[jboss-cvs] JBossAS SVN: r76013 - in projects/jboss-cl/trunk: classloading/src/main/org/jboss/classloading/spi/dependency/policy/mock and 3 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sat Jul 19 09:35:44 EDT 2008


Author: alesj
Date: 2008-07-19 09:35:44 -0400 (Sat, 19 Jul 2008)
New Revision: 76013

Modified:
   projects/jboss-cl/trunk/classloading-vfs/src/main/org/jboss/classloading/plugins/vfs/VFSResourceVisitor.java
   projects/jboss-cl/trunk/classloading-vfs/src/main/org/jboss/classloading/spi/vfs/dependency/VFSClassLoaderPolicyModule.java
   projects/jboss-cl/trunk/classloading-vfs/src/tests/org/jboss/test/classloading/vfs/metadata/test/VFSResourceVisitorUnitTestCase.java
   projects/jboss-cl/trunk/classloading/src/main/org/jboss/classloading/spi/dependency/Module.java
   projects/jboss-cl/trunk/classloading/src/main/org/jboss/classloading/spi/dependency/policy/mock/MockClassLoaderPolicyModule.java
Log:
[JBCL-19]; adding recursion filter.

Modified: projects/jboss-cl/trunk/classloading/src/main/org/jboss/classloading/spi/dependency/Module.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/org/jboss/classloading/spi/dependency/Module.java	2008-07-19 13:15:01 UTC (rev 76012)
+++ projects/jboss-cl/trunk/classloading/src/main/org/jboss/classloading/spi/dependency/Module.java	2008-07-19 13:35:44 UTC (rev 76013)
@@ -335,9 +335,24 @@
     */
    public void visit(ResourceVisitor visitor, ResourceFilter filter)
    {
+      visit(visitor, filter, null);
+   }
+
+   /**
+    * Visit the resources in this module using the given filter(s)
+    * <p/>
+    * Typically the filter is used to determine which types of files to visit, e.g. .class files.
+    * While the recurseFilter determines which jars/directories to recurse into.
+    *
+    * @param visitor       the visitor
+    * @param filter        the filter
+    * @param recurseFilter the recursion filter (null means recurse into everything)
+    */
+   public void visit(ResourceVisitor visitor, ResourceFilter filter, ResourceFilter recurseFilter)
+   {
       throw new UnsupportedOperationException("The module " + getContextName() + " does not support filtering: " + getClass().getName());
    }
-   
+
    /**
     * Get the delegate loaders for this module
     * 

Modified: projects/jboss-cl/trunk/classloading/src/main/org/jboss/classloading/spi/dependency/policy/mock/MockClassLoaderPolicyModule.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/org/jboss/classloading/spi/dependency/policy/mock/MockClassLoaderPolicyModule.java	2008-07-19 13:15:01 UTC (rev 76012)
+++ projects/jboss-cl/trunk/classloading/src/main/org/jboss/classloading/spi/dependency/policy/mock/MockClassLoaderPolicyModule.java	2008-07-19 13:35:44 UTC (rev 76013)
@@ -91,7 +91,7 @@
       return classLoader.getResource(path);
    }
 
-   public void visit(ResourceVisitor visitor, ResourceFilter filter)
+   public void visit(ResourceVisitor visitor, ResourceFilter filter, ResourceFilter recurseFilter)
    {
       MockClassLoadingMetaData mclmd = getClassLoadingMetaData();
       String[] paths = mclmd.getPaths();

Modified: projects/jboss-cl/trunk/classloading-vfs/src/main/org/jboss/classloading/plugins/vfs/VFSResourceVisitor.java
===================================================================
--- projects/jboss-cl/trunk/classloading-vfs/src/main/org/jboss/classloading/plugins/vfs/VFSResourceVisitor.java	2008-07-19 13:15:01 UTC (rev 76012)
+++ projects/jboss-cl/trunk/classloading-vfs/src/main/org/jboss/classloading/plugins/vfs/VFSResourceVisitor.java	2008-07-19 13:35:44 UTC (rev 76013)
@@ -66,6 +66,9 @@
    /** The resource filter */
    private ResourceFilter filter;
    
+   /** The resource filter */
+   private ResourceFilter recurseFilter;
+
    /**
     * Visit the resources
     * 
@@ -75,10 +78,11 @@
     * @param classLoader the classLoader
     * @param visitor the visitor
     * @param filter the filter
+    * @param recurseFilter the recurse filter
     */
