openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Albert Lee (JIRA)" <j...@apache.org>
Subject [jira] Commented: (OPENJPA-367) PCEnhancer does not find meta data for entities using pure XML annotation
Date Wed, 12 Sep 2007 19:48:32 GMT

    [ https://issues.apache.org/jira/browse/OPENJPA-367?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12526887
] 

Albert Lee commented on OPENJPA-367:
------------------------------------

Patrick, thanks for the pointer to the serp code. It helps a lot.  This problem has nothing
to do with Serp.

The scope of the problem is:

1) When pcEnhancer is invoked with a target (i.e. test.XMLDatatypeSupportTestEntity), the
ClassArgParser.parseTypes() is called to process the arguments and indirectly the entity is
loaded using the TemporaryClassLoader. Subsequently, when the orm.xml is parsed, the same
TemporaryClassLoader is used as the key to the meta data repository map.

    TemporaryClassLoader.loadClass(String, boolean) line: 78	
    TemporaryClassLoader.loadClass(String) line: 44	
    ClassLoader.defineClassImpl(String, byte[], int, int, Object) line: not available [native
method]	
    TemporaryClassLoader(ClassLoader).defineClass(String, byte[], int, int, ProtectionDomain)
line: 224	
    TemporaryClassLoader(ClassLoader).defineClass(String, byte[], int, int) line: 163	
    TemporaryClassLoader.loadClass(String, boolean) line: 78	
    TemporaryClassLoader.loadClass(String) line: 44	
    Class<T>.forNameImpl(String, boolean, ClassLoader) line: not available [native method]

    Class<T>.forName(String, boolean, ClassLoader) line: 164	
    Strings.toClass(String, boolean, ClassLoader) line: 162	
    Strings.toClass(String, ClassLoader) line: 108	
    ClassArgParser.parseTypes(String) line: 164	
    PCEnhancer.run(OpenJPAConfiguration, String[], PCEnhancer$Flags, MetaDataRepository, BytecodeWriter,
ClassLoader) line: 4333	
    PCEnhancer.run(OpenJPAConfiguration, String[], Options) line: 4296	
    PCEnhancer.main(String[]) line: 4268	

2) When no target is specified, the argument process is skipped and proceed to meta-data processing.
The first step to do is to load entity class using serp.Project.  Currently, the project's
loadClass() method is called without a classloader, therefore Project uses a default, which
is the application context classloader (Thread.currentThread().getContextClassLoader();)
However, the remaining meta-data processing follow the exactly the same path as the successfully
scenario and use the TemporaryClassLoader to load the entity class. This later entity Class
object is used as the key to the meta-data repository map.  When all the processing is finished,
MetaDataRepository.getMetaDataInternal( entityClass_from_applCtxtClassLoader) is called to
lookup the meta data and was not found.

