Uploaded image for project: 'Commons Discovery'
  1. Commons Discovery
  2. DISCOVERY-13

Problem with Oracle JVM classLoader

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Reopened
    • Minor
    • Resolution: Unresolved
    • 0.5
    • 0.6
    • None
    • Oracle Java stored procedure (oracle versions 8i -> 11g) Any OS

    Description

      First of all, excuse my bad english (I'm an spanish speaker)
      Starting in version 8i, Oracle provides an embedded JVM inside th databases, in order to develop a stored procedure inJava language, later to be invoked via PL/SQL.

      Saddly, the JVM has some quirks, for example an somehow brain-damaged classLoader (oracle.aurora.rdbms.OracleClassLoader).
      This JVM stores the classes inside table objects (very reasonable).

      This leads to some problem: the resources haves some strange URL (example: jserver:/resource/schema/NAME_OF_THE_SCHEMA/ar.com.menhir.config.properties).
      It will be not problema at all except because it's brain damage insist in telling that the above URL works only with RESOURCES and not with CLASSES!!

      for example, the following example

      private static void getData ( ClassLoader cl , String str )

      { System.out.println(str +".class" + "-> "+cl.getResource(str+".class")); System.out.println(str +".class" + "-> "+ClassLoader.getSystemResource(str+".class")); }

      ...
      getData(Test.class.getClassLoader(),"ar.com.menhir.wstest.Test");
      ...
      gives this 2 results:
      with normal classLoader ( sun.misc.Launcher$AppClassLoader)

      ar/com/menhir/wstest/Test.class-> file:/C:/Users/LeoB/workspace2/prueba/bin/ar/com/menhir/wstest/Test.class
      ar/com/menhir/wstest/Test.class-> file:/C:/Users/LeoB/workspace2/prueba/bin/ar/com/menhir/wstest/Test.class

      with oracle classLoader (oracle.aurora.rdbms.OracleClassLoader)

      ar/com/menhir/wstest/Test.class-> null
      ar/com/menhir/wstest/Test.class-> null

      The problem arises in org.apache.commons.discovery.resource.classes.DiscoverClasses, where the line 60

      final String resourceName = className.replace('.','/') + ".class";

      points to a nonexistente resource.

      my workaround was to hack this class with the following:

      final String resourceName = ar.com.menhir.oracle.resources.Utils.getResourcePrefix(className).replace('.','/') + ".class";

      where getResourcePrefix gets the correct prefix for this class.

      You must note that this is a somehow brutal way of solving. I'm interested in contribute with the wright way, but I'm not very sure of where to start.
      Could you please help me?

      Thank you
      Leo Blumencweig

      Attachments

        Activity

          People

            simone.tripodi Simone Tripodi
            lblumencweig Leo Blumencweig
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:

              Time Tracking

                Estimated:
                Original Estimate - 504h
                504h
                Remaining:
                Remaining Estimate - 504h
                504h
                Logged:
                Time Spent - Not Specified
                Not Specified