-   public static void visit(VirtualFile[] roots, ClassFilter included, ClassFilter excluded, ClassLoader classLoader, ResourceVisitor visitor, ResourceFilter filter)
+   public static void visit(VirtualFile[] roots, ClassFilter included, ClassFilter excluded, ClassLoader classLoader, ResourceVisitor visitor, ResourceFilter filter, ResourceFilter recurseFilter)
    {
-      VFSResourceVisitor vfsVisitor = new VFSResourceVisitor(roots, included, excluded, classLoader, visitor, filter);
+      VFSResourceVisitor vfsVisitor = new VFSResourceVisitor(roots, included, excluded, classLoader, visitor, filter, recurseFilter);
       for (VirtualFile root : roots)
       {
          try
@@ -102,8 +106,9 @@
     * @param classLoader the classloader
     * @param visitor the visitor
     * @param filter the filter
+    * @param recurseFilter the recurse filter
     */
-   VFSResourceVisitor(VirtualFile[] roots, ClassFilter included, ClassFilter excluded, ClassLoader classLoader, ResourceVisitor visitor, ResourceFilter filter)
+   VFSResourceVisitor(VirtualFile[] roots, ClassFilter included, ClassFilter excluded, ClassLoader classLoader, ResourceVisitor visitor, ResourceFilter filter, ResourceFilter recurseFilter)
    {
       if (roots == null)
          throw new IllegalArgumentException("Null roots");
@@ -118,6 +123,7 @@
       this.classLoader = classLoader;
       this.visitor = visitor;
       this.filter = filter;
+      this.recurseFilter = recurseFilter;
    }
 
    /**
@@ -141,10 +147,41 @@
       attributes.setIncludeRoot(false);
       attributes.setRecurseFilter(this);
       return attributes;
+   }   
+
+   /**
+    * Determine the file's path.
+    *
+    * @param file the file
+    * @return file's path
+    */
+   protected String determinePath(VirtualFile file)
+   {
+      String path = file.getPathName();
+      if (path.equals(rootPath))
+         path = "";
+      else if (path.startsWith(rootPathWithSlash))
+         path = path.substring(rootPathWithSlash.length());
+      return path;
    }
-   
+
    public boolean accepts(VirtualFile file)
    {
+      if (recurseFilter != null)
+      {
+         try
+         {
+            String path = determinePath(file);
+            ResourceContext resource = new ResourceContext(file.toURL(), path, classLoader);
+            if (recurseFilter.accepts(resource) == false)
+               return false;
+         }
+         catch (Exception e)
+         {
+            throw new Error("Error accepting " + file, e);
+         }
+      }
+
       // This is our current root
       if (file.equals(root))
          return true;
@@ -169,11 +206,7 @@
             return;
 
          // Determine the resource name
-         String path = file.getPathName();
-         if (path.equals(rootPath))
-            path = "";
-         else if (path.startsWith(rootPathWithSlash))
-            path = path.substring(rootPathWithSlash.length());
+         String path = determinePath(file);
 
          // Check for inclusions/exclusions
          if (included != null && included.matchesResourcePath(path) == false)

Modified: projects/jboss-cl/trunk/classloading-vfs/src/main/org/jboss/classloading/spi/vfs/dependency/VFSClassLoaderPolicyModule.java
===================================================================
--- projects/jboss-cl/trunk/classloading-vfs/src/main/org/jboss/classloading/spi/vfs/dependency/VFSClassLoaderPolicyModule.java	2008-07-19 13:15:01 UTC (rev 76012)
+++ projects/jboss-cl/trunk/classloading-vfs/src/main/org/jboss/classloading/spi/vfs/dependency/VFSClassLoaderPolicyModule.java	2008-07-19 13:35:44 UTC (rev 76013)
@@ -214,7 +214,7 @@
    }
 
    @Override
-   public void visit(ResourceVisitor visitor, ResourceFilter filter)
+   public void visit(ResourceVisitor visitor, ResourceFilter filter, ResourceFilter recurseFilter)
    {
       ClassLoader classLoader = getClassLoader();
       if (classLoader == null)
@@ -225,7 +225,7 @@
       {
          ClassFilter included = getIncluded();
          ClassFilter excluded = getExcluded();
-         VFSResourceVisitor.visit(roots, included, excluded, classLoader, visitor, filter);
+         VFSResourceVisitor.visit(roots, included, excluded, classLoader, visitor, filter, recurseFilter);
       }
    }
 }

Modified: projects/jboss-cl/trunk/classloading-vfs/src/tests/org/jboss/test/classloading/vfs/metadata/test/VFSResourceVisitorUnitTestCase.java
===================================================================
--- projects/jboss-cl/trunk/classloading-vfs/src/tests/org/jboss/test/classloading/vfs/metadata/test/VFSResourceVisitorUnitTestCase.java	2008-07-19 13:15:01 UTC (rev 76012)
+++ projects/jboss-cl/trunk/classloading-vfs/src/tests/org/jboss/test/classloading/vfs/metadata/test/VFSResourceVisitorUnitTestCase.java	2008-07-19 13:35:44 UTC (rev 76013)
@@ -36,8 +36,8 @@
 import org.jboss.classloading.spi.vfs.metadata.VFSClassLoaderFactory;
 import org.jboss.classloading.spi.visitor.ClassVisitor;
 import org.jboss.classloading.spi.visitor.ResourceContext;
+import org.jboss.classloading.spi.visitor.ResourceFilter;
 import org.jboss.classloading.spi.visitor.ResourceVisitor;
-import org.jboss.classloading.spi.visitor.ResourceFilter;
 import org.jboss.kernel.spi.deployment.KernelDeployment;
 import org.jboss.test.classloading.vfs.metadata.VFSClassLoadingMicrocontainerTest;
 import org.jboss.test.classloading.vfs.metadata.support.a.A;
@@ -197,6 +197,91 @@
       }
    }
 
