You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geronimo.apache.org by Kristian Köhler <Kr...@gmx.de> on 2004/02/02 22:48:27 UTC
Work and run Offline - EntityResolving for Kernel
Hi
Building and running Geronimo offline or behind a firewall is nearly
impossible.
Most problems araise from the fact that there are code requiring remote
entity resolving. The current LocalEntityResolver solves that problem
for "Geronimo code". Every other module/ service could cause a similar
problem.
Currently I have problems with the Jetty Module requiring a SUN schema
file which is not found by the SAXParser.
One possible solution IMO is a ParserWrapper implementation which wraps
the "normal" implemention. This Wrapper should be made available to all
services deployed in Geronimo. A call to
SAXParserFactory.newInstance();
should return a Wrapper implementation which returns all other Wrapper
implementations (SAXParserWrapper, XMLReaderWrapper, ...).
The normal lookup mechanism in the SAXParserFactory is as follows:
* test SystemProperty "javax.xml.parsers.SAXParserFactory"
* lookup in java.home jax.properties
* test META-INF/services/javax.xml.parsers.SAXParserFactory file
The last call could be redirected to the wrapper implementation
("ClassLoader hack"). The other both calls couldn't be redirected. But I
think if a user had set a implementation via SystemProperty or
jaxp.properties file the wrapper implementation should be skipped
(warning message for the user).
IMO all services/modules should be deployed with a ClassLoaderWrapper
which redirects all Parser lookups to a wrapper implementation which
wraps the "normal implementation". This "normal implementation" could be
determined via the "normal lookup mechanism".
something like that
------ 8< ------
InputStream stream =
localClassLoader.getResourceAsStream("META-INF/services/javax.xml.parsers.SAXParserFactory");
if (stream != null) {
InputStreamReader isr = new InputStreamReader(stream);
BufferedReader reader = new BufferedReader(isr);
factoryClassName = reader.readLine();
} else {
factoryClassName = "org.apache.crimson.jaxp.SAXParserFactoryImpl";
}
------ 8< ------
So all resolving could be redirected to a LocalEntityResolver.
Something like the following code could be included in the doStart()
method of the Configuration class. So all deployed Beans should use the
wrapper.
------ 8< ------
Class clazz =
wrappedClassLoader.loadClass(SAXParserFactoryWrapper.class.getName());
Method setDelegate = clazz.getMethod("setDelegate",
new Class[]{String.class});
if (parent == null) {
setDelegate.invoke(clazz, new Object[]{...)});
} else {
setDelegate.invoke(clazz, new Object[]{...)});
}
------ 8< ------
I have submitted a sample wrapper implementation to jira (not a patch -
which I will create if someone is interested) - GERONIMO-155.
I hope my idea is understandable ;-)
Comments?
Kristian
--
Kristian Köhler