Class EnhancementHelper

java.lang.Object
org.datanucleus.enhancer.EnhancementHelper

public class EnhancementHelper extends Object
Helper class for the DN bytecode enhancement contract. It contains methods to register metadata for persistable classes and to perform common operations needed by implementations, not by end users.

It allows construction of instances of persistable classes without using reflection.

Persistable classes register themselves via a static method at class load time. There is no security restriction on this access. TODO Provide a mechanism to automatically deregister classes when their class loader exits? or register against the NucleusContext?

  • Field Details

    • singletonHelper

      private static EnhancementHelper singletonHelper
    • registeredClasses

      private static Map<Class,EnhancementHelper.Meta> registeredClasses
      Static mapping of Persistable class to an instance of that class. New entries are added by the static method in each Persistable class initialisation. Entries are never removed.
    • listeners

      private static final List<EnhancementHelper.RegisterClassListener> listeners
      This list contains the registered listeners for RegisterClassEvents.
  • Constructor Details

    • EnhancementHelper

      private EnhancementHelper()
  • Method Details

    • getInstance

      public static EnhancementHelper getInstance()
    • newInstance

      public Persistable newInstance(Class pcClass, StateManager sm)
      Create a new instance of the class and assign its StateManager.
      Parameters:
      pcClass - the Persistable class.
      sm - the StateManager which will own the new instance.
      Returns:
      the new instance, or null if the class is not registered.
      See Also:
    • newInstance

      public Persistable newInstance(Class pcClass, StateManager sm, Object oid)
      Create a new instance of the class and assign its StateManager and key values from the ObjectId. If the oid parameter is null, no key values are copied. The new instance has its dnFlags set to LOAD_REQUIRED.
      Parameters:
      pcClass - the Persistable class.
      sm - the StateManager which will own the new instance.
      oid - the ObjectId instance from which to copy key field values.
      Returns:
      the new instance, or null if the class is not registered.
      See Also:
    • newObjectIdInstance

      public Object newObjectIdInstance(Class pcClass)
      Create a new instance of the ObjectId class of this Persistable class. It is intended only for application identity. This method should not be called for classes that use single field identity; newObjectIdInstance(Class, Object) should be used instead. If the class has been enhanced for datastore identity, or if the class is abstract, null is returned.
      Parameters:
      pcClass - the Persistable class.
      Returns:
      the new ObjectId instance, or null if the class is not registered.
    • newObjectIdInstance

      public Object newObjectIdInstance(Class pcClass, Object obj)
      Create a new instance of the class used by the parameter Class for JDO identity, using the key constructor of the object id class. It is intended for single field identity. The identity instance returned has no relationship with the values of the primary key fields of the persistence-capable instance on which the method is called. If the key is the wrong class for the object id class, null is returned.

      For classes that use single field identity, if the parameter is of one of the following types, the behavior must be as specified:

      • Number or Character: the parameter must be the single field type or the wrapper class of the primitive field type; the parameter is passed to the single field identity constructor
      • ObjectIdFieldSupplier: the field value is fetched from the ObjectIdFieldSupplier and passed to the single field identity constructor
      • String: the String is passed to the single field identity constructor
      Parameters:
      pcClass - the Persistable class.
      obj - the Object form of the object id
      Returns:
      the new ObjectId instance, or null if the class is not registered.
    • registerClass

      public static void registerClass(Class pcClass, Persistable pc)
      Register metadata by class. This is called by the enhanced constructor of the Persistable class.
      Parameters:
      pcClass - the Persistable class used as the key for lookup.
      pc - an instance of the Persistable class. TODO We can just do pcClass.newInstance() to get one!
    • unregisterClasses

      public void unregisterClasses(ClassLoader cl)
      Unregister all classes for the specified class loader.
      Parameters:
      cl - ClassLoader
    • addRegisterClassListener

      public void addRegisterClassListener(EnhancementHelper.RegisterClassListener crl)
      Add the specified RegisterClassListener to the listener list.
      Parameters:
      crl - the listener to be added
    • removeRegisterClassListener

      public void removeRegisterClassListener(EnhancementHelper.RegisterClassListener crl)
      Remove the specified RegisterClassListener from the listener list.
      Parameters:
      crl - the listener to be removed
    • getRegisteredClasses

      public Collection<Class> getRegisteredClasses()
      Returns a collection of class objects of the registered persistable classes.
      Returns:
      registered persistable classes
    • getPersistableForClass

      private static Persistable getPersistableForClass(Class pcClass)
      Look up the instance for a Persistable class.
      Parameters:
      pcClass - the Class.
      Returns:
      the Persistable instance for the Class.