Description
When URIResolver.resolve(..) is called with both baseUriStr and uriStr containing absolute URIs, e.g.
then it makes suspicious calls to a class loader, trying to find resources with names like
- jar:file:/C:/midpoint/tgit/cxf/core/target/test-classes/org/apache/cxf/resource/resources/helloworld.bpr!/wsdl/hello_world_2.wsdl
- /jar:file:/C:/midpoint/tgit/cxf/core/target/test-classes/org/apache/cxf/resource/resources/helloworld.bpr!/wsdl/hello_world_2.wsdl
- jar:file:/C:/midpoint/tgit/cxf/core/target/test-classes/org/apache/cxf/resource/resources/helloworld.bpr!/wsdl/hello_world_2.wsdl
In our case (when used as part of the midPoint product) the situation is like this:
Resolving:
leads first to the resolution of obviously wrong URL:
(note the two midpoint.war segments there)
and then to the resolution of the following resource name (via class loader):
jar:file:/C:/tmp/mp/lib/midpoint.war!/WEB-INF/lib/schema-3.7.jar!/prism/xml/ns/public/types-3.xsd
Note that as per ClassLoader javadocs, "The name of a resource is a '/'-separated path name that identifies the resource." Although formally the above URIs match this definition, some class loader implementations, namely the one in Spring Boot which we use in midPoint, react to such requests in an unexpected way, returning wrong (unrelated) content. The result is that URIResolver.resolve(..) returns the wrong content as well. See Spring Boot issue #11367.
Even when Spring Boot is eventually fixed, classLoader.findResource(..) calls are unnecessary overhead.
Please see URIResolverTest.testJARResolveBaseAndAbsolute in the upcoming commit as well as the proposed fix in URIResolver.
Attachments
Issue Links
- links to