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.