[jboss-cvs] JBossAS SVN: r107238 - in projects/jboss-cl/trunk: classloading/src/main/java/org/jboss/classloading/spi/dependency and 4 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Jul 30 10:32:09 EDT 2010


Author: alesj
Date: 2010-07-30 10:32:08 -0400 (Fri, 30 Jul 2010)
New Revision: 107238

Added:
   projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/ClassLoadingSpaceUnitTestCase.java
Modified:
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderCacheWrapper.java
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java
   projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpaceCache.java
   projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java
   projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/mock/MockClassLoaderPolicyModule.java
   projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/DependencyTestSuite.java
   projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/WildcardPackageUnitTestCase.java
Log:
Fix cache lookup, more tests.

Modified: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java	2010-07-30 14:08:05 UTC (rev 107237)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java	2010-07-30 14:32:08 UTC (rev 107238)
@@ -57,7 +57,7 @@
    
    /** The classloaders by package name */
    private Map<String, List<ClassLoaderInformation>> classLoadersByPackageName = new ConcurrentHashMap<String, List<ClassLoaderInformation>>();
-   
+
    /** The global class cache */
    private Map<String, ClassCacheItem> globalClassCache = new ConcurrentHashMap<String, ClassCacheItem>();
    
@@ -1375,6 +1375,10 @@
          flushCaches();
       }
 
+      ClassLoaderCache cache = policy.getCache();
+      if (cache != null)
+         cache.flushCaches();
+
       try
       {
          afterRegisterClassLoader(classLoader, classLoader.getPolicy());
@@ -1439,6 +1443,10 @@
          flushCaches();
       }
 
+      ClassLoaderCache cache = policy.getCache();
+      if (cache != null)
+         cache.flushCaches();
+
       try
       {
          afterUnregisterClassLoader(classLoader, classLoader.getPolicy());

Modified: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderCacheWrapper.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderCacheWrapper.java	2010-07-30 14:08:05 UTC (rev 107237)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderCacheWrapper.java	2010-07-30 14:32:08 UTC (rev 107238)
@@ -23,6 +23,7 @@
 package org.jboss.classloader.spi.base;
 
 import java.net.URL;
+import java.util.Set;
 
 import org.jboss.classloader.spi.ClassLoaderCache;
 import org.jboss.classloader.spi.ImportType;
@@ -44,9 +45,33 @@
       this.info = info;
    }
 
+   /**
+    * Is the resource imported by our classloader.
+    *
+    * @param type the type
+    * @param name the resource name
+    * @return true if it's imported, false otherwise
+    */
+   protected boolean isImported(ImportType type, String name)
+   {
+      if (info != null)
+      {
+         Set<String> imports = info.getImportedPackages(type);
+         if (imports.isEmpty() == false)
+         {
+            String pckg = ClassLoaderInformation.getResourcePackageName(name);
+            return imports.contains(pckg);
+         }
+      }
+      return false;
+   }
+
    public Loader getCachedLoader(String name)
    {
-      return delegate.getCachedLoader(name);
+      if (isImported(ImportType.ALL, name))
+         return delegate.getCachedLoader(name);
+      else
+         return null;
    }
 
    public Loader findLoader(ImportType type, String name)
@@ -79,12 +104,16 @@
 
    public void blackListClass(String name)
    {
-      delegate.blackListClass(name);
+      if (isImported(ImportType.ALL, name))
+         delegate.blackListClass(name);
    }
 
    public URL getCachedResource(String name)
    {
-      return delegate.getCachedResource(name);
+      if (isImported(ImportType.ALL, name))
+         return delegate.getCachedResource(name);
+      else
+         return null;
    }
 
    public URL findResource(ImportType type, String name)
@@ -117,7 +146,8 @@
 
    public void blackListResource(String name)
    {
-      delegate.blackListResource(name);
+      if (isImported(ImportType.ALL, name))
+         delegate.blackListResource(name);
    }
 
    public void flushCaches()

Modified: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java	2010-07-30 14:08:05 UTC (rev 107237)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java	2010-07-30 14:32:08 UTC (rev 107238)
@@ -26,6 +26,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -339,6 +340,18 @@
    }
 
    /**
+    * Get imported packages.
+    *
+    * @param type the type
+    * @return the imported packages
+    */
+   Set<String> getImportedPackages(ImportType type)
+   {
+      Map<String, List<Loader>> map = index.get(type);
+      return (map != null) ? map.keySet() : Collections.<String>emptySet();
+   }
+
+   /**
     * Add loader to index.
     *
     * @param loader the loader
@@ -433,7 +446,7 @@
     * @param resource the resource name
     * @return the package name or the empty string if there is no package
     */
