[jboss-cvs] JBossAS SVN: r97014 - in projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool: support and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Nov 26 05:30:46 EST 2009


Author: flavia.rainone at jboss.com
Date: 2009-11-26 05:30:45 -0500 (Thu, 26 Nov 2009)
New Revision: 97014

Modified:
   projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/test/JBossClClassPoolTest.java
   projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderFactory.java
   projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderFactoryFactory.java
   projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderPolicyModule.java
Log:
[JBREFLECT-73] Created infrastructure for classlaoder policy excludes.

Modified: projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/test/JBossClClassPoolTest.java
===================================================================
--- projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/test/JBossClClassPoolTest.java	2009-11-26 07:32:06 UTC (rev 97013)
+++ projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/jbosscl/test/JBossClClassPoolTest.java	2009-11-26 10:30:45 UTC (rev 97014)
@@ -115,7 +115,7 @@
    /****** HELPER FIELDS ********************************************************************/
    
    /** The ClassPool repository */
-   private ClassPoolRepository repository;
+   protected ClassPoolRepository repository;
    
    /** The classloader helper */
    protected ClassLoaderSystem system;
@@ -177,6 +177,12 @@
       TestVFSClassLoaderFactory factory = TestVFSClassLoaderFactoryFactory.createClassLoaderFactory(name, importAll, urls);
       return createClassLoader(result, factory);
    }
+
+   protected ClassLoader createClassLoader(Result result, String name, boolean importAll, URL[] excludes, URL... urls) throws Exception
+   {
+      TestVFSClassLoaderFactory factory = TestVFSClassLoaderFactoryFactory.createClassLoaderFactory(name, importAll, excludes, urls);
+      return createClassLoader(result, factory);
+   }
    
    protected ClassLoader createClassLoader(Result result, String name, BundleInfoBuilder builder, URL... urls) throws Exception
    {
@@ -365,6 +371,12 @@
       return assertRegisterClassLoader(loader);
    }
    
+   protected ClassPool createClassPool(Result result, String name, boolean importAll, URL[] excludes, URL... urls) throws Exception
+   {
+      ClassLoader loader = createClassLoader(result, name, importAll, excludes, urls);
+      return assertRegisterClassLoader(loader);
+   }
+   
    protected ClassPool createClassPool(Result result, String name, BundleInfoBuilder builder, URL... urls) throws Exception
    {
       return createClassPool(result, name, false, builder, urls);
@@ -431,7 +443,7 @@
       return createChildDomainParentLastClassPool(null, name, domainName, importAll, parent, urls);
    }
 
-   private ClassPool createChildDomainParentLastClassPool(Result result, String name, String domainName, boolean importAll, ClassPool parent, URL... urls) throws Exception
+   protected ClassPool createChildDomainParentLastClassPool(Result result, String name, String domainName, boolean importAll, ClassPool parent, URL... urls) throws Exception
    {
       ClassLoader loader = createChildDomainParentLastClassLoader(result, name, domainName, importAll, parent.getClassLoader(), urls);
       return assertRegisterClassLoader(loader);

Modified: projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderFactory.java
===================================================================
--- projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderFactory.java	2009-11-26 07:32:06 UTC (rev 97013)
+++ projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderFactory.java	2009-11-26 10:30:45 UTC (rev 97014)
@@ -40,6 +40,7 @@
    private static final long serialVersionUID = 1L;
    
    private ClassLoader parent;
+   private List<String> excludedRoots;
 
    @Override
    protected Class<? extends VFSClassLoaderPolicyModule> getModuleClass()
@@ -52,12 +53,19 @@
       this.parent = parent;
    }
    
