[jboss-cvs] JBossAS SVN: r107731 - projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/classloading.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Aug 23 09:03:56 EDT 2010
Author: alesj
Date: 2010-08-23 09:03:55 -0400 (Mon, 23 Aug 2010)
New Revision: 107731
Added:
projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/classloading/AbstractResourceLookupDeployer.java
Log:
Simple resource lookup deployer -- TODO tests.
Copied: projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/classloading/AbstractResourceLookupDeployer.java (from rev 104761, projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/classloading/AbstractClassLoaderDescribeDeployer.java)
===================================================================
--- projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/classloading/AbstractResourceLookupDeployer.java (rev 0)
+++ projects/jboss-deployers/trunk/deployers-impl/src/main/java/org/jboss/deployers/plugins/classloading/AbstractResourceLookupDeployer.java 2010-08-23 13:03:55 UTC (rev 107731)
@@ -0,0 +1,177 @@
+/*
+* 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.deployers.plugins.classloading;
+
+import java.net.URL;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.jboss.classloading.spi.dependency.Module;
+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.RootAwareResource;
+import org.jboss.deployers.spi.DeploymentException;
+import org.jboss.deployers.spi.deployer.DeploymentStages;
+import org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer;
+import org.jboss.deployers.structure.spi.DeploymentUnit;
+
+/**
+ * AbstractResourceLookupDeployer.
+ *
+ * Allow for early resource lookup,
+ * and map this against Module / ClassLoader
+ *
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+public class AbstractResourceLookupDeployer extends AbstractSimpleRealDeployer<Module>
+{
+ private String resourceName;
+ private String[] dir;
+
+ private Map<Module, Set<URL>> matchingModules;
+ private AtomicBoolean active = new AtomicBoolean(true);
+
+ public AbstractResourceLookupDeployer(String resourceName)
+ {
+ super(Module.class);
+
+ if (resourceName == null)
+ throw new IllegalArgumentException("Null resource name");
+
+ setStage(DeploymentStages.POST_CLASSLOADER);
+
+ this.resourceName = resourceName;
+
+ int p = resourceName.lastIndexOf("/");
+ if (p > 0)
+ {
+ String dirs = resourceName.substring(0, p);
+ dir = dirs.split("/");
+ }
+ else
+ {
+ dir = new String[0];
+ }
+ matchingModules = new ConcurrentHashMap<Module, Set<URL>>();
+ }
+
+ /**
+ * Get matching modules and urls which own matching resources.
+ *
+ * @return the matching modules and urls which own matching resources.
+ */
+ public Map<Module, Set<URL>> getMatchingModules()
+ {
+ return Collections.unmodifiableMap(matchingModules);
+ }
+
+ public void deploy(DeploymentUnit unit, Module module) throws DeploymentException
+ {
+ if (active.get() == false)
+ return;
+
+ MapperRV rv = new MapperRV();
+ module.visit(rv, rv.getFilter(), new MapperRF());
+ if (rv.owners.isEmpty() == false)
+ {
+ matchingModules.put(module, rv.owners);
+ }
+ }
+
+ @Override
+ public void undeploy(DeploymentUnit unit, Module module)
+ {
+ // we don't care if it's a member
+ matchingModules.remove(module);
+ }
+
+ /**
+ * Disable or enable this mapper.
+ *
+ * @param active the active flag
+ */
+ public void setActive(boolean active)
+ {
+ this.active.set(active);
+ }
+
+ private class MapperRV implements ResourceVisitor
+ {
+ private Set<URL> owners = new HashSet<URL>();
+
+ public ResourceFilter getFilter()
+ {
+ return new ResourceFilter()
+ {
+ public boolean accepts(ResourceContext resource)
+ {
+ String name = resource.getResourceName();
+ return name.endsWith(resourceName);
+ }
+ };
+ }
+
+ public void visit(ResourceContext resource)
+ {
+ if (resource instanceof RootAwareResource)
+ {
+ RootAwareResource rar = (RootAwareResource) resource;
+ owners.add(rar.getRootUrl());
+ }
+ }
+ }
+
+ // recurse filter
+ private class MapperRF implements ResourceFilter
+ {
+ public boolean accepts(ResourceContext resource)
+ {
+ if (dir.length == 0)
+ return false;
+
+ String name = resource.getResourceName();
+ String[] split = name.split("/");
+ int sl = split.length;
+ int min = Math.min(sl, dir.length);
+ for (int i = 1; i <= min; i++)
+ {
+ boolean match = true;
+ for (int j = 0; j < i; j++)
+ {
+ if (dir[j].equals(split[sl - i + j]) == false)
+ {
+ match = false;
+ break;
+ }
+ }
+ if (match)
+ return true;
+ }
+ return false;
+ }
+ }
+}
More information about the jboss-cvs-commits
mailing list