[jboss-cvs] JBossAS SVN: r99199 - in projects/jboss-classpool/trunk/classpool/src: test/java/org/jboss/test/classpool/support and 1 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Jan 11 07:12:32 EST 2010
Author: kabir.khan at jboss.com
Date: 2010-01-11 07:12:31 -0500 (Mon, 11 Jan 2010)
New Revision: 99199
Added:
projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/support/TestCallback.java
Modified:
projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/spi/ClassPoolRepository.java
projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/test/ClassPoolTest.java
projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/test/SimpleDelegatingClassPoolTestCase.java
Log:
[JBREFLECT-91] Support multiple callbacks in ClassPoolRepository
Modified: projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/spi/ClassPoolRepository.java
===================================================================
--- projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/spi/ClassPoolRepository.java 2010-01-11 11:38:38 UTC (rev 99198)
+++ projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/spi/ClassPoolRepository.java 2010-01-11 12:12:31 UTC (rev 99199)
@@ -21,9 +21,12 @@
*/
package org.jboss.classpool.spi;
+import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
import javassist.ClassPool;
import javassist.scopedpool.ScopedClassPool;
@@ -44,7 +47,7 @@
protected final ScopedClassPoolRepository delegate;
- private volatile ClassPoolRepositoryCallback callback;
+ private volatile List<ClassPoolRepositoryCallback> callbacks;
private final ConcurrentMap<ClassLoader, Boolean> currentClassLoaders = new ConcurrentHashMap<ClassLoader, Boolean>();
@@ -84,24 +87,53 @@
}
/**
- * Sets a callback object for notifications on classloader registration.
+ * Adds a callback object for notifications on classloader registration.
*
* @param callback the callback object
* @see ClassPoolRepositoryCallback
+ * @throws IllegalArgumentException if the passed in callback was null
*/
- public void setClassPoolRepositoryCallback(ClassPoolRepositoryCallback callback)
+ public void addClassPoolRepositoryCallback(ClassPoolRepositoryCallback callback)
{
- this.callback = callback;
+ if (callback == null)
+ throw new IllegalArgumentException("Null callback");
+ if (callbacks == null)
+ {
+ synchronized(this)
+ {
+ if (callbacks == null)
+ {
+ callbacks = new CopyOnWriteArrayList<ClassPoolRepositoryCallback>();
+ }
+ }
+ }
+ callbacks.add(callback);
}
/**
- * Returns the callback object.
- * @return the callback object. May be {@code null}
+ * Returns the callback objects.
+ * @return the callback objects in an unmodifiable list. If there are none an empty list is returned
*/
- public ClassPoolRepositoryCallback getClassPoolRepositoryCallback()
+ public List<ClassPoolRepositoryCallback> getClassPoolRepositoryCallbacks()
{
- return this.callback;
+ List<ClassPoolRepositoryCallback> cbs = callbacks;
+ if (cbs == null || cbs.size() == 0)
+ return Collections.<ClassPoolRepositoryCallback>emptyList();
+ return Collections.unmodifiableList(callbacks);
}
+
+ /**
+ * Removes a callback object. If the callback object is null, or it cannot be found in the list, no error is thrown.
+ * @param callback the callback object
+ */
+ public boolean removeClassPoolRepositoryCallback(ClassPoolRepositoryCallback callback)
+ {
+ if (callback == null)
+ return false;
+ if (callbacks == null)
+ return false;
+ return callbacks.remove(callback);
+ }
public boolean isPrune()
{
@@ -177,10 +209,12 @@
currentClassLoaders.remove(classLoader);
// TODO review classPool != null check for AOP tests
- ClassPoolRepositoryCallback cb = callback;
- if (classPool != null && cb != null)
+ if (callbacks != null && callbacks.size() > 0)
{
- cb.classLoaderRegistered(classLoader);
+ for (ClassPoolRepositoryCallback callback : callbacks)
+ {
+ callback.classLoaderRegistered(classLoader);
+ }
}
return classPool;
}
@@ -193,10 +227,12 @@
public void unregisterClassLoader(ClassLoader classLoader)
{
delegate.unregisterClassLoader(classLoader);
- ClassPoolRepositoryCallback cb = callback;
- if (cb != null)
+ if (callbacks != null && callbacks.size() > 0)
{
- cb.classLoaderUnregistered(classLoader);
+ for (ClassPoolRepositoryCallback callback : callbacks)
+ {
+ callback.classLoaderUnregistered(classLoader);
+ }
}
}
}
\ No newline at end of file
Added: projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/support/TestCallback.java
===================================================================
--- projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/support/TestCallback.java (rev 0)
+++ projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/support/TestCallback.java 2010-01-11 12:12:31 UTC (rev 99199)
@@ -0,0 +1,61 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.classpool.support;
+
+import org.jboss.classpool.spi.ClassPoolRepositoryCallback;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class TestCallback implements ClassPoolRepositoryCallback
+{
+ ClassLoader register;
+ ClassLoader unregister;
+
+ public void classLoaderRegistered(ClassLoader classLoader)
+ {
+ register = classLoader;
+ }
+
+ public void classLoaderUnregistered(ClassLoader classLoader)
+ {
+ unregister = classLoader;
+ }
+
+ public ClassLoader getRegister()
+ {
+ return register;
+ }
+
+ public ClassLoader getUnregister()
+ {
+ return unregister;
+ }
+
+ public void clear()
+ {
+ register = null;
+ unregister = null;
+ }
+}
Modified: projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/test/ClassPoolTest.java
===================================================================
--- projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/test/ClassPoolTest.java 2010-01-11 11:38:38 UTC (rev 99198)
+++ projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/test/ClassPoolTest.java 2010-01-11 12:12:31 UTC (rev 99199)
@@ -72,6 +72,12 @@
protected static DelegatingClassPool createDelegatingClassPool(ClassPoolDomain domain, URL...urls) throws ClassNotFoundException
{
+ ClassLoader loader = createLoader(domain, urls);
+ return new DelegatingClassPool(domain, loader, ClassPool.getDefault(), ClassPoolRepository.getInstance());
+ }
+
+ protected static ClassLoader createLoader(ClassPoolDomain domain, URL...urls) throws ClassNotFoundException
+ {
ClassLoader loader = new URLClassLoader(urls);
for (URL url : urls)
{
@@ -90,7 +96,7 @@
loader = new URLClassLoader(urls);
//Add hard reference to loader
loaders.add(loader);
- return new DelegatingClassPool(domain, loader, ClassPool.getDefault(), ClassPoolRepository.getInstance());
+ return loader;
}
@Override
Modified: projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/test/SimpleDelegatingClassPoolTestCase.java
===================================================================
--- projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/test/SimpleDelegatingClassPoolTestCase.java 2010-01-11 11:38:38 UTC (rev 99198)
+++ projects/jboss-classpool/trunk/classpool/src/test/java/org/jboss/test/classpool/test/SimpleDelegatingClassPoolTestCase.java 2010-01-11 12:12:31 UTC (rev 99199)
@@ -29,6 +29,9 @@
import javassist.CtClass;
import org.jboss.classpool.domain.ClassPoolDomain;
+import org.jboss.classpool.spi.ClassPoolRepository;
+import org.jboss.classpool.spi.ClassPoolRepositoryCallback;
+import org.jboss.test.classpool.support.TestCallback;
/**
* Basic tests for DelegatingClassPool
@@ -145,4 +148,58 @@
assertSame(a.getClassPool(), aArray.getClassPool());
assertSame(b.getClassPool(), bArray.getClassPool());
}
+
+ public void testSinglePoolRepositoryCallback() throws Exception
+ {
+ ClassPoolDomain domain = createClassPoolDomain("SIMPLE", null, false);
+ ClassPoolRepository repository = ClassPoolRepository.getInstance();
+ TestCallback cb1 = new TestCallback();
+ repository.addClassPoolRepositoryCallback(cb1);
+ ClassLoader loaderA = createLoader(domain, JAR_A_URL);
+ assertNotNull(loaderA);
+ ClassPool poolA = repository.registerClassLoader(loaderA);
+ assertNotNull(poolA);
+
+ assertNotNull(cb1.getRegister());
+ assertSame(loaderA, cb1.getRegister());
+ assertNull(cb1.getUnregister());
+
+ cb1.clear();
+ repository.unregisterClassLoader(loaderA);
+ assertNull(cb1.getRegister());
+ assertNotNull(cb1.getUnregister());
+ assertSame(loaderA, cb1.getUnregister());
+ }
+
+
+ public void testMultiplePoolRepositoryCallbacks() throws Exception
+ {
+ ClassPoolDomain domain = createClassPoolDomain("SIMPLE", null, false);
+ ClassPoolRepository repository = ClassPoolRepository.getInstance();
+ TestCallback cb1 = new TestCallback();
+ TestCallback cb2 = new TestCallback();
+ repository.addClassPoolRepositoryCallback(cb1);
+ repository.addClassPoolRepositoryCallback(cb2);
+ ClassLoader loaderA = createLoader(domain, JAR_A_URL);
+ assertNotNull(loaderA);
+ ClassPool poolA = repository.registerClassLoader(loaderA);
+ assertNotNull(poolA);
+
+ assertNotNull(cb1.getRegister());
+ assertSame(loaderA, cb1.getRegister());
+ assertNull(cb1.getUnregister());
+ assertNotNull(cb2.getRegister());
+ assertSame(loaderA, cb2.getRegister());
+ assertNull(cb2.getUnregister());
+
+ cb1.clear();
+ cb2.clear();
+ repository.unregisterClassLoader(loaderA);
+ assertNull(cb1.getRegister());
+ assertNotNull(cb1.getUnregister());
+ assertSame(loaderA, cb1.getUnregister());
+ assertNull(cb2.getRegister());
+ assertNotNull(cb2.getUnregister());
+ assertSame(loaderA, cb2.getUnregister());
+ }
}
\ No newline at end of file
More information about the jboss-cvs-commits
mailing list