Module org.eclipse.persistence.jpa
Class ClassWeaver
java.lang.Object
org.eclipse.persistence.asm.ClassVisitor
org.eclipse.persistence.internal.jpa.weaving.ClassWeaver
INTERNAL: Weaves classes to allow them to support EclipseLink indirection.
Classes are weaved to add a variable of type ValueHolderInterface for each
attribute that uses indirection. In addition, access methods are added for
the new variable. Also, triggers the process of weaving the methods of the
class.
- See Also:
-
Field Summary
Modifier and TypeFieldDescriptionprotected boolean
static final String
protected ClassDetails
Stores information on the class gathered from the temp class loader and descriptor.static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
static final String
boolean
static final String
static final String
boolean
boolean
boolean
boolean
boolean
static final String
Fields inherited from class org.eclipse.persistence.asm.ClassVisitor
customClassVisitor, cv
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
addFetchGroupMethods
(ClassDetails classDetails) Adds get/set method for FetchGroupTracker interface.void
Add a variable of type FetchGroup, Session to the class.void
addGetPropertyChangeListener
(ClassDetails classDetails) Add the implementation of the changeTracker_getPropertyChangeListener method to the class.void
addGetterMethodForFieldAccess
(ClassDetails classDetails, AttributeDetails attributeDetails) Adds a convenience method used to replace a GETFIELD when field access is used.void
addGetterMethodForValueHolder
(ClassDetails classDetails, AttributeDetails attributeDetails) Add a get method for the newly added valueholder.void
addInitializerForValueHolder
(ClassDetails classDetails, AttributeDetails attributeDetails) Add a method that allows us to lazily initialize a valueholder we have woven in This allows us to avoid initializing valueholders in the constructor.void
addPersistenceEntityMethods
(ClassDetails classDetails) Adds get/set method for PersistenceEntity interface.void
Add a variable of type Object to the class.void
addPersistenceGetSet
(ClassDetails classDetails) Add an internal generic get and set method.void
addPersistenceNew
(ClassDetails classDetails) Add an internal empty constructor, and new method.void
addPersistencePostClone
(ClassDetails classDetails) Add an internal post clone method.void
addPersistenceRestMethods
(ClassDetails classDetails) void
void
addPropertyChange
(ClassDetails classDetails) Add a method to track property changes.void
addPropertyChangeListener
(boolean attributeAccess) Add a variable of type PropertyChangeListener to the class.void
addSetPropertyChangeListener
(ClassDetails classDetails) Add the implementation of the changeTracker_setPropertyChangeListener method to the class.void
addSetterMethodForFieldAccess
(ClassDetails classDetails, AttributeDetails attributeDetails) Adds a convenience method used to replace a PUTFIELD when field access is used.void
addSetterMethodForValueHolder
(ClassDetails classDetails, AttributeDetails attributeDetails) Add a set method for the newly added ValueHolder.void
addShallowClone
(ClassDetails classDetails) Add an internal shallow clone method.void
addValueHolder
(AttributeDetails attributeDetails) Add a variable of type ValueHolderInterface to the class.static String
getWeavedValueHolderGetMethodName
(String attributeName) Return the get method name weaved for a value-holder attribute.static String
getWeavedValueHolderSetMethodName
(String attributeName) Return the set method name weaved for a value-holder attribute.static boolean
Return if the JAXB classes are on the classpath (if they are the XmlTransient annotation is added).static void
unwrapPrimitive
(AttributeDetails attribute, MethodVisitor visitor) Used for primitive conversion.void
visit
(int version, int access, String name, String signature, String superName, String[] interfaces) Visit the class byte-codes and modify to weave Persistence interfaces.visitAnnotation
(String desc, boolean visible) void
visitEnd()
Visit the end of the class byte codes.visitField
(int access, String name, String desc, String signature, Object value) visitMethod
(int access, String methodName, String desc, String signature, String[] exceptions) Construct a MethodWeaver and allow it to process the method.static String
wrapperFor
(int sort) Used for primitive conversion.Methods inherited from class org.eclipse.persistence.asm.ClassVisitor
setCustomClassVisitor, unwrap, visitAnnotationSuper, visitFieldSuper, visitMethodSuper, visitSuper
-
Field Details
-
PERSISTENCE_WEAVED_SHORT_SIGNATURE
- See Also:
-
TW_LAZY_SHORT_SIGNATURE
- See Also:
-
VHI_CLASSNAME
- See Also:
-
VH_SHORT_SIGNATURE
- See Also:
-
VHI_SHORT_SIGNATURE
- See Also:
-
VHI_SIGNATURE
- See Also:
-
TW_CT_SHORT_SIGNATURE
- See Also:
-
PCL_SHORT_SIGNATURE
- See Also:
-
PCL_SIGNATURE
- See Also:
-
CT_SHORT_SIGNATURE
- See Also:
-
PCE_SHORT_SIGNATURE
- See Also:
-
PCE_SIGNATURE
- See Also:
-
PERSISTENCE_ENTITY_SHORT_SIGNATURE
- See Also:
-
PERSISTENCE_OBJECT_SHORT_SIGNATURE
- See Also:
-
PERSISTENCE_OBJECT_SIGNATURE
- See Also:
-
VECTOR_SIGNATURE
- See Also:
-
OBJECT_SIGNATURE
- See Also:
-
STRING_SIGNATURE
- See Also:
-
CACHEKEY_SIGNATURE
- See Also:
-
WEAVED_FETCHGROUPS_SHORT_SIGNATURE
- See Also:
-
FETCHGROUP_TRACKER_SIGNATURE
- See Also:
-
FETCHGROUP_TRACKER_SHORT_SIGNATURE
- See Also:
-
FETCHGROUP_SHORT_SIGNATURE
- See Also:
-
FETCHGROUP_SIGNATURE
- See Also:
-
SESSION_SIGNATURE
- See Also:
-
ENTITY_MANAGER_IMPL_SHORT_SIGNATURE
- See Also:
-
PBOOLEAN_SIGNATURE
- See Also:
-
LONG_SIGNATURE
- See Also:
-
WEAVED_REST_LAZY_SHORT_SIGNATURE
- See Also:
-
LIST_RELATIONSHIP_INFO_SIGNATURE
- See Also:
-
LIST_RELATIONSHIP_INFO_GENERIC_SIGNATURE
- See Also:
-
LINK_SIGNATURE
- See Also:
-
ITEM_LINKS_SIGNATURE
- See Also:
-
CLONEABLE_SHORT_SIGNATURE
- See Also:
-
JPA_TRANSIENT_DESCRIPTION
- See Also:
-
XML_TRANSIENT_DESCRIPTION
- See Also:
-
PERSISTENCE_SET
- See Also:
-
PERSISTENCE_GET
- See Also:
-
PERSISTENCE_FIELDNAME_PREFIX
- See Also:
-
PERSISTENCE_FIELDNAME_POSTFIX
- See Also:
-
VIRTUAL_GETTER_SIGNATURE
- See Also:
-
VIRTUAL_SETTER_SIGNATURE
- See Also:
-
classDetails
Stores information on the class gathered from the temp class loader and descriptor. -
alreadyWeaved
protected boolean alreadyWeaved -
weaved
public boolean weaved -
weavedLazy
public boolean weavedLazy -
weavedPersistenceEntity
public boolean weavedPersistenceEntity -
weavedChangeTracker
public boolean weavedChangeTracker -
weavedFetchGroups
public boolean weavedFetchGroups -
weavedRest
public boolean weavedRest
-
-
Constructor Details
-
ClassWeaver
-
-
Method Details
-
wrapperFor
Used for primitive conversion. Returns the name of the class that wraps a given type. -
unwrapPrimitive
Used for primitive conversion. Returns the name conversion method for the given type. -
getWeavedValueHolderGetMethodName
Return the get method name weaved for a value-holder attribute. -
getWeavedValueHolderSetMethodName
Return the set method name weaved for a value-holder attribute. -
isJAXBOnPath
public static boolean isJAXBOnPath()Return if the JAXB classes are on the classpath (if they are the XmlTransient annotation is added). -
addValueHolder
Add a variable of type ValueHolderInterface to the class. When this method has been run, the class will contain a variable declaration similar to the following: private ValueHolderInterface _persistence_variableName_vh; -
addPropertyChangeListener
public void addPropertyChangeListener(boolean attributeAccess) Add a variable of type PropertyChangeListener to the class. When this method has been run, the class will contain a variable declaration similar to the following private transient _persistence_listener; -
addGetPropertyChangeListener
Add the implementation of the changeTracker_getPropertyChangeListener method to the class. The result is a method that looks as follows: public PropertyChangeListener _persistence_getPropertyChangeListener() { return _persistence_listener; } -
addSetPropertyChangeListener
Add the implementation of the changeTracker_setPropertyChangeListener method to the class. The result is a method that looks as follows: public void _persistence_setPropertyChangeListener(PropertyChangeListener propertychangelistener){ _persistence_listener = propertychangelistener; } -
addPropertyChange
Add a method to track property changes. The method will look as follows: public void _toplink_propertyChange(String s, Object obj, Object obj1){ if(_persistence_listener != null && obj != obj1){ _persistence_listener.propertyChange(new PropertyChangeEvent(this, s, obj, obj1)); } } -
addInitializerForValueHolder
public void addInitializerForValueHolder(ClassDetails classDetails, AttributeDetails attributeDetails) Add a method that allows us to lazily initialize a valueholder we have woven in This allows us to avoid initializing valueholders in the constructor. protected void _persistence_initialize_attribute_vh(){ if(_persistence_attribute_vh == null){ _persistence_attribute_vh = new ValueHolder(this.attribute); // or new ValueHolder() if property access. _persistence_attribute_vh.setIsNewlyWeavedValueHolder(true); } } -
addGetterMethodForValueHolder
public void addGetterMethodForValueHolder(ClassDetails classDetails, AttributeDetails attributeDetails) Add a get method for the newly added valueholder. Adds a method of the following form: public WeavedAttributeValueHolderInterface _persistence_getfoo_vh(){ _persistence_initialize_attributeName_vh(); if (_persistence_vh.isCoordinatedWithProperty() || _persistence_foo_vh.isNewlyWeavedValueHolder()){ EntityC object = (EntityC)getFoo(); if (object != _persistence_foo_vh.getValue()){ setFoo(object); } } return _persistence_foo_vh; } -
addSetterMethodForValueHolder
public void addSetterMethodForValueHolder(ClassDetails classDetails, AttributeDetails attributeDetails) Add a set method for the newly added ValueHolder. Adds a method of this form: public void _persistence_setfoo_vh(WeavedAttributeValueHolderInterface valueholderinterface){ _persistence_foo_vh = valueholderinterface; if (valueholderinterface.isInstantiated()){ Object object = getFoo(); Object value = valueholderinterface.getValue(); if (object != value){ setFoo((EntityC)value); } } else { foo = null; } } -
addSetterMethodForFieldAccess
public void addSetterMethodForFieldAccess(ClassDetails classDetails, AttributeDetails attributeDetails) Adds a convenience method used to replace a PUTFIELD when field access is used. The method follows the following form: public void _persistence_set_variableName((VariableClas) argument) { _persistence_checkFetchedForSet("variableName"); _persistence_initialize_variableName_vh(); _persistence_propertyChange("variableName", this.variableName, argument); // if change tracking enabled, wrapping primitives, i.e. Long.valueOf(item) this.variableName = argument; _persistence_variableName_vh.setValue(variableName); // if lazy enabled } -
addGetterMethodForFieldAccess
public void addGetterMethodForFieldAccess(ClassDetails classDetails, AttributeDetails attributeDetails) Adds a convenience method used to replace a GETFIELD when field access is used. The method follows the following form: public (VariableClass) _persistence_get_variableName() { _persistence_checkFetched("variableName"); _persistence_initialize_variableName_vh(); this.variableName = ((VariableClass))_persistence_variableName_vh.getValue(); return this.variableName; } -
addPersistenceEntityVariables
public void addPersistenceEntityVariables()Add a variable of type Object to the class. When this method has been run, the class will contain a variable declarations similar to the following: private Object _persistence_primaryKey; -
addPersistencePostClone
Add an internal post clone method. This will clone value holders to avoid change original/clone to effect the other. public Object _persistence_post_clone() { this._attribute_vh = this._attribute_vh.clone(); ... this._persistence_listener = null; return this; } -
addPersistenceRestMethods
-
addPersistenceRestVariables
public void addPersistenceRestVariables() -
addShallowClone
Add an internal shallow clone method. This can be used to optimize uow cloning. public Object _persistence_shallow_clone() { return super.clone(); } -
addPersistenceNew
Add an internal empty constructor, and new method. This is used to avoid unnecessary initialization and avoid reflection. public void _persistence_new(PersistenceObject factory) { return new ClassType(factory); } public ClassType(PersistenceObject factory) { super(); } -
addPersistenceGetSet
Add an internal generic get and set method. This is used to avoid reflection. public Object _persistence_get(String attribute) { if (attribute == "address") { return this.address; } if (attribute == "city") { return this.city; } return null; } public void _persistence_set(int index, Object value) { if (attribute == "address") { this.address = (String)value; } else if (attribute == "city") { this.city = (String)city; } } -
addPersistenceEntityMethods
Adds get/set method for PersistenceEntity interface. This adds the following methods: public Object _persistence_getId() { return _persistence_primaryKey; } public void _persistence_setId(Object primaryKey) { this._persistence_primaryKey = primaryKey; } -
addFetchGroupVariables
public void addFetchGroupVariables()Add a variable of type FetchGroup, Session to the class. When this method has been run, the class will contain a variable declarations similar to the following: private FetchGroup _persistence_fetchGroup; private boolean _persistence_shouldRefreshFetchGroup; private Session _persistence_session; -
addFetchGroupMethods
Adds get/set method for FetchGroupTracker interface. This adds the following methods: public Session _persistence_getSession() { return _persistence_session; } public void _persistence_setSession(Session session) { this._persistence_session = session; } public FetchGroup _persistence_getFetchGroup() { return _persistence_fetchGroup; } public void _persistence_setFetchGroup(FetchGroup fetchGroup) { this._persistence_fetchGroup = fetchGroup; } public boolean _persistence_shouldRefreshFetchGroup() { return _persistence_shouldRefreshFetchGroup; } public void _persistence_setShouldRefreshFetchGroup(boolean shouldRefreshFetchGroup) { this._persistence_shouldRefreshFetchGroup = shouldRefreshFetchGroup; } public void _persistence_resetFetchGroup() { } public void _persistence_isAttributeFetched(String attribute) { return this._persistence_fetchGroup == null || _persistence_fetchGroup.containsAttribute(attribute); } public void _persistence_checkFetched(String attribute) { if (this._persistence_fetchGroup != null) { EntityManagerImpl.processUnfetchedAttribute(this, attribute); } } public void _persistence_checkSetFetched(String attribute) { if (this._persistence_fetchGroup != null) { EntityManagerImpl.processUnfetchedAttributeForSet(this, attribute); } } -
visit
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) Visit the class byte-codes and modify to weave Persistence interfaces. This add PersistenceWeaved, PersistenceWeavedLazy, PersistenceWeavedChangeTracking, PersistenceEntity, ChangeTracker. The new interfaces are pass to the super weaver.- Overrides:
visit
in classClassVisitor
-
visitMethod
public MethodVisitor visitMethod(int access, String methodName, String desc, String signature, String[] exceptions) Construct a MethodWeaver and allow it to process the method.- Overrides:
visitMethod
in classClassVisitor
-
visitEnd
public void visitEnd()Visit the end of the class byte codes. Add any new methods or variables to the end.- Overrides:
visitEnd
in classClassVisitor
-
visitAnnotation
- Overrides:
visitAnnotation
in classClassVisitor
-
visitField
public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) - Overrides:
visitField
in classClassVisitor
-