org.datanucleus.metadata
Class MetaDataManager

java.lang.Object
  extended by org.datanucleus.metadata.MetaDataManager
All Implemented Interfaces:
Serializable

public abstract class MetaDataManager
extends Object
implements Serializable

Manager of metadata information in DataNucleus having scope of an NucleusContext. Each PMF/EMF will effectively have a single MetaDataManager handling all XML/Annotations metadata.

Metadata can be loaded into the MetaDataManager in two ways

Acts as a registry of metadata so that metadata files don't need to be parsed multiple times. MetaData is stored as a FileMetaData, which contains PackageMetaData, which contains ClassMetaData, and so on. This maps exactly to the users model of their metadata. The users access point is getMetaDataForClass() which will check the known classes without metadata, then check the existing registered metdata, then check the valid locations for metdata files. This way, the metadata is managed from this single point.

Maintains a list of all classes that have been checked for MetaData and don't have any available. This avoids the needs to look up MetaData multiple times finding the same result. Currently this list is for all ClassMetaData objects keyed by the class name.

Users can register interest in knowing when metadata for classes are loaded by registering a listener using the addListener method. This will then notify the listener when metadata for any class is initialised. This provides the opportunity to reject the metadata where particular features are not supported. For example a StoreManager could register a listener where it doesn't support datastore identity and throw an InvalidMetaDataException. This would then filter back out to the user for the operation they invoked

See Also:
Serialized Form

Field Summary
protected  boolean allowAnnotations
          Whether we allow annotations metadata.
protected  boolean allowMetaDataLoad
          Flag defining if we allow metadata load currently.
protected  boolean allowORM
          Whether we allow ORM XML metadata.
protected  boolean allowXML
          Whether we allow XML metadata.
protected  AnnotationManager annotationManager
          Manager for annotations.
protected  Collection<String> classesWithoutPersistenceInfo
          Cache of class names that are known to not have MetaData/annotations.
protected  MultiMap classMetaDataByAppIdClassName
          Map of class metadata, keyed by the application-id object-id class name (not SingleField).
protected  Map<String,AbstractClassMetaData> classMetaDataByClass
          Map of ClassMetaData, keyed by the class name.
protected  Map<String,AbstractClassMetaData> classMetaDataByDiscriminatorName
          Map of ClassMetaData, keyed by the class discriminator name.
protected  Map<String,AbstractClassMetaData> classMetaDataByEntityName
          Map of ClassMetaData, keyed by the JPA "entity name".
protected  Map<String,Set<String>> directSubclassesByClass
          Cache subclass information as that is expensive to compute, keyed by class name
protected  Map<String,org.datanucleus.metadata.MetaDataManager.DiscriminatorLookup> discriminatorLookupByRootClassName
           
protected  Map<String,FetchPlanMetaData> fetchPlanMetaDataByName
          Map of FetchPlanMetaData, keyed by the fetch plan name.
protected  Map<String,FileMetaData> fileMetaDataByURLString
          Map of FileMetaData for the parsed files, keyed by the URL string.
protected  Set<MetaDataListener> listeners
          Listeners for metadata load.
protected  List<AbstractClassMetaData> loadedMetaData
          Temporary list of class metadata loaded during the current call.
protected static Localiser LOCALISER
          Localiser for messages.
protected  MetaDataParser metaDataParser
          Parser for MetaData.
protected  NucleusContext nucleusContext
          The NucleusContext that this metadata manager is operating in.
protected  Map<String,QueryMetaData> queryMetaDataByName
          Map of QueryMetaData, keyed by the (class name + query name).
protected  Map<String,QueryResultMetaData> queryResultMetaDataByName
          Map of QueryResultMetaData keyed by the name.
protected  Map<String,SequenceMetaData> sequenceMetaDataByPackageSequence
          Map of SequenceMetaData, keyed by the package name and sequence name.
protected  Map<String,StoredProcQueryMetaData> storedProcQueryMetaDataByName
          Map of StoredProcQueryMetaData, keyed by the (class name + query name).
protected  boolean supportXMLNamespaces
          Flag whether we should be (XML) namespace aware when parsing.
protected  Map<String,TableGeneratorMetaData> tableGeneratorMetaDataByPackageSequence
          Map of TableGeneratorMetaData, keyed by the package name and generator name.
protected  int userMetaDataNumber
          Number of user metadata items.
protected  ArrayList<FileMetaData> utilisedFileMetaData
          Temporary list of the FileMetaData objects utilised in this call for metadata.
protected  boolean validateXML
          Flag whether we should validate the (XML) metadata files when parsing.
 
Constructor Summary
MetaDataManager(NucleusContext ctx)
          Constructor, specifying the context used.
 
