org.apache.openjpa.enhance
Class PCEnhancer

java.lang.Object
  extended by org.apache.openjpa.enhance.PCEnhancer

public class PCEnhancer
extends Object

Bytecode enhancer used to enhance persistent classes from metadata. The enhancer must be invoked on all persistence-capable and persistence aware classes.

Author:
Abe White

Nested Class Summary
static interface PCEnhancer.AuxiliaryEnhancer
          Plugin interface for additional enhancement.
static class PCEnhancer.Flags
          Run flags.
 
Field Summary
(package private)  boolean _addVersionInitFlag
           
static int ENHANCE_AWARE
           
static int ENHANCE_INTERFACE
           
static int ENHANCE_NONE
           
static int ENHANCE_PC
           
static int ENHANCER_VERSION
           
static String ISDETACHEDSTATEDEFINITIVE
           
static String PRE
           
 
Constructor Summary
PCEnhancer(MetaDataRepository repos, serp.bytecode.BCClass type, ClassMetaData meta)
          Constructor.
PCEnhancer(OpenJPAConfiguration conf, serp.bytecode.BCClass type, ClassMetaData meta)
          Constructor.
PCEnhancer(OpenJPAConfiguration conf, serp.bytecode.BCClass type, MetaDataRepository repos)
          Deprecated. use PCEnhancer(OpenJPAConfiguration, BCClass, MetaDataRepository, ClassLoader) instead.
PCEnhancer(OpenJPAConfiguration conf, serp.bytecode.BCClass type, MetaDataRepository repos, ClassLoader loader)
          Constructor.
PCEnhancer(OpenJPAConfiguration conf, Class type)
          Constructor.
PCEnhancer(OpenJPAConfiguration conf, ClassMetaData meta)
          Constructor.
 
Method Summary
static boolean checkEnhancementLevel(Class<?> cls, Log log)
          This static public worker method detects and logs any Entities that may have been enhanced at build time by a version of the enhancer that is older than the current version.
 boolean getAddDefaultConstructor()
          A boolean indicating whether the enhancer should add a no-args constructor if one is not already present in the class.
(package private) static serp.bytecode.BCField getAssignedField(serp.bytecode.BCMethod meth)
          Return the field assigned in the given method, or null if none.
 PCEnhancer.AuxiliaryEnhancer[] getAuxiliaryEnhancers()
          Gets the auxiliary enhancers registered as services.
 BytecodeWriter getBytecodeWriter()
          Return the current BytecodeWriter to write to or null if none.
 boolean getCreateSubclass()
          Whether the enhancer should make its arguments persistence-capable, or generate a persistence-capable subclass.
 File getDirectory()
          The base build directory to generate code to.
 boolean getEnforcePropertyRestrictions()
          Whether to fail if the persistent type uses property access and bytecode analysis shows that it may be violating OpenJPA's property access restrictions.
 serp.bytecode.BCClass getManagedTypeBytecode()
          Return the bytecode representation of the managed class being manipulated.
 ClassMetaData getMetaData()
          Return the metadata for the class being manipulated, or null if not a persistent type.
 serp.bytecode.BCClass getPCBytecode()
          Return the bytecode representation of the persistence-capable class being manipulated.
 boolean getRedefine()
          Whether the enhancer should mutate its arguments, or just run validation and optional subclassing logic on them.
(package private) static serp.bytecode.BCField getReturnedField(serp.bytecode.BCMethod meth)
          Return the field returned by the given method, or null if none.
 Class getType(ClassMetaData meta)
          Return the concrete type for the given class, i.e.
 boolean isAlreadyRedefined()
          Whether the type that this instance is enhancing has already been redefined.
 boolean isAlreadySubclassed()
          Whether the type that this instance is enhancing has already been subclassed in this instance's environment classloader.
(package private)  boolean isFieldAccess(FieldMetaData fmd)
          Affirms if the given field is using method-based access.
static boolean isPCSubclassName(String className)
          Whether or not className is the name for a dynamically-created persistence-capable subclass.
