Package org.datanucleus.store.types
Class TypeManagerImpl
java.lang.Object
org.datanucleus.store.types.TypeManagerImpl
- All Implemented Interfaces:
Serializable
,TypeManager
Implementation of registry of java type support.
Provides information applicable to all datastores for how a field of a class is treated;
whether it is by default persistent, whether it is by default embedded, whether it is in the DFG, and if it has a wrapper for SCO operations.
Also stores whether the type can be converted to/from a String (for datastores that don't provide storage natively).
Uses the plugin mechanism extension-point "org.datanucleus.java_type".
- See Also:
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static Comparator
<Class> private static Comparator
<String> protected Map
<String, TypeConverter> Map of TypeConverter keyed by type name that we should default to for this type (user-defined).Cache of classes that don't need a ContainerHandler.protected ClassLoaderResolver
protected Map
<Class, ContainerHandler> Map of ContainerHandlers, keyed by the container type class name.protected Map
<String, TypeManagerImpl.JavaType> Map of java types, keyed by the class name.protected NucleusContext
private static final Class[]
private static final long
protected Map
<String, TypeConverter> Map of TypeConverter keyed by their symbolic name.protected Map
<TypeConverter, Class> Cache of TypeConverter datastore type, keyed by the converter.protected Map
<Class, Map<Class, TypeConverter>> Map of (Map of TypeConverter keyed by the datastore type), keyed by the member type.protected Map
<TypeConverter, Class> Cache of TypeConverter member type, keyed by the converter. -
Constructor Summary
ConstructorsConstructorDescriptionTypeManagerImpl
(NucleusContext nucCtx) Constructor, loading support for type mappings using the plugin mechanism. -
Method Summary
Modifier and TypeMethodDescriptionprivate void
addJavaType
(Class cls, Class genericType, boolean embedded, boolean dfg, Class wrapperType, Class wrapperTypeBacked, Class containerHandlerType, String typeConverterName) void
close()
<T> SCO
<T> createSCOWrapper
(DNStateManager ownerSM, AbstractMemberMetaData mmd, Class<T> instantiatedType) Method to create a new SCO wrapper for member type.String[]
filterOutSupportedSecondClassNames
(String[] inputClassNames) Convenience method to filter out any supported classes from a list.protected TypeManagerImpl.JavaType
Convenience method to return the JavaType for the specified class.protected TypeManagerImpl.JavaType
findJavaTypeForCollectionClass
(Class cls, Class genericType) Convenience method to return the JavaType for the specified class.getAutoApplyTypeConverterForType
(Class memberType) Method to return a TypeConverter that should be applied by default for the specified java (member) type.getBackedWrapperTypeForType
(Class declaredType, Class instantiatedType, String typeName) Convenience method to return the backed wrapper type for the field definition.getContainerAdapter
(Object container) Convenience method to obtain the ContainerAdapter using the container object instance<H extends ContainerHandler>
HgetContainerHandler
(Class containerClass) Obtains the registered ContainerHandler for the given containerClass.getDatastoreTypeForTypeConverter
(TypeConverter conv, Class memberType) Method to return the datastore type for the specified TypeConverter.getDefaultTypeConverterForType
(Class memberType) Accessor for the default type converter for the provided Java type.getMemberTypeForTypeConverter
(TypeConverter conv, Class datastoreType) Method to return the member type for the specified TypeConverter.getSimpleWrapperTypeForType
(Class declaredType, Class instantiatedType, String typeName) Convenience method to return the simple wrapper type for the field definition.Accessor for the supported second-class Types.getTypeConverterForName
(String converterName) Accessor for the type converter with the provided name.getTypeConverterForType
(Class memberType, Class datastoreType) Accessor for the type converter for the provided Java type and its datastore type.getTypeConvertersForType
(Class memberType) Accessor for the available type converters for the provided Java type.getTypeForSecondClassWrapper
(String className) Accessor for a java type that the supplied class is a SCO wrapper for.getWrappedTypeBackedForType
(String className) Accessor for the backing-store Second Class Wrapper class for the supplied class.getWrapperTypeForType
(String className) Accessor for the SCO wrapper for the typeboolean
Accessor for whether the type is by default embedded.boolean
Accessor for whether the type is by default in the DFG.boolean
isDefaultFetchGroupForCollection
(Class c, Class genericType) Accessor for whether the generic collection type is by default in the DFG.boolean
Accessor for whether the type is by default persistent.boolean
isSecondClassMutableType
(String className) Accessor for whether the type is SCO mutable.boolean
isSecondClassWrapper
(String className) Accessor for whether the type is a SCO wrapper itself.boolean
isSupportedSecondClassType
(String className) Accessor for whether a class is supported as being second class.private Class
loadClass
(PluginManager mgr, ConfigurationElement elem, String className, String messageKey) private void
Method to load the java types that we support out of the box.private void
Method to load the java type that are currently registered in the PluginManager.void
registerConverter
(String name, TypeConverter converter, Class memberType, Class dbType, boolean autoApply, String autoApplyType) Register a TypeConverter with the TypeManager process for specific attribute/db types.void
setDefaultTypeConverterForType
(Class memberType, String converterName) Method providing the ability for a datastore plugin to override the default converter type for the specified java type.
-
Field Details
-
serialVersionUID
private static final long serialVersionUID- See Also:
-
nucCtx
-
clr
-
SCO_WRAPPER_CONSTRUCTOR_ARG_TYPES
-
javaTypes
Map of java types, keyed by the class name. -
containerHandlersByClass
Map of ContainerHandlers, keyed by the container type class name. -
classesWithoutContainerHandler
Cache of classes that don't need a ContainerHandler. -
typeConverterByName
Map of TypeConverter keyed by their symbolic name. -
autoApplyConvertersByType
Map of TypeConverter keyed by type name that we should default to for this type (user-defined). -
typeConverterMap
Map of (Map of TypeConverter keyed by the datastore type), keyed by the member type. -
typeConverterDatastoreTypeByConverter
Cache of TypeConverter datastore type, keyed by the converter. -
typeConverterMemberTypeByConverter
Cache of TypeConverter member type, keyed by the converter. -
ALPHABETICAL_ORDER
-
ALPHABETICAL_ORDER_STRING
-
-
Constructor Details
-
TypeManagerImpl
Constructor, loading support for type mappings using the plugin mechanism.- Parameters:
nucCtx
- NucleusContext
-
-
Method Details
-
close
public void close()- Specified by:
close
in interfaceTypeManager
-
getSupportedSecondClassTypes
Description copied from interface:TypeManager
Accessor for the supported second-class Types. This may or may not be a complete list, just that it provides the principal ones.- Specified by:
getSupportedSecondClassTypes
in interfaceTypeManager
- Returns:
- Set of supported types (fully qualified class names).
-
isSupportedSecondClassType
Description copied from interface:TypeManager
Accessor for whether a class is supported as being second class.- Specified by:
isSupportedSecondClassType
in interfaceTypeManager
- Parameters:
className
- The class name- Returns:
- Whether the class is supported (to some degree)
-
filterOutSupportedSecondClassNames
Description copied from interface:TypeManager
Convenience method to filter out any supported classes from a list.- Specified by:
filterOutSupportedSecondClassNames
in interfaceTypeManager
- Parameters:
inputClassNames
- Names of the classes- Returns:
- Names of the classes (omitting supported types)
-
isDefaultPersistent
Description copied from interface:TypeManager
Accessor for whether the type is by default persistent. TODO Support use of apiAdapter.isMemberDefaultPersistent to get strict JDO/JPA behaviour.- Specified by:
isDefaultPersistent
in interfaceTypeManager
- Parameters:
c
- The type- Returns:
- Whether persistent
-
isDefaultFetchGroup
Description copied from interface:TypeManager
Accessor for whether the type is by default in the DFG.- Specified by:
isDefaultFetchGroup
in interfaceTypeManager
- Parameters:
c
- The type- Returns:
- Whether in the DFG
-
isDefaultFetchGroupForCollection
Description copied from interface:TypeManager
Accessor for whether the generic collection type is by default in the DFG.- Specified by:
isDefaultFetchGroupForCollection
in interfaceTypeManager
- Parameters:
c
- The typegenericType
- The element generic type- Returns:
- Whether in the DFG
-
isDefaultEmbeddedType
Description copied from interface:TypeManager
Accessor for whether the type is by default embedded.- Specified by:
isDefaultEmbeddedType
in interfaceTypeManager
- Parameters:
c
- The type- Returns:
- Whether embedded
-
isSecondClassMutableType
Description copied from interface:TypeManager
Accessor for whether the type is SCO mutable.- Specified by:
isSecondClassMutableType
in interfaceTypeManager
- Parameters:
className
- The type- Returns:
- Whether SCO mutable
-
getWrapperTypeForType
Description copied from interface:TypeManager
Accessor for the SCO wrapper for the type- Specified by:
getWrapperTypeForType
in interfaceTypeManager
- Parameters:
className
- The type- Returns:
- SCO wrapper type
-
getWrappedTypeBackedForType
Description copied from interface:TypeManager
Accessor for the backing-store Second Class Wrapper class for the supplied class. A type will have a SCO wrapper if it is SCO supported and is mutable. If there is no backed wrapper provided returns the simple wrapper.- Specified by:
getWrappedTypeBackedForType
in interfaceTypeManager
- Parameters:
className
- The class name- Returns:
- The second class wrapper
-
isSecondClassWrapper
Description copied from interface:TypeManager
Accessor for whether the type is a SCO wrapper itself.- Specified by:
isSecondClassWrapper
in interfaceTypeManager
- Parameters:
className
- The type- Returns:
- Whether is SCO wrapper
-
createSCOWrapper
public <T> SCO<T> createSCOWrapper(DNStateManager ownerSM, AbstractMemberMetaData mmd, Class<T> instantiatedType) Description copied from interface:TypeManager
Method to create a new SCO wrapper for member type. Will find a wrapper suitable for the instantiated type (if provided), otherwise suitable for the member metadata type.- Specified by:
createSCOWrapper
in interfaceTypeManager
- Type Parameters:
T
- Type of the object that we are creating a wrapper for- Parameters:
ownerSM
- StateManager for the owning objectmmd
- The MetaData for the related member.instantiatedType
- Type to instantiate the member as (if known), otherwise falls back to the type from metadata- Returns:
- The wrapper object of the required type
-
getBackedWrapperTypeForType
private Class<? extends SCO> getBackedWrapperTypeForType(Class declaredType, Class instantiatedType, String typeName) Convenience method to return the backed wrapper type for the field definition. Wrapper is null if no backed wrapper is defined for the type.- Parameters:
declaredType
- Declared type of the fieldinstantiatedType
- Instantiated type of the fieldtypeName
- Type name to try first- Returns:
- The wrapper type
-
getSimpleWrapperTypeForType
private Class<? extends SCO> getSimpleWrapperTypeForType(Class declaredType, Class instantiatedType, String typeName) Convenience method to return the simple wrapper type for the field definition. Wrapper is null if no simple wrapper is defined for the type.- Parameters:
declaredType
- Declared type of the fieldinstantiatedType
- Instantiated type of the fieldtypeName
- Type name to try first- Returns:
- The wrapper type
-
getTypeForSecondClassWrapper
Description copied from interface:TypeManager
Accessor for a java type that the supplied class is a SCO wrapper for. If the supplied class is not a SCO wrapper for anything then returns null.- Specified by:
getTypeForSecondClassWrapper
in interfaceTypeManager
- Parameters:
className
- Name of the class- Returns:
- The java class that this is a wrapper for (or null)
-
getContainerAdapter
Description copied from interface:TypeManager
Convenience method to obtain the ContainerAdapter using the container object instance- Specified by:
getContainerAdapter
in interfaceTypeManager
- Parameters:
container
- The container instance- Returns:
- The ContainerAdapter for the respective container or null if it's not a supported container
-
getContainerHandler
Description copied from interface:TypeManager
Obtains the registered ContainerHandler for the given containerClass. ContainerHandler are specified via the plugin mechanism using the container-handler attribute of the java-type element.- Specified by:
getContainerHandler
in interfaceTypeManager
- Type Parameters:
H
- Handler type- Parameters:
containerClass
- The class of the container.- Returns:
- The respective ContainerHandler if registered or null if no ContainerHandler is found for the containerClass.
-
getTypeConverterForName
Description copied from interface:TypeManager
Accessor for the type converter with the provided name. This is used when the user has specified metadata for a field to use a particular named converter.- Specified by:
getTypeConverterForName
in interfaceTypeManager
- Parameters:
converterName
- Name of the converter- Returns:
- The converter
-
registerConverter
public void registerConverter(String name, TypeConverter converter, Class memberType, Class dbType, boolean autoApply, String autoApplyType) Description copied from interface:TypeManager
Register a TypeConverter with the TypeManager process for specific attribute/db types. TypeConverters are registered either from the contents of "plugin.xml" (i.e the builtin types) where the name is of the form "dn.*", or from user-registered metadata (e.g JPA Annotations) where the name is the class name of the converter or a user supplied name.- Specified by:
registerConverter
in interfaceTypeManager
- Parameters:
name
- The name to register the converter underconverter
- The convertermemberType
- Type of the java memberdbType
- Type of the database columnautoApply
- Whether this should be used as an auto-apply converterautoApplyType
- Java type to auto apply this for
-
getAutoApplyTypeConverterForType
Description copied from interface:TypeManager
Method to return a TypeConverter that should be applied by default for the specified java (member) type. Will return null if the java type has no autoApply type defined for it (the default).- Specified by:
getAutoApplyTypeConverterForType
in interfaceTypeManager
- Parameters:
memberType
- The java (member) type- Returns:
- The converter to use by default
-
setDefaultTypeConverterForType
Description copied from interface:TypeManager
Method providing the ability for a datastore plugin to override the default converter type for the specified java type.- Specified by:
setDefaultTypeConverterForType
in interfaceTypeManager
- Parameters:
memberType
- Member typeconverterName
- The converter to use by default. This is assumed to exist.
-
getDefaultTypeConverterForType
Description copied from interface:TypeManager
Accessor for the default type converter for the provided Java type.- Specified by:
getDefaultTypeConverterForType
in interfaceTypeManager
- Parameters:
memberType
- Java type for the member- Returns:
- The default converter (if any)
-
getTypeConverterForType
Description copied from interface:TypeManager
Accessor for the type converter for the provided Java type and its datastore type.- Specified by:
getTypeConverterForType
in interfaceTypeManager
- Parameters:
memberType
- Java type for the memberdatastoreType
- Java type for the datastore- Returns:
- The converter (if any)
-
getTypeConvertersForType
Description copied from interface:TypeManager
Accessor for the available type converters for the provided Java type.- Specified by:
getTypeConvertersForType
in interfaceTypeManager
- Parameters:
memberType
- The java type- Returns:
- The available Type Converters
-
getDatastoreTypeForTypeConverter
Method to return the datastore type for the specified TypeConverter.- Specified by:
getDatastoreTypeForTypeConverter
in interfaceTypeManager
- Parameters:
conv
- The convertermemberType
- The member type- Returns:
- The datastore type
-
getMemberTypeForTypeConverter
Method to return the member type for the specified TypeConverter.- Specified by:
getMemberTypeForTypeConverter
in interfaceTypeManager
- Parameters:
conv
- The converterdatastoreType
- The datastore type for this converter- Returns:
- The member type
-
findJavaTypeForClass
Convenience method to return the JavaType for the specified class. If this class has a defined JavaType then returns it. If not then tries to find a superclass that is castable to the specified type.- Parameters:
cls
- The class required- Returns:
- The JavaType
-
findJavaTypeForCollectionClass
Convenience method to return the JavaType for the specified class. If this class has a defined JavaType then returns it. If not then tries to find a superclass that is castable to the specified type.- Parameters:
cls
- The class requiredgenericType
- Any generic type specified for the element- Returns:
- The JavaType
-
loadJavaTypes
Method to load the java types that we support out of the box. This includes all built-in types, as well as all types registered via the plugin mechanism.- Parameters:
mgr
- the PluginManager
-
addJavaType
-
loadClass
private Class loadClass(PluginManager mgr, ConfigurationElement elem, String className, String messageKey) -
loadTypeConverters
Method to load the java type that are currently registered in the PluginManager.- Parameters:
mgr
- the PluginManager
-