+   public void testRecurseFilter() throws Exception
+   {
+      VFSClassLoaderFactory factory = new VFSClassLoaderFactory("test");
+      factory.setRoots(Arrays.asList(System.getProperty("test.dir") + "/support/"));
+      KernelDeployment deployment = install(factory);
+      try
+      {
+         final Set<String> classes = new HashSet<String>();
+         ResourceVisitor visitor = new ClassVisitor()
+         {
+            public void visit(ResourceContext resource)
+            {
+               classes.add(resource.getResourceName());
+            }
+         };
+         ResourceFilter recurseFilter = new ResourceFilter()
+         {
+            public boolean accepts(ResourceContext resource)
+            {
+               return "a".equals(resource.getResourceName());
+            }
+         };
+
+         Module module = assertModule("test:0.0.0");
+         module.visit(visitor, visitor.getFilter(), recurseFilter);
+
+         assertEquals(1, classes.size());
+         assertEquals(aliases.get(classes.iterator().next()), A.class);
+      }
+      finally
+      {
+         undeploy(deployment);
+      }
+   }
+
+   public void testRecurseFilterFromTop() throws Exception
+   {
+      VFSClassLoaderFactory factory = new VFSClassLoaderFactory("test");
+      factory.setRoots(Arrays.asList(getRoot(getClass())));
+      KernelDeployment deployment = install(factory);
+      try
+      {
+         final Set<String> classes = new HashSet<String>();
+         ResourceVisitor visitor = new ResourceVisitor()
+         {
+            public ResourceFilter getFilter()
+            {
+               return new ResourceFilter()
+               {
+                  public boolean accepts(ResourceContext resource)
+                  {
+                     return resource.getResourceName().contains("support");
+                  }
+               };
+            }
+
+            public void visit(ResourceContext resource)
+            {
+               classes.add(resource.getClassName());
+            }
+         };
+         final String pathA = ClassLoaderUtils.packageNameToPath(A.class.getName());
+         final int pathAlength = pathA.length();
+         ResourceFilter recurseFilter = new ResourceFilter()
+         {
+            public boolean accepts(ResourceContext resource)
+            {
+               String resourceName = resource.getResourceName();
+               int min = Math.min(resourceName.length(), pathAlength);
+               return pathA.substring(0, min).equals(resourceName.substring(0, min));
+            }
+         };
+
+         Module module = assertModule("test:0.0.0");
+         module.visit(visitor, visitor.getFilter(), recurseFilter);
+
+         assertEquals(1, classes.size());
+         assertEquals(classes.iterator().next(), A.class.getName());
+      }
+      finally
+      {
+         undeploy(deployment);
+      }
+   }
+
    protected void visitModule()
    {
       Module module = assertModule("test:0.0.0");




More information about the jboss-cvs-commits mailing list