(package private)  boolean isPropertyAccess(ClassMetaData meta)
          Affirms if the given class is using field-based access.
(package private)  boolean isPropertyAccess(FieldMetaData fmd)
          Affirms if the given field is using field-based access.
static void main(String[] args)
          Usage: java org.apache.openjpa.enhance.PCEnhancer [option]* <class name | .java file | .class file | .jdo file>+ Where the following options are recognized.
 void record()
          Write the generated bytecode.
 int run()
          Perform bytecode enhancements.
static boolean run(OpenJPAConfiguration conf, String[] args, Options opts)
          Run the tool.
static boolean run(OpenJPAConfiguration conf, String[] args, PCEnhancer.Flags flags, MetaDataRepository repos, BytecodeWriter writer, ClassLoader loader)
          Enhance the given classes.
static boolean run(String[] args, Options opts)
          Run the tool.
 void setAddDefaultConstructor(boolean addDefaultConstructor)
          A boolean indicating whether the enhancer should add a no-args constructor if one is not already present in the class.
 void setBytecodeWriter(BytecodeWriter writer)
          Set the BytecodeWriter to write the bytecode to or null if none.
 void setCreateSubclass(boolean subclass)
          Whether the enhancer should make its arguments persistence-capable, or generate a persistence-capable subclass.
 void setDirectory(File dir)
          The base build directory to generate code to.
 void setEnforcePropertyRestrictions(boolean fail)
          Whether to fail if the persistent type uses property access and bytecode analysis shows that it may be violating OpenJPA's property access restrictions.
 void setRedefine(boolean redefine)
          Whether the enhancer should mutate its arguments, or just run validation and optional subclassing logic on them.
static String toManagedTypeName(String className)
          If className is a dynamically-created persistence-capable subclass name, returns the name of the class that it subclasses.
(package private) static String toPCSubclassName(Class cls)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

ENHANCER_VERSION

public static final int ENHANCER_VERSION

_addVersionInitFlag

boolean _addVersionInitFlag

ENHANCE_NONE

public static final int ENHANCE_NONE
See Also:
Constant Field Values

ENHANCE_AWARE

public static final int ENHANCE_AWARE
See Also:
Constant Field Values

ENHANCE_INTERFACE

public static final int ENHANCE_INTERFACE
See Also:
Constant Field Values

ENHANCE_PC

public static final int ENHANCE_PC
See Also:
Constant Field Values

PRE

public static final String PRE
See Also:
Constant Field Values

ISDETACHEDSTATEDEFINITIVE

public static final String ISDETACHEDSTATEDEFINITIVE
See Also:
Constant Field Values
Constructor Detail

PCEnhancer

public PCEnhancer(OpenJPAConfiguration conf,
                  Class type)
Constructor. Supply configuration and type to enhance. This will look up the metadata for type from conf's repository.


PCEnhancer

public PCEnhancer(OpenJPAConfiguration conf,
                  ClassMetaData meta)
Constructor. Supply configuration and type to enhance. This will look up the metadata for meta by converting back to a class and then loading from conf's repository.


PCEnhancer

public PCEnhancer(OpenJPAConfiguration conf,
                  serp.bytecode.BCClass type,
                  MetaDataRepository repos)
Deprecated. use PCEnhancer(OpenJPAConfiguration, BCClass, MetaDataRepository, ClassLoader) instead.

Constructor. Supply configuration.

Parameters:
type - the bytecode representation fo the type to enhance; this can be created from any stream or file
repos - a metadata repository to use for metadata access, or null to create a new reporitory; the repository from the given configuration isn't used by default because the configuration might be an implementation-specific subclass whose metadata required more than just base metadata files

PCEnhancer

public PCEnhancer(OpenJPAConfiguration conf,
                  serp.bytecode.BCClass type,
                  MetaDataRepository repos,
                  ClassLoader loader)
Constructor. Supply configuration.

