Hello everyone,
One of our appserver user is currently facing a strange issue (which I
can't reproduce for now ... :-( , bu I will managed to do it, if I can ...)
(We are running with jdk 1.5 on linux with Felix 1.4.0).
The application does the following:
* a dtd file is stored within the application bundle, in
WEB-INF/classes/anchoringPolicy.dtd
* in the manifest, there is the following:
o an Import-Package header with many things ...
o DynamicImport-Package: *
o Bundle-ClassPath: "., WEB-INF/classes, ..." (I don't report
all the inner embedded jars)
* at startup, the application tries to parse an xml document using
its dtd (in WEB-INF/classes/anchoringPolicy.dtd)
* So, the application does the following:
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setValidating(true);
SAXParser parser = spf.newSAXParser();
XMLReader xmlReader = parser.getXMLReader();
xmlReader.setEntityResolver(new EntityResolver() {
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException
{
InputStream s =
getclass().getClassLoader().getResourceAsStream("anchoringPolicy.dtd");
if (s == null) {
if (logger.isDebugEnabled()) {
logger.debug("unable to get resource stream for our dtd");
}
s =
Thread.currentThread().getContextClassLoader().getResourceAsStream("anchoringPolicy.dtd");
}
if (s != null) {
return new InputSource(s);
}
if (logger.isDebugEnabled()) {
logger.debug("dtd not found from the classpath: ");
}
return null;
}
});
xmlReader.setContentHandler(handler);
xmlReader.setErrorHandler(new PolicyErrorHandler());
xmlReader.parse(new InputSource(new
ByteArrayInputStream(policyFile.getBytes())));
}
This application was working fine with the felix *1.0.4
*Now, with Felix* 1.4.0* (and also with the felix-trunk), the
EntityResolver can't find its dtd and the following line of code returns
null:
InputStream s =
getclass().getClassLoader().getResourceAsStream("anchoringPolicy.dtd");
-> I investigated and it turns out, that , if I remove the header
"DynamicImport-Package: *" header, then the dtd is properly loaded from the
application bundle class loader !
-> But I don't understand the relation between this issue and the
"DynamicImport-Package: *" header ?
I know that using the DynImport: * header is not really clean, but,
well, it should work, doesn't it ?
Best Regards
/pierre