[jboss-cvs] JBossAS SVN: r63176 - branches/Branch_4_2/tomcat/src/main/org/jboss/web/tomcat/service.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon May 21 19:13:35 EDT 2007
Author: scott.stark at jboss.org
Date: 2007-05-21 19:13:35 -0400 (Mon, 21 May 2007)
New Revision: 63176
Modified:
branches/Branch_4_2/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java
Log:
JBCTS-591, Generate iiop stubs dynamically for any name ending in _Stub.
Modified: branches/Branch_4_2/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java
===================================================================
--- branches/Branch_4_2/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java 2007-05-21 16:26:06 UTC (rev 63175)
+++ branches/Branch_4_2/tomcat/src/main/org/jboss/web/tomcat/service/WebAppClassLoader.java 2007-05-21 23:13:35 UTC (rev 63176)
@@ -23,11 +23,12 @@
import org.apache.catalina.loader.WebappClassLoader;
import org.jboss.logging.Logger;
+import org.jboss.proxy.compiler.IIOPStubCompiler;
/**
- * Subclass the tomcat web app class loader to override the filter method
- * to exclude classes which cannot be override by the web app due to their
- * use in the tomcat web container/integration.
+ * Subclass the tomcat web app class loader to override the filter method to
+ * exclude classes which cannot be override by the web app due to their use in
+ * the tomcat web container/integration.
*
* @author Scott.Stark at jboss.org
* @version $Revision: 57206 $
@@ -35,10 +36,9 @@
public class WebAppClassLoader extends WebappClassLoader
{
static Logger log = Logger.getLogger(WebAppClassLoader.class);
- private String[] filteredPackages = {
- "org.apache.commons.logging"
- };
+ private String[] filteredPackages = { "org.apache.commons.logging" };
+
public WebAppClassLoader()
{
}
@@ -52,37 +52,120 @@
{
return filteredPackages;
}
+
public void setFilteredPackages(String[] pkgs)
{
this.filteredPackages = pkgs;
}
/**
+ * Generate iiop stubs dynamically for any name ending in _Stub.
+ */
+ @Override
+ public Class findClass(String name) throws ClassNotFoundException
+ {
+ boolean trace = log.isTraceEnabled();
+ if (trace)
+ {
+ log.trace("findClass(" + name + ") called");
+ }
+ if (name.endsWith("_Stub"))
+ {
+ int start = name.lastIndexOf('.') + 1;
+ if (name.charAt(start) == '_')
+ {
+ String pkg = name.substring(0, start);
+ String interfaceName = pkg
+ + name.substring(start + 1, name.length() - 5);
+
+ // This is a workaround for a problem in the RMI/IIOP
+ // stub loading code in SUN JDK 1.4.x, which prepends
+ // "org.omg.stub." to classes in certain name spaces,
+ // such as "com.sun". This non-compliant behavior
+ // results in failures when deploying SUN example code,
+ // including ECPerf and PetStore, so we remove the prefix.
+ if (interfaceName.startsWith("org.omg.stub.com.sun."))
+ interfaceName = interfaceName.substring(13);
+
+ Class intf = super.loadClass(interfaceName);
+ if (trace)
+ {
+ log.trace("loaded class " + interfaceName);
+ }
+
+ try
+ {
+ byte[] code = IIOPStubCompiler.compile(intf, name);
+
+ if (trace)
+ {
+ log.trace("compiled stub class for " + interfaceName);
+ }
+ Class clz = defineClass(name, code, 0, code.length);
+ if (trace)
+ {
+ log.trace("defined stub class for " + interfaceName);
+ }
+ resolveClass(clz);
+ try
+ {
+ clz.newInstance();
+ }
+ catch (Throwable t)
+ {
+ ClassNotFoundException cnfe = new ClassNotFoundException(
+ interfaceName, t);
+ throw cnfe;
+ }
+ if (trace)
+ {
+ log.trace("resolved stub class for " + interfaceName);
+ }
+ return clz;
+ }
+ catch (RuntimeException e)
+ {
+ log.debug("failed finding class " + name, e);
+ return super.findClass(name);
+ }
+ }
+ else
+ {
+ return super.findClass(name);
+ }
+ }
+ else
+ {
+ return super.findClass(name);
+ }
+ }
+
+ /**
* Overriden to filter out classes in the packages listed in the
* filteredPackages settings.
*
* @param name
* @return true if the class should be loaded from the parent class loader,
- * false if it can be loaded from this class loader.
- */
+ * false if it can be loaded from this class loader.
+ */
protected boolean filter(String name)
{
boolean excludeClass = super.filter(name);
- if( excludeClass == false )
+ if (excludeClass == false)
{
// Check class against our filtered packages
int length = filteredPackages != null ? filteredPackages.length : 0;
- for(int n = 0; n < length; n ++)
+ for (int n = 0; n < length; n++)
{
String pkg = filteredPackages[n];
- if( name.startsWith(pkg) )
+ if (name.startsWith(pkg))
{
excludeClass = true;
break;
}
}
}
- log.trace("filter name="+name+", exclude="+excludeClass);
+ log.trace("filter name=" + name + ", exclude=" + excludeClass);
return excludeClass;
}
}
More information about the jboss-cvs-commits
mailing list