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

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Oct 1 09:09:15 EDT 2008


Author: alesj
Date: 2008-10-01 09:09:15 -0400 (Wed, 01 Oct 2008)
New Revision: 78988

Added:
   projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/plugins/visitor/FederatedResourceVisitor.java
   projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockFederatedResourceVisitor.java
   projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/ResourcesAdapter.java
Modified:
   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/support/MockFilteredResourceVisitor.java
   projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockResourceVisitor.java
   projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/MockResourceVisitorUnitTestCase.java
Log:
[JBCL-46]; implement federated resource visitor.

Added: projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/plugins/visitor/FederatedResourceVisitor.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/plugins/visitor/FederatedResourceVisitor.java	                        (rev 0)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/plugins/visitor/FederatedResourceVisitor.java	2008-10-01 13:09:15 UTC (rev 78988)
@@ -0,0 +1,125 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.classloading.plugins.visitor;
+
+import org.jboss.classloading.spi.visitor.ResourceVisitor;
+import org.jboss.classloading.spi.visitor.ResourceFilter;
+import org.jboss.classloading.spi.visitor.ResourceContext;
+
+/**
+ * Federated resource visitor.
+ * 
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class FederatedResourceVisitor implements ResourceVisitor
+{
+   private ResourceVisitor[] visitors;
+   private ResourceFilter[] filters;
+   private ResourceFilter[] recurseFilters;
+   private boolean[] recurseFlags;
+   private boolean[] filterFlags;
+
+   public FederatedResourceVisitor(ResourceVisitor[] visitors)
+   {
+      if (visitors == null)
+         throw new IllegalArgumentException("Null visitors");
+      this.visitors = visitors;
+   }
+
+   public FederatedResourceVisitor(ResourceVisitor[] visitors, ResourceFilter[] filters, ResourceFilter[] recurseFilters)
+   {
+      this(visitors);
+      this.filters = filters;
+      this.recurseFilters = recurseFilters;
+   }
+
+   public ResourceFilter getRecurseFilter()
+   {
+      if (recurseFilters == null || recurseFilters.length == 0)
+         return null;
+
+      recurseFlags = new boolean[recurseFilters.length];
+      return new FederatedRecurseFilter();
+   }
+
+   public ResourceFilter getFilter()
+   {
+      if (filters != null && filters.length == 0)
+         return null;
+
+      if (filters == null)
+      {
+         filters = new ResourceFilter[visitors.length];
+         for (int i =0; i < visitors.length; i++)
+            filters[i] = visitors[i].getFilter();
+      }
+
+      filterFlags = new boolean[filters == null ? 0 : filters.length];           
+      return new FederatedResourceFilter();
+   }
+
+   public void visit(ResourceContext resource)
+   {
+      for (int i = 0; i < visitors.length; i++)
+      {
+         if (filterFlags == null || filterFlags.length <= i || filterFlags[i])
+         {
+            visitors[i].visit(resource);               
+         }
+      }
+   }
+
+   private class FederatedRecurseFilter implements ResourceFilter
+   {
+      public boolean accepts(ResourceContext resource)
+      {
+         boolean accept = false;
+         for (int i = 0; i < recurseFilters.length; i++)
+         {
+            recurseFlags[i] = recurseFilters[i] == null || recurseFilters[i].accepts(resource);
+            if (recurseFlags[i])
+               accept = true;
+         }
+         return accept;
+      }
+   }
+
+   private class FederatedResourceFilter implements ResourceFilter
+   {
+      public boolean accepts(ResourceContext resource)
+      {
+         boolean accept = false;
+         for (int i = 0; i < filters.length; i++)
+         {
+            if (recurseFlags == null || recurseFlags.length <= i || recurseFlags[i])
+            {
+               filterFlags[i] = filters[i] == null || filters[i].accepts(resource);
+               if (filterFlags[i])
+                  accept = true;
+            }
+            else
+               filterFlags[i] = false;
+         }
+         return accept;
+      }
+   }
+}

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	2008-10-01 11:48:03 UTC (rev 78987)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/mock/MockClassLoaderPolicyModule.java	2008-10-01 13:09:15 UTC (rev 78988)
@@ -129,7 +129,7 @@
 
          for (String path : paths)
          {
-            visitPath(null, path, visitor, filter, classLoader, included, includedFilter, excluded, excludedFilter);
+            visitPath(null, path, visitor, filter, recurseFilter, classLoader, included, includedFilter, excluded, excludedFilter, null);
          }
       }
    }
@@ -141,13 +141,15 @@
     * @param path the path
     * @param visitor the visitor
     * @param filter the filter
+    * @param recurseFilter the recurse filter
     * @param classLoader the classloader
     * @param included the included
     * @param includedFilter the included filter
     * @param excluded the excluded
     * @param excludedFilter the excluded filter
+    * @param context the current context
     */