Method Summary
protected  void addORMDataToClass(Class c, ClassLoaderResolver clr)
          Load up and add any O/R mapping info for the specified class to the stored ClassMetaData (if supported).
 void close()
          Clear resources
 void deregisterListener(MetaDataListener listener)
          Method to deregister a listener from being notified when metadata for a class/interface is initialised.
 boolean getAllowMetaDataLoad()
           
 AnnotationManager getAnnotationManager()
           
 ApiAdapter getApiAdapter()
          Accessor for the API adapter being used by this MetaDataManager.
 String[] getClassesImplementingInterface(String interfaceName, ClassLoaderResolver clr)
          Accessor for the list of names of classes that are declared to implement the specified interface (using <implements> in the MetaData).
 Collection<String> getClassesWithMetaData()
          Accessor for the names of the classes with MetaData currently registered with this manager.
 ClassMetaData getClassMetaDataForImplementationOfPersistentInterface(String interfaceName)
          Accessor for the metadata for the implementation of the specified "persistent-interface".
 Collection<AbstractClassMetaData> getClassMetaDataWithApplicationId(String objectIdClassName)
          Accessor for the metadata for the class(es) with the specified object-id class name as PK.
 String getClassNameForDiscriminatorValueWithRoot(AbstractClassMetaData rootCmd, String discrimValue)
           
 String getDiscriminatorValueForClass(AbstractClassMetaData cmd, String discrimValue)
           
 FileMetaData[] getFileMetaData()
          Accessor for all FileMetaData currently managed here.
 String getImplementationNameForPersistentInterface(String interfaceName)
          Accessor for the implementation name for the specified "persistent-interface".
 AbstractClassMetaData getMetaDataForClass(Class c, ClassLoaderResolver clr)
          Main accessor for the MetaData for a class.
 AbstractClassMetaData getMetaDataForClass(String className, ClassLoaderResolver clr)
          Accessor for the MetaData for a class given the name and a loader.
abstract  AbstractClassMetaData getMetaDataForClassInternal(Class c, ClassLoaderResolver clr)
          Internal convenience method for accessing the MetaData for a class.
 AbstractClassMetaData getMetaDataForDiscriminator(String discriminator)
          Accessor for the MetaData for a class given the "discriminator".
 AbstractClassMetaData getMetaDataForEntityName(String entityName)
          Accessor for the MetaData for a class given the "entity-name".
 FetchPlanMetaData getMetaDataForFetchPlan(String name)
          Accessor for the MetaData for a named fetch plan.
 ClassMetaData getMetaDataForImplementationOfReference(Class referenceClass, Object implValue, ClassLoaderResolver clr)
          Accessor for the MetaData for an implementation of a reference type.
 InterfaceMetaData getMetaDataForInterface(Class c, ClassLoaderResolver clr)
          Accessor for the MetaData for an interface.
 AbstractMemberMetaData getMetaDataForMember(Class c, ClassLoaderResolver clr, String memberName)
          Accessor for the MetaData for a field/property of a class.
 AbstractMemberMetaData getMetaDataForMember(String className, String memberName, ClassLoaderResolver clr)
          Accessor for the MetaData for a field/property of a class.
 PersistenceUnitMetaData getMetaDataForPersistenceUnit(String unitName)
          Method to parse all available "persistence.xml" files and return the metadata for the persistence unit with the specified name.
 QueryMetaData getMetaDataForQuery(Class cls, ClassLoaderResolver clr, String queryName)
          Accessor for the MetaData for a named query for a class.
 QueryResultMetaData getMetaDataForQueryResult(String name)
          Accessor for the MetaData for a QueryResult.
 SequenceMetaData getMetaDataForSequence(ClassLoaderResolver clr, String seqName)
          Accessor for the MetaData for a Sequence in a package.
 StoredProcQueryMetaData getMetaDataForStoredProcQuery(Class cls, ClassLoaderResolver clr, String queryName)
          Accessor for the MetaData for a named stored procedure query for a class.
 TableGeneratorMetaData getMetaDataForTableGenerator(ClassLoaderResolver clr, String genName)
          Accessor for the MetaData for a TableGenerator in a package.
 Set<String> getNamedQueryNames()
           
 NucleusContext getNucleusContext()
          Accessor for the NucleusContext that this manager is running in.
 List<AbstractClassMetaData> getReferencedClasses(String[] classNames, ClassLoaderResolver clr)
          Convenience method to get the MetaData for all referenced classes with the passed set of classes as root.
protected  List<AbstractClassMetaData> getReferencedClassMetaData(AbstractClassMetaData cmd, ClassLoaderResolver clr)
          Utility to return all ClassMetaData that is referenced from the supplier class.
protected  MetaDataScanner getScanner(ClassLoaderResolver clr)
          Accessor for any scanner for metadata classes (optional).
 String[] getSubclassesForClass(String className, boolean includeDescendents)
          Accessor for the subclasses of a particular class
 boolean hasMetaDataForClass(String className)
          Convenience method to check if we have metadata present for the specified class.
protected  void initialiseAbstractClassMetaData(AbstractClassMetaData acmd, ClassLoaderResolver clr)
          Convenience method to initialise the MetaData for the specified class/interface.
protected  void initialiseClassMetaData(ClassMetaData cmd, Class cls, ClassLoaderResolver clr)
          Utility to initialise the MetaData for a class, using the specified class.
protected  void initialiseFileMetaData(FileMetaData filemd, ClassLoaderResolver clr, ClassLoader primary)
          Initialise all classes/interfaces in a Meta-Data file.
protected  void initialiseFileMetaDataForUse(Collection fileMetaData, ClassLoaderResolver clr)
          Method to initialise the provided FileMetaData, ready for use.
protected  void initialiseInterfaceMetaData(InterfaceMetaData imd, ClassLoaderResolver clr, ClassLoader primary)
          Utility to initialise the MetaData for a interface, using the specified class.
 boolean isAllowAnnotations()
           
 boolean isAllowXML()
           
 boolean isClassPersistable(String className)
          Convenience method to return if the specified class is a known persistable class.