-   private static String getResourcePackageName(final String resource)
+   static String getResourcePackageName(final String resource)
    {
       int i = resource.lastIndexOf('/');
       if (i == -1)

Modified: projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpaceCache.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpaceCache.java	2010-07-30 14:08:05 UTC (rev 107237)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpaceCache.java	2010-07-30 14:32:08 UTC (rev 107238)
@@ -39,6 +39,8 @@
    ClassLoadingSpaceCache(ClassLoadingSpace space)
    {
       this.space = space;
+      restoreCache();
+      restoreBlackList();
    }
 
    public Loader findLoader(ImportType type, String name)
@@ -58,7 +60,7 @@
 
    public String getInfo(ImportType type)
    {
-      return space.toString();
+      return String.valueOf(space);
    }
 
    void merge(ClassLoadingSpaceCache other)

Modified: projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java	2010-07-30 14:08:05 UTC (rev 107237)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java	2010-07-30 14:32:08 UTC (rev 107238)
@@ -239,10 +239,6 @@
       if (classLoader != null)
          unregisterModuleClassLoader(this, classLoader);
 
-      ClassLoaderCache cache = getCache();
-      if (cache != null)
-         cache.flushCaches(); // flush just in case
-
       classLoader = null;
       system = null;
       policy = null;
@@ -291,6 +287,7 @@
                   return getPolicy();
                }
             };
+            // in this case it's actually the right policy, since we need it to add additional delegates
             return resolveWildcard(controller, factory, filter, item);
          }
          else

Modified: projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/mock/MockClassLoaderPolicyModule.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/mock/MockClassLoaderPolicyModule.java	2010-07-30 14:08:05 UTC (rev 107237)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/mock/MockClassLoaderPolicyModule.java	2010-07-30 14:32:08 UTC (rev 107238)
@@ -22,8 +22,8 @@
 package org.jboss.classloading.spi.dependency.policy.mock;
 
 import java.io.File;
+import java.net.URISyntaxException;
 import java.net.URL;
-import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -45,9 +45,10 @@
 import org.jboss.kernel.spi.dependency.KernelControllerContextAware;
 
 /**
- * VFSClassLoaderPolicyModule.
+ * MockClassLoaderPolicyModule.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
  * @version $Revision: 1.1 $
  */
 public class MockClassLoaderPolicyModule extends ClassLoaderPolicyModule implements KernelControllerContextAware

Modified: projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/DependencyTestSuite.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/DependencyTestSuite.java	2010-07-30 14:08:05 UTC (rev 107237)
+++ projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/DependencyTestSuite.java	2010-07-30 14:32:08 UTC (rev 107238)
@@ -21,32 +21,17 @@
  */
 package org.jboss.test.classloading.dependency;
 
+import org.jboss.test.classloading.dependency.test.*;
+
 import junit.framework.Test;
 import junit.framework.TestSuite;
 import junit.textui.TestRunner;
 
-import org.jboss.test.classloading.dependency.test.ClassLoadingAdminLazyShutdownUnitTestCase;
-import org.jboss.test.classloading.dependency.test.ClassLoadingAdminUnitTestCase;
-import org.jboss.test.classloading.dependency.test.ConflictingPackageUnitTestCase;
-import org.jboss.test.classloading.dependency.test.ConflictingRequirementUnitTestCase;
-import org.jboss.test.classloading.dependency.test.DependencyUnitTestCase;
-import org.jboss.test.classloading.dependency.test.DomainUnitTestCase;
-import org.jboss.test.classloading.dependency.test.HierarchicalDomainUnitTestCase;
-import org.jboss.test.classloading.dependency.test.ImportAllUnitTestCase;
-import org.jboss.test.classloading.dependency.test.MockClassLoadingMetaDataUnitTestCase;
-import org.jboss.test.classloading.dependency.test.ModuleDependencyUnitTestCase;
-import org.jboss.test.classloading.dependency.test.PackageDependencyUnitTestCase;
-import org.jboss.test.classloading.dependency.test.ReExportModuleUnitTestCase;
-import org.jboss.test.classloading.dependency.test.ReExportPackageUnitTestCase;
-import org.jboss.test.classloading.dependency.test.SelfImportPackageDependencyUnitTestCase;
-import org.jboss.test.classloading.dependency.test.SplitPackageDependencyUnitTestCase;
-import org.jboss.test.classloading.dependency.test.UsesPackageUnitTestCase;
-import org.jboss.test.classloading.dependency.test.MockResourceVisitorUnitTestCase;
-
 /**
  * Dependency Test Suite.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
  * @version $Revision: 37459 $
  */
 public class DependencyTestSuite extends TestSuite
@@ -87,6 +72,7 @@
       suite.addTest(SelfImportPackageDependencyUnitTestCase.suite());
       suite.addTest(ClassLoadingAdminUnitTestCase.suite());
       suite.addTest(ClassLoadingAdminLazyShutdownUnitTestCase.suite());
