[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