Uploaded image for project: 'Geronimo'
  1. Geronimo
  2. GERONIMO-155

[proposal] XML resolving for kernel - containerwide Parser

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Won't Fix
    • None
    • None
    • core
    • None

    Description

      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 hope my idea is understandable
      Comments?

      Kristian

      Attachments

        1. resolving-for-kernel.zip
          8 kB
          Kristian Kohler
        2. patch.zip
          17 kB
          Kristian Kohler
        3. patch02192004.zip
          18 kB
          Kristian Kohler
        4. patch-02-19-2004-2.zip
          18 kB
          Kristian Kohler
        5. patch-02-24-2004.zip
          21 kB
          Kristian Kohler
        6. things-in-action.txt
          2 kB
          Kristian Kohler

        Activity

          People

            djencks David Jencks
            kkoehler Kristian Kohler
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: