Class DeepCloner


  • public class DeepCloner
    extends Object
    Helper class for deep cloning and fine-grained instantiation per interface and deep copying their properties.

    This class is intended to be used by individual map storage implementations for copying over entities into their native implementations.

    For example, a MapClientEntity interface could be implemented by MapClientEntityImpl (used by a file-based storage in this example) and an HotRodClientEntityImpl (for Infinispan). Say that the Infinispan is stacked on top of the file-based storage to provide caching layer. Upon first read, a MapClientEntityImpl could be obtained from file-based storage and passed to Infinispan layer for caching. Infinispan, regardless of the actual implementation, need to store the MapClientEntity data in a form that can be processed and sent over the wire in Infinispan (say in an InfinispanClientEntityImpl). To achieve this, the Infinispan store has to clone the file entity values from the MapClientEntityImpl to InfinispanClientEntityImpl, i.e. it performs deep cloning, using this helper class.

    Broader context: In tree store, map storages are agnostic to their neighbours. Therefore each implementation can be provided with a record (a MapClientEntity instance in the example above) originating from any other implementation. For a map storage to process the record (beyond read-only mode), it needs to be able to clone it into its own entity. Each of the storages thus can benefit from the DeepCloner capabilities.

    Author:
    hmlnarik
    • Field Detail

      • DUMB_CLONER

        public static final DeepCloner DUMB_CLONER
    • Method Detail

      • delegate

        public <D,​V extends D> D delegate​(V delegate,
                                                DelegateProvider<D> delegateProvider)
      • delegate

        public <D,​V extends D> D delegate​(Class<V> delegateClass,
                                                DelegateProvider<D> delegateProvider)
      • entityFieldDelegate

        public <V> V entityFieldDelegate​(Class<V> delegateClass,
                                         EntityFieldDelegate<V> delegateProvider)
      • emptyInstance

        public <V> V emptyInstance​(Class<V> instanceClass)
      • newInstance

        public <V> V newInstance​(Class<V> clazz)
        Creates a new instance of the given class or interface if the parameterless constructor for that type is known.
        Type Parameters:
        V - Type (class or a @Root interface) to create a new instance
        Parameters:
        clazz - Type (class or a @Root interface) to create a new instance
        Returns:
        A new instance
        Throws:
        IllegalStateException - When the constructor is not known.
      • newInstanceType

        public <V> Class<? extends V> newInstanceType​(Class<V> valueType)
        Returns a class type of an instance that would be instantiated by newInstance(java.lang.Class) method.
        Type Parameters:
        V - Type (class or a @Root interface) to create a new instance
        Parameters:
        valueType - Type (class or a @Root interface) to create a new instance
        Returns:
        See description
      • deepClone

        public <V> V deepClone​(V from,
                               V to)
        Deeply clones properties from the from instance to the to instance.
        Type Parameters:
        V - Type (class or a @Root interface) to clone the instance
        Parameters:
        from - Original instance
        to - Instance to copy the properties onto
        Returns:
        Instance which has all the properties same as the from. Preferably, to is returned. However from is returned if the cloner is not known and generic cloner is not available.
      • deepCloneNoId

        public <V> V deepCloneNoId​(V from,
                                   V to)
        Deeply clones properties from the from instance to the to instance excluding the ID field.
        Type Parameters:
        V - Type (class or a @Root interface) to clone the instance
        Parameters:
        from - Original instance
        to - Instance to copy the properties onto
        Returns:
        Instance which has all the properties same as the from. Preferably, to is returned. However from is returned if the cloner is not known and generic cloner is not available.
      • from

        public <V extends AbstractEntity> V from​(String newId,
                                                 V from)
        Creates a new instance of the given type and copies its properties from the from instance
        Type Parameters:
        V - Type (class or a @Root interface) to create a new instance and clone properties from
        Parameters:
        newId - ID of the new object
        from - Original instance
        Returns:
        Newly created instance or null if from is null.
      • from

        public <V> V from​(V from)
        Creates a new instance of the given type and copies its properties from the from instance
        Type Parameters:
        V - Type (class or a @Root interface) to create a new instance and clone properties from
        Parameters:
        from - Original instance
        Returns:
        Newly created instance or null if from is null.
      • warnCloneNotSupported

        public static <T> T warnCloneNotSupported​(T o)
        Issues warning in the logs and returns the input parameter o
        Parameters:
        o -
        Returns:
        The o object