DefaultSchemaResolver logic is wrong
adrian.brock Oct 5, 2006 7:34 AMAs per the previous thread earlier this year, it is not possible
to compose schemas using imports with JBossXB.
I've fixed this, with the new implemetation, I can now get an
XSModel for the JavaEE schemas (which previously failed due
to confusion of imports).
The new implementation looks like this:
private InputSource getInputSource(String nsURI, String baseURI, String schemaLocation)
{
boolean trace = log.isTraceEnabled();
InputSource is = null;
if( trace )
log.trace("getInputSource, nsURI="+nsURI+", baseURI="+baseURI+", schemaLocation="+schemaLocation);
// First try what is requested
try
{
is = resolver.resolveEntity(nsURI, schemaLocation);
if (trace)
log.trace("Resolved schema using namespace as publicId and schemaLocation as systemId");
}
catch (Exception e)
{
if (trace)
log.trace("Failed to use nsUri/schemaLocation", e);
}
// Next, try to use the baseURI to resolve the schema location
if (is == null && baseURI != null && schemaLocation != null)
{
try
{
URL url = new URL(baseURI);
url = new URL(url, schemaLocation);
String resolvedSchemaLocation = url.toString();
// No point if the schema location was already absolute
if (schemaLocation.equals(resolvedSchemaLocation) == false)
{
is = resolver.resolveEntity(null, url.toString());
if( trace && is != null )
log.trace("Resolved schema location using baseURI");
}
}
catch (Exception e)
{
if (trace)
log.trace("Failed to use schema location with baseURI", e);
}
}
// Finally, just try the namespace as the system id
if (is == null && nsURI != null)
{
try
{
is = resolver.resolveEntity(null, nsURI);
if( trace && is != null )
log.trace("Resolved namespace as system id");
}
catch (Exception e)
{
if (trace)
log.trace("Failed to use namespace as system id", e);
}
}
if( trace )
{
log.trace("getInputSource, nsURI="+nsURI+", baseURI="
+baseURI+", schemaLocation="+schemaLocation+", is="+is);
}
return is;
}
Previously, the last step was first, making it impossible
to compose a namespaces from different schema files.
Also, it didn't use the schemaLocation properly so it always
failed for simple imports like:
<xsd:include schemaLocation="javaee_web_services_client_1_2.xsd"/>