-   protected void visitPath(File file, String path, ResourceVisitor visitor, ResourceFilter filter, ClassLoader classLoader, Collection<String> included, ClassFilter includedFilter, Collection<String> excluded, ClassFilter excludedFilter)
+   protected void visitPath(File file, String path, ResourceVisitor visitor, ResourceFilter filter, ResourceFilter recurseFilter, ClassLoader classLoader, Collection<String> included, ClassFilter includedFilter, Collection<String> excluded, ClassFilter excludedFilter, ResourceContext context)
    {
       boolean visit = includePath(path, included, includedFilter, excluded, excludedFilter);
 
@@ -155,7 +157,8 @@
       
       if (visit)
       {
-         ResourceContext context = new DefaultResourceContext(url, path, classLoader);
+         if (context == null)
+            context = new DefaultResourceContext(url, path, classLoader);
          if (filter == null || filter.accepts(context))
             visitor.visit(context);
       }
@@ -175,7 +178,11 @@
          for (File child : files)
          {
             String childPath = path + child.getName();
-            visitPath(child, childPath, visitor, filter, classLoader, included, includedFilter, excluded, excludedFilter);
+            ResourceContext childContext = new DefaultResourceContext(getURL(childPath), childPath, classLoader);
+            if (recurseFilter == null || recurseFilter.accepts(childContext))
+            {
+               visitPath(child, childPath, visitor, filter, recurseFilter, classLoader, included, includedFilter, excluded, excludedFilter, childContext);
+            }
          }
       }
    }

Copied: projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockFederatedResourceVisitor.java (from rev 78928, projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockResourceVisitor.java)
===================================================================
--- projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockFederatedResourceVisitor.java	                        (rev 0)
+++ projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockFederatedResourceVisitor.java	2008-10-01 13:09:15 UTC (rev 78988)
@@ -0,0 +1,57 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.support;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jboss.classloading.plugins.visitor.FederatedResourceVisitor;
+import org.jboss.classloading.spi.visitor.ResourceFilter;
+import org.jboss.classloading.spi.visitor.ResourceVisitor;
+
+/**
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class MockFederatedResourceVisitor extends FederatedResourceVisitor implements ResourcesAdapter
+{
+   private ResourceVisitor[] tmp;
+   private Set<String> resources = new HashSet<String>();
+
+   public MockFederatedResourceVisitor(ResourceVisitor[] visitors, ResourceFilter[] filters, ResourceFilter[] recurseFilters)
+   {
+      super(visitors, filters, recurseFilters);
+      tmp = visitors;
+   }
+
+   public Set<String> getResources()
+   {
+      for (ResourceVisitor rv : tmp)
+      {
+         if (rv instanceof ResourcesAdapter)
+         {
+            ResourcesAdapter ra = (ResourcesAdapter)rv;
+            resources.addAll(ra.getResources());
+         }
+      }
+      return resources;
+   }
+}
\ No newline at end of file

Modified: projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockFilteredResourceVisitor.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockFilteredResourceVisitor.java	2008-10-01 11:48:03 UTC (rev 78987)
+++ projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockFilteredResourceVisitor.java	2008-10-01 13:09:15 UTC (rev 78988)
@@ -21,14 +21,23 @@
 */
 package org.jboss.test.classloading.dependency.support;
 
+import java.util.regex.Pattern;
+
+import org.jboss.classloading.spi.visitor.ResourceContext;
 import org.jboss.classloading.spi.visitor.ResourceFilter;
