This patch looks for a classloader in the classes from the stack trace,
making the functionality much closer to Sun's. The original idea was
suggested by Jeroen Frijters, but I decided just to use VMStackWalker
instead of modifying it.
2005-10-13 Audrius Meskauskas <[EMAIL PROTECTED]>
* gnu/CORBA/ObjectCreator.java (forName):
Use gnu.classpath.VMStackWalker.
* gnu/CORBA/Interceptor/Registrator.java,
gnu/CORBA/gnuValueHolder.java,
gnu/CORBA/stubFinder.java,
gnu/javax/rmi/CORBA/DelegateFactory.java,
gnu/javax/rmi/CORBA/StubDelegateImpl.java,
org/omg/CORBA/ORB.java: Load class via ObjectCreator.
Index: gnu/CORBA/ObjectCreator.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/CORBA/ObjectCreator.java,v
retrieving revision 1.8
diff -u -r1.8 ObjectCreator.java
--- gnu/CORBA/ObjectCreator.java 10 Oct 2005 22:49:50 -0000 1.8
+++ gnu/CORBA/ObjectCreator.java 13 Oct 2005 20:21:04 -0000
@@ -43,6 +43,7 @@
import gnu.CORBA.CDR.cdrBufOutput;
import gnu.CORBA.CDR.cdrInput;
import gnu.CORBA.GIOP.ServiceContext;
+import gnu.classpath.VMStackWalker;
import org.omg.CORBA.Any;
import org.omg.CORBA.CompletionStatus;
@@ -547,12 +548,42 @@
}
/**
- * Load the class with the given name.
+ * Load the class with the given name. This method tries to use the context
+ * class loader first. If this fails, it searches for the suitable class
+ * loader in the caller stack trace. This method is a central point where all
+ * requests to find a class by name are delegated.
*/
- public static Class forName(String className)
- throws ClassNotFoundException
- {
- return Class.forName(className, true,
- Thread.currentThread().getContextClassLoader());
- }
+ public static Class forName(String className) throws ClassNotFoundException
+ {
+ try
+ {
+ return Class.forName(className, true,
+ Thread.currentThread().getContextClassLoader());
+ }
+ catch (ClassNotFoundException nex)
+ {
+ /**
+ * Returns the first user defined class loader on the call stack, or
+ * null when no non-null class loader was found.
+ */
+ Class[] ctx = VMStackWalker.getClassContext();
+ for (int i = 0; i < ctx.length; i++)
+ {
+ // Since we live in a class loaded by the bootstrap
+ // class loader, getClassLoader is safe to call without
+ // needing to be wrapped in a privileged action.
+ ClassLoader cl = ctx[i].getClassLoader();
+ try
+ {
+ if (cl != null)
+ return Class.forName(className, true, cl);
+ }
+ catch (ClassNotFoundException nex2)
+ {
+ // Try next.
+ }
+ }
+ }
+ throw new ClassNotFoundException(className);
+ }
}
Index: gnu/CORBA/gnuValueHolder.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/CORBA/gnuValueHolder.java,v
retrieving revision 1.2
diff -u -r1.2 gnuValueHolder.java
--- gnu/CORBA/gnuValueHolder.java 10 Oct 2005 22:49:50 -0000 1.2
+++ gnu/CORBA/gnuValueHolder.java 13 Oct 2005 18:30:02 -0000
@@ -123,8 +123,7 @@
try
{
Class helperClass =
- Class.forName(ObjectCreator.toHelperName(type.id()),
- true, Thread.currentThread().getContextClassLoader());
+ ObjectCreator.forName(ObjectCreator.toHelperName(type.id()));
helper = (BoxedValueHelper) helperClass.newInstance();
}
Index: gnu/CORBA/stubFinder.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/CORBA/stubFinder.java,v
retrieving revision 1.3
diff -u -r1.3 stubFinder.java
--- gnu/CORBA/stubFinder.java 10 Oct 2005 22:49:50 -0000 1.3
+++ gnu/CORBA/stubFinder.java 13 Oct 2005 18:58:20 -0000
@@ -83,8 +83,7 @@
String stub = "_" + s.substring(b + 1) + "Stub";
- Class stubClass = Class.forName(path + stub, true,
- Thread.currentThread().getContextClassLoader());
+ Class stubClass = ObjectCreator.forName(path + stub);
return (ObjectImpl) stubClass.newInstance();
}
Index: gnu/CORBA/Interceptor/Registrator.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/CORBA/Interceptor/Registrator.java,v
retrieving revision 1.4
diff -u -r1.4 Registrator.java
--- gnu/CORBA/Interceptor/Registrator.java 10 Oct 2005 22:49:50 -0000
1.4
+++ gnu/CORBA/Interceptor/Registrator.java 13 Oct 2005 18:31:08 -0000
@@ -39,6 +39,7 @@
package gnu.CORBA.Interceptor;
import gnu.CORBA.Poa.ORB_1_4;
+import gnu.CORBA.ObjectCreator;
import gnu.CORBA.gnuCodecFactory;
import org.omg.CORBA.BAD_INV_ORDER;
@@ -182,8 +183,8 @@
try
{
String cn = sk.substring(m_prefix.length());
- Class iClass = Class.forName(cn, true,
- Thread.currentThread().getContextClassLoader());
+ Class iClass = ObjectCreator.forName(cn);
+
ORBInitializer initializer =
(ORBInitializer) iClass.newInstance();
m_initializers.add(initializer);
Index: gnu/javax/rmi/CORBA/DelegateFactory.java
===================================================================
RCS file:
/cvsroot/classpath/classpath/gnu/javax/rmi/CORBA/DelegateFactory.java,v
retrieving revision 1.5
diff -u -r1.5 DelegateFactory.java
--- gnu/javax/rmi/CORBA/DelegateFactory.java 2 Oct 2005 19:58:01 -0000
1.5
+++ gnu/javax/rmi/CORBA/DelegateFactory.java 13 Oct 2005 18:32:10 -0000
@@ -38,6 +38,8 @@
package gnu.javax.rmi.CORBA;
+import gnu.CORBA.ObjectCreator;
+
/**
* This class produces delegates, using the system properties. If not
@@ -91,8 +93,7 @@
}
try
{
- Class dclass = Class.forName(dcname, true,
- Thread.currentThread().getContextClassLoader());
+ Class dclass = ObjectCreator.forName(dcname);
return dclass.newInstance();
}
catch (Exception e)
Index: gnu/javax/rmi/CORBA/StubDelegateImpl.java
===================================================================
RCS file:
/cvsroot/classpath/classpath/gnu/javax/rmi/CORBA/StubDelegateImpl.java,v
retrieving revision 1.6
diff -u -r1.6 StubDelegateImpl.java
--- gnu/javax/rmi/CORBA/StubDelegateImpl.java 10 Oct 2005 22:49:50 -0000
1.6
+++ gnu/javax/rmi/CORBA/StubDelegateImpl.java 13 Oct 2005 18:32:42 -0000
@@ -38,6 +38,7 @@
package gnu.javax.rmi.CORBA;
+import gnu.CORBA.ObjectCreator;
import gnu.CORBA.Unexpected;
import gnu.CORBA.CDR.cdrBufInput;
import gnu.CORBA.CDR.cdrBufOutput;
@@ -193,8 +194,7 @@
try
{
- tieClass = Class.forName(tn, true,
- Thread.currentThread().getContextClassLoader());
+ tieClass = ObjectCreator.forName(tn);
t = (Tie) tieClass.newInstance();
if (self instanceof Remote)
Util.registerTarget(t, (Remote) self);
Index: org/omg/CORBA/ORB.java
===================================================================
RCS file: /cvsroot/classpath/classpath/org/omg/CORBA/ORB.java,v
retrieving revision 1.17
diff -u -r1.17 ORB.java
--- org/omg/CORBA/ORB.java 10 Oct 2005 22:49:50 -0000 1.17
+++ org/omg/CORBA/ORB.java 13 Oct 2005 18:35:24 -0000
@@ -38,6 +38,7 @@
package org.omg.CORBA;
+import gnu.CORBA.ObjectCreator;
import gnu.CORBA.Restricted_ORB;
import gnu.CORBA.fixedTypeCode;
import gnu.CORBA.generalTypeCode;
@@ -1167,8 +1168,7 @@
try
{
- orb = (ORB) Class.forName(orbClassName, true,
- Thread.currentThread().getContextClassLoader()).newInstance();
+ orb = (ORB) ObjectCreator.forName(orbClassName).newInstance();
}
catch (ClassNotFoundException ex)
{
_______________________________________________
Classpath-patches mailing list
Classpath-patches@gnu.org
http://lists.gnu.org/mailman/listinfo/classpath-patches