You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Florent BENOIT (JIRA)" <ji...@apache.org> on 2007/02/17 18:15:05 UTC

[jira] Commented: (OPENJPA-148) Parsing exception while using an "exploded" archive

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

Florent BENOIT commented on OPENJPA-148:
----------------------------------------

Here is a follow up for explaining the process that OpenJPA is using on exploded jar files:

The PersistenceUnitInfo object build by the EJB3 container(EasyBeans in my testcase) is sent to OpenJPA.
Then, in the method toOpenJPAProperties of org.apache.openjpa.persistence.PersistenceUnitInfoImpl class

The getPersistenceUnitRootUrl() URL (which is the directory URL
 file:/home/florent/workspace/easybeans/ejb3s/entitybean.jar/) is transformed
 into /home/florent/workspace/easybeans/ejb3s/entitybean.jar/ as it is a "file:" URL


Then, the getJarFileUrls() is returning the same URL (file:/home/florent/workspace/easybeans/ejb3s/entitybean.jar/)
This URL is an exploded JAR file URL which is valid for this method as said in the specification
 "Returns a list of URLs for the jar files or exploded jar file directories that the persistence provider [...]"
 (It has been clarified between the proposed final specification and the final specification)

The PersistenceUnitInfoImpl class is then transforming these two URLs into:
  - "Files" property with the value /home/florent/workspace/easybeans/ejb3s/entitybean.jar/
  - "URLs" property with the value file:/home/florent/workspace/easybeans/ejb3s/entitybean.jar/

Then, these values will be analyzed in  parsePersistentTypeNames(ClassLoader loader) method of
 the class org.apache.openjpa.meta.AbstractCFMetaDataFactory

1/ First, the "Files" property is analyzed:
As /home/florent/workspace/easybeans/ejb3s/entitybean.jar/ is a directory, it goes in:

                if (file.isDirectory()) {
                    if (log.isTraceEnabled())
                        log.trace(_loc.get("scanning-directory", file));
                    scan(new FileMetaDataIterator(dir, newMetaDataFilter()),
                        cparser, names, true, file);
                } 

which found...nothing. (I have done another test with a file for the PersistenceUnitRootUrl
 (and not a directory) and in this case the scan of the file finds the Entity class while it doesn't
 find the entity class in directory mode).
Also here, dir is null, if dir = file, it finds the entity class.

The corresponding debug trace is:
[TRACE] MetaData - Scanning directory "/home/florent/workspace/easybeans/ejb3s/entitybean.jar" for persistent types.


2/ Then, the "URLs" property is analyzed:
It's not a .jar file so the case "else if (url.getPath().endsWith(".jar"))" is not used and it fallbacks
 in the default case:

                } else {
                    if (log.isTraceEnabled())
                        log.trace(_loc.get("scanning-url", url));
                    clss = cparser.parseTypeNames(new URLMetaDataIterator(url));
                    if (log.isTraceEnabled())
                        log.trace(_loc.get("scan-found-names", clss, url));
                    names.addAll(Arrays.asList(clss));
                    mapPersistentTypeNames(url, clss);
                }

And mapPersistentTypeNames method do the following:
_unparsed.add((URL) rsrc);

so, the URL which is referencing an exploded jar is considered as an unparsed URL from now.

The corresponding traces are:
[TRACE] MetaData - Scanning URL "file:/home/florent/workspace/easybeans/ejb3s/entitybean.jar/" for persistent types.
[TRACE] MetaData - Scan of "file:/home/florent/workspace/easybeans/ejb3s/entitybean.jar/" found persistent types [Ljava.lang.String;@14c7cd.
[TRACE] MetaData - Mapping resource location "file:/home/florent/workspace/easybeans/ejb3s/entitybean.jar/" to persistent types "[]".

(with [Ljava.lang.String;@14c7cd. being an empty array.)

When a class needs to be loaded by the load(Class cls, int mode, ClassLoader envLoader) method of org.apache.openjpa.persistence.PersistenceMetaDataFactory class, there is a check on the _unparsed attribute.

And in this case, it tries to parse the URL as an XML file:
  for (URL url : _unparsed)
    parseXML(url, cls, mode, envLoader);

And we can imagine the result of parsing a directory as an XML file.

The result is:
[WARN] Enhance - An exception was thrown while attempting to perform class file transformation on "org/objectweb/easybeans/examples/entitybean/SessionFacadeRemote": <<0|false|0.9.7-incubating-SNAPSHOT> org.apache.openjpa.util.GeneralException: org.xml.sax.SAXException: file:/home/florent/workspace/easybeans/ejb3s/entitybean.jar/ [Location: Line: 1, C: 1]: org.xml.sax.SAXParseException: Content is not allowed in prolog.><0|false|0.9.7-incubating-SNAPSHOT> org.apache.openjpa.util.GeneralException: org.xml.sax.SAXException: file:/home/florent/workspace/easybeans/ejb3s/entitybean.jar/ [Location: Line: 1, C: 1]: org.xml.sax.SAXParseException: Content is not allowed in prolog.
	at org.apache.openjpa.persistence.PersistenceMetaDataFactory.parseXML(PersistenceMetaDataFactory.java:233)


So, I think that you have now a complete report and that you're understanding why OpenJPA is failing.




> Parsing exception while using an "exploded" archive
> ---------------------------------------------------
>
>                 Key: OPENJPA-148
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-148
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jpa
>         Environment: Sun JDK 5.0 / EasyBeans / OpenJPA snapshot 0.9.7
>            Reporter: Florent BENOIT
>         Attachments: debug_traces_directorymode.txt, stacktrace-error.txt, steps.txt
>
>
> This happens when using OpenJPA as persistence provider for the EasyBeans ObjectWeb container.
> The error is happening with "exploded" archive.
> Exploded means that there is a directory, named "entitybean.jar" with a folder META-INF which contains a file named persistence.xml, and other directories/files for the classes.
> It seems that when using this mode, OpenJPA is trying to parse the directory inputstream (which is failing).
> This exception is not occuring if a jar file is used instead of the "exploded" mode, but the exploded mode is the default mode for EasyBeans.
> Note also that this exception don't occur by using Hibernate Entity Manager or Oracle TopLink Essentials as persistence provider.
> I will attach to this issue a stack trace (with the exploded directory) which fails and at the end with a jar file (which work)
> And 4 steps used to reproduce this problem

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