protected  boolean isClassWithoutPersistenceInfo(String className)
          Accessor for whether a class doesn't have MetaData or annotations.
 boolean isEnhancing()
          Accessor for whether we are managing the enhancement process.
 boolean isFieldTypePersistable(Class type)
          Utility to return if this field is persistable.
 boolean isPersistentDefinitionImplementation(String implName)
          Convenience method to return if the passed class name is an implementation of a "persistent definition".
 boolean isPersistentInterface(String name)
          Convenience method to return if the passed class name is a "persistent-interface".
 boolean isPersistentInterfaceImplementation(String interfaceName, String implName)
          Convenience method to return if the passed class name is an implementation of the passed "persistent-interface".
protected  FileMetaData loadAnnotationsForClass(Class cls, ClassLoaderResolver clr, boolean register, boolean populate)
          Method to load the annotations for the specified class and return the FileMetaData containing the class.
 FileMetaData[] loadClasses(String[] classNames, ClassLoader loader)
          Method to load up all metadata for the specified classes.
 Collection<FileMetaData> loadFiles(String[] metadataFiles, ClassLoaderResolver clr)
          Method to load the metadata from the specified files.
 FileMetaData[] loadJar(String jarFileName, ClassLoader loader)
          Initialisation method to load the metadata provided by the specified jar.
 FileMetaData[] loadMetadataFiles(String[] metadataFiles, ClassLoader loader)
          Method to load up all metadata defined by the specified metadata files.
 FileMetaData[] loadPersistenceUnit(PersistenceUnitMetaData pumd, ClassLoader loader)
          Initialisation method to to load all class metadata defined by the "persistence-unit".
 void loadUserMetaData(FileMetaData fileMetaData, ClassLoader loader)
          Method to load user-provided metadata.
protected abstract  FileMetaData parseFile(URL file_url)
          Utility to parse an XML metadata file.
protected  void populateAbstractClassMetaData(AbstractClassMetaData acmd, ClassLoaderResolver clr, ClassLoader loader)
          Convenience method to populate the MetaData for the specified class/interface.
protected  void populateFileMetaData(FileMetaData filemd, ClassLoaderResolver clr, ClassLoader primary)
          Convenience method to populate all classes/interfaces in a Meta-Data file.
protected  void postProcessClassMetaData(AbstractClassMetaData cmd, ClassLoaderResolver clr)
          Method that will perform any necessary post-processing on metadata.
protected  void processListenerLoadingCall()
           
 AbstractClassMetaData readMetaDataForClass(String className)
          Method to access the (already known) metadata for the specified class.
 AbstractMemberMetaData readMetaDataForMember(String className, String memberName)
          Method to access the (already known) metadata for the field/property of the specified class.
 void registerDiscriminatorValueForClass(AbstractClassMetaData cmd, String discrimValue)
          Method to register a discriminator value (when using VALUE_MAP strategy) for the specified class.
protected  void registerFetchPlansForFile(FileMetaData filemd)
          Convenience method to register all FetchPlans found in the passed file.
abstract  void registerFile(String fileURLString, FileMetaData filemd, ClassLoaderResolver clr)
          Method to take the FileMetaData and register the relevant parts of it with the assorted caches provided.
 void registerImplementationOfAbstractClass(ClassMetaData cmd, Class implClass, ClassLoaderResolver clr)
          Method to register the metadata for an implementation of a persistent abstract class.
 void registerListener(MetaDataListener listener)
          Method to register a listener to be notified when metadata for a class/interface is initialised.
protected  void registerMetaDataForClass(String fullClassName, AbstractClassMetaData cmd)
          Internal method called when we want to register the metadata for a class/interface.
 void registerPersistentInterface(InterfaceMetaData imd, Class implClass, ClassLoaderResolver clr)
          Method to register a persistent interface and its implementation with the MetaData system.
protected  void registerQueriesForFile(FileMetaData filemd)
          Convenience method to register all queries found in the passed file.
protected  void registerQueryResultMetaDataForFile(FileMetaData filemd)
          Convenience method to register all table generators found in the passed file.
protected  void registerSequencesForFile(FileMetaData filemd)
          Convenience method to register all sequences found in the passed file.
protected  void registerStoredProcQueriesForFile(FileMetaData filemd)
          Convenience method to register all stored proc queries found in the passed file.
protected  void registerTableGeneratorsForFile(FileMetaData filemd)
          Convenience method to register all table generators found in the passed file.
 void setAllowAnnotations(boolean allow)
          Method to set if we are allowing annotations metadata.
 void setAllowMetaDataLoad(boolean allow)
          Method to set if we are allowing any further load of metadata beyond this point
 void setAllowXML(boolean allow)
          Method to set if we are allowing XML metadata.
 void setValidate(boolean validate)
          Mutator for whether to validate the MetaData files for XML compliance.
 void setXmlNamespaceAware(boolean aware)
          Mutator for whether to support XML namespaces.
 boolean supportsORM()
          Accessor for whether the MetaData manager supports ORM concepts and metadata.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

LOCALISER

protected static final Localiser LOCALISER
Localiser for messages.


nucleusContext

protected final NucleusContext nucleusContext
The NucleusContext that this metadata manager is operating in.


annotationManager

protected final AnnotationManager annotationManager
Manager for annotations.


metaDataParser

protected MetaDataParser metaDataParser
Parser for MetaData.


validateXML

protected boolean validateXML
Flag whether we should validate the (XML) metadata files when parsing.


supportXMLNamespaces

protected boolean supportXMLNamespaces
Flag whether we should be (XML) namespace aware when parsing.


classesWithoutPersistenceInfo

