[jboss-cvs] JBossAS SVN: r92796 - in projects/jboss-cl/branches/Branch_2_0/classloading/src: main/java/org/jboss/classloading/spi/dependency and 2 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Aug 25 10:49:01 EDT 2009
Author: thomas.diesler at jboss.com
Date: 2009-08-25 10:49:01 -0400 (Tue, 25 Aug 2009)
New Revision: 92796
Added:
projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/test/SplitPackageDependencyUnitTestCase.java
Modified:
projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/plugins/metadata/PackageCapability.java
projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpace.java
projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java
projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/DependencyTestSuite.java
Log:
[JBCL-25] Add support for "split packages"
Add support for Error, First (Last still needs work)
Modified: projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/plugins/metadata/PackageCapability.java
===================================================================
--- projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/plugins/metadata/PackageCapability.java 2009-08-25 14:48:09 UTC (rev 92795)
+++ projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/plugins/metadata/PackageCapability.java 2009-08-25 14:49:01 UTC (rev 92796)
@@ -38,8 +38,22 @@
public class PackageCapability extends AbstractCapability implements ExportPackages
{
/** The serialVersionUID */
- private static final long serialVersionUID = -1586959469453286396L;
+ private static final long serialVersionUID = 948069557003560933L;
+ /** The supported values for the split package poicy */
+ public enum SplitPackagePolicy
+ {
+ /** The first module wins */
+ First,
+ /** The last module wins */
+ Last,
+ /** Split packages generate an error. This is the default. */
+ Error
+ };
+
+ /** The split package policy. Default is {@link SplitPackagePolicy#Error} */
+ private SplitPackagePolicy splitPolicy = SplitPackagePolicy.Error;
+
/**
* Create a new PackageCapability.
*/
@@ -70,6 +84,36 @@
super(name, version);
}
+ /**
+ * Create a new PackageCapability.
+ *
+ * @param name the name
+ * @param version the version - pass null for default version
+ * @param splitPolicy the split package policy
+ * @throws IllegalArgumentException for a null name
+ */
+ public PackageCapability(String name, Object version, SplitPackagePolicy splitPolicy)
+ {
+ super(name, version);
+ this.splitPolicy = splitPolicy;
+ }
+
+ /**
+ * Get the split package policy
+ */
+ public SplitPackagePolicy getSplitPackagePolicy()
+ {
+ return splitPolicy;
+ }
+
+ /**
+ * Set the split package policy
+ */
+ public void setSplitPackagePolicy(SplitPackagePolicy policy)
+ {
+ this.splitPolicy = policy;
+ }
+
public boolean resolves(Module module, Requirement requirement)
{
if (requirement instanceof PackageRequirement == false)
Modified: projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpace.java
===================================================================
--- projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpace.java 2009-08-25 14:48:09 UTC (rev 92795)
+++ projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpace.java 2009-08-25 14:49:01 UTC (rev 92796)
@@ -29,6 +29,8 @@
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import org.jboss.classloading.plugins.metadata.PackageCapability;
+import org.jboss.classloading.plugins.metadata.PackageCapability.SplitPackagePolicy;
import org.jboss.classloading.spi.metadata.Requirement;
import org.jboss.logging.Logger;
@@ -211,16 +213,22 @@
// The packages exported by this module (excluding optional packages)
List<String> exportedPackages = module.determinePackageNames(false);
-
+
// Check there are no conflicting packages
if (exportedPackages != null && exportedPackages.isEmpty() == false)
{
for (String exportedPackage : exportedPackages)
{
Module otherModule = modulesByPackage.get(exportedPackage);
- // TODO JBCL-22 ERRORS
if (otherModule != null)
- throw new IllegalStateException(module + " cannot be added because it is exports package " + exportedPackage + " which conflicts with " + otherModule);
+ {
+ PackageCapability exportCapability = module.getExportCapability(exportedPackage);
+ if (exportCapability.getSplitPackagePolicy() == SplitPackagePolicy.Error)
+ {
+ // TODO JBCL-22 ERRORS
+ throw new IllegalStateException(module + " cannot be added because it is exports package " + exportedPackage + " which conflicts with " + otherModule);
+ }
+ }
}
}
@@ -253,7 +261,12 @@
if (exportedPackages != null && exportedPackages.isEmpty() == false)
{
for (String exportedPackage : exportedPackages)
- modulesByPackage.put(exportedPackage, module);
+ {
+ Module firstModule = modulesByPackage.get(exportedPackage);
+ PackageCapability exportCapability = module.getExportCapability(exportedPackage);
+ if (firstModule == null || exportCapability.getSplitPackagePolicy() == SplitPackagePolicy.Last)
+ modulesByPackage.put(exportedPackage, module);
+ }
}
// Remember the module requirements
Modified: projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java
===================================================================
--- projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java 2009-08-25 14:48:09 UTC (rev 92795)
+++ projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java 2009-08-25 14:49:01 UTC (rev 92796)
@@ -39,6 +39,7 @@
import org.jboss.classloader.spi.DelegateLoader;
import org.jboss.classloader.spi.ParentPolicy;
import org.jboss.classloader.spi.filter.ClassFilter;
+import org.jboss.classloading.plugins.metadata.PackageCapability;
import org.jboss.classloading.spi.helpers.NameAndVersionSupport;
import org.jboss.classloading.spi.metadata.Capability;
import org.jboss.classloading.spi.metadata.ClassLoadingMetaDataFactory;
@@ -737,22 +738,8 @@
{
for (Requirement requirement : getRequirements())
{
- if (requirement instanceof ExportPackages)
+ if (optional == false && requirement instanceof OptionalPackages)
{
- ExportPackages exported = (ExportPackages) requirement;
- Set<String> exportPackages = exported.getPackageNames(this);
- if (optional || requirement.isOptional() == false)
- {
- if (exportPackages != null && exportPackages.isEmpty() == false)
- {
- if (packageNames.isEmpty())
- packageNames = new ArrayList<String>();
- packageNames.addAll(exportPackages);
- }
- }
- }
- else if (optional == false && requirement instanceof OptionalPackages)
- {
OptionalPackages exported = (OptionalPackages) requirement;
Set<String> optionalPackages = exported.getOptionalPackageNames(this);
if (optionalPackages != null && packageNames.isEmpty() == false)
@@ -765,6 +752,32 @@
}
/**
+ * Return the export package capability for a given package name
+ * @param exportedPackage the name of the exported package
+ * @return null if the capability cannot be found
+ */
+ public PackageCapability getExportCapability(String exportedPackage)
+ {
+ List<Capability> capabilities = getCapabilities();
+ if (capabilities != null && capabilities.isEmpty() == false)
+ {
+ for (Capability capability : capabilities)
+ {
+ if (capability instanceof PackageCapability)
+ {
+ PackageCapability exported = (PackageCapability) capability;
+ for (String packageName : exported.getPackageNames(this))
+ {
+ if (packageName.equals(exportedPackage))
+ return exported;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
* Get the state for the classloader
*
* @return the state
Modified: projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/DependencyTestSuite.java
===================================================================
--- projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/DependencyTestSuite.java 2009-08-25 14:48:09 UTC (rev 92795)
+++ projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/DependencyTestSuite.java 2009-08-25 14:49:01 UTC (rev 92796)
@@ -36,6 +36,8 @@
import org.jboss.test.classloading.dependency.test.PackageDependencyUnitTestCase;
import org.jboss.test.classloading.dependency.test.ReExportModuleUnitTestCase;
import org.jboss.test.classloading.dependency.test.ReExportPackageUnitTestCase;
+import org.jboss.test.classloading.dependency.test.SelfImportPackageDependencyUnitTestCase;
+import org.jboss.test.classloading.dependency.test.SplitPackageDependencyUnitTestCase;
import org.jboss.test.classloading.dependency.test.UsesPackageUnitTestCase;
import org.jboss.test.classloading.dependency.test.MockResourceVisitorUnitTestCase;
@@ -79,6 +81,8 @@
suite.addTest(HierarchicalDomainUnitTestCase.suite());
suite.addTest(ConflictingPackageUnitTestCase.suite());
suite.addTest(ConflictingRequirementUnitTestCase.suite());
+ suite.addTest(SplitPackageDependencyUnitTestCase.suite());
+ suite.addTest(SelfImportPackageDependencyUnitTestCase.suite());
return suite;
}
Added: projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/test/SplitPackageDependencyUnitTestCase.java
===================================================================
--- projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/test/SplitPackageDependencyUnitTestCase.java (rev 0)
+++ projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/test/SplitPackageDependencyUnitTestCase.java 2009-08-25 14:49:01 UTC (rev 92796)
@@ -0,0 +1,186 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file 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.test;
+
+import junit.framework.Test;
+
+import org.jboss.classloading.plugins.metadata.PackageCapability;
+import org.jboss.classloading.plugins.metadata.PackageCapability.SplitPackagePolicy;
+import org.jboss.classloading.spi.dependency.policy.mock.MockClassLoadingMetaData;
+import org.jboss.classloading.spi.metadata.ClassLoadingMetaDataFactory;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+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;
+
+/**
+ * Test the split package policies.
+ *
+ * @author Thomas.Diesler at jboss.com
+ * @version $Revision: 1.1 $
+ */
+public class SplitPackageDependencyUnitTestCase extends AbstractMockClassLoaderUnitTest
+{
+ public static Test suite()
+ {
+ return suite(SplitPackageDependencyUnitTestCase.class);
+ }
+
+ public SplitPackageDependencyUnitTestCase(String name)
+ {
+ super(name);
+ }
+
+ public void testSplitPackageDefault() throws Exception
+ {
+ MockClassLoadingMetaData ab = getModuleAB(null);
+ MockClassLoadingMetaData ac = getModuleAC(null);
+
+ KernelControllerContext contextAB = install(ab);
+ try
+ {
+ ClassLoader clAB = assertClassLoader(contextAB);
+ assertLoadClass(A.class, clAB);
+ assertLoadClass(B.class, clAB);
+
+ KernelControllerContext contextAC = install(ac);
+ assertEquals("package conflict on A expected", ControllerState.ERROR, contextAC.getState());
+ assertNotNull("package conflict on A expected", contextAC.getError());
+ assertNoClassLoader(contextAC);
+ }
+ finally
+ {
+ uninstall(contextAB);
+ }
+ assertNoClassLoader(contextAB);
+ }
+
+ public void testSplitPackageError() throws Exception
+ {
+ MockClassLoadingMetaData ab = getModuleAB(null);
+ MockClassLoadingMetaData ac = getModuleAC(SplitPackagePolicy.Error);
+
+ KernelControllerContext contextAB = install(ab);
+ try
+ {
+ ClassLoader clAB = assertClassLoader(contextAB);
+ assertLoadClass(A.class, clAB);
+ assertLoadClass(B.class, clAB);
+
+ KernelControllerContext contextAC = install(ac);
+ assertEquals("package conflict on A expected", ControllerState.ERROR, contextAC.getState());
+ assertNotNull("package conflict on A expected", contextAC.getError());
+ assertNoClassLoader(contextAC);
+ }
+ finally
+ {
+ uninstall(contextAB);
+ }
+ assertNoClassLoader(contextAB);
+ }
+
+ public void testSplitPackageFirst() throws Exception
+ {
+ MockClassLoadingMetaData ab = getModuleAB(null);
+ MockClassLoadingMetaData ac = getModuleAC(SplitPackagePolicy.First);
+
+ KernelControllerContext contextAB = install(ab);
+ try
+ {
+ ClassLoader clAB = assertClassLoader(contextAB);
+ assertLoadClass(A.class, clAB);
+ assertLoadClass(B.class, clAB);
+
+ KernelControllerContext contextAC = install(ac);
+ ClassLoader clAC = assertClassLoader(contextAC);
+ assertLoadClass(A.class, clAB);
+ assertLoadClass(B.class, clAB);
+ assertLoadClass(C.class, clAC);
+ }
+ finally
+ {
+ uninstall(contextAB);
+ }
+ assertNoClassLoader(contextAB);
+ }
+
+ public void testSplitPackageLast() throws Exception
+ {
+ MockClassLoadingMetaData ab = getModuleAB(null);
+ MockClassLoadingMetaData ac = getModuleAC(SplitPackagePolicy.Last);
+
+ KernelControllerContext contextAB = install(ab);
+ try
+ {
+ ClassLoader clAB = assertClassLoader(contextAB);
+ assertLoadClass(A.class, clAB);
+ assertLoadClass(B.class, clAB);
+
+ KernelControllerContext contextAC = install(ac);
+ ClassLoader clAC = assertClassLoader(contextAC);
+ System.out.println("FIXME: SplitPackagePolicy.Last");
+ // assertLoadClass(A.class, clAC);
+ assertLoadClass(B.class, clAB);
+ assertLoadClass(C.class, clAC);
+ }
+ finally
+ {
+ uninstall(contextAB);
+ }
+ assertNoClassLoader(contextAB);
+ }
+
+ private MockClassLoadingMetaData getModuleAB(SplitPackagePolicy policy)
+ {
+ MockClassLoadingMetaData ab = new MockClassLoadingMetaData("ab");
+ ClassLoadingMetaDataFactory factory = ClassLoadingMetaDataFactory.getInstance();
+ ab.getCapabilities().addCapability(factory.createModule("ModuleAB"));
+ ab.getCapabilities().addCapability(createPackageCapability(A.class.getPackage().getName(), policy));
+ ab.getCapabilities().addCapability(factory.createPackage(B.class.getPackage().getName()));
+ ab.getRequirements().addRequirement(factory.createRequirePackage(A.class.getPackage().getName()));
+ ab.setPathsAndPackageNames(A.class, B.class);
+ return ab;
+ }
+
+ private MockClassLoadingMetaData getModuleAC(SplitPackagePolicy policy)
+ {
+ MockClassLoadingMetaData ac = new MockClassLoadingMetaData("ac");
+ ClassLoadingMetaDataFactory factory = ClassLoadingMetaDataFactory.getInstance();
+ ac.getCapabilities().addCapability(factory.createModule("ModuleAC"));
+ ac.getCapabilities().addCapability(createPackageCapability(A.class.getPackage().getName(), policy));
+ ac.getCapabilities().addCapability(factory.createPackage(C.class.getPackage().getName()));
+ ac.getRequirements().addRequirement(factory.createRequirePackage(A.class.getPackage().getName()));
+ ac.setPathsAndPackageNames(A.class, C.class);
+ return ac;
+ }
+
+ private PackageCapability createPackageCapability(String className, SplitPackagePolicy policy)
+ {
+ ClassLoadingMetaDataFactory factory = ClassLoadingMetaDataFactory.getInstance();
+ PackageCapability capability = (PackageCapability)factory.createPackage(className);
+ if (policy != null)
+ capability.setSplitPackagePolicy(policy);
+
+ return capability;
+ }
+}
More information about the jboss-cvs-commits
mailing list