Class ClassMetaData

  • All Implemented Interfaces:
    Serializable

    public class ClassMetaData
    extends AbstractClassMetaData
    Representation of the MetaData of a class. Extends the abstract definition to include implementations, fields, embedded-only tags. Has a parent PackageMetaData that can contain the metadata for several classes.

    Lifecycle state

    This object supports 3 lifecycle states. The first is the raw constructed object which represents pure MetaData (maybe from a MetaData file). The second is a "populated" object which represents MetaData for a Class with the metadata aligned to be appropriate for that Class. The third is "initialised" once the internal arrays are created. This object, once populated, will represent ALL fields in the class (including static, final and transient fields).

    Fields/Properties

    This object keeps a list of FieldMetaData/PropertyMetaData objects for the fields of this class. In addition it has an array of FieldMetaData objects representing those that are actually managed by JDO ("managedFields"). This second set does not contain things like static, final or transient fields since JDO doesn't support those yet.

    Fields are of 2 types. The first are normal fields of this class. These have their own "relative" field number, relative to this class. The second type are "overriding" fields which override the baseline field in a superclass. These fields have no "relative" field number since they are relative to this class (and such a relative field number would make no sense). Fields are all added through addField() during the parse process, and are updated during the populate/initialise process to define their relative field numbers. Please refer to FieldMetaData for more details of fields.

    Numbering of fields

    Fields of the class are numbered in 2 ways. The first way is the numbering within a class. In a class, the field 'id's will start at 0. If a class is inherited, it will also have a second numbering for its fields - the "absolute" numbering. With "absolute" numbering, the fields start at the first field in the root superclass which has absolute number 0, and they are numbered from there, navigating down the hierarchy. In terms of what is stored in the records, the FieldMetaData stores fieldId as the first method (relative to the class it is in). The "absolute" numbering is always derived from this and the inheritance hierarchy.
    See Also:
    Serialized Form
    • Field Detail

      • isAbstract

        protected boolean isAbstract
        Is the persistable class abstract.
    • Constructor Detail

      • ClassMetaData

        public ClassMetaData​(PackageMetaData parent,
                             String name)
        Constructor. Takes the basic string information found in the MetaData file.
        Parameters:
        parent - The package to which this class belongs
        name - Name of class
      • ClassMetaData

        public ClassMetaData​(InterfaceMetaData imd,
                             String implClassName,
                             boolean copyFields)
        Constructor for creating the ClassMetaData for an implementation of a "persistent-interface".
        Parameters:
        imd - MetaData for the "persistent-interface"
        implClassName - Name of the implementation class
        copyFields - Whether to copy the fields of the interface too
      • ClassMetaData

        public ClassMetaData​(ClassMetaData cmd,
                             String implClassName)
        Constructor for creating the ClassMetaData for an implementation of a "persistent-abstract-class".
        Parameters:
        cmd - MetaData for the implementation of the "persistent-abstract-class"
        implClassName - Name of the implementation class
    • Method Detail

      • populate

        public void populate​(ClassLoaderResolver clr,
                             ClassLoader primary,
                             MetaDataManager mgr)
        Method to provide the details of the class being represented by this MetaData. This can be used to firstly provide defaults for attributes that aren't specified in the MetaData, and secondly to report any errors with attributes that have been specified that are inconsistent with the class being represented.

        One possible use of this method would be to take a basic ClassMetaData for a class and call this, passing in the users class. This would then add AbstractMemberMetaData for all fields in this class providing defaults for all of these.

        Specified by:
        populate in class AbstractClassMetaData
        Parameters:
        clr - ClassLoaderResolver to use in loading any classes
        primary - the primary ClassLoader to use (or null)
        mgr - MetaData manager
      • addMetaDataForMembersNotInMetaData

        protected void addMetaDataForMembersNotInMetaData​(Class cls)
        Add MetaData of fields/properties not declared in MetaData. Note that if a member is defined using some generic type in the superclass and this class can use a TypeVariable to resolve it then this will add the member to "members" here since the type will be different to this class.
        Parameters:
        cls - Class represented by this metadata
      • populateMemberMetaData

        protected void populateMemberMetaData​(ClassLoaderResolver clr,
                                              Class cls,
                                              boolean pkMembers,
                                              ClassLoader primary)
        Populate MetaData for all members.
        Parameters:
        clr - The ClassLoaderResolver
        cls - This class
        pkMembers - Process pk fields/properties (or non-PK if false)
        primary - the primary ClassLoader to use (or null)
        Throws:
        InvalidMetaDataException - if the Class for a declared type in a field cannot be loaded by the clr
        InvalidMetaDataException - if a field declared in the MetaData does not exist in the Class
      • initialise

        public void initialise​(ClassLoaderResolver clr)
        Method to initialise the object, creating internal convenience arrays. Initialises all sub-objects. populate() should be called BEFORE calling this.
        Overrides:
        initialise in class MetaData
        Parameters:
        clr - ClassLoader resolver
      • isAbstract

        public boolean isAbstract()
        Whether the persistable class is abstract.
        Returns:
        true if the persistable class is abstract
      • newDefaultedProperty

        protected AbstractMemberMetaData newDefaultedProperty​(String name)
        Utility to add a defaulted FieldMetaData to the class. Provided as a method since then any derived classes can override it (e.g ClassMetaData can create a FieldMetaData)
        Overrides:
        newDefaultedProperty in class AbstractClassMetaData
        Parameters:
        name - name of field
        Returns:
        the new FieldMetaData
      • getImplementsMetaData

        public final List<ImplementsMetaData> getImplementsMetaData()
        Accessor for the implements MetaData
        Returns:
        Returns the implements MetaData.
      • addImplements

        public void addImplements​(ImplementsMetaData implmd)
        Method to add an implements to this class.
        Parameters:
        implmd - Meta-Data for the implements