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(a)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(a)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(a)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(a)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(a)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(a)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(a)lists.jboss.org
>>> >> >
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>> >>
>>> > _______________________________________________
>>> > hibernate-dev mailing list
>>> > hibernate-dev(a)lists.jboss.org
>>> >
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>> _______________________________________________
>>> hibernate-dev mailing list
>>> hibernate-dev(a)lists.jboss.org
>>>
https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>
>>
>
_______________________________________________
hibernate-dev mailing list
hibernate-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev