Class ClassCopierBase
- java.lang.Object
-
- org.glassfish.pfl.dynamic.copyobject.impl.ClassCopierBase
-
- All Implemented Interfaces:
ClassCopier
- Direct Known Subclasses:
ClassCopierOrdinaryImpl
public abstract class ClassCopierBase extends java.lang.Object implements ClassCopier
A convenient base class for making ClassCopier types. This takes care of checking oldToNew and updating oldToNew when an actual copy is made. All subclasses must override createCopy, which allocates a new result. In some simple cases, this is all that is needed. In the more complex cases, doCopy must also be overridden to make the actual copy.
-
-
Field Summary
Fields Modifier and Type Field Description private booleanisReflectiveprivate java.lang.Stringname
-
Constructor Summary
Constructors Modifier Constructor Description protectedClassCopierBase(java.lang.String name)Pass a name here that can be used for toString, hashCode, and equals.protectedClassCopierBase(java.lang.String name, boolean isReflective)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description private java.util.HashMapcloneEmptyHashMap()java.lang.Objectcopy(java.util.Map<java.lang.Object,java.lang.Object> oldToNew, java.lang.Object source)Make the actual copy of source, using oldToNew to preserve aliasing.protected abstract java.lang.ObjectcreateCopy(java.lang.Object source)Create a copy of source.private java.lang.ObjectdoByFieldCopy(java.util.Map<java.lang.Object,java.lang.Object> oldToNew, java.lang.Object source)protected java.lang.ObjectdoCopy(java.util.Map<java.lang.Object,java.lang.Object> oldToNew, java.lang.Object source, java.lang.Object result)Do the copying of data from source to result.private java.lang.ObjectdoSpecialCaseCopy(java.util.Map<java.lang.Object,java.lang.Object> oldToNew, java.lang.Object source)Sometimes the internal representation of an object will be violated by our field-by-field copy.booleanequals(java.lang.Object obj)inthashCode()private booleanisEmptyHashMap(java.lang.Object source)As of JDK 1.7-40, the JDK relies on the HashMap#table field being identical to a constant.booleanisReflectiveClassCopier()We need to know whether this class copier operates via reflection or not, as the reflective class copier must be able to tell when a super class is copied by an incompatible copier.java.lang.StringtoString()
-
-
-
Constructor Detail
-
ClassCopierBase
protected ClassCopierBase(java.lang.String name)
Pass a name here that can be used for toString, hashCode, and equals. All different ClassCopier classes derived from this base should have unique names.
-
ClassCopierBase
protected ClassCopierBase(java.lang.String name, boolean isReflective)
-
-
Method Detail
-
toString
public final java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
hashCode
public final int hashCode()
- Overrides:
hashCodein classjava.lang.Object
-
equals
public final boolean equals(java.lang.Object obj)
- Overrides:
equalsin classjava.lang.Object
-
copy
public final java.lang.Object copy(java.util.Map<java.lang.Object,java.lang.Object> oldToNew, java.lang.Object source) throws ReflectiveCopyExceptionMake the actual copy of source, using oldToNew to preserve aliasing. This first checks to see whether source has been previously copied. If so, the value obtained from oldToNew is returned. Otherwise,- createCopy( source ) is called to create a new copy of source.
- The new copy is placed in oldToNew with source as its key.
- doCopy is called to complete the copy.
- Specified by:
copyin interfaceClassCopier- Throws:
ReflectiveCopyException
-
doSpecialCaseCopy
private java.lang.Object doSpecialCaseCopy(java.util.Map<java.lang.Object,java.lang.Object> oldToNew, java.lang.Object source)Sometimes the internal representation of an object will be violated by our field-by-field copy. This method handles those special cases. It suggests that there may be a basic problem with our code logic.- Parameters:
oldToNew- a map of already copied objects and their corresponding copies.source- the object to copy.
-
isEmptyHashMap
private boolean isEmptyHashMap(java.lang.Object source)
As of JDK 1.7-40, the JDK relies on the HashMap#table field being identical to a constant. That will not be true if we invoke #doByFieldCopy to copy it, so we need special processing.- Parameters:
source- the object to copy.
-
cloneEmptyHashMap
private java.util.HashMap cloneEmptyHashMap()
-
doByFieldCopy
private java.lang.Object doByFieldCopy(java.util.Map<java.lang.Object,java.lang.Object> oldToNew, java.lang.Object source)
-
isReflectiveClassCopier
public boolean isReflectiveClassCopier()
Description copied from interface:ClassCopierWe need to know whether this class copier operates via reflection or not, as the reflective class copier must be able to tell when a super class is copied by an incompatible copier.- Specified by:
isReflectiveClassCopierin interfaceClassCopier
-
createCopy
protected abstract java.lang.Object createCopy(java.lang.Object source) throws ReflectiveCopyExceptionCreate a copy of source. The copy may or may not be fully initialized. This method must always be overridden in a subclass.- Throws:
ReflectiveCopyException
-
doCopy
protected java.lang.Object doCopy(java.util.Map<java.lang.Object,java.lang.Object> oldToNew, java.lang.Object source, java.lang.Object result) throws ReflectiveCopyExceptionDo the copying of data from source to result. This just returns the result by default, but it may be overrideden in a subclass. When this method completes, result must be fully initialized.- Throws:
ReflectiveCopyException
-
-