You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hivemind.apache.org by hl...@apache.org on 2004/09/04 16:38:50 UTC
cvs commit: jakarta-hivemind status.xml
hlship 2004/09/04 07:38:50
Modified: framework/src/java/org/apache/hivemind/service/impl Tag:
branch-1-0 ClassFactoryImpl.java
HiveMindClassPool.java CtClassSource.java
ClassFactoryClassLoader.java
framework/src/test/org/apache/hivemind/service/impl Tag:
branch-1-0 TestClassFab.java
. Tag: branch-1-0 status.xml
Log:
HIVEMIND-49: Fix a class loading issue inside Tomcat.
Revision Changes Path
No revision
No revision
1.6.2.1 +5 -1 jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/ClassFactoryImpl.java
Index: ClassFactoryImpl.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/ClassFactoryImpl.java,v
retrieving revision 1.6
retrieving revision 1.6.2.1
diff -u -r1.6 -r1.6.2.1
--- ClassFactoryImpl.java 31 Aug 2004 20:02:13 -0000 1.6
+++ ClassFactoryImpl.java 4 Sep 2004 14:38:49 -0000 1.6.2.1
@@ -68,7 +68,11 @@
if (result == null)
{
- result = new CtClassSource(_pool, module.getClassResolver().getClassLoader());
+ ClassLoader moduleLoader = module.getClassResolver().getClassLoader();
+
+ _pool.appendClassLoader(moduleLoader);
+
+ result = new CtClassSource(_pool);
_ctClassSourceMap.put(id, result);
}
1.1.2.1 +22 -5 jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/HiveMindClassPool.java
Index: HiveMindClassPool.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/HiveMindClassPool.java,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -u -r1.1 -r1.1.2.1
--- HiveMindClassPool.java 31 Aug 2004 20:02:13 -0000 1.1
+++ HiveMindClassPool.java 4 Sep 2004 14:38:50 -0000 1.1.2.1
@@ -14,8 +14,12 @@
package org.apache.hivemind.service.impl;
+import java.util.HashSet;
+import java.util.Set;
+
import javassist.ClassPath;
import javassist.ClassPool;
+import javassist.LoaderClassPath;
/**
* Used to ensure that {@link javassist.ClassPool#appendClassPath(javassist.ClassPath)} is
@@ -28,19 +32,32 @@
{
private ClassFactoryClassLoader _loader = new ClassFactoryClassLoader();
+ /**
+ * Used to identify which class loaders have already been integrated into the pool.
+ */
+ private Set _loaders = new HashSet();
+
public HiveMindClassPool()
{
super(null);
}
/**
- * Synchronizes this operation. {@link ClassPool#get(java.lang.String)} is already
- * synchronized.
- *
+ * Convienience method for adding to the ClassPath for a particular
+ * class loader.
*/
- public synchronized ClassPath appendClassPath(ClassPath cp)
+ public synchronized void appendClassLoader(ClassLoader loader)
{
- return super.appendClassPath(cp);
+ if (_loaders.contains(loader))
+ return;
+
+ _loader.addDelegateLoader(loader);
+
+ ClassPath path = new LoaderClassPath(loader);
+
+ appendClassPath(path);
+
+ _loaders.add(loader);
}
public Class loadClass(String name, byte[] bytecodes)
1.2.2.1 +1 -7 jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/CtClassSource.java
Index: CtClassSource.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/CtClassSource.java,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -r1.2 -r1.2.2.1
--- CtClassSource.java 31 Aug 2004 20:02:13 -0000 1.2
+++ CtClassSource.java 4 Sep 2004 14:38:50 -0000 1.2.2.1
@@ -14,9 +14,7 @@
package org.apache.hivemind.service.impl;
-import javassist.ClassPath;
import javassist.CtClass;
-import javassist.LoaderClassPath;
import javassist.NotFoundException;
import org.apache.hivemind.ApplicationRuntimeException;
@@ -34,13 +32,9 @@
{
private HiveMindClassPool _pool;
- public CtClassSource(HiveMindClassPool pool, ClassLoader parentLoader)
+ public CtClassSource(HiveMindClassPool pool)
{
_pool = pool;
-
- ClassPath path = new LoaderClassPath(parentLoader);
-
- _pool.appendClassPath(path);
}
public CtClass getCtClass(Class searchClass)
1.3.2.1 +52 -0 jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/ClassFactoryClassLoader.java
Index: ClassFactoryClassLoader.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/ClassFactoryClassLoader.java,v
retrieving revision 1.3
retrieving revision 1.3.2.1
diff -u -r1.3 -r1.3.2.1
--- ClassFactoryClassLoader.java 31 Aug 2004 20:02:13 -0000 1.3
+++ ClassFactoryClassLoader.java 4 Sep 2004 14:38:50 -0000 1.3.2.1
@@ -14,6 +14,9 @@
package org.apache.hivemind.service.impl;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* ClassLoader used to properly instantiate newly created classes.
*
@@ -22,6 +25,11 @@
*/
class ClassFactoryClassLoader extends ClassLoader
{
+ private List _loaders = new ArrayList();
+
+ /**
+ * Invoked to create a new class instance from fabricated bytecode.
+ */
public Class loadClass(String name, byte[] bytecodes)
{
Class result = defineClass(name, bytecodes, 0, bytecodes.length);
@@ -30,4 +38,48 @@
return result;
}
+
+ /**
+ * Adds a delegate class loader to the list of delegate class loaders.
+ */
+ public synchronized void addDelegateLoader(ClassLoader loader)
+ {
+ _loaders.add(loader);
+ }
+
+ /**
+ * Searches each of the delegate class loaders for the given class.
+ */
+ protected synchronized Class findClass(String name) throws ClassNotFoundException
+ {
+ ClassNotFoundException cnfex = null;
+
+ try
+ {
+ return super.findClass(name);
+ }
+ catch (ClassNotFoundException ex)
+ {
+ cnfex = ex;
+ }
+
+ int count = _loaders.size();
+ for (int i = 0; i < count; i++)
+ {
+ ClassLoader l = (ClassLoader) _loaders.get(i);
+
+ try
+ {
+ return l.loadClass(name);
+ }
+ catch (ClassNotFoundException ex)
+ {
+ }
+ }
+
+ // Not found .. through the first exception
+
+ throw cnfex;
+ }
+
}
No revision
No revision
1.1.2.1 +15 -2 jakarta-hivemind/framework/src/test/org/apache/hivemind/service/impl/TestClassFab.java
Index: TestClassFab.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/test/org/apache/hivemind/service/impl/TestClassFab.java,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -u -r1.1 -r1.1.2.1
--- TestClassFab.java 31 Aug 2004 20:02:14 -0000 1.1
+++ TestClassFab.java 4 Sep 2004 14:38:50 -0000 1.1.2.1
@@ -40,8 +40,20 @@
*/
public class TestClassFab extends HiveMindTestCase
{
- private CtClassSource _source =
- new CtClassSource(new HiveMindClassPool(), Thread.currentThread().getContextClassLoader());
+ private CtClassSource _source;
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ ClassLoader threadLoader = Thread.currentThread().getContextClassLoader();
+
+ HiveMindClassPool pool = new HiveMindClassPool();
+
+ pool.appendClassLoader(threadLoader);
+
+ _source = new CtClassSource(pool);
+ }
private ClassFab newClassFab(String className, Class superClass)
{
@@ -387,4 +399,5 @@
// Javassist lets us down here; I can't think of a way to get addField() to actually
// fail.
}
+
}
No revision
No revision
1.57.2.1 +4 -2 jakarta-hivemind/status.xml
Index: status.xml
===================================================================
RCS file: /home/cvs/jakarta-hivemind/status.xml,v
retrieving revision 1.57
retrieving revision 1.57.2.1
diff -u -r1.57 -r1.57.2.1
--- status.xml 4 Sep 2004 13:45:28 -0000 1.57
+++ status.xml 4 Sep 2004 14:38:50 -0000 1.57.2.1
@@ -22,7 +22,7 @@
<person name="Knut Wannheden" email="knut.wannheden@paranor.ch" id="KW" />
</developers>
<todo>
- <actions priority="Release 1.0">
+ <actions priority="Release 1.1">
<action context="lib" dev="HLS">JMX Integration</action>
</actions>
</todo>
@@ -43,7 +43,9 @@
<action type="fix" dev="HLS" fixes-bug="HIVEMIND-44" due-to="James Carman">
The previous fix was incomplete; this should close the remaining sychronization gaps.
</action>
-
+ <action type="fix" dev="HLS" fixed-bug="HIVEMIND-49">
+ Class loading issue inside Tomcat.
+ </action>
</release>
<release version="1.0-rc-1" date="Aug 25 2004">
---------------------------------------------------------------------
To unsubscribe, e-mail: hivemind-cvs-unsubscribe@jakarta.apache.org
For additional commands, e-mail: hivemind-cvs-help@jakarta.apache.org