protected Collection<String> classesWithoutPersistenceInfo
Cache of class names that are known to not have MetaData/annotations.


fileMetaDataByURLString

protected Map<String,FileMetaData> fileMetaDataByURLString
Map of FileMetaData for the parsed files, keyed by the URL string.


classMetaDataByClass

protected Map<String,AbstractClassMetaData> classMetaDataByClass
Map of ClassMetaData, keyed by the class name.


classMetaDataByEntityName

protected Map<String,AbstractClassMetaData> classMetaDataByEntityName
Map of ClassMetaData, keyed by the JPA "entity name".


classMetaDataByDiscriminatorName

protected Map<String,AbstractClassMetaData> classMetaDataByDiscriminatorName
Map of ClassMetaData, keyed by the class discriminator name.


directSubclassesByClass

protected Map<String,Set<String>> directSubclassesByClass
Cache subclass information as that is expensive to compute, keyed by class name


queryMetaDataByName

protected Map<String,QueryMetaData> queryMetaDataByName
Map of QueryMetaData, keyed by the (class name + query name).


storedProcQueryMetaDataByName

protected Map<String,StoredProcQueryMetaData> storedProcQueryMetaDataByName
Map of StoredProcQueryMetaData, keyed by the (class name + query name).


fetchPlanMetaDataByName

protected Map<String,FetchPlanMetaData> fetchPlanMetaDataByName
Map of FetchPlanMetaData, keyed by the fetch plan name.


sequenceMetaDataByPackageSequence

protected Map<String,SequenceMetaData> sequenceMetaDataByPackageSequence
Map of SequenceMetaData, keyed by the package name and sequence name.


tableGeneratorMetaDataByPackageSequence

protected Map<String,TableGeneratorMetaData> tableGeneratorMetaDataByPackageSequence
Map of TableGeneratorMetaData, keyed by the package name and generator name.


queryResultMetaDataByName

protected Map<String,QueryResultMetaData> queryResultMetaDataByName
Map of QueryResultMetaData keyed by the name.


classMetaDataByAppIdClassName

protected MultiMap classMetaDataByAppIdClassName
Map of class metadata, keyed by the application-id object-id class name (not SingleField).


listeners

protected Set<MetaDataListener> listeners
Listeners for metadata load.


userMetaDataNumber

protected int userMetaDataNumber
Number of user metadata items.


allowMetaDataLoad

protected boolean allowMetaDataLoad
Flag defining if we allow metadata load currently. If false then we only allow access to currently loaded metadata.


allowXML

protected boolean allowXML
Whether we allow XML metadata.


allowAnnotations

protected boolean allowAnnotations
Whether we allow annotations metadata.


allowORM

protected boolean allowORM
Whether we allow ORM XML metadata.


discriminatorLookupByRootClassName

protected Map<String,org.datanucleus.metadata.MetaDataManager.DiscriminatorLookup> discriminatorLookupByRootClassName

utilisedFileMetaData

protected ArrayList<FileMetaData> utilisedFileMetaData
Temporary list of the FileMetaData objects utilised in this call for metadata.


loadedMetaData

protected List<AbstractClassMetaData> loadedMetaData
Temporary list of class metadata loaded during the current call.

Constructor Detail

MetaDataManager

public MetaDataManager(NucleusContext ctx)
Constructor, specifying the context used.

Parameters:
ctx - context that this metadata manager operates in
Method Detail

close

public void close()
Clear resources


registerListener

public void registerListener(MetaDataListener listener)
Method to register a listener to be notified when metadata for a class/interface is initialised.

Parameters:
listener - The listener

deregisterListener

public void deregisterListener(MetaDataListener listener)
Method to deregister a listener from being notified when metadata for a class/interface is initialised.

Parameters:
listener - The listener

setAllowMetaDataLoad

public void setAllowMetaDataLoad(boolean allow)
Method to set if we are allowing any further load of metadata beyond this point

Parameters:
allow - Whether to allow it

getAllowMetaDataLoad

public boolean getAllowMetaDataLoad()

isAllowXML

public boolean isAllowXML()

setAllowXML

public void setAllowXML(boolean allow)
Method to set if we are allowing XML metadata.

Parameters:
allow - Whether to allow it

isAllowAnnotations

public boolean isAllowAnnotations()

setAllowAnnotations

public void setAllowAnnotations(boolean allow)
Method to set if we are allowing annotations metadata.

Parameters:
allow - Whether to allow it

supportsORM

public boolean supportsORM()
Accessor for whether the MetaData manager supports ORM concepts and metadata. With object datastores this will return false.

Returns:
Whether we support ORM

isEnhancing

public boolean isEnhancing()
Accessor for whether we are managing the enhancement process.

Returns:
Whether we are enhancing

setValidate

public void setValidate(boolean validate)
Mutator for whether to validate the MetaData files for XML compliance.

Parameters:
validate - Whether to validate

setXmlNamespaceAware

public void setXmlNamespaceAware(boolean aware)
Mutator for whether to support XML namespaces.

Parameters:
aware - Whether to be XML namespace aware

getNucleusContext

public NucleusContext getNucleusContext()
Accessor for the NucleusContext that this manager is running in.

Returns:
The NucleusContext

getApiAdapter

public ApiAdapter getApiAdapter()
Accessor for the API adapter being used by this MetaDataManager.

Returns:
API adapter.

getAnnotationManager

public AnnotationManager getAnnotationManager()

loadMetadataFiles

