[hibernate-dev] The PAR archive test case validity - PackagedEntityManagerTest

Emmanuel Bernard emmanuel at hibernate.org
Thu Mar 10 05:15:46 EST 2016


I would go for the conservative side. This code was very tedious to
stabilize on all crazy types of URL one can receive (http, file on
various OSes, osgi, custom container url schemes, etc.).

On Thu 2016-03-10  9:52, Vlad Mihalcea wrote:
> The fix goes like this:
> 
> if ( filePart.startsWith( "/" ) || new File(url.getFile()).isAbsolute() ) {
>    // the URL is already an absolute form
>    return url;
> }
> 
> The reason why it works on Linux/Macs is that absolute paths start with "/".
> 
> With this fix works on Windows too, but I wonder if we shouldn't have
> it like this instead:
> 
> if ( new File(url.getFile()).isAbsolute() ) {
>    // the URL is already an absolute form
>    return url;
> }
> 
> I think this should work on any OS, right?
> 
> Vlad
> 
> 
> On Thu, Mar 10, 2016 at 9:18 AM, Vlad Mihalcea <mihalcea.vlad at gmail.com>
> wrote:
> 
> > Hi,
> >
> > I managed to find what caused this test to start failing. The reason is
> > this commit:
> >
> > Commit: 5c77f279afaecb505f7a22bfa05c172b493096bd [5c77f27]
> > Parents: 8670b4211e
> > Author: Steve Ebersole <steve at hibernate.org>
> > Date: Tuesday, January 12, 2016 11:21:54 PM
> > Commit Date: Tuesday, January 12, 2016 11:22:19 PM
> > Labels: HEAD
> > HHH-4161 - persistence.xml <jar-file> not following JSR220 spec
> >
> > This commit was done for this issue
> > https://hibernate.atlassian.net/browse/HHH-4161.
> >
> > The problem is that StandardArchiveDescriptorFactory#adjustJarFileEntryUrl
> > applies even when we don't deal with relative paths.
> >
> > In the context of the PackagedEntityManagerTest#testExternalJar test, we
> > have a PAR whose persistence.xml uses a jar-file that's declared with an
> > absolute path
> > (file:D:/Vlad/Work/GitHub/hibernate-orm/hibernate-entitymanager/target/packages/externaljar.jar),
> > and the jar resides next to the PAR (it's not embedded).
> >
> > If I disable the check,
> > StandardArchiveDescriptorFactory#adjustJarFileEntryUrl returns the URL as
> > is
> > (file:D:/Vlad/Work/GitHub/hibernate-orm/hibernate-entitymanager/target/packages/externaljar.jar),
> > which is passed to the ArchiveDescriptor.
> >
> > But the check is enabled because the URL has a file protocol:
> >
> > final boolean check = StringHelper.isEmpty( protocol )
> >     || "file".equals( protocol )
> >     || "vfszip".equals( protocol )
> >     || "vfsfile".equals( protocol );
> >
> > So, StandardArchiveDescriptorFactory#adjustJarFileEntryUrl will return
> > this instead:
> >
> >
> > jar:file://D:\Vlad\Work\GitHub\hibernate-orm\hibernate-entitymanager\target\packages\explicitpar.par!/D:/Vlad/Work/GitHub/hibernate-orm/hibernate-entitymanager/target/packages/externaljar.jar
> >
> > And, the jar will not be located because this is not an embedded jar use
> > case.
> >
> > I wonder how is it working on Linux and it only fails on Windows?
> >
> > Can someone run this test and check what's the return value from the
> > StandardArchiveDescriptorFactory#adjustJarFileEntryUrl method when running
> > the PackagedEntityManagerTest#testExternalJar test?
> >
> > Thanks,
> > Vlad
> >
> >
> > On Thu, Mar 10, 2016 at 12:49 AM, Steve Ebersole <steve at hibernate.org>
> > wrote:
> >
> >> A PAR is just an archive with a META-INF/persistence.xml file in it.  The
> >> JPA spec does cover this.  The extension is irrelevant.
> >>
> >> On Wed, Mar 9, 2016 at 4:08 PM Sanne Grinovero <sanne at hibernate.org>
> >> wrote:
> >>
> >>> I remember JBoss had "HAR" deployments to package Hibernate models and
> >>> PU definitions.. as far as I know this was a JBoss only thing, it
> >>> wouldn't surprise me if other app servers experimented with similar
> >>> non-standardized archives.
> >>>
> >>> https://docs.jboss.org/jbossas/jboss4guide/r3/html/ch13.html
> >>>
> >>> On 9 March 2016 at 18:39, Vlad Mihalcea <mihalcea.vlad at gmail.com> wrote:
> >>> > Hi,
> >>> >
> >>> > The part is backslashes comes from the absolute path set by Gradle when
> >>> > supplying the module OS folder.
> >>> > The right part containing slashes is the one set in persistence.xml.
> >>> > I'll try to replace backslashes with slashes and see how it goes.
> >>> >
> >>> > I was curious if people use the jar-file with absolute paths because
> >>> the
> >>> > JPA spec only implies it in the context of relative paths inside an
> >>> EAR or
> >>> > WAR.
> >>> > As for PAR, I guess that was included in some JPA 1.0 draft but it got
> >>> > rejected in the end, right?
> >>> >
> >>> > Vlad
> >>> >
> >>> >
> >>> >
> >>> >
> >>> > On Wed, Mar 9, 2016 at 6:39 PM, Emmanuel Bernard <
> >>> emmanuel at hibernate.org>
> >>> > wrote:
> >>> >
> >>> >> We usually strive on having functionalities work on both Java EE and
> >>> >> Java SE.
> >>> >> you example though shows a mix of forward and backslash in your
> >>> >> <jar-file>, is that expected ?
> >>> >>
> >>> >> Emmanuel
> >>> >>
> >>> >> On Wed 2016-03-09 17:05, Vlad Mihalcea wrote:
> >>> >> > Hi,
> >>> >> >
> >>> >> > I have two tests in the PackagedEntityManagerTest unit test that
> >>> fail on
> >>> >> my
> >>> >> > machine, but work just fine for everybody else.
> >>> >> > It could be an OS thing or not, but during the check, I found hat
> >>> we are
> >>> >> > testing against an use case that is not found in the JPA spec.
> >>> >> >
> >>> >> > The testExternalJar() creates an externaljar.jar and an
> >>> explicitpar.par.
> >>> >> >
> >>> >> > I found an old reference on the PAR archive (
> >>> >> > http://radio-weblogs.com/0135826/2005/07/07.html) but the JPA 2.1
> >>> >> doesn't
> >>> >> > mention anything about it.
> >>> >> > The explicitpar.par contains the persistence.xml which contains a
> >>> >> jar-file
> >>> >> > attribute that references the externaljar.jar with an absolute path:
> >>> >> >
> >>> >> >
> >>> >>
> >>> <jar-file>D:\Vlad\Work\GitHub\hibernate-orm\hibernate-entitymanager\target/packages/externaljar.jar</jar-file>
> >>> >> >
> >>> >> > The JPA spec says that: "Such JAR files are specified relative to
> >>> the
> >>> >> > directory or jar file that contains the root of the persistence
> >>> unit",
> >>> >> and
> >>> >> > gives several examples
> >>> >> > for when using an EAR with or without a WAR.
> >>> >> >
> >>> >> > While debugging, I found that the JarFileBasedArchiveDescriptor
> >>> scans the
> >>> >> > "explicitpar.par" and looks for:
> >>> >> >
> >>> >> > if ( getEntryBasePrefix() != null && ! entryName.startsWith(
> >>> >> > getEntryBasePrefix() ) ) {
> >>> >> >     continue;
> >>> >> > }
> >>> >> >
> >>> >> > where the getEntryBasePrefix() is
> >>> >> >
> >>> >>
> >>> "D:/Vlad/Work/GitHub/hibernate-orm/hibernate-entitymanager/target/packages/externaljar.jar"
> >>> >> >
> >>> >> > The way that JarFileBasedArchiveDescriptor is implemented matches
> >>> the JPA
> >>> >> > description.
> >>> >> > Nevertheless, the scan cannot locate the jar, and the entities that
> >>> are
> >>> >> > contained in the "externaljar.jar" don't get loaded, and the test
> >>> fails.
> >>> >> >
> >>> >> > I can ignore this on my machine and just consider it a white noise,
> >>> but I
> >>> >> > wonder why we still check for PAR when we might want to have a test
> >>> with
> >>> >> an
> >>> >> > EAR instead and relative paths.
> >>> >> >
> >>> >> > Vlad
> >>> >> > _______________________________________________
> >>> >> > hibernate-dev mailing list
> >>> >> > hibernate-dev at lists.jboss.org
> >>> >> > https://lists.jboss.org/mailman/listinfo/hibernate-dev
> >>> >>
> >>> > _______________________________________________
> >>> > hibernate-dev mailing list
> >>> > hibernate-dev at lists.jboss.org
> >>> > https://lists.jboss.org/mailman/listinfo/hibernate-dev
> >>> _______________________________________________
> >>> hibernate-dev mailing list
> >>> hibernate-dev at lists.jboss.org
> >>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
> >>>
> >>
> >
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev


More information about the hibernate-dev mailing list