+      suite.addTest(ClassLoadingSpaceUnitTestCase.suite());
 
       return suite;
    }

Copied: projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/ClassLoadingSpaceUnitTestCase.java (from rev 106760, projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/PackageDependencyUnitTestCase.java)
===================================================================
--- projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/ClassLoadingSpaceUnitTestCase.java	                        (rev 0)
+++ projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/ClassLoadingSpaceUnitTestCase.java	2010-07-30 14:32:08 UTC (rev 107238)
@@ -0,0 +1,209 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, 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.classloading.dependency.test;
+
+import java.lang.reflect.Method;
+
+import org.jboss.classloader.plugins.ClassLoaderUtils;
+import org.jboss.classloader.spi.ClassLoaderCache;
+import org.jboss.classloading.spi.dependency.ClassLoading;
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.classloading.spi.dependency.policy.mock.MockClassLoadingMetaData;
+import org.jboss.classloading.spi.metadata.ClassLoadingMetaDataFactory;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.test.classloading.dependency.support.a.A;
+import org.jboss.test.classloading.dependency.support.b.B;
+import org.jboss.test.classloading.dependency.support.c.C;
+
+import junit.framework.Test;
+
+/**
+ * ClassLoadingSpaceUnitTestCase.
+ * 
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ * @version $Revision: 1.1 $
+ */
+public class ClassLoadingSpaceUnitTestCase extends AbstractMockClassLoaderUnitTest
+{
+   private Method getCache;
+
+   public static Test suite()
+   {
+      return suite(ClassLoadingSpaceUnitTestCase.class);
+   }
+
+   public ClassLoadingSpaceUnitTestCase(String name)
+   {
+      super(name);
+   }
+
+   @Override
+   protected void setUp() throws Exception
+   {
+      super.setUp();
+
+      getCache = Module.class.getDeclaredMethod("getCache");
+      getCache.setAccessible(true);
+   }
+
+   @Override
+   protected void tearDown() throws Exception
+   {
+      if (getCache != null)
+      {
+         getCache.setAccessible(false);
+         getCache = null;
+      }
+
+      super.tearDown();
+   }
+
+   protected ClassLoaderCache getCache(ClassLoader cl)
+   {
+      try
+      {
+         Module module = ClassLoading.getModuleForClassLoader(cl);
+         getCache.setAccessible(true);
+         return (ClassLoaderCache) getCache.invoke(module);
+      }
+      catch (Exception e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+
+   public void testCacheViaPackages() throws Exception
+   {
+      MockClassLoadingMetaData a = new MockClassLoadingMetaData("a");
+      ClassLoadingMetaDataFactory factory = ClassLoadingMetaDataFactory.getInstance();
+      a.getCapabilities().addCapability(factory.createPackage(A.class.getPackage().getName()));
+      a.setPathsAndPackageNames(A.class);
+      KernelControllerContext contextA = install(a);
+      try
+      {
+         MockClassLoadingMetaData b = new MockClassLoadingMetaData("b");
+         b.getRequirements().addRequirement(factory.createRequirePackage(A.class.getPackage().getName()));
+         b.getCapabilities().addCapability(factory.createPackage(B.class.getPackage().getName()));
+         b.setPathsAndPackageNames(B.class);
+         KernelControllerContext contextB = install(b);
+         try
+         {
+            MockClassLoadingMetaData c = new MockClassLoadingMetaData("c");
+            c.getRequirements().addRequirement(factory.createRequirePackage(A.class.getPackage().getName()));
+            c.getRequirements().addRequirement(factory.createRequirePackage(B.class.getPackage().getName()));
+            c.getCapabilities().addCapability(factory.createPackage(C.class.getPackage().getName()));
+            c.setPathsAndPackageNames(C.class);
+            KernelControllerContext contextC = install(c);
+            try
+            {
+               ClassLoader clA = assertClassLoader(contextA);
+               ClassLoader clB = assertClassLoader(contextB);
+               ClassLoader clC = assertClassLoader(contextC);
+
+               ClassLoaderCache clcA = getCache(clA);
+               ClassLoaderCache clcB = getCache(clB);
+               ClassLoaderCache clcC = getCache(clC);
+
+               assertSame(clcA, clcB);
+               assertSame(clcB, clcC);
+
+               String pathA = ClassLoaderUtils.classNameToPath(A.class);
+               assertNull(clcA.getCachedLoader(pathA));
+               assertLoadClass(A.class, clB, clA);
+               assertNotNull(clcA.getCachedLoader(pathA));
+               assertLoadClass(A.class, clC, clA);
+            }
+            finally
+            {
+               uninstall(contextC);
+            }
+         }
+         finally
+         {
+            uninstall(contextB);
+         }
+      }
+      finally
+      {
+         uninstall(contextA);
+      }
+      assertNoClassLoader(contextA);
+   }
+
+   public void testCacheViaModules() throws Exception
+   {
+      MockClassLoadingMetaData a = new MockClassLoadingMetaData("a");
+      ClassLoadingMetaDataFactory factory = ClassLoadingMetaDataFactory.getInstance();
+      a.setPathsAndPackageNames(A.class);
+      a.setExportedPackages(A.class);
+      KernelControllerContext contextA = install(a);
+      try
+      {
+         MockClassLoadingMetaData b = new MockClassLoadingMetaData("b");
+         b.getRequirements().addRequirement(factory.createRequireModule("a"));
+         b.setPathsAndPackageNames(B.class);
+         b.setExportedPackages(B.class);
+         KernelControllerContext contextB = install(b);
+         try
+         {
+            MockClassLoadingMetaData c = new MockClassLoadingMetaData("c");
+            c.getRequirements().addRequirement(factory.createRequireModule("a"));
+            c.getRequirements().addRequirement(factory.createRequireModule("b"));
+            c.setPathsAndPackageNames(C.class);
+            c.setExportedPackages(C.class);
+            KernelControllerContext contextC = install(c);
+            try
+            {
+               ClassLoader clA = assertClassLoader(contextA);
+               ClassLoader clB = assertClassLoader(contextB);
+               ClassLoader clC = assertClassLoader(contextC);
+
+               ClassLoaderCache clcA = getCache(clA);
+               ClassLoaderCache clcB = getCache(clB);
+               ClassLoaderCache clcC = getCache(clC);
+
+               assertSame(clcA, clcB);
+               assertSame(clcB, clcC);
+
+               String pathA = ClassLoaderUtils.classNameToPath(A.class);
+               assertNull(clcA.getCachedLoader(pathA));
+               assertLoadClass(A.class, clB, clA);
+               assertNotNull(clcA.getCachedLoader(pathA));
+               assertLoadClass(A.class, clC, clA);
+            }
+            finally
+            {
+               uninstall(contextC);
+            }
+         }
+         finally
+         {
+            uninstall(contextB);
+         }
+      }
+      finally
+      {
+         uninstall(contextA);
+      }
+      assertNoClassLoader(contextA);
+   }
+}

Modified: projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/WildcardPackageUnitTestCase.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/WildcardPackageUnitTestCase.java	2010-07-30 14:08:05 UTC (rev 107237)
+++ projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/WildcardPackageUnitTestCase.java	2010-07-30 14:32:08 UTC (rev 107238)
@@ -53,35 +53,35 @@
    {
       ClassLoadingMetaDataFactory factory = ClassLoadingMetaDataFactory.getInstance();
 
-      MockClassLoadingMetaData a1 = new MockClassLoadingMetaData("a1");
-      a1.getRequirements().addRequirement(factory.createWildcardPackage(A.class.getPackage().getName()));
-      KernelControllerContext contextA1 = install(a1);
+      MockClassLoadingMetaData b = new MockClassLoadingMetaData("b");
+      b.getRequirements().addRequirement(factory.createWildcardPackage(A.class.getPackage().getName()));
+      KernelControllerContext contextB = install(b);
       try
       {
-         ClassLoader clA1 = assertClassLoader(contextA1);
-         assertLoadClassFail(A.class, clA1);
+         ClassLoader clB = assertClassLoader(contextB);
+         assertLoadClassFail(A.class, clB);
 
-         MockClassLoadingMetaData a2 = new MockClassLoadingMetaData("a2");
-         a2.getCapabilities().addCapability(factory.createPackage(A.class.getPackage().getName()));
-         a2.setPathsAndPackageNames(A.class);
-         KernelControllerContext contextA2 = install(a2);
+         MockClassLoadingMetaData a = new MockClassLoadingMetaData("a");
+         a.getCapabilities().addCapability(factory.createPackage(A.class.getPackage().getName()));
+         a.setPathsAndPackageNames(A.class);
+         KernelControllerContext contextA = install(a);
          try
          {
-            ClassLoader clA2 = assertClassLoader(contextA2);
-            assertLoadClass(A.class, clA2);
-            assertLoadClass(A.class, clA1, clA2);
+            ClassLoader clA = assertClassLoader(contextA);
+            //assertLoadClass(A.class, clA);
+            assertLoadClass(A.class, clB, clA);
          }
          finally
          {
-            uninstall(contextA2);
+            uninstall(contextA);
          }
-         assertNoClassLoader(contextA2);
+         assertNoClassLoader(contextA);
       }
       finally
       {
-         uninstall(contextA1);
+         uninstall(contextB);
       }
-      assertNoClassLoader(contextA1);
+      assertNoClassLoader(contextB);
    }
 
    // deploy B first, then A



More information about the jboss-cvs-commits mailing list