public FileMetaData[] loadMetadataFiles(String[] metadataFiles,
                                        ClassLoader loader)
Method to load up all metadata defined by the specified metadata files. Metadata files can be absolute/relative filenames, or can be resources in the CLASSPATH.

Parameters:
metadataFiles - The metadata files
loader - ClassLoader to use in loading the metadata (if any)
Returns:
Array of the FileMetaData that is managed
Throws:
NucleusUserException - (with nested exceptions) if an error occurs parsing the files

loadClasses

public FileMetaData[] loadClasses(String[] classNames,
                                  ClassLoader loader)
Method to load up all metadata for the specified classes.

Parameters:
classNames - The class names
loader - ClassLoader to use in loading the classes (if any)
Returns:
Array of the FileMetaData that is managed
Throws:
NucleusUserException - (with nested exceptions) if an error occurs parsing the files

loadJar

public FileMetaData[] loadJar(String jarFileName,
                              ClassLoader loader)
Initialisation method to load the metadata provided by the specified jar.

Parameters:
jarFileName - Name of the jar file
loader - ClassLoader to use in loading of the jar (if any)
Returns:
Array of the FileMetaData that is managed
Throws:
NucleusUserException - if an error occurs parsing the jar info

loadPersistenceUnit

public FileMetaData[] loadPersistenceUnit(PersistenceUnitMetaData pumd,
                                          ClassLoader loader)
Initialisation method to to load all class metadata defined by the "persistence-unit".

Parameters:
pumd - The MetaData for this "persistence-unit"
loader - ClassLoader to use in loading of the persistence unit (if any)
Returns:
Array of the FileMetaData that is managed
Throws:
NucleusUserException - if an error occurs parsing the persistence-unit info

getScanner

protected MetaDataScanner getScanner(ClassLoaderResolver clr)
Accessor for any scanner for metadata classes (optional). Looks for the persistence property "datanucleus.metadata.scanner" (if defined)

Parameters:
clr - The classloader resolver
Returns:
scanner instance or null if it doesn't exist or cannot be instantiated

loadUserMetaData

public void loadUserMetaData(FileMetaData fileMetaData,
                             ClassLoader loader)
Method to load user-provided metadata.

Parameters:
fileMetaData - FileMetaData to register/populate/initialise
loader - ClassLoader to use in loading the metadata (if any)

initialiseFileMetaDataForUse

protected void initialiseFileMetaDataForUse(Collection fileMetaData,
                                            ClassLoaderResolver clr)
Method to initialise the provided FileMetaData, ready for use.

Parameters:
fileMetaData - Collection of FileMetaData
clr - ClassLoader resolver
Throws:
NucleusUserException - thrown if an error occurs during the populate/initialise of the supplied metadata.

loadFiles

public Collection<FileMetaData> loadFiles(String[] metadataFiles,
                                          ClassLoaderResolver clr)
Method to load the metadata from the specified files. Supports absolute/relative file names, or CLASSPATH resources.

Parameters:
metadataFiles - array of MetaData files
clr - ClassLoader resolver
Returns:
List of FileMetaData

isClassPersistable

public boolean isClassPersistable(String className)
Convenience method to return if the specified class is a known persistable class.

Parameters:
className - Name of the class
Returns:
Whether it is persistable

getFileMetaData

public FileMetaData[] getFileMetaData()
Accessor for all FileMetaData currently managed here.

Returns:
FileMetaData managed here currently

getClassesWithMetaData

public Collection<String> getClassesWithMetaData()
Accessor for the names of the classes with MetaData currently registered with this manager.

Returns:
Names of classes with MetaData

hasMetaDataForClass

public boolean hasMetaDataForClass(String className)
Convenience method to check if we have metadata present for the specified class.

Parameters:
className - The name of the class to check
Returns:
Whether the metadata is already registered for this class

isClassWithoutPersistenceInfo

protected boolean isClassWithoutPersistenceInfo(String className)
Accessor for whether a class doesn't have MetaData or annotations.

Parameters:
className - Name of the class
Returns:
Whether it has no metadata and annotations

getClassMetaDataWithApplicationId

public Collection<AbstractClassMetaData> getClassMetaDataWithApplicationId(String objectIdClassName)
Accessor for the metadata for the class(es) with the specified object-id class name as PK. This only works for user-provided object-id classes (not SingleFieldIdentity).

Parameters:
objectIdClassName - The object-id class name
Returns:
Collection of AbstractClassMetaData for the classes using this PK

getMetaDataForClass

public AbstractClassMetaData getMetaDataForClass(String className,
                                                 ClassLoaderResolver clr)
Accessor for the MetaData for a class given the name and a loader. All MetaData returned from this method will be initialised and ready for full use. If the class can't be loaded, null will be returned.

Parameters:
className - Name of the class to find MetaData for
clr - ClassLoaderResolver resolver for use in loading the class.
Returns:
The ClassMetaData for this class (or null if not found)

getMetaDataForClass

public AbstractClassMetaData getMetaDataForClass(Class c,
                                                 ClassLoaderResolver clr)
Main accessor for the MetaData for a class. All MetaData returned from this method will be initialised and ready for full use.

Parameters:
c - The class to find MetaData for
clr - the ClassLoaderResolver
Returns:
The ClassMetaData for this class (or null if not found)

processListenerLoadingCall

protected void processListenerLoadingCall()

getMetaDataForEntityName

public AbstractClassMetaData getMetaDataForEntityName(String entityName)
Accessor for the MetaData for a class given the "entity-name".

