/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.property.access.internal;
import org.hibernate.EntityMode;
import org.hibernate.HibernateException;
import org.hibernate.boot.registry.selector.spi.StrategySelector;
import org.hibernate.engine.spi.Managed;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.property.access.spi.BuiltInPropertyAccessStrategies;
import org.hibernate.property.access.spi.PropertyAccessStrategy;
import org.hibernate.property.access.spi.PropertyAccessStrategyResolver;
import org.hibernate.service.ServiceRegistry;
Standard implementation of PropertyAccessStrategyResolver
Author: Steve Ebersole
/**
* Standard implementation of PropertyAccessStrategyResolver
*
* @author Steve Ebersole
*/
public class PropertyAccessStrategyResolverStandardImpl implements PropertyAccessStrategyResolver {
private final ServiceRegistry serviceRegistry;
public PropertyAccessStrategyResolverStandardImpl(ServiceRegistry serviceRegistry) {
this.serviceRegistry = serviceRegistry;
}
@Override
public PropertyAccessStrategy resolvePropertyAccessStrategy(
Class containerClass,
String explicitAccessStrategyName,
EntityMode entityMode) {
if ( BuiltInPropertyAccessStrategies.BASIC.getExternalName().equals( explicitAccessStrategyName )
|| BuiltInPropertyAccessStrategies.FIELD.getExternalName().equals( explicitAccessStrategyName )
|| BuiltInPropertyAccessStrategies.MIXED.getExternalName().equals( explicitAccessStrategyName ) ) {
if ( Managed.class.isAssignableFrom( containerClass ) ) {
// PROPERTY (BASIC) and MIXED are not valid for bytecode enhanced entities...
return PropertyAccessStrategyEnhancedImpl.INSTANCE;
}
}
if ( StringHelper.isNotEmpty( explicitAccessStrategyName ) ) {
return resolveExplicitlyNamedPropertyAccessStrategy( explicitAccessStrategyName );
}
if ( entityMode == EntityMode.MAP ) {
return BuiltInPropertyAccessStrategies.MAP.getStrategy();
}
else {
return BuiltInPropertyAccessStrategies.BASIC.getStrategy();
}
}
protected PropertyAccessStrategy resolveExplicitlyNamedPropertyAccessStrategy(String explicitAccessStrategyName) {
final BuiltInPropertyAccessStrategies builtInStrategyEnum = BuiltInPropertyAccessStrategies.interpret(
explicitAccessStrategyName
);
if ( builtInStrategyEnum != null ) {
return builtInStrategyEnum.getStrategy();
}
return strategySelectorService().resolveStrategy( PropertyAccessStrategy.class, explicitAccessStrategyName );
}
private StrategySelector strategySelectorService;
protected StrategySelector strategySelectorService() {
if ( strategySelectorService == null ) {
if ( serviceRegistry == null ) {
throw new HibernateException( "ServiceRegistry not yet injected; PropertyAccessStrategyResolver not ready for use." );
}
strategySelectorService = serviceRegistry.getService( StrategySelector.class );
}
return strategySelectorService;
}
}