- /*
- * @(#)StubFactoryFactoryStaticImpl.java 1.10 04/05/25
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
- package com.sun.corba.se.impl.presentation.rmi;
-
- import javax.rmi.CORBA.Util;
- import javax.rmi.CORBA.Tie ;
-
- import org.omg.CORBA.CompletionStatus;
-
- import com.sun.corba.se.spi.presentation.rmi.PresentationManager;
-
- import com.sun.corba.se.impl.util.PackagePrefixChecker;
- import com.sun.corba.se.impl.util.Utility;
-
- import com.sun.corba.se.spi.logging.CORBALogDomains ;
-
- import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
-
- public class StubFactoryFactoryStaticImpl extends
- StubFactoryFactoryBase
- {
- private ORBUtilSystemException wrapper = ORBUtilSystemException.get(
- CORBALogDomains.RPC_PRESENTATION ) ;
-
- public PresentationManager.StubFactory createStubFactory(
- String className, boolean isIDLStub, String remoteCodeBase, Class
- expectedClass, ClassLoader classLoader)
- {
- String stubName = null ;
-
- if (isIDLStub)
- stubName = Utility.idlStubName( className ) ;
- else
- stubName = Utility.stubNameForCompiler( className ) ;
-
- ClassLoader expectedTypeClassLoader =
- (expectedClass == null ? classLoader :
- expectedClass.getClassLoader());
-
- // The old code was optimized to try to guess which way to load classes
- // first. The real stub class name could either be className or
- // "org.omg.stub." + className. We will compute this as follows:
- // If stubName starts with a "forbidden" package, try the prefixed
- // version first, otherwise try the non-prefixed version first.
- // In any case, try both forms if necessary.
-
- String firstStubName = stubName ;
- String secondStubName = stubName ;
-
- if (PackagePrefixChecker.hasOffendingPrefix(stubName))
- firstStubName = PackagePrefixChecker.packagePrefix() + stubName ;
- else
- secondStubName = PackagePrefixChecker.packagePrefix() + stubName ;
-
- Class clz = null;
-
- try {
- clz = Util.loadClass( firstStubName, remoteCodeBase,
- expectedTypeClassLoader ) ;
- } catch (ClassNotFoundException e1) {
- // log only at FINE level
- wrapper.classNotFound1( CompletionStatus.COMPLETED_MAYBE,
- e1, firstStubName ) ;
- try {
- clz = Util.loadClass( secondStubName, remoteCodeBase,
- expectedTypeClassLoader ) ;
- } catch (ClassNotFoundException e2) {
- throw wrapper.classNotFound2(
- CompletionStatus.COMPLETED_MAYBE, e2, secondStubName ) ;
- }
- }
-
- // XXX Is this step necessary, or should the Util.loadClass
- // algorithm always produce a valid class if the setup is correct?
- // Does the OMG standard algorithm need to be changed to include
- // this step?
- if ((clz == null) ||
- ((expectedClass != null) && !expectedClass.isAssignableFrom(clz))) {
- try {
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
- if (cl == null)
- cl = ClassLoader.getSystemClassLoader();
-
- clz = cl.loadClass(className);
- } catch (Exception exc) {
- // XXX make this a system exception
- IllegalStateException ise = new IllegalStateException(
- "Could not load class " + stubName ) ;
- ise.initCause( exc ) ;
- throw ise ;
- }
- }
-
- return new StubFactoryStaticImpl( clz ) ;
- }
-
- public Tie getTie( Class cls )
- {
- Class tieClass = null ;
- String className = Utility.tieName(cls.getName());
-
- // XXX log exceptions at FINE level
- try {
- try {
- //_REVISIT_ The spec does not specify a loadingContext parameter for
- //the following call. Would it be useful to pass one?
- tieClass = Utility.loadClassForClass(className, Util.getCodebase(cls),
- null, cls, cls.getClassLoader());
- return (Tie) tieClass.newInstance();
- } catch (Exception err) {
- tieClass = Utility.loadClassForClass(
- PackagePrefixChecker.packagePrefix() + className,
- Util.getCodebase(cls), null, cls, cls.getClassLoader());
- return (Tie) tieClass.newInstance();
- }
- } catch (Exception err) {
- return null;
- }
-
- }
-
- public boolean createsDynamicStubs()
- {
- return false ;
- }
- }