Parameters:
type - the bytecode representation fo the type to enhance; this can be created from any stream or file
repos - a metadata repository to use for metadata access, or null to create a new reporitory; the repository from the given configuration isn't used by default because the configuration might be an implementation-specific subclass whose metadata required more than just base metadata files
loader - the environment classloader to use for loading classes and resources.

PCEnhancer

public PCEnhancer(MetaDataRepository repos,
                  serp.bytecode.BCClass type,
                  ClassMetaData meta)
Constructor. Supply repository. The repository's configuration will be used, and the metadata passed in will be used as-is without doing any additional lookups. This is useful when running the enhancer during metadata load.

Parameters:
repos - a metadata repository to use for metadata access, or null to create a new reporitory; the repository from the given configuration isn't used by default because the configuration might be an implementation-specific subclass whose metadata required more than just base metadata files
type - the bytecode representation fo the type to enhance; this can be created from any stream or file
meta - the metadata to use for processing this type.
Since:
1.1.0

PCEnhancer

public PCEnhancer(OpenJPAConfiguration conf,
                  serp.bytecode.BCClass type,
                  ClassMetaData meta)
Constructor. Supply configuration, type, and metadata.

Method Detail

toPCSubclassName

static String toPCSubclassName(Class cls)

isPCSubclassName

public static boolean isPCSubclassName(String className)
Whether or not className is the name for a dynamically-created persistence-capable subclass.

Since:
1.1.0

toManagedTypeName

public static String toManagedTypeName(String className)
If className is a dynamically-created persistence-capable subclass name, returns the name of the class that it subclasses. Otherwise, returns className.

Since:
1.1.0

getPCBytecode

public serp.bytecode.BCClass getPCBytecode()
Return the bytecode representation of the persistence-capable class being manipulated.


getManagedTypeBytecode

public serp.bytecode.BCClass getManagedTypeBytecode()
Return the bytecode representation of the managed class being manipulated. This is usually the same as getPCBytecode(), except when running the enhancer to redefine and subclass existing persistent types.


getMetaData

public ClassMetaData getMetaData()
Return the metadata for the class being manipulated, or null if not a persistent type.


getAddDefaultConstructor

public boolean getAddDefaultConstructor()
A boolean indicating whether the enhancer should add a no-args constructor if one is not already present in the class. OpenJPA requires that a no-arg constructor (whether created by the compiler or by the user) be present in a PC.


setAddDefaultConstructor

public void setAddDefaultConstructor(boolean addDefaultConstructor)
A boolean indicating whether the enhancer should add a no-args constructor if one is not already present in the class. OpenJPA requires that a no-arg constructor (whether created by the compiler or by the user) be present in a PC.


getRedefine

public boolean getRedefine()
Whether the enhancer should mutate its arguments, or just run validation and optional subclassing logic on them. Usually used in conjunction with setCreateSubclass(true).

Since:
1.0.0

setRedefine

public void setRedefine(boolean redefine)
Whether the enhancer should mutate its arguments, or just run validation and optional subclassing logic on them. Usually used in conjunction with setCreateSubclass(true).

Since:
1.0.0

isAlreadyRedefined

public boolean isAlreadyRedefined()
Whether the type that this instance is enhancing has already been redefined.

Since:
1.0.0

isAlreadySubclassed

public boolean isAlreadySubclassed()
Whether the type that this instance is enhancing has already been subclassed in this instance's environment classloader.

Since:
1.0.0

getCreateSubclass

public boolean getCreateSubclass()
Whether the enhancer should make its arguments persistence-capable, or generate a persistence-capable subclass.

Since:
1.0.0

setCreateSubclass

public void setCreateSubclass(boolean subclass)
Whether the enhancer should make its arguments persistence-capable, or generate a persistence-capable subclass.

Since:
1.0.0

getEnforcePropertyRestrictions

public boolean getEnforcePropertyRestrictions()
Whether to fail if the persistent type uses property access and bytecode analysis shows that it may be violating OpenJPA's property access restrictions.


setEnforcePropertyRestrictions

