- From: Francois Daoust <fd@w3.org>
- Date: Wed, 19 Mar 2008 17:43:41 +0100
- To: public-mobileok-checker@w3.org
Hi folks,
As it stands, the "in-JAR" DTD catalog works fine when the checker is
run from the command-line, but the checker fails to resolve well-known
DTDs when the JAR is imported in a JSP page (at least using Jigsaw, it
may work with other Web servers)
The problem lies in the ExtendedCatalogResolver class and in particular
in the resolveEntity method. The call to "delegate.resolveEntity" fails
because for some reason the mapping to an "in-JAR" file doesn't work in
that case. It fails to resolve something like "[file path to mobileOK
jar]/dtd/whatever", which should fetch the file in the JAR. I don't know
why, I'm just seeing it doesn't work...
The subsequent lines of codes in the resolveEntity method seem to be
willing to handle a similar case (where the systemId would already be a
local file), but does not cover this one, because the only way to enter
the loop is to have a systemId that already starts with "file://". It
could easily be adapted to handle this more generic case.
My proposed patch for ExtendedCatalogResolver.resolveEntity:
public InputSource resolveEntity(final String publicId, String systemId)
throws IOException {
InputSource source = delegate.resolveEntity(publicId, systemId);
if (source == null) {
if (!systemId.startsWith("file://")) {
systemId = delegate.getCatalog().resolveSystem(systemId);
}
if (systemId != null) {
if (!systemId.startsWith("file:///")) {
systemId = "file:///" + systemId.substring(7);
}
try {
source = new InputSource(new URL(systemId).openStream());
} catch (FileNotFoundException fnfe) {
final String resourceName = getResourceFromAbsoluteFilename(systemId);
final InputStream is = getClass().getResourceAsStream("/" +
resourceName);
source = new InputSource(is);
}
source.setSystemId(systemId);
source.setPublicId(publicId);
}
}
return source;
}
The only changed lines are at the beginning of the inner loop:
if (source == null) {
if (!systemId.startsWith("file://")) {
systemId = delegate.getCatalog().resolveSystem(systemId);
}
instead of:
if (source == null && systemId.startsWith("file://")) {
Note that I'm not crazy about this patch as the case is handled by the
"catch" line, so that means using exceptions as regular code flow... not
really a good practice. Anything better?
Also note that's not related to the failures that occur when the checker
doesn't have a DTD in its catalog, it's really about being able to read
an existing file in the catalog when the JAR is imported in a JSP page.
François.
Received on Wednesday, 19 March 2008 16:44:18 UTC