Class DirectCopyClassTransformer

java.lang.Object
org.broadleafcommerce.common.extensibility.jpa.copy.AbstractClassTransformer
org.broadleafcommerce.common.extensibility.jpa.copy.DirectCopyClassTransformer
All Implemented Interfaces:
jakarta.persistence.spi.ClassTransformer, BroadleafClassTransformer, org.springframework.beans.factory.InitializingBean
Direct Known Subclasses:
OptionalDirectCopyClassTransformer

public class DirectCopyClassTransformer extends AbstractClassTransformer implements BroadleafClassTransformer
This class transformer will copy fields, methods, and interface definitions from a source class to a target class, based on the xformTemplates map. It will fail if it encounters any duplicate definitions.
Author:
Andre Azzolini (apazzolini), Jeff Fischer
  • Field Details

  • Constructor Details

    • DirectCopyClassTransformer

      public DirectCopyClassTransformer(String moduleName)
  • Method Details

    • compileJPAProperties

      public void compileJPAProperties(Properties props, Object key) throws Exception
      Specified by:
      compileJPAProperties in interface BroadleafClassTransformer
      Throws:
      Exception
    • transform

      public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException
      Specified by:
      transform in interface jakarta.persistence.spi.ClassTransformer
      Throws:
      IllegalClassFormatException
    • combineXFormParams

      Combines two DirectCopyClassTransformer.XFormParams together with first passed in xformParama supercedes the second passed in parameter.
      Parameters:
      defaultParams -
      conditionalParams -
      Returns:
    • reviewDirectCopyTransformAnnotations

      protected DirectCopyClassTransformer.XFormParams reviewDirectCopyTransformAnnotations(javassist.CtClass clazz, boolean mySkipOverlaps, boolean myRenameMethodOverlaps, List<DirectCopyIgnorePattern> matchedPatterns)
      Retrieves DirectCopyTransformTypes that are placed as annotations on classes.
      Parameters:
      clazz -
      mySkipOverlaps -
      myRenameMethodOverlaps -
      matchedPatterns -
      Returns:
    • reviewConditionalDirectCopyTransforms

      protected DirectCopyClassTransformer.XFormParams reviewConditionalDirectCopyTransforms(String convertedClassName, List<DirectCopyIgnorePattern> matchedPatterns)
      Retrieves DirectCopyTransformTypes that are conditionally/optionally included via properties file.
      Parameters:
      convertedClassName -
      matchedPatterns -
      Returns:
      See Also:
    • reviewTemplateTokens

      protected List<String> reviewTemplateTokens(List<DirectCopyIgnorePattern> matchedPatterns, String val)
    • transformIndexAnnotations

      protected void transformIndexAnnotations(javassist.bytecode.ClassFile classFile, javassist.bytecode.ClassFile templateClassFile, javassist.bytecode.ConstPool constantPool, List<IndexAnnotationDto> indexes) throws javassist.NotFoundException
      Throws:
      javassist.NotFoundException
    • getIndexes

      protected javassist.bytecode.annotation.Annotation getIndexes(javassist.bytecode.ConstPool constantPool, javassist.bytecode.annotation.Annotation existingTable, javassist.bytecode.annotation.Annotation templateTable, List<IndexAnnotationDto> indexes)
    • cloneIndexAnnotation

      protected javassist.bytecode.annotation.Annotation cloneIndexAnnotation(javassist.bytecode.annotation.Annotation annotation, javassist.bytecode.ConstPool constantPool)
    • cloneUniqueAnnotation

      protected javassist.bytecode.annotation.Annotation cloneUniqueAnnotation(javassist.bytecode.annotation.Annotation annotation, javassist.bytecode.ConstPool constantPool)
    • buildClassLevelAnnotations

      protected void buildClassLevelAnnotations(javassist.bytecode.ClassFile classFile, javassist.bytecode.ClassFile templateClassFile, javassist.bytecode.ConstPool constantPool) throws javassist.NotFoundException
      Throws:
      javassist.NotFoundException
    • buildEntityListenerAnnotations

      protected void buildEntityListenerAnnotations(javassist.bytecode.ClassFile classFile, javassist.bytecode.ClassFile templateClassFile, javassist.bytecode.ConstPool constantPool) throws javassist.NotFoundException
      Throws:
      javassist.NotFoundException
    • getEntityListeners

      protected javassist.bytecode.annotation.Annotation getEntityListeners(javassist.bytecode.ConstPool constantPool, javassist.bytecode.annotation.Annotation existingEntityListeners, javassist.bytecode.annotation.Annotation templateEntityListeners)
    • buildClassCacheAnnotation

      protected void buildClassCacheAnnotation(javassist.bytecode.ClassFile classFile, javassist.bytecode.ClassFile templateClassFile, javassist.bytecode.ConstPool constantPool) throws javassist.NotFoundException
      Allows replacing of Cache annotations at the class level
      Parameters:
      classFile -
      templateClassFile -
      constantPool -
      Throws:
      javassist.NotFoundException
    • getNewCacheAnnotation

      protected javassist.bytecode.annotation.Annotation getNewCacheAnnotation(javassist.bytecode.ConstPool constantPool, javassist.bytecode.annotation.Annotation annotation)
    • getImplementationType

      protected String getImplementationType(String className)
      This method will do its best to return an implementation type for a given classname. This will allow weaving template classes to have initialized values.

      We provide default implementations for List, Map, and Set, and will attempt to utilize a default constructor for other classes.

      If the className contains an '[', we will return null.

    • methodDescription

      protected String methodDescription(javassist.CtMethod method)
    • getXformTemplates

      public Map<String,String> getXformTemplates()
    • setXformTemplates

      public void setXformTemplates(Map<String,String> xformTemplates)
    • addXformTemplate

      public DirectCopyClassTransformer addXformTemplate(String classToTransform, String contributingClass)
      Parameters:
      classToTransform - the class that will be transformed at runtime
      contributingClass - the class that should be bytecode-merged into classToTransform
      Returns:
    • getRenameMethodOverlaps

      public Boolean getRenameMethodOverlaps()
    • setRenameMethodOverlaps

      public void setRenameMethodOverlaps(Boolean renameMethodOverlaps)
    • getRenameMethodPrefix

      public String getRenameMethodPrefix()
    • setRenameMethodPrefix

      public void setRenameMethodPrefix(String renameMethodPrefix)
    • getSkipOverlaps

      public Boolean getSkipOverlaps()
    • setSkipOverlaps

      public void setSkipOverlaps(Boolean skipOverlaps)
    • getTemplateTokens

      public Map<String,String> getTemplateTokens()
    • setTemplateTokens

      public void setTemplateTokens(Map<String,String> templateTokens)
    • getIgnorePatterns

      public List<DirectCopyIgnorePattern> getIgnorePatterns()
    • setIgnorePatterns

      public void setIgnorePatterns(List<DirectCopyIgnorePattern> ignorePatterns)