Parameters:
entityName - The entity name to find MetaData for
Returns:
The ClassMetaData for this entity name (or null if not found)

getMetaDataForDiscriminator

public AbstractClassMetaData getMetaDataForDiscriminator(String discriminator)
Accessor for the MetaData for a class given the "discriminator".

Parameters:
discriminator - The discriminator name to find MetaData for
Returns:
The ClassMetaData for this discriminator (or null if not found)

readMetaDataForClass

public AbstractClassMetaData readMetaDataForClass(String className)
Method to access the (already known) metadata for the specified class. If the class is not yet known about it returns null.

Parameters:
className - Name of the class
Returns:
MetaData for the class

readMetaDataForMember

public AbstractMemberMetaData readMetaDataForMember(String className,
                                                    String memberName)
Method to access the (already known) metadata for the field/property of the specified class. If the class (or this field/property) is not yet known about it returns null.

Parameters:
className - Name of the class
memberName - Name of the field/property
Returns:
MetaData for the field/property

getMetaDataForClassInternal

public abstract AbstractClassMetaData getMetaDataForClassInternal(Class c,
                                                                  ClassLoaderResolver clr)
Internal convenience method for accessing the MetaData for a class. MetaData returned by this method may be uninitialised so should only really be used in initialisation processes. To be implemented by the implementing class.

Parameters:
c - The class to find MetaData for
Returns:
The ClassMetaData for this class (or null if not found)

registerMetaDataForClass

protected void registerMetaDataForClass(String fullClassName,
                                        AbstractClassMetaData cmd)
Internal method called when we want to register the metadata for a class/interface.

Parameters:
fullClassName - Name of the class
cmd - The metadata

getSubclassesForClass

public String[] getSubclassesForClass(String className,
                                      boolean includeDescendents)
Accessor for the subclasses of a particular class

Parameters:
className - Name of the class that we want the known subclasses for.
includeDescendents - Whether to include subclasses of subclasses etc
Returns:
Names of the subclasses. return null if there are no subclasses

getClassesImplementingInterface

public String[] getClassesImplementingInterface(String interfaceName,
                                                ClassLoaderResolver clr)
Accessor for the list of names of classes that are declared to implement the specified interface (using <implements> in the MetaData). This will include subclasses of declared classes. Ignore abstract classes. The array of implementation class names will have the initial implementations first followed by the subclass implementations etc. So for example if we look for all implementations of I and A implements I and B extends A, then it will return [A, B] in that order.

Parameters:
interfaceName - Name of the interface
clr - The ClassLoaderResolver
Returns:
The names of the classes declared as implementing that interface. return null if no classes

addORMDataToClass

protected void addORMDataToClass(Class c,
                                 ClassLoaderResolver clr)
Load up and add any O/R mapping info for the specified class to the stored ClassMetaData (if supported). This implementation does nothing so if ORM files are supported then this should be overridden by subclasses. Is package-access so that is only accessable by MetaData classes

Parameters:
c - The class
clr - ClassLoader resolver

getMetaDataForImplementationOfReference

public ClassMetaData getMetaDataForImplementationOfReference(Class referenceClass,
                                                             Object implValue,
                                                             ClassLoaderResolver clr)
Accessor for the MetaData for an implementation of a reference type. Finds the metadata for the implementation of this reference.

Parameters:
referenceClass - The reference class to find MetaData for
implValue - Object of an implementation class, to return if possible (null=ignore)
clr - ClassLoader resolver
Returns:
The ClassMetaData for an implementation of a reference type

getMetaDataForMember

public AbstractMemberMetaData getMetaDataForMember(String className,
                                                   String memberName,
                                                   ClassLoaderResolver clr)
Accessor for the MetaData for a field/property of a class. Utilises getMetaDataForClass, and then finds the relevant field/property.

Parameters:
className - The name of the class owning the field/property
memberName - The name of the field to find MetaData for
clr - ClassLoaderResolver resolver for any loading of classes
Returns:
The metadata for this field/property (or null if not found)

getMetaDataForMember

public AbstractMemberMetaData getMetaDataForMember(Class c,
                                                   ClassLoaderResolver clr,
                                                   String memberName)
Accessor for the MetaData for a field/property of a class. Utilises getMetaDataForClass, and then finds the relevant field/property.

Parameters:
c - The class owning the field/property
clr - the ClassLoaderResolver
memberName - The name of the field/property to find MetaData for
Returns:
The metadata for this field/property (or null if not found)

getMetaDataForQuery

public QueryMetaData getMetaDataForQuery(Class cls,
                                         ClassLoaderResolver clr,
                                         String queryName)
Accessor for the MetaData for a named query for a class. If the class is not specified, searches for the query with this name for any class. Will only return metadata for queries already registered in this implementation.

Parameters:
cls - The class which has the query defined for it
clr - the ClassLoaderResolver
queryName - Name of the query
Returns:
The QueryMetaData for the query for this class

getNamedQueryNames

public Set<String> getNamedQueryNames()

getMetaDataForStoredProcQuery

public StoredProcQueryMetaData getMetaDataForStoredProcQuery(Class cls,
                                                             ClassLoaderResolver clr,
                                                             String queryName)
Accessor for the MetaData for a named stored procedure query for a class. If the class is not specified, searches for the query with this name for any class. Will only return metadata for queries already registered in this implementation.

