[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