On 1/11/2011 9:20 AM, Ivan wrote:

Hmm, I have to say that I know little about corba, just from the codes of UtilLoader.loadClass, the first part of that method is trying to load an implementation of the SPI, but the left part is just to load the SPI itself, is it the expected behavior ?
Util.loadClass() is used for a lot more purposes than loading an SPI. The problem is occurring because the code is overloading the concepts on to the single loadClass() method. What is needed to fix this problem is a solution specific to the task of loading an SPI.

Rick


If we need to look up a specific provider for an interface, maybe it is better to use the similar method suggested by you. which passing both the SPI and defaultImpl class, then we might first try to look up the impl by ProviderLocator, if failed, try to load the default impl by context classloader or stack classloader...
Thanks.

2011/1/11 Rick McGuire <[email protected] <mailto:[email protected]>>

    On 1/11/2011 8:45 AM, Ivan wrote:

        That makes sense, also it is better to remove the codes
        ProviderLocator.loadClass from the UtilLoader.loadClass
        method, or that makes the function of loadClass method ambigurous.


    For other reasons, I believe it is still necessary to have
    ProviderLocator.loadClass() part of the loadClass() searches.
     This is a different, internal situation where we're looking for a
    specific provider for an interface.

    Rick


        2011/1/11 Rick McGuire <[email protected]
        <mailto:[email protected]> <mailto:[email protected]
        <mailto:[email protected]>>>


           On 1/11/2011 7:35 AM, Ivan wrote:

               I agree with Forrest that those code logic might need to be
               updated. From the codes fragment below of UtilLoader
               In the loadClass method, it will first try the
               ProviderLocator.loadClass, but what
            ProviderLocation.loadClass
               expect is an interface class name, like
            javax.rmi.CORBA.Util.
               So those codes in the static block of Util, it should
            first try
               to load it from ProviderLocator with service provider
            interface.
               Comments ?


           I think the static code in the Util class should be
        something like:


           // Initialize delegate StringdelegateName=
(String)AccessController.doPrivileged(newGetSystemPropertyAction("javax.rmi.CORBA.UtilClass",


           defaultDelegate)); try{ // this is a little bit recursive, but
           this will use the full default search order for locating //
        this.
                        delegate  =
        (UtilDelegate)UtilLoader.loadServiceClass(delegateName,
        Delegate.class).newInstance();
           } catch(Throwablee) { org.omg.CORBA.INITIALIZEex=
           neworg.omg.CORBA.INITIALIZE("Can not create Util delegate:

           "+delegateName); ex.initCause(e); throwex; }

           Where UtilLoader.loadServiceClass() is a method that functions
           like UtilLoader.loadClass(), but takes both an interface class
           name that is used to qualify the lookup.

           Rick

               -->
               static public Class loadClass(String name, String codebase,
               ClassLoader loader)
                           throws ClassNotFoundException {
                       Class result = null;

                       try {
                           return ProviderLocator.loadClass(name,
            null, loader);
                       } catch (ClassNotFoundException e) {
                           //skip
                       }

                       ClassLoader stackLoader = null;
                       ClassLoader thisLoader =
            UtilLoader.class.getClassLoader();
                       Class[] stack = _secman.getClassContext();
                       for (int i = 1; i < stack.length; i++) {
                           ClassLoader testLoader =
            stack[i].getClassLoader();
                           if (testLoader != null && testLoader !=
            thisLoader)
                           {
                               stackLoader = thisLoader;
                               break;
                           }
                       }
                       ......
            <---





               2011/1/11 Rick McGuire <[email protected]
            <mailto:[email protected]> <mailto:[email protected]
            <mailto:[email protected]>>>


                   On 1/11/2011 4:46 AM, Forrest Xia wrote:

                       Hi,

                       When I debug a corba related application, I
            managed to
                       trace into a piece of yoko code like this:

                       public class Util {
                          private static UtilDelegate delegate = null;
                          private static final String defaultDelegate =
                       "org.apache.yoko.rmi.impl.UtilImpl";

                          // To hide the default constructor we should
            implement
                       empty private constructor
                          private Util() {}

                          static {
                              // Initialize delegate
                              String delegateName =
                       (String)AccessController.doPrivileged(new
GetSystemPropertyAction("javax.rmi.CORBA.UtilClass",
                       defaultDelegate));
                              try {

                                  // this is a little bit recursive,
            but this
                       will use the full default search order for locating
                                  // this.
                       delegate =
            (UtilDelegate)Util.loadClass(delegateName,
                       null, null).newInstance();
                              } catch (Throwable e) {
                                  org.omg.CORBA.INITIALIZE ex = new
                       org.omg.CORBA.INITIALIZE("Can not create Util
            delegate:
                       "+delegateName);
                                  ex.initCause(e);
                                  throw ex;
                              }
                          }
                       ...

                       According to another code in
                       ProviderRegistryImpl$SPIRegistry(the id's value
            is the
                       delegateName variable as highlighted above),
            while the
                       registry hashmap's key is
            "javax.rmi.CORBA.UtilClass",
                       that will lead CNF exception.
                       private synchronized BundleProviderLoader
                       getLoader(String id) {
                                  // synchronize on the registry instance
                                  if (registry != null) {
                                      log.fine("registry: " + registry);
                                      // return the first match, if any
                                      List<BundleProviderLoader> list =
                       registry.get(id);
                                      if (list != null &&
            !list.isEmpty()) {
                                          return list.get(0);
                                      }
                                  }
                                  // no match here
                                  return null;
                              }

                       So my question is should we change the Util
            code to pass
                       the interface class name to load class? Please
            advise.

                   I'm not sure I understand the question.  The target
            class in
                   question here is a concrete delegate instance, so I
            don't
                   understand why you think an interface is needed
            here.  The
                   loading in question here is just for the delegate
            class that
                   is used for the rmi util class.

                   In any event, you cannot change any of the method
            signatures
                   for the javax.rmi.CORBA.Util class.  That is a
            standard API
                   class and you can't add that.

                   I think I understand what you wish to do here, and I'd
                   recommend adding a loadServiceClass() method to the
                   UtilLoader class and change the initializer in Util
            to use
                   that directly rather than recursively calling
            Util.loadClass().

                   Rick


                       Forrest







               --     Ivan





-- Ivan





--
Ivan

Reply via email to