Class DeepCloner

java.lang.Object
org.keycloak.models.map.common.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 Details

    • DUMB_CLONER

      public static final DeepCloner DUMB_CLONER
  • Method Details

    • 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 extends AbstractEntity> V entityFieldDelegate(V delegate, EntityFieldDelegate<V> 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