Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.hibernate.type.TypeFactory Maven / Gradle / Ivy
/*
* 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 .
*/
package org.hibernate.type;
import java.io.Serializable;
import java.util.Comparator;
import java.util.Properties;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.boot.cfgxml.spi.CfgXmlAccessService;
import org.hibernate.classic.Lifecycle;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.SessionFactoryRegistry;
import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.tuple.component.ComponentMetamodel;
import org.hibernate.usertype.CompositeUserType;
import org.hibernate.usertype.ParameterizedType;
import org.hibernate.usertype.UserType;
import static org.hibernate.internal.CoreLogging.messageLogger;
/**
* Used internally to build instances of {@link Type}, specifically it builds instances of
*
*
* Used internally to obtain instances of Type . Applications should use static methods
* and constants on org.hibernate.Hibernate .
*
* @author Gavin King
* @author Steve Ebersole
*/
@SuppressWarnings({"unchecked"})
public final class TypeFactory implements Serializable {
private static final CoreMessageLogger LOG = messageLogger( TypeFactory.class );
private final TypeScopeImpl typeScope = new TypeScopeImpl();
public static interface TypeScope extends Serializable {
public SessionFactoryImplementor resolveFactory();
}
private static class TypeScopeImpl implements TypeFactory.TypeScope {
private transient SessionFactoryImplementor factory;
private String sessionFactoryName;
private String sessionFactoryUuid;
public void injectSessionFactory(SessionFactoryImplementor factory) {
if ( this.factory != null ) {
LOG.scopingTypesToSessionFactoryAfterAlreadyScoped( this.factory, factory );
}
else {
LOG.tracev( "Scoping types to session factory {0}", factory );
sessionFactoryUuid = factory.getUuid();
String sfName = factory.getSettings().getSessionFactoryName();
if ( sfName == null ) {
final CfgXmlAccessService cfgXmlAccessService = factory.getServiceRegistry()
.getService( CfgXmlAccessService.class );
if ( cfgXmlAccessService.getAggregatedConfig() != null ) {
sfName = cfgXmlAccessService.getAggregatedConfig().getSessionFactoryName();
}
}
sessionFactoryName = sfName;
}
this.factory = factory;
}
public SessionFactoryImplementor resolveFactory() {
if ( factory == null ) {
factory = (SessionFactoryImplementor) SessionFactoryRegistry.INSTANCE.findSessionFactory(
sessionFactoryUuid,
sessionFactoryName
);
if ( factory == null ) {
throw new HibernateException(
"Could not find a SessionFactory [uuid=" + sessionFactoryUuid + ",name=" + sessionFactoryName + "]"
);
}
}
return factory;
}
}
public void injectSessionFactory(SessionFactoryImplementor factory) {
typeScope.injectSessionFactory( factory );
}
public SessionFactoryImplementor resolveSessionFactory() {
return typeScope.resolveFactory();
}
public Type byClass(Class clazz, Properties parameters) {
if ( Type.class.isAssignableFrom( clazz ) ) {
return type( clazz, parameters );
}
if ( CompositeUserType.class.isAssignableFrom( clazz ) ) {
return customComponent( clazz, parameters );
}
if ( UserType.class.isAssignableFrom( clazz ) ) {
return custom( clazz, parameters );
}
if ( Lifecycle.class.isAssignableFrom( clazz ) ) {
// not really a many-to-one association *necessarily*
return manyToOne( clazz.getName() );
}
if ( Serializable.class.isAssignableFrom( clazz ) ) {
return serializable( clazz );
}
return null;
}
public Type type(Class typeClass, Properties parameters) {
try {
Type type = typeClass.newInstance();
injectParameters( type, parameters );
return type;
}
catch (Exception e) {
throw new MappingException( "Could not instantiate Type: " + typeClass.getName(), e );
}
}
// todo : can a Properties be wrapped in unmodifiable in any way?
private final static Properties EMPTY_PROPERTIES = new Properties();
public static void injectParameters(Object type, Properties parameters) {
if ( ParameterizedType.class.isInstance( type ) ) {
if ( parameters == null ) {
( (ParameterizedType) type ).setParameterValues( EMPTY_PROPERTIES );
}
else {
( (ParameterizedType) type ).setParameterValues( parameters );
}
}
else if ( parameters != null && !parameters.isEmpty() ) {
throw new MappingException( "type is not parameterized: " + type.getClass().getName() );
}
}
public CompositeCustomType customComponent(Class typeClass, Properties parameters) {
return customComponent( typeClass, parameters, typeScope );
}
/**
* @deprecated Only for use temporary use by {@link org.hibernate.Hibernate}
*/
@Deprecated
@SuppressWarnings({"JavaDoc"})
public static CompositeCustomType customComponent(
Class typeClass,
Properties parameters,
TypeScope scope) {
try {
CompositeUserType userType = typeClass.newInstance();
injectParameters( userType, parameters );
return new CompositeCustomType( userType );
}
catch (Exception e) {
throw new MappingException( "Unable to instantiate custom type: " + typeClass.getName(), e );
}
}
public CollectionType customCollection(
String typeName,
Properties typeParameters,
String role,
String propertyRef) {
Class typeClass;
try {
typeClass = ReflectHelper.classForName( typeName );
}
catch (ClassNotFoundException cnfe) {
throw new MappingException( "user collection type class not found: " + typeName, cnfe );
}
CustomCollectionType result = new CustomCollectionType( typeScope, typeClass, role, propertyRef );
if ( typeParameters != null ) {
injectParameters( result.getUserType(), typeParameters );
}
return result;
}
public CustomType custom(Class typeClass, Properties parameters) {
return custom( typeClass, parameters, typeScope );
}
/**
* @deprecated Only for use temporary use by {@link org.hibernate.Hibernate}
*/
@Deprecated
public static CustomType custom(Class typeClass, Properties parameters, TypeScope scope) {
try {
UserType userType = typeClass.newInstance();
injectParameters( userType, parameters );
return new CustomType( userType );
}
catch (Exception e) {
throw new MappingException( "Unable to instantiate custom type: " + typeClass.getName(), e );
}
}
/**
* Build a {@link SerializableType} from the given {@link Serializable} class.
*
* @param serializableClass The {@link Serializable} class.
* @param The actual class type (extends Serializable)
*
* @return The built {@link SerializableType}
*/
public static SerializableType serializable(Class serializableClass) {
return new SerializableType( serializableClass );
}
// one-to-one type builders ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public EntityType oneToOne(
String persistentClass,
ForeignKeyDirection foreignKeyType,
boolean referenceToPrimaryKey,
String uniqueKeyPropertyName,
boolean lazy,
boolean unwrapProxy,
String entityName,
String propertyName) {
return new OneToOneType(
typeScope, persistentClass, foreignKeyType, referenceToPrimaryKey,
uniqueKeyPropertyName, lazy, unwrapProxy, entityName, propertyName
);
}
public EntityType specialOneToOne(
String persistentClass,
ForeignKeyDirection foreignKeyType,
boolean referenceToPrimaryKey,
String uniqueKeyPropertyName,
boolean lazy,
boolean unwrapProxy,
String entityName,
String propertyName) {
return new SpecialOneToOneType(
typeScope, persistentClass, foreignKeyType, referenceToPrimaryKey,
uniqueKeyPropertyName, lazy, unwrapProxy, entityName, propertyName
);
}
// many-to-one type builders ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public EntityType manyToOne(String persistentClass) {
return new ManyToOneType( typeScope, persistentClass );
}
public EntityType manyToOne(String persistentClass, boolean lazy) {
return new ManyToOneType( typeScope, persistentClass, lazy );
}
/**
* @deprecated Use {@link #manyToOne(String, boolean, String, boolean, boolean, boolean, boolean)} instead.
*/
@Deprecated
public EntityType manyToOne(
String persistentClass,
String uniqueKeyPropertyName,
boolean lazy,
boolean unwrapProxy,
boolean ignoreNotFound,
boolean isLogicalOneToOne) {
return manyToOne(
persistentClass,
uniqueKeyPropertyName == null,
uniqueKeyPropertyName,
lazy,
unwrapProxy,
ignoreNotFound,
isLogicalOneToOne
);
}
public EntityType manyToOne(
String persistentClass,
boolean referenceToPrimaryKey,
String uniqueKeyPropertyName,
boolean lazy,
boolean unwrapProxy,
boolean ignoreNotFound,
boolean isLogicalOneToOne) {
return new ManyToOneType(
typeScope,
persistentClass,
referenceToPrimaryKey,
uniqueKeyPropertyName,
lazy,
unwrapProxy,
ignoreNotFound,
isLogicalOneToOne
);
}
// collection type builders ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public CollectionType array(String role, String propertyRef, Class elementClass) {
return new ArrayType( typeScope, role, propertyRef, elementClass );
}
public CollectionType list(String role, String propertyRef) {
return new ListType( typeScope, role, propertyRef );
}
public CollectionType bag(String role, String propertyRef) {
return new BagType( typeScope, role, propertyRef );
}
public CollectionType idbag(String role, String propertyRef) {
return new IdentifierBagType( typeScope, role, propertyRef );
}
public CollectionType map(String role, String propertyRef) {
return new MapType( typeScope, role, propertyRef );
}
public CollectionType orderedMap(String role, String propertyRef) {
return new OrderedMapType( typeScope, role, propertyRef );
}
public CollectionType sortedMap(String role, String propertyRef, Comparator comparator) {
return new SortedMapType( typeScope, role, propertyRef, comparator );
}
public CollectionType set(String role, String propertyRef) {
return new SetType( typeScope, role, propertyRef );
}
public CollectionType orderedSet(String role, String propertyRef) {
return new OrderedSetType( typeScope, role, propertyRef );
}
public CollectionType sortedSet(String role, String propertyRef, Comparator comparator) {
return new SortedSetType( typeScope, role, propertyRef, comparator );
}
// component type builders ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public ComponentType component(ComponentMetamodel metamodel) {
return new ComponentType( typeScope, metamodel );
}
public EmbeddedComponentType embeddedComponent(ComponentMetamodel metamodel) {
return new EmbeddedComponentType( typeScope, metamodel );
}
// any type builder ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public Type any(Type metaType, Type identifierType) {
return new AnyType( typeScope, metaType, identifierType );
}
}