--------------------------------
  PCEnhancer.java
        for (Iterator itr = classes.iterator(); itr.hasNext();) {
            Object o = itr.next();
            if (log.isTraceEnabled())
                log.trace(_loc.get("enhance-running", o));

            if (o instanceof String)
                bc = project.loadClass((String) o, loader); //<<<<  loader is
added to resolve the observed problem
            else
                bc = project.loadClass((Class) o);
            enhancer = new PCEnhancer(conf, bc, repos, loader);
--------------------------------
  serp.Project.java
      public BCClass loadClass(String name) {
        return loadClass(name, null);
    }
--------------------------------
    public BCClass loadClass(String name, ClassLoader loader) {
        // convert to proper Class.forName() form
        name = _names.getExternalForm(name, false);

        BCClass cached = checkCache(name);
        if (cached != null)
            return cached;

        // check for existing type
        if (loader == null)
            loader = Thread.currentThread().getContextClassLoader();
        try {
            return loadClass(Strings.toClass(name, loader));
        } catch (Exception e) {
        }
--------------------------------

I modified PCEnhancer.run method and add the classloader parameter to the project.loadClass()
 call to request Project to load the entity class using the TemporaryClassLoader. This seems
to fix the problem.

            if (o instanceof String)
                bc = project.loadClass((String) o, loader); //<<<<  loader is
added to resolve the observed problem

Is this the correct fix strategy for this problem?

Thanks,
Albert Lee

> PCEnhancer does not find meta data for entities using pure XML annotation
> -------------------------------------------------------------------------
>
>                 Key: OPENJPA-367
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-367
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 1.0.0
>         Environment: All platforms
>            Reporter: Albert Lee
>         Attachments: OPENJPA-367.test.jar
>
>
> When an entity is defined using pure XML (i.e. no annotation in the entity class), the
enhancer does not recognized the meta data and no enhancing will take place: E.g.
> -----------------------------------------
> C:\temp\test>runPcEnhancer.bat
> C:\temp\test>java -cp C:\temp\test\;C:\temp\test\openjpa-1.1.0-SNAPSHOT.jar;C:\temp\test\utils.jar;C:\temp\test\geronimo-jpa_3.0_spec-1.0.jar;C:\temp\test\geronimo-jta_1.1_spec-1.1.jar
org.apache.openjpa.enhance.PCEnhancer
> 15  EntityUnit_JSE  TRACE  [main] openjpa.Runtime - Setting the following properties
from "file:/C:/temp/test/META-INF/persistence.xml" into configuration: {openjpa.Id=EntityUnit_JSE,
openjpa.Log=DefaultLevel=TRACE, openjpa.MetaDataFactory=jpa(Resources=META-INF/jpamappings.xml,
Types=test.XMLDatatypeSupportTestEntity)}
> 31  EntityUnit_JSE  TRACE  [main] openjpa.Runtime - No cache marshaller found for id
org.apache.openjpa.conf.MetaDataCacheMaintenance.
> 47  EntityUnit_JSE  INFO   [main] openjpa.Tool - No targets were given.  Running on all
classes in your persistent classes list, or all metadata files in classpath directories if
you have not listed your persistent classes.  Use -help to display tool usage information.
> 62  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Scanning resource "META-INF/jpamappings.xml"
for persistent types.
> 62  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Scan of "META-INF/jpamappings.xml"
found persistent types [Ljava.lang.String;@3a183a18.
> 62  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Mapping resource location "file:/C:/temp/test/META-INF/jpamappings.xml"
to persistent types "[test.XMLDatatypeSupportTestEntity]".
> 62  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Scanning resource "META-INF/orm.xml"
for persistent types.
> 62  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - parsePersistentTypeNames() found
[test.XMLDatatypeSupportTestEntity].
> 62  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Found 1 classes with metadata in
15 milliseconds.
> 62  EntityUnit_JSE  TRACE  [main] openjpa.Tool - Enhancer running on type "test.XMLDatatypeSupportTestEntity".
> 93  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Loading metadata for "class test.XMLDatatypeSupportTestEntity"
under mode "[META]".
> 125  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Parsing resource "file:/C:/temp/test/META-INF/jpamappings.xml".
> 156  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Parsing class "test.XMLDatatypeSupportTestEntity".
> 172  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Generating default metadata for
type "test.XMLDatatypeSupportTestEntity".
> 172  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Using reflection for metadata generation.
> 187  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Parsing class "test.XMLDatatypeSupportTestEntity".
> 187  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Parsing package "test.XMLDatatypeSupportTestEntity".
> 187  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Finished parsing metadata resource
"file:/C:/temp/test/META-INF/jpamappings.xml".
> 187  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Parsing class "test.XMLDatatypeSupportTestEntity".
> 187  EntityUnit_JSE  TRACE  [main] openjpa.Enhance - Enhancing type "class test.XMLDatatypeSupportTestEntity".
> 203  EntityUnit_JSE  WARN   [main] openjpa.Enhance - Type "class test.XMLDatatypeSupportTestEntity"
has no metadata; enhancing as persistence aware. If you intended for "class test.XMLDatatypeSupportTestEntity"
to be persistence-capable, then this means that OpenJPA could not find any metadata for "class
test.XMLDatatypeSupportTestEntity". This can happen if the directory containing your metadata
is not in your CLASSPATH, or if your metadata files are not named properly. See the documentation
on metadata placement for more information.
> 203  EntityUnit_JSE  TRACE  [main] openjpa.Tool - The class does not have metadata -
enhanced as persistence-aware.
> -----------------------------------------
> However if the target is specified, the enhancement will occur, E.g.
> -----------------------------------------
> C:\temp\test>runPcEnhancer.bat test.XMLDatatypeSupportTestEntity
> C:\temp\test>java -cp C:\temp\test\;C:\temp\test\openjpa-1.1.0-SNAPSHOT.jar;C:\temp\test\utils.jar;C:\temp\test\geronimo-jpa_3.0_spec-1.0.jar;C:\temp\test\geronimo-jta_1.1_spec-1.1.jar
org.apache.openjpa.enhance.PCEnhancer test.XMLDatatypeSupportTestEntity
> 15  EntityUnit_JSE  TRACE  [main] openjpa.Runtime - Setting the following properties
from "file:/C:/temp/test/META-INF/persistence.xml" into configuration: {openjpa.Id=EntityUnit_JSE,
openjpa.Log=DefaultLevel=TRACE, openjpa.MetaDataFactory=jpa(Resources=META-INF/jpamappings.xml,
Types=test.XMLDatatypeSupportTestEntity)}
> 47  EntityUnit_JSE  TRACE  [main] openjpa.Runtime - No cache marshaller found for id
org.apache.openjpa.conf.MetaDataCacheMaintenance.
> 78  EntityUnit_JSE  TRACE  [main] openjpa.Runtime - No cache marshaller found for id
org.apache.openjpa.conf.MetaDataCacheMaintenance.
> 94  EntityUnit_JSE  TRACE  [main] openjpa.Tool - Enhancer running on type "class test.XMLDatatypeSupportTestEntity".
> 125  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Loading metadata for "class test.XMLDatatypeSupportTestEntity"
under mode "[META]".
> 125  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Scanning resource "META-INF/jpamappings.xml"
for persistent types.
> 125  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Scan of "META-INF/jpamappings.xml"
found persistent types [Ljava.lang.String;@20962096.
> 140  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Mapping resource location "file:/C:/temp/test/META-INF/jpamappings.xml"
to persistent types "[test.XMLDatatypeSupportTestEntity]".
> 140  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Scanning resource "META-INF/orm.xml"
for persistent types.
> 140  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - parsePersistentTypeNames() found
[test.XMLDatatypeSupportTestEntity].
> 140  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Found 1 classes with metadata in
15 milliseconds.
> 156  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Parsing resource "file:/C:/temp/test/META-INF/jpamappings.xml".
> 187  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Parsing class "test.XMLDatatypeSupportTestEntity".
> 187  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Generating default metadata for
type "test.XMLDatatypeSupportTestEntity".
> 187  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Using reflection for metadata generation.
> 203  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Parsing class "test.XMLDatatypeSupportTestEntity".
> 219  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Finished parsing metadata resource
"file:/C:/temp/test/META-INF/jpamappings.xml".
> 219  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Set persistence-capable superclass
of "test.XMLDatatypeSupportTestEntity" to "null".
> 219  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Resolving metadata for "test.XMLDatatypeSupportTestEntity@1259490066".
> 219  EntityUnit_JSE  TRACE  [main] openjpa.MetaData -   Resolving field "test.XMLDatatypeSupportTestEntity@1259490066.byteAttrDefault".
> 219  EntityUnit_JSE  TRACE  [main] openjpa.MetaData -   Resolving field "test.XMLDatatypeSupportTestEntity@1259490066.id".
> 250  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Preparing mapping for "test.XMLDatatypeSupportTestEntity".
> 250  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Resolving mapping for "test.XMLDatatypeSupportTestEntity@1259490066".
> 250  EntityUnit_JSE  TRACE  [main] openjpa.Enhance - Enhancing type "class test.XMLDatatypeSupportTestEntity".
> 312  EntityUnit_JSE  TRACE  [main] openjpa.MetaData - Clearing metadata repository "org.apache.openjpa.meta.MetaDataRepository@518c518c".
> -----------------------------------------

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message