Parameters:
cls - The class which has the query defined for it
clr - the ClassLoaderResolver
queryName - Name of the (stored proc) query
Returns:
The StoredProcQueryMetaData for the query for this class

getMetaDataForFetchPlan

public FetchPlanMetaData getMetaDataForFetchPlan(String name)
Accessor for the MetaData for a named fetch plan.

Parameters:
name - Name of the fetch plan
Returns:
The FetchPlanMetaData for this name (if any)

getMetaDataForSequence

public SequenceMetaData getMetaDataForSequence(ClassLoaderResolver clr,
                                               String seqName)
Accessor for the MetaData for a Sequence in a package. This implementation simply checks what is already loaded and returns if found

Parameters:
clr - the ClassLoaderResolver
seqName - Name of the package (fully qualified if necessary)
Returns:
The SequenceMetaData for this named sequence

getMetaDataForTableGenerator

public TableGeneratorMetaData getMetaDataForTableGenerator(ClassLoaderResolver clr,
                                                           String genName)
Accessor for the MetaData for a TableGenerator in a package. This implementation simply checks what is already loaded and returns if found

Parameters:
clr - the ClassLoaderResolver
genName - Name of the package (fully qualified if necessary)
Returns:
The TableGenerator for this named generator

getMetaDataForQueryResult

public QueryResultMetaData getMetaDataForQueryResult(String name)
Accessor for the MetaData for a QueryResult.

Parameters:
name - Name of the query result
Returns:
The QueryResultMetaData under this name

getMetaDataForInterface

public InterfaceMetaData getMetaDataForInterface(Class c,
                                                 ClassLoaderResolver clr)
Accessor for the MetaData for an interface. Part of the support for "persistent-interface". This defaults to returning null since interfaces are only supported by JDO.

Parameters:
c - The interface to find MetaData for
clr - the ClassLoaderResolver
Returns:
The InterfaceMetaData for this interface (or null if not found)

isPersistentInterface

public boolean isPersistentInterface(String name)
Convenience method to return if the passed class name is a "persistent-interface".

Parameters:
name - Name if the interface
Returns:
Whether it is a "persistent-interface"

isPersistentInterfaceImplementation

public boolean isPersistentInterfaceImplementation(String interfaceName,
                                                   String implName)
Convenience method to return if the passed class name is an implementation of the passed "persistent-interface".

Parameters:
interfaceName - Name of the persistent interface
implName - The implementation name
Returns:
Whether it is a (DataNucleus-generated) impl of the persistent interface

isPersistentDefinitionImplementation

public boolean isPersistentDefinitionImplementation(String implName)
Convenience method to return if the passed class name is an implementation of a "persistent definition".

Parameters:
implName - The implementation name
Returns:
Whether it is a (DataNucleus-generated) impl of the persistent interface or abstract class

getImplementationNameForPersistentInterface

public String getImplementationNameForPersistentInterface(String interfaceName)
Accessor for the implementation name for the specified "persistent-interface".

Parameters:
interfaceName - The name of the persistent interface
Returns:
The name of the implementation class

getClassMetaDataForImplementationOfPersistentInterface

public ClassMetaData getClassMetaDataForImplementationOfPersistentInterface(String interfaceName)
Accessor for the metadata for the implementation of the specified "persistent-interface".

Parameters:
interfaceName - The name of the persistent interface
Returns:
The ClassMetaData of the implementation class

registerPersistentInterface

public void registerPersistentInterface(InterfaceMetaData imd,
                                        Class implClass,
                                        ClassLoaderResolver clr)
Method to register a persistent interface and its implementation with the MetaData system.

Parameters:
imd - MetaData for the interface
implClass - The implementation class
clr - ClassLoader Resolver to use

registerImplementationOfAbstractClass

public void registerImplementationOfAbstractClass(ClassMetaData cmd,
                                                  Class implClass,
                                                  ClassLoaderResolver clr)
Method to register the metadata for an implementation of a persistent abstract class.

Parameters:
cmd - MetaData for the abstract class
implClass - The implementation class
clr - ClassLoader resolver

getMetaDataForPersistenceUnit

public PersistenceUnitMetaData getMetaDataForPersistenceUnit(String unitName)
Method to parse all available "persistence.xml" files and return the metadata for the persistence unit with the specified name.

Parameters:
unitName - Name of the persistence-unit
Returns:
MetaData for the persistence-unit of the specified name (or null if not found)
Throws:
NucleusUserException - if no "persistence.xml" files are found

parseFile

protected abstract FileMetaData parseFile(URL file_url)
Utility to parse an XML metadata file.

Parameters:
file_url - URL of the file
Returns:
The FileMetaData for this file

registerFile

public abstract void registerFile(String fileURLString,
                                  FileMetaData filemd,
                                  ClassLoaderResolver clr)
Method to take the FileMetaData and register the relevant parts of it with the assorted caches provided.

Parameters:
fileURLString - URL of the metadata file
filemd - The File MetaData

registerDiscriminatorValueForClass

public void registerDiscriminatorValueForClass(AbstractClassMetaData cmd,
                                               String discrimValue)
Method to register a discriminator value (when using VALUE_MAP strategy) for the specified class.

Parameters:
cmd - Metadata for the class
discrimValue - The value to register against this class

getClassNameForDiscriminatorValueWithRoot

public String getClassNameForDiscriminatorValueWithRoot(AbstractClassMetaData rootCmd,
                                                        String discrimValue)

getDiscriminatorValueForClass

public String getDiscriminatorValueForClass(AbstractClassMetaData cmd,
                                            String discrimValue)