+   public void setExcludedRoots(List<String> excludedRoots)
+   {
+      this.excludedRoots = excludedRoots;
+   }
+   
    @Override
    public List<BeanMetaData> getBeans()
    {
-
-       List<BeanMetaData> result = super.getBeans();
-      if (parent != null)
+   
+      List<BeanMetaData> result = super.getBeans();
+      boolean overwriteClassLoader = parent != null;
+      boolean overwriteModule = this.excludedRoots != null && !this.excludedRoots.isEmpty();
+      if (overwriteClassLoader || overwriteModule)
       {
          //We need to modify the Module factory method used to create the classloader to pass in the parent
          if (result.size() != 2)
@@ -87,18 +95,32 @@
          {
             throw new IllegalStateException("Could not find module");
          }
-         
-         BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(classLoader.getName(), ClassLoader.class.getName());
-         builder.setNoClassLoader();
-         builder.setFactory(module.getName());
-         builder.setFactoryMethod("registerClassLoaderPolicy");
-         builder.addConstructorParameter(ClassLoaderSystem.class.getName(), builder.createInject(getClassLoaderSystemName()));
-         builder.addConstructorParameter(ClassLoader.class.getName(), parent);
-         classLoader = builder.getBeanMetaData();
+         String moduleName = module.getName();
 
+         if (overwriteClassLoader)
+         {
+            BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(classLoader.getName(), ClassLoader.class.getName());
+            builder.setNoClassLoader();
+            builder.setFactory(module.getName());
+            builder.setFactoryMethod("registerClassLoaderPolicy");
+            builder.addConstructorParameter(ClassLoaderSystem.class.getName(), builder.createInject(getClassLoaderSystemName()));
+            builder.addConstructorParameter(ClassLoader.class.getName(), parent);
+            classLoader = builder.getBeanMetaData();
+         }
+         if (overwriteModule)
+         {
+            // Create the module
+            BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(moduleName, getModuleClass().getName());
+            builder.addConstructorParameter(VFSClassLoaderFactory.class.getName(), this);
+            builder.addConstructorParameter(String.class.getName(), moduleName);
+            builder.addPropertyMetaData("roots", getRoots());
+            builder.addPropertyMetaData("excludedRoots", this.excludedRoots);
+            builder.setNoClassLoader();
+            builder.addUninstall("removeClassLoader");
+            module = builder.getBeanMetaData();
+         }
          result = Arrays.asList(classLoader, module);
       }
-      
       return result;
    }
 }

Modified: projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderFactoryFactory.java
===================================================================
--- projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderFactoryFactory.java	2009-11-26 07:32:06 UTC (rev 97013)
+++ projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderFactoryFactory.java	2009-11-26 10:30:45 UTC (rev 97014)
@@ -41,38 +41,73 @@
       return createClassLoaderFactory(name, importAll, null, false, urls);
    }
    
+   public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, URL[] excludes, URL... urls)
+   {
+      return createClassLoaderFactory(name, importAll, null, false, excludes, urls);
+   }
+   
    public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, BundleInfoBuilder builder, URL... urls) throws Exception
    {
-      return createClassLoaderFactory(name, importAll, null, null, builder, false, urls);
+      return createClassLoaderFactory(name, importAll, null, null, builder, false, null, urls);
    }
    
+   public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, BundleInfoBuilder builder, URL[] excludes, URL... urls) throws Exception
+   {
+      return createClassLoaderFactory(name, importAll, null, null, builder, false, excludes, urls);
+   }
+   
    public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, String domainName, BundleInfoBuilder builder, boolean parentFirst, URL... urls) throws Exception
    {
       return createClassLoaderFactory(name, domainName, null, builder, parentFirst, urls);
    }
    
+   public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, String domainName, BundleInfoBuilder builder, boolean parentFirst, URL[] excludes, URL... urls) throws Exception
+   {
+      return createClassLoaderFactory(name, domainName, null, builder, parentFirst, excludes, urls);
+   }
+   
    public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, String domainName, String parentDomainName, BundleInfoBuilder builder, boolean parentFirst, URL... urls) throws Exception
    {
-      return createClassLoaderFactory(name, false, domainName, parentDomainName, builder, false, urls);
+      return createClassLoaderFactory(name, false, domainName, parentDomainName, builder, false, null, urls);
    }
+   
+   public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, String domainName, String parentDomainName, BundleInfoBuilder builder, boolean parentFirst, URL[] excludes, URL... urls) throws Exception
+   {
+      return createClassLoaderFactory(name, false, domainName, parentDomainName, builder, false, excludes, urls);
+   }
 
    public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, String moduleName, URL... urls) throws Exception
    {
       return createClassLoaderFactory(name, importAll, null, false, urls);
    }
    
+   public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, String moduleName, URL[] excludes, URL... urls) throws Exception
+   {
+      return createClassLoaderFactory(name, importAll, null, false, excludes, urls);
+   }
+   
    public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, String domainName, boolean parentFirst, URL... urls)
    {
       return createClassLoaderFactory(name, importAll, domainName, null, parentFirst, urls);
    }
+   
+   public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, String domainName, boolean parentFirst, URL[] excludes, URL... urls)
+   {
+      return createClassLoaderFactory(name, importAll, domainName, null, parentFirst, excludes, urls);
+   }
 
    public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, String domainName, String parentDomainName, boolean parentFirst, URL... urls)
    {
-      return createClassLoaderFactory(name, importAll, domainName, parentDomainName, null, parentFirst, urls);
+      return createClassLoaderFactory(name, importAll, domainName, parentDomainName, null, parentFirst, null, urls);
    }
    
