[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