registerSequencesForFile

protected void registerSequencesForFile(FileMetaData filemd)
Convenience method to register all sequences found in the passed file.

Parameters:
filemd - MetaData for the file

registerTableGeneratorsForFile

protected void registerTableGeneratorsForFile(FileMetaData filemd)
Convenience method to register all table generators found in the passed file.

Parameters:
filemd - MetaData for the file

registerQueryResultMetaDataForFile

protected void registerQueryResultMetaDataForFile(FileMetaData filemd)
Convenience method to register all table generators found in the passed file.

Parameters:
filemd - MetaData for the file

registerQueriesForFile

protected void registerQueriesForFile(FileMetaData filemd)
Convenience method to register all queries found in the passed file.

Parameters:
filemd - MetaData for the file

registerStoredProcQueriesForFile

protected void registerStoredProcQueriesForFile(FileMetaData filemd)
Convenience method to register all stored proc queries found in the passed file.

Parameters:
filemd - MetaData for the file

registerFetchPlansForFile

protected void registerFetchPlansForFile(FileMetaData filemd)
Convenience method to register all FetchPlans found in the passed file.

Parameters:
filemd - MetaData for the file

populateFileMetaData

protected void populateFileMetaData(FileMetaData filemd,
                                    ClassLoaderResolver clr,
                                    ClassLoader primary)
Convenience method to populate all classes/interfaces in a Meta-Data file.

Parameters:
filemd - The MetaData file
clr - Class Loader to use in population
primary - the primary ClassLoader to use (or null)

initialiseFileMetaData

protected void initialiseFileMetaData(FileMetaData filemd,
                                      ClassLoaderResolver clr,
                                      ClassLoader primary)
Initialise all classes/interfaces in a Meta-Data file.

Parameters:
filemd - the FileMetaData
clr - ClassLoader resolver to use
primary - the primary ClassLoader to use (or null)

initialiseClassMetaData

protected void initialiseClassMetaData(ClassMetaData cmd,
                                       Class cls,
                                       ClassLoaderResolver clr)
Utility to initialise the MetaData for a class, using the specified class. This assigns defaults to tags that haven't been assigned. If the class that is being used to populate the MetaData is not enhanced, this will throw a NucleusUserException informing them of this.

Parameters:
cmd - The classes metadata
cls - The class to use as a basis for initialisation
clr - ClassLoader resolver to use
Throws:
NucleusUserException - if the class is not enhanced

initialiseInterfaceMetaData

protected void initialiseInterfaceMetaData(InterfaceMetaData imd,
                                           ClassLoaderResolver clr,
                                           ClassLoader primary)
Utility to initialise the MetaData for a interface, using the specified class. This assigns defaults to tags that haven't been assigned. If the class that is being used to populate the MetaData is not enhanced, this will throw a NucleusUserException informing them of this.

Parameters:
imd - The interface metadata
clr - The loader of the interface
primary - the primary ClassLoader to use (or null)

loadAnnotationsForClass

protected FileMetaData loadAnnotationsForClass(Class cls,
                                               ClassLoaderResolver clr,
                                               boolean register,
                                               boolean populate)
Method to load the annotations for the specified class and return the FileMetaData containing the class. The FileMetaData, PackageMetaData will be dummy records.

Parameters:
cls - The class
clr - ClassLoader resolver
register - Whether to register the data
populate - Whether to populate the data
Returns:
The FileMetaData

postProcessClassMetaData

protected void postProcessClassMetaData(AbstractClassMetaData cmd,
                                        ClassLoaderResolver clr)
Method that will perform any necessary post-processing on metadata.

Parameters:
cmd - Metadata for the class
clr - ClassLoader resolver

populateAbstractClassMetaData

protected void populateAbstractClassMetaData(AbstractClassMetaData acmd,
                                             ClassLoaderResolver clr,
                                             ClassLoader loader)
Convenience method to populate the MetaData for the specified class/interface.

Parameters:
acmd - MetaData
clr - ClassLoader resolver
loader - The primary class loader

initialiseAbstractClassMetaData

protected void initialiseAbstractClassMetaData(AbstractClassMetaData acmd,
                                               ClassLoaderResolver clr)
Convenience method to initialise the MetaData for the specified class/interface.

Parameters:
acmd - MetaData
clr - ClassLoaderResolver

getReferencedClasses

public List<AbstractClassMetaData> getReferencedClasses(String[] classNames,
                                                        ClassLoaderResolver clr)
Convenience method to get the MetaData for all referenced classes with the passed set of classes as root.

Parameters:
classNames - Names of the root classes
clr - ClassLoader resolver
Returns:
List of AbstractClassMetaData objects for the referenced classes
Throws:
NoPersistenceInformationException - thrown when one of the classes has no metadata.

getReferencedClassMetaData

protected List<AbstractClassMetaData> getReferencedClassMetaData(AbstractClassMetaData cmd,
                                                                 ClassLoaderResolver clr)
Utility to return all ClassMetaData that is referenced from the supplier class.

Parameters:
cmd - The origin class's MetaData.
clr - ClassLoaderResolver resolver for loading any classes.
Returns:
List of ClassMetaData referenced by the origin

isFieldTypePersistable

public boolean isFieldTypePersistable(Class type)
Utility to return if this field is persistable.

Parameters:
type - Type of the field (for when "type" is not yet set)
Returns:
Whether the field type is persistable.


Copyright © 2013. All Rights Reserved.