-import org.jboss.classloading.spi.visitor.ResourceContext;
 
 /**
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
 public class MockFilteredResourceVisitor extends MockResourceVisitor
 {
+   private Pattern excludePattern;
+
+   public MockFilteredResourceVisitor(String excludeString)
+   {
+      this.excludePattern = Pattern.compile(excludeString);
+   }
+
    @Override
    public ResourceFilter getFilter()
    {
@@ -36,7 +45,7 @@
       {
          public boolean accepts(ResourceContext resource)
          {
-            return resource.isClass() && resource.getResourceName().contains("C.class") == false;
+            return resource.isClass() && excludePattern.matcher(resource.getResourceName()).find() == false;
          }
       };
    }

Modified: projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockResourceVisitor.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockResourceVisitor.java	2008-10-01 11:48:03 UTC (rev 78987)
+++ projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/MockResourceVisitor.java	2008-10-01 13:09:15 UTC (rev 78988)
@@ -27,12 +27,11 @@
 import org.jboss.classloading.spi.visitor.ClassFilter;
 import org.jboss.classloading.spi.visitor.ResourceContext;
 import org.jboss.classloading.spi.visitor.ResourceFilter;
-import org.jboss.classloading.spi.visitor.ResourceVisitor;
 
 /**
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
-public class MockResourceVisitor implements ResourceVisitor
+public class MockResourceVisitor implements ResourcesAdapter
 {
    private Set<String> resources = new HashSet<String>();
 

Added: projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/ResourcesAdapter.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/ResourcesAdapter.java	                        (rev 0)
+++ projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/support/ResourcesAdapter.java	2008-10-01 13:09:15 UTC (rev 78988)
@@ -0,0 +1,34 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.support;
+
+import java.util.Set;
+
+import org.jboss.classloading.spi.visitor.ResourceVisitor;
+
+/**
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public interface ResourcesAdapter extends ResourceVisitor
+{
+   Set<String> getResources();
+}

Modified: projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/MockResourceVisitorUnitTestCase.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/MockResourceVisitorUnitTestCase.java	2008-10-01 11:48:03 UTC (rev 78987)
+++ projects/jboss-cl/trunk/classloading/src/test/java/org/jboss/test/classloading/dependency/test/MockResourceVisitorUnitTestCase.java	2008-10-01 13:09:15 UTC (rev 78988)
@@ -30,9 +30,14 @@
 import org.jboss.classloader.spi.filter.PackageClassFilter;
 import org.jboss.classloading.spi.dependency.policy.mock.MockClassLoaderPolicyModule;
 import org.jboss.classloading.spi.dependency.policy.mock.MockClassLoadingMetaData;
+import org.jboss.classloading.spi.visitor.ResourceFilter;
+import org.jboss.classloading.spi.visitor.ResourceVisitor;
+import org.jboss.classloading.spi.visitor.ResourceContext;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.test.classloading.dependency.support.MockFederatedResourceVisitor;
+import org.jboss.test.classloading.dependency.support.MockFilteredResourceVisitor;
 import org.jboss.test.classloading.dependency.support.MockResourceVisitor;
-import org.jboss.test.classloading.dependency.support.MockFilteredResourceVisitor;
+import org.jboss.test.classloading.dependency.support.ResourcesAdapter;
 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;
@@ -92,27 +97,122 @@
    public void testFiltered() throws Exception
    {
       MockClassLoadingMetaData a = createClassLoadingMetaData("a");
-      testMockClassLoadingMetaData(a, new MockFilteredResourceVisitor());
+      testMockClassLoadingMetaData(a, new MockFilteredResourceVisitor("C.class"));
    }
 
+   public void testRecurseFilter() throws Exception
+   {
+      Set<String> resources = new HashSet<String>(Arrays.asList(classes));
+      resources.remove(ClassLoaderUtils.classNameToPath(C.class));
+      MockClassLoadingMetaData a = new MockClassLoadingMetaData("a");
+      a.setExcluded(new PackageClassFilter(new String[]{ResourcesAdapter.class.getPackage().getName()}));
+      a.setPaths(ResourcesAdapter.class);
+      ResourceFilter recurseFilter = new ResourceFilter()
+      {
+         public boolean accepts(ResourceContext resource)
+         {
+            String name = resource.getResourceName();
+            boolean result = name.contains("support/c") || name.contains("support\\c");
+            return result == false;
+         }
+      };
+      testMockClassLoadingMetaData(a, new MockResourceVisitor(), null, recurseFilter, resources);
+   }
+
+   public void testFederated() throws Exception
+   {
+      MockClassLoadingMetaData a = createClassLoadingMetaData("a");
+      MockFilteredResourceVisitor fa = new MockFilteredResourceVisitor("B\\.class|C\\.class");
+      MockFilteredResourceVisitor fb = new MockFilteredResourceVisitor("A\\.class|C\\.class");
+      testMockClassLoadingMetaData(a, new MockFederatedResourceVisitor(new ResourceVisitor[]{fa, fb}, null, null));
+   }
+
+   public void testFederatedWithRecurse() throws Exception
+   {
+      MockClassLoadingMetaData a = new MockClassLoadingMetaData("a");
+      a.setExcluded(new PackageClassFilter(new String[]{ResourcesAdapter.class.getPackage().getName()}));
+      a.setPaths(ResourcesAdapter.class);
+      MockFilteredResourceVisitor fa = new MockFilteredResourceVisitor("A\\.class");
+      MockFilteredResourceVisitor fb = new MockFilteredResourceVisitor("B\\.class");
+      ResourceFilter recurseFilter = new ResourceFilter()
+      {
+         public boolean accepts(ResourceContext resource)
+         {
+            String name = resource.getResourceName();
+            boolean result = name.contains("support/c") || name.contains("support\\c");
+            return result == false;
+         }
+      };
+      MockFederatedResourceVisitor federatedRV = new MockFederatedResourceVisitor(new ResourceVisitor[]{fa, fb}, null, new ResourceFilter[]{recurseFilter, recurseFilter});
+      Set<String> resources = new HashSet<String>(Arrays.asList(classes));
+      resources.remove(ClassLoaderUtils.classNameToPath(C.class));
+      testMockClassLoadingMetaData(a, federatedRV, federatedRV.getFilter(), federatedRV.getRecurseFilter(), resources);
+   }
+
+   public void testFederatedWithRecurseMixed() throws Exception
+   {
+      MockClassLoadingMetaData a = new MockClassLoadingMetaData("a");
+      a.setExcluded(new PackageClassFilter(new String[]{ResourcesAdapter.class.getPackage().getName()}));
+      a.setPaths(ResourcesAdapter.class);
+      MockFilteredResourceVisitor fa = new MockFilteredResourceVisitor("A\\.class|C\\.class");
+      MockFilteredResourceVisitor fb = new MockFilteredResourceVisitor("B\\.class");
+      ResourceFilter recurseFilter = new ResourceFilter()
+      {
+         public boolean accepts(ResourceContext resource)
+         {
+            String name = resource.getResourceName();
+            boolean result = name.contains("support/c") || name.contains("support\\c");
+            return result == false;
+         }
+      };
+      MockFederatedResourceVisitor federatedRV = new MockFederatedResourceVisitor(new ResourceVisitor[]{fa, fb}, null, new ResourceFilter[]{null, recurseFilter});
+      Set<String> resources = new HashSet<String>(Arrays.asList(classes));
+      resources.remove(ClassLoaderUtils.classNameToPath(C.class));
+      testMockClassLoadingMetaData(a, federatedRV, federatedRV.getFilter(), federatedRV.getRecurseFilter(), resources);
+   }
+
    protected void testMockClassLoadingMetaData(MockClassLoadingMetaData a) throws Exception
    {
       testMockClassLoadingMetaData(a, new MockResourceVisitor());
    }
 
-   protected void testMockClassLoadingMetaData(MockClassLoadingMetaData a, MockResourceVisitor visitor) throws Exception
+   protected void testMockClassLoadingMetaData(MockClassLoadingMetaData a, ResourcesAdapter visitor) throws Exception
    {
+      Set<String> resources = new HashSet<String>(Arrays.asList(classes));
+      resources.remove(ClassLoaderUtils.classNameToPath(C.class));
+      testMockClassLoadingMetaData(a, visitor, resources);
+   }
+
+   protected void testMockClassLoadingMetaData(MockClassLoadingMetaData a, ResourcesAdapter visitor, Set<String> expectedResources) throws Exception
+   {
+      testMockClassLoadingMetaData(a, visitor, visitor.getFilter(), null, expectedResources);
+   }
+
+   protected void testMockClassLoadingMetaData(MockClassLoadingMetaData a, ResourcesAdapter visitor, ResourceFilter filter, ResourceFilter recurseFilter, Set<String> expectedResources) throws Exception
+   {
       KernelControllerContext contextA = install(a);
       try
       {
          MockClassLoaderPolicyModule module = assertModule(contextA);
          module.registerClassLoaderPolicy(system);
 
-         module.visit(visitor);
+         if (recurseFilter != null)
+         {
+            if (filter != null)
+               module.visit(visitor, filter, recurseFilter);
+            else
+               module.visit(visitor, visitor.getFilter(), recurseFilter);
+         }
+         else if (filter != null)
+         {
+            module.visit(visitor, filter);
+         }
+         else
+         {
+            module.visit(visitor);
+         }
 
-         Set<String> resources = new HashSet<String>(Arrays.asList(classes));
-         resources.remove(ClassLoaderUtils.classNameToPath(C.class));
-         assertEquals(resources, visitor.getResources());
+         assertEquals(expectedResources, visitor.getResources());
       }
       finally
       {




More information about the jboss-cvs-commits mailing list