public void setEnforcePropertyRestrictions(boolean fail)
Whether to fail if the persistent type uses property access and bytecode analysis shows that it may be violating OpenJPA's property access restrictions.


getDirectory

public File getDirectory()
The base build directory to generate code to. The proper package structure will be created beneath this directory. Defaults to overwriting the existing class file if null.


setDirectory

public void setDirectory(File dir)
The base build directory to generate code to. The proper package structure will be creaed beneath this directory. Defaults to overwriting the existing class file if null.


getBytecodeWriter

public BytecodeWriter getBytecodeWriter()
Return the current BytecodeWriter to write to or null if none.


setBytecodeWriter

public void setBytecodeWriter(BytecodeWriter writer)
Set the BytecodeWriter to write the bytecode to or null if none.


run

public int run()
Perform bytecode enhancements.

Returns:
ENHANCE_* constant

record

public void record()
            throws IOException
Write the generated bytecode.

Throws:
IOException

getReturnedField

static serp.bytecode.BCField getReturnedField(serp.bytecode.BCMethod meth)
Return the field returned by the given method, or null if none. Package-protected and static for testing.


getAssignedField

static serp.bytecode.BCField getAssignedField(serp.bytecode.BCMethod meth)
Return the field assigned in the given method, or null if none. Package-protected and static for testing.


getAuxiliaryEnhancers

public PCEnhancer.AuxiliaryEnhancer[] getAuxiliaryEnhancers()
Gets the auxiliary enhancers registered as services.


isPropertyAccess

boolean isPropertyAccess(ClassMetaData meta)
Affirms if the given class is using field-based access.


isPropertyAccess

boolean isPropertyAccess(FieldMetaData fmd)
Affirms if the given field is using field-based access.


isFieldAccess

boolean isFieldAccess(FieldMetaData fmd)
Affirms if the given field is using method-based access.


getType

public Class getType(ClassMetaData meta)
Return the concrete type for the given class, i.e. impl for managed interfaces


main

public static void main(String[] args)
Usage: java org.apache.openjpa.enhance.PCEnhancer [option]* <class name | .java file | .class file | .jdo file>+ Where the following options are recognized. Each additional argument can be either the full class name of the type to enhance, the path to the .java file for the type, the path to the .class file for the type, or the path to a .jdo file listing one or more types to enhance. If the type being enhanced has metadata, it will be enhanced as a persistence capable class. If not, it will be considered a persistence aware class, and all access to fields of persistence capable classes will be replaced by the appropriate get/set method. If the type explicitly declares the persistence-capable interface, it will not be enhanced. Thus, it is safe to invoke the enhancer on classes that are already enhanced.


run

public static boolean run(String[] args,
                          Options opts)
Run the tool. Returns false if invalid options given. Runs against all the persistence units defined in the resource to parse.


run

public static boolean run(OpenJPAConfiguration conf,
                          String[] args,
                          Options opts)
                   throws IOException
Run the tool. Returns false if invalid options given.

Throws:
IOException

run

public static boolean run(OpenJPAConfiguration conf,
                          String[] args,
                          PCEnhancer.Flags flags,
                          MetaDataRepository repos,
                          BytecodeWriter writer,
                          ClassLoader loader)
                   throws IOException
Enhance the given classes.

Throws:
IOException

checkEnhancementLevel

public static boolean checkEnhancementLevel(Class<?> cls,
                                            Log log)
This static public worker method detects and logs any Entities that may have been enhanced at build time by a version of the enhancer that is older than the current version.

Parameters:
cls - - A non-null Class implementing org.apache.openjpa.enhance.PersistenceCapable.
log - - A non-null org.apache.openjpa.lib.log.Log.
Returns:
true if the provided Class is down level from the current PCEnhancer.ENHANCER_VERSION. False otherwise.
Throws:
- - IllegalStateException if cls doesn't implement org.apache.openjpa.enhance.PersistenceCapable.


Copyright © 2006-2012 Apache Software Foundation. All Rights Reserved.