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

Vlad Mihalcea mihalcea.vlad at gmail.com
Thu Mar 10 02:52:39 EST 2016


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
>>>
>>
>


More information about the hibernate-dev mailing list