-   public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, String domainName, String parentDomainName, BundleInfoBuilder builder, boolean parentFirst, URL... urls)
+   public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, String domainName, String parentDomainName, boolean parentFirst, URL[] excludes, URL... urls)
    {
+      return createClassLoaderFactory(name, importAll, domainName, parentDomainName, null, parentFirst, excludes, urls);
+   }
+   
+   public static TestVFSClassLoaderFactory createClassLoaderFactory(String name, boolean importAll, String domainName, String parentDomainName, BundleInfoBuilder builder, boolean parentFirst, URL[] excludes, URL... urls)
+   {
       TestVFSClassLoaderFactory factory = new TestVFSClassLoaderFactory();
       factory.setName(name);
       factory.setImportAll(importAll);
@@ -81,6 +116,7 @@
          factory.setExportAll(ExportAll.NON_EMPTY);
       }
       factory.setRoots(urlsToStringList(urls));
+      factory.setExcludedRoots(urlsToStringList(excludes));
       addCapabilitiesAndRequirements(factory, builder);
       setupDomain(factory, domainName, parentDomainName, parentFirst);
       return factory;
@@ -118,6 +154,10 @@
    
    private static List<String> urlsToStringList(URL... urls)
    {
+      if (urls == null)
+      {
+         return null;
+      }
       List<String> urlList = new ArrayList<String>(urls.length);
       if (urls.length > 0)
       {

Modified: projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderPolicyModule.java
===================================================================
--- projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderPolicyModule.java	2009-11-26 07:32:06 UTC (rev 97013)
+++ projects/jboss-classpool/trunk/src/test/java/org/jboss/test/classpool/support/TestVFSClassLoaderPolicyModule.java	2009-11-26 10:30:45 UTC (rev 97014)
@@ -21,10 +21,18 @@
 */ 
 package org.jboss.test.classpool.support;
 
+import java.io.IOException;
+import java.net.URI;
 import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import org.jboss.classloading.spi.vfs.dependency.VFSClassLoaderPolicyModule;
 import org.jboss.classloading.spi.vfs.metadata.VFSClassLoaderFactory;
+import org.jboss.classloading.spi.vfs.policy.VFSClassLoaderPolicy;
 import org.jboss.util.id.GUID;
 import org.jboss.virtual.MemoryFileFactory;
 import org.jboss.virtual.VirtualFile;
@@ -38,15 +46,22 @@
 {
    private static final long serialVersionUID = 1;
    
+   
    /** In AS we need a URL to create the temporary files */
    URL dynamicClassRoot;
    VirtualFile classes;
-
+   private List<String> excludedRoots;
+   
    public TestVFSClassLoaderPolicyModule(VFSClassLoaderFactory classLoadingMetaData, String contextName)
    {
       // FIXME TesetMockClassLoaderPolicyModule constructor
       super(classLoadingMetaData, contextName);
    }
+   
+   public void setExcludedRoots(List<String> excludedRoots)
+   {
+      this.excludedRoots = excludedRoots;
+   }
 
    /**
     * Get/Create the vfs memory file where we will create dynamic classes
@@ -65,14 +80,79 @@
    protected VirtualFile[] determineVFSRoots()
    {
       initDynamicClassRoot();
+      Map<Integer, String> truncatedRootPaths = truncateArchiveNestedPaths(this.getRoots());
       VirtualFile[] roots = super.determineVFSRoots();
+      restoreArchiveNestedPaths(truncatedRootPaths, roots);
       VirtualFile[] newRoots = new VirtualFile[roots.length + 1];
       newRoots[0] = classes;
       System.arraycopy(roots, 0, newRoots, 1, roots.length);
-      
       return newRoots;
    }
    
+   @Override
+   // FIXME code copied from determinePolicy method in super class
+   protected VFSClassLoaderPolicy determinePolicy()
+   {
+      VirtualFile[] roots = determineVFSRoots();
+
+      // these are the only lines that are different from super class's determinePolicy()
+      VirtualFile[] excludedRoots = determineVFSExcludedRoots();
+      VFSClassLoaderPolicy policy = VFSClassLoaderPolicy.createVFSClassLoaderPolicy(
+            getContextName(), roots, excludedRoots);
+
+      String[] packageNames = getPackageNames();
+      policy.setExportedPackages(packageNames);
+      policy.setIncluded(getIncluded());
+      policy.setExcluded(getExcluded());
+      policy.setExcludedExport(getExcludedExport());
+      policy.setExportAll(getExportAll());
+      policy.setImportAll(isImportAll());
+      policy.setCacheable(isCacheable());
+      policy.setBlackListable(isBlackListable());
+      policy.setDelegates(getDelegates());
+      return policy;
+   }
+
+   protected VirtualFile[] determineVFSExcludedRoots()
+   {
+      if (this.excludedRoots == null || this.excludedRoots.isEmpty())
+      {
+         return new VirtualFile[0];
+      }
+      Map<Integer, String> truncatedRootPaths = truncateArchiveNestedPaths(this.excludedRoots);
+      VirtualFile[] roots = determineVFSRoots(this.excludedRoots);
+      restoreArchiveNestedPaths(truncatedRootPaths, roots);
+      return roots;
+   }
+   
+   // FIXME: code copied from determineVFSRoots method in superclass
+   protected VirtualFile[] determineVFSRoots(List<String> roots)
+   {
+      if (roots == null)
+      {
+         return new VirtualFile[0];
+      }
+      VirtualFile[] vfsRoots = new VirtualFile[roots.size()];
+      for (int i = 0; i < roots.size(); ++i)
+      {
+         String root = roots.get(i);
+         try
+         {
+            URI uri = new URI(root);
+            vfsRoots[i] = getVirtualFile(uri);
+         }
+         catch (RuntimeException e)
+         {
+            throw e;
+         }
+         catch (Exception e)
+         {
+            throw new RuntimeException("Error creating VFS file for " + root, e);
+         }
+      }
+      return vfsRoots;
+   }
+   
    private synchronized void initDynamicClassRoot()
    {
       if (dynamicClassRoot == null)
@@ -84,9 +164,83 @@
          }
          catch (Exception e)
          {
-            // AutoGenerated
             throw new RuntimeException(e);
          }
       }
    }
+
+   /**
+    * This method truncated nested archives classpath.
+    * For example, the "/home/user_name/jboss-classpool/target/mywar.war/META-INF/classes"
+    * is replaced by "/home/user_name/jboss-classpool/target/mywar.war"
+    * The truncation is only performed on paths that involve subdirectories of archive files.
+    * 
+    * @param paths a list of paths. After this method is executed, this list will contain the
+    *              truncated paths
+    * @return a map that can be used to restore the truncated paths by invoking
+    *         {@code #restoreArchiveNestedPaths(Map, VirtualFile[])}
+    */
+   private Map<Integer, String> truncateArchiveNestedPaths(List<String> paths)
+   {
+      Map<Integer, String> truncatedRootPaths = new HashMap<Integer, String>();
+      for (ListIterator<String> listIterator = paths.listIterator(); listIterator.hasNext();)
+      {
+         int rootIndex = listIterator.nextIndex();
+         String root = listIterator.next();
+         int archiveIndex = root.indexOf('.');
+         int lastSlash = root.indexOf('/', archiveIndex);
+         if (lastSlash > 0)
+         {
+            listIterator.set(root.substring(0, lastSlash));
+            root = root.substring(lastSlash + 1);
+            if (root != null)
+            {
+               truncatedRootPaths.put(rootIndex, root);
+            }
+         }
+      }
+      return truncatedRootPaths;
+   }
+   
+   /**
+    * Restores the truncated paths.
+    * 
+    * @param truncatedPaths the result of a previous truncation
+    *                       ({@see #truncateArchiveNestedPaths(List)}).
+    * @param paths a list of virtual files representing the truncated paths. Every virtual file
+    *              in this array that corresponds to a previously truncated path will be
+    *              replaced the virtual file that represent the original path.
+    */
+   private void restoreArchiveNestedPaths(
+         Map<Integer, String> truncatedPaths, VirtualFile[] paths)
+   {
+      for (Entry<Integer, String> truncatedPath: truncatedPaths.entrySet())
+      {
+         int pathIndex = truncatedPath.getKey();
+         VirtualFile file = paths[pathIndex];
+         String path = truncatedPath.getValue();
+         do
+         {
+            int archiveIndex = path.indexOf('.');
+            int lastSlash = archiveIndex > 0? path.indexOf('/', archiveIndex): -1;
+            try
+            {
+               if (lastSlash > 0)
+               {
+                  file = file.getChild(path.substring(0, lastSlash));
+                  path = path.substring(lastSlash + 1);
+               }
+               else
+               {
+                  file = file.getChild(path);
+                  path = null;
+               }
+            } catch (IOException e)
+            {
+               throw new RuntimeException("Can't find path " + path + " on root " + file, e);
+            }
+         } while(path != null);
+         paths[pathIndex] = file;
+      }
+   }
 }




More information about the jboss-cvs-commits mailing list