[jboss-cvs] JBossAS SVN: r68811 - in projects/microcontainer/trunk/classloader/src: main/org/jboss/classloader/plugins/jdk and 13 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Jan 10 05:17:48 EST 2008


Author: adrian at jboss.org
Date: 2008-01-10 05:17:47 -0500 (Thu, 10 Jan 2008)
New Revision: 68811

Modified:
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/CombiningClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/EverythingClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/JavaOnlyClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingButJavaClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/PatternClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/loader/ClassLoaderToLoaderAdapter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/Loader.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/ClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/PackageClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTestHelper.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/MockClassLoaderPolicy.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/support/TestClass.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/MatchClassFilter.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/MockLoader.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/NoMatchClassFilter.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/test/CustomParentLoaderUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/test/ParentPolicyUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/filter/test/FilterUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/filter/test/PackageFilterUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/junit/test/IsolatedClassLoaderUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java
Log:
[JBMICROCONT-223] - Package handling fixes

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/CombiningClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/CombiningClassFilter.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/CombiningClassFilter.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -78,6 +78,16 @@
       }
       return false;
    }
+
+   public boolean matchesPackageName(String packageName)
+   {
+      for (ClassFilter filter : filters)
+      {
+         if (filter.matchesPackageName(packageName))
+            return true;
+      }
+      return false;
+   }
    
    @Override
    public String toString()

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/EverythingClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/EverythingClassFilter.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/EverythingClassFilter.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -52,6 +52,11 @@
       return true;
    }
    
+   public boolean matchesPackageName(String packageName)
+   {
+      return true;
+   }
+   
    @Override
    public String toString()
    {

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/JavaOnlyClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/JavaOnlyClassFilter.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/JavaOnlyClassFilter.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -37,7 +37,9 @@
     */
    private JavaOnlyClassFilter()
    {
-      super(new String[] { "java\\..+", "javax\\..+" }, new String[] { "java/.+", "javax/.+" } );
+      super(new String[] { "java\\..+", "javax\\..+" }, 
+            new String[] { "java/.+", "javax/.+" },
+            new String[] { "java", "java\\..*", "javax", "javax\\..*" });
    }
 
    public String toString()

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingButJavaClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingButJavaClassFilter.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingButJavaClassFilter.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -37,7 +37,9 @@
     */
    private NothingButJavaClassFilter()
    {
-      super(new String[] { "java\\..+" }, new String[] { "java/.+" });
+      super(new String[] { "java\\..+" }, 
+            new String[] { "java/.+" },
+            new String[] { "java", "java\\..*" });
    }
 
    public String toString()

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingClassFilter.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingClassFilter.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -52,6 +52,11 @@
       return false;
    }
    
+   public boolean matchesPackageName(String packageName)
+   {
+      return false;
+   }
+   
    @Override
    public String toString()
    {

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/PatternClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/PatternClassFilter.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/PatternClassFilter.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -40,6 +40,9 @@
 
    /** The resource patterns as regular expressions */
    private Pattern[] resourcePatterns;
+
+   /** The package patterns as regular expressions */
+   private Pattern[] packagePatterns;
    
    /** Whether to include java */
    private boolean includeJava = false;
@@ -49,9 +52,10 @@
     * 
     * @param classPatterns the class patterns
     * @param resourcePatterns the resource patterns
+    * @param packagePatterns the package patterns
     * @throws IllegalArgumentException for a null pattern
     */
-   public PatternClassFilter(String[] classPatterns, String[] resourcePatterns)
+   public PatternClassFilter(String[] classPatterns, String[] resourcePatterns, String[] packagePatterns)
    {
       if (classPatterns == null)
          throw new IllegalArgumentException("Null patterns");
@@ -77,6 +81,20 @@
             throw new IllegalArgumentException("Null pattern in " + Arrays.asList(resourcePatterns));
          this.resourcePatterns[i] = Pattern.compile(resourcePatterns[i]);
       }
+
+      if (packagePatterns == null)
+      {
+         this.packagePatterns = this.classPatterns;
+         return;
+      }
+      
+      this.packagePatterns = new Pattern[packagePatterns.length];
+      for (int i = 0; i < packagePatterns.length; ++i)
+      {
+         if (packagePatterns[i] == null)
+            throw new IllegalArgumentException("Null pattern in " + Arrays.asList(packagePatterns));
+         this.packagePatterns[i] = Pattern.compile(packagePatterns[i]);
+      }
    }
 
    /**
@@ -131,6 +149,22 @@
       return JavaOnlyClassFilter.INSTANCE.matchesResourcePath(resourcePath);
    }
 
+   public boolean matchesPackageName(String packageName)
+   {
+      if (packageName == null)
+         return false;
+      
+      for (int i = 0; i < packagePatterns.length; ++i)
+      {
+         Matcher matcher = packagePatterns[i].matcher(packageName);
+         if (matcher.matches())
+            return true;
+      }
+      if (includeJava == false)
+         return false;
+      return JavaOnlyClassFilter.INSTANCE.matchesPackageName(packageName);
+   }
+
    @Override
    public String toString()
    {

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -103,9 +103,9 @@
     * @param stack the class stack 
     * @return the requesting class
     */
-   protected Class<?> getRequestingClass(Class[] stack)
+   protected Class<?> getRequestingClass(Class<?>[] stack)
    {
-      for (Class clazz : stack)
+      for (Class<?> clazz : stack)
       {
          if (Hack.class.isAssignableFrom(clazz) == false &&
              JDKChecker.class.isAssignableFrom(clazz) == false &&
@@ -146,7 +146,7 @@
    private static class Hack extends SecurityManager
    {
       @Override
-      public Class[] getClassContext()
+      public Class<?>[] getClassContext()
       {
          return super.getClassContext();
       }

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/loader/ClassLoaderToLoaderAdapter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/loader/ClassLoaderToLoaderAdapter.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/loader/ClassLoaderToLoaderAdapter.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -22,6 +22,7 @@
 package org.jboss.classloader.plugins.loader;
 
 import java.io.IOException;
+import java.lang.reflect.Method;
 import java.net.URL;
 import java.security.AccessControlContext;
 import java.security.AccessController;
@@ -47,10 +48,45 @@
    
    /** The classloader */
    private ClassLoader classLoader;
-
+   
    /** The access control context of the creator of this adapter */
    private AccessControlContext accessControlContext;
    
+   /** The get package method */
+   private static Method getPackage;
+   
+   /** The get packages method */
+   private static Method getPackages;
+   
+   static
+   {
+      AccessController.doPrivileged(new PrivilegedAction<Object>()
+      {
+         public Object run()
+         {
+            try
+            {
+               getPackage = ClassLoader.class.getDeclaredMethod("getPackage", String.class);
+               getPackage.setAccessible(true);
+            }
+            catch (Exception e)
+            {
+               log.warn("Unable to set accessible on ClassLoader.getPackage()", e);
+            }
+            try
+            {
+               getPackages = ClassLoader.class.getDeclaredMethod("getPackages");
+               getPackages.setAccessible(true);
+            }
+            catch (Exception e)
+            {
+               log.warn("Unable to set accessible on ClassLoader.getPackages()", e);
+            }
+            return null;
+         }
+      });
+   }
+   
    /**
     * Create a new ClassLoaderToLoaderAdapter.
     * 
@@ -142,6 +178,37 @@
       }
    }
 
+   public Package getPackage(String name)
+   {
+      if  (getPackage == null)
+         return null;
+
+      try
+      {
+         return (Package) getPackage.invoke(classLoader, new Object[] { name });
+      }
+      catch (Exception e)
+      {
+         log.warn("Unexpected error retrieving package " + name + " from classloader " + classLoader, e);
+         return null;
+      }
+   }
+
+   public void getPackages(Set<Package> packages)
+   {
+      if  (getPackages == null)
+         return;
+
+      try
+      {
+         getPackages.invoke(classLoader);
+      }
+      catch (Exception e)
+      {
+         log.warn("Unexpected error retrieving packages from classloader " + classLoader, e);
+      }
+   }
+
    @Override
    public String toString()
    {

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -25,6 +25,7 @@
 import java.net.URL;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.util.HashSet;
 import java.util.Set;
 
 import org.jboss.classloader.plugins.loader.ClassLoaderToLoaderAdapter;
@@ -334,8 +335,124 @@
       
       parentLoader.getResources(name, urls);
    }
+   
+   @Override
+   protected Package beforeGetPackage(String name)
+   {
+      boolean trace = log.isTraceEnabled();
+      ClassFilter filter = getParentPolicy().getBeforeFilter();
+      if (filter.matchesPackageName(name))
+      {
+         if (trace)
+            log.trace(this + " " + name + " matches parent beforeFilter=" + filter);
+         return getPackageFromParent(name);
+      }
+      if (trace)
+         log.trace(this + " " + name + " does NOT match parent beforeFilter=" + filter);
+      return null;
+   }
 
+   @Override
+   protected Package afterGetPackage(String name)
+   {
+      boolean trace = log.isTraceEnabled();
+      ClassFilter filter = getParentPolicy().getAfterFilter();
+      if (filter.matchesPackageName(name))
+      {
+         if (trace)
+            log.trace(this + " " + name + " matches parent afterFilter=" + filter);
+         return getPackageFromParent(name);
+      }
+      if (trace)
+         log.trace(this + " " + name + " does NOT match parent afterFilter=" + filter);
+      return null;
+   }
+
    /**
+    * Try to get a package from the parent
+    * 
+    * @param name the name
+    * @return the package if found
+    */
+   protected Package getPackageFromParent(String name)
+   {
+      Loader parentLoader = getParent();
+
+      boolean trace = log.isTraceEnabled();
+      if (parentLoader == null)
+      {
+         if (trace)
+            log.trace(this + " not getting package from non-existant parent");
+         return null;
+      }
+
+      if (trace)
+         log.trace(this + " get package from parent " + name + " parent=" + parentLoader);
+      
+      Package result = parentLoader.getPackage(name);
+
+      if (trace)
+      {
+         if (result != null)
+            log.trace(this + " got package from parent " + name + " parent=" + parentLoader + " " + result);
+         else
+            log.trace(this + " package not found in parent " + name + " parent=" + parentLoader);
+      }
+      
+      return result;
+   }
+   
+   @Override
+   protected void beforeGetPackages(Set<Package> packages)
+   {
+      ClassFilter filter = getParentPolicy().getBeforeFilter();
+      getPackagesFromParent(packages, filter);
+   }
+
+   @Override
+   protected void afterGetPackages(Set<Package> packages)
+   {
+      ClassFilter filter = getParentPolicy().getAfterFilter();
+      getPackagesFromParent(packages, filter);
+   }
+
+   /**
+    * Try to get packages from the parent
+    * 
+    * @param packages the packages to add to
+    * @param filter the filter
+    */
+   protected void getPackagesFromParent(Set<Package> packages, ClassFilter filter)
+   {
+      Loader parentLoader = getParent();
+
+      boolean trace = log.isTraceEnabled();
+      if (parentLoader == null)
+      {
+         if (trace)
+            log.trace(this + " not getting packages from non-existant parent");
+         return;
+      }
+
+      if (trace)
+         log.trace(this + " get packages from parent=" + parentLoader + " filter=" + filter);
+      
+      Set<Package> parentPackages = new HashSet<Package>();
+      parentLoader.getPackages(parentPackages);
+      for (Package parentPackage : parentPackages)
+      {
+         if (filter.matchesPackageName(parentPackage.getName()))
+         {
+            if (trace)
+               log.trace(this + " parentPackage=" + parentPackage + " matches filter=" + filter);
+            packages.add(parentPackage);
+         }
+         else if (trace)
+            log.trace(this + " parentPackage=" + parentPackage + " does NOT match filter=" + filter);
+      }
+   }
+
+   /**
     * Fixup the parent to the our classloader as parent if we don't have an explicit one
     */
    private void fixUpParent()

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/Loader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/Loader.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/Loader.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -57,4 +57,19 @@
     * @throws IOException for any error
     */
    void getResources(String name, Set<URL> urls) throws IOException;
+   
+   /**
+    * Get a package
+    * 
+    * @param name the package name
+    * @return the package
+    */
+   Package getPackage(String name);
+   
+   /**
+    * Get all the packages visible from this  loader
+    * 
+    * @param packages the packages
+    */
+   void getPackages(Set<Package> packages);
 }

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -25,6 +25,7 @@
 import java.io.InputStream;
 import java.net.URL;
 import java.security.AccessController;
+import java.security.CodeSource;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
@@ -129,6 +130,83 @@
    }
 
    @Override
+   protected Package getPackage(String name)
+   {
+      boolean trace = log.isTraceEnabled();
+      if (trace)
+         log.trace(this + " getPackage " + name);
+
+      if (name == null)
+         return null;
+      
+      // Did we already load this package?
+      Package result = super.getPackage(name);
+      if (result != null && trace)
+         log.trace(this + " already loaded package " + name + " " + result.getName());
+      
+      // Not already loaded use the domain
+      if (result == null)
+      {
+         BaseClassLoaderPolicy basePolicy = policy;
+         BaseClassLoaderDomain domain = basePolicy.getClassLoaderDomain();
+         if (domain == null)
+            return null;
+         if (trace)
+            log.trace(this + " getPackage " + name + " domain=" + domain);
+         result = domain.getPackage(this, name);
+      }
+      
+      // Still not found
+      if (result == null)
+      {
+         if (trace)
+            log.trace(this + " package not found " + name);
+      }
+      
+      return result;
+   }
+
+   @Override
+   protected Package[] getPackages()
+   {
+      BaseClassLoaderPolicy basePolicy = policy;
+      BaseClassLoaderDomain domain = basePolicy.getClassLoaderDomain();
+      if (domain == null)
+         return super.getPackages();
+      boolean trace = log.isTraceEnabled();
+      if (trace)
+         log.trace(this + " getPackages domain=" + domain);
+
+      Set<Package> packages = new HashSet<Package>();
+      if (domain != null)
+         domain.getPackages(this, packages);
+      return packages.toArray(new Package[packages.size()]);
+   }
+
+   /**
+    * Get a package locally
+    * 
+    * @param name the package name
+    * @return the package
+    */
+   Package getPackageLocally(String name)
+   {
+      return super.getPackage(name);
+   }
+
+   /**
+    * Get the packages locally
+    * 
+    * @param packages the packages
+    */
+   void getPackagesLocally(Set<Package> packages)
+   {
+      Package[] pkgs = super.getPackages();
+      for (Package pkg : pkgs)
+         packages.add(pkg);
+   }
+   
+   @Override
    protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
    {
       boolean trace = log.isTraceEnabled();
@@ -241,7 +319,7 @@
       // Look for the resource
       final String resourcePath = ClassLoaderUtils.classNameToPath(name);
       
-      return AccessController.doPrivileged(new PrivilegedAction<Class>()
+      return AccessController.doPrivileged(new PrivilegedAction<Class<?>>()
       {
          public Class<?> run()
          {
@@ -271,7 +349,14 @@
             }
             
             // Create the package if necessary
-            definePackage(name);
+            URL codeSourceURL = null;
+            if (protectionDomain != null)
+            {
+               CodeSource codeSource = protectionDomain.getCodeSource();
+               if (codeSource != null)
+                  codeSourceURL = codeSource.getLocation();
+            }
+            definePackage(name, codeSourceURL);
             
             // Finally we can define the class
             Class<?> result;
@@ -413,26 +498,44 @@
     * Define the package for the class if not already done
     *
     * @param className the class name
+    * @param codeSourceURL the code source url
     */
-   protected void definePackage(String className)
+   protected void definePackage(String className, URL codeSourceURL)
    {
       String packageName = ClassLoaderUtils.getClassPackageName(className);
       if (packageName.length() == 0)
          return;
       
+      // Ask the policy for the information
+      PackageInformation pi = policy.getPackageInformation(packageName);
+      
       // Already defined?
       Package pkge = getPackage(packageName);
       if (pkge != null)
+      {
+         // Check sealing
+         if (pkge.isSealed())
+         {
+            // Are we trying to add outside the seal?
+            if (codeSourceURL == null || pkge.isSealed(codeSourceURL) == false)
+               throw new SecurityException("Sealing violation for package " + packageName);
+         }
+         // Can we seal now?
+         else if (pi != null && pi.sealBase != null)
+         {
+            throw new SecurityException("Can't seal package " + packageName +" it is already loaded");
+         }
          return;
-      
-      // Ask the policy for the information
-      PackageInformation pi = policy.getPackageInformation(packageName);
+      }
+
       try
       {
          if (pi != null)
             definePackage(packageName, pi.specTitle, pi.specVersion, pi.specVendor, pi.implTitle, pi.implVersion, pi.implVendor, pi.sealBase);
          else
             definePackage(packageName, null, null, null, null, null, null, null);
+         if (log.isTraceEnabled())
+            log.trace(this + " defined package: " + packageName);
       }
       catch (IllegalArgumentException alreadyDone)
       {
@@ -564,6 +667,7 @@
       StringBuilder builder = new StringBuilder();
       builder.append(getClass().getSimpleName());
       builder.append('@').append(Integer.toHexString(System.identityHashCode(this)));
+      builder.append("{").append(policy.getName()).append("}");
       return builder.toString();
    }
 

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -415,6 +415,129 @@
    }
    
    /**
+    * Load a package from the domain
+    * 
+    * @param classLoader the classloader
+    * @param name the resource name
+    * @param allExports whether we should look at all exports
+    * @return the package
+    */
+   Package getPackage(BaseClassLoader classLoader, String name, boolean allExports)
+   {
+      boolean trace = log.isTraceEnabled();
+
+      if (getClassLoaderSystem() == null)
+         throw new IllegalStateException("Domain is not registered with a classloader system: " + toLongString());
+
+      // Try the before attempt
+      Package result = beforeGetPackage(name);
+      if (result != null)
+         return result;
+
+      // Work out the rules
+      ClassLoaderInformation info = null;
+      BaseClassLoaderPolicy policy = null;
+      if (classLoader != null)
+      {
+         policy = classLoader.getPolicy();
+         info = infos.get(classLoader);
+         if (policy.isImportAll())
+            allExports = true;
+      }
+
+      // Next we try the old "big ball of mud" model      
+      if (allExports)
+      {
+         result = getPackageFromExports(classLoader, name, trace);
+         if (result != null)
+            return result;
+      }
+      else if (trace)
+         log.trace(this + " not getting package " + name + " from all exports");
+      
+      // Next we try the imports
+      if (info != null)
+      {
+         result = getPackageFromImports(info, name, trace);
+         if (result != null)
+            return result;
+      }
+
+      // Finally use any requesting classloader
+      if (classLoader != null)
+      {
+         if (trace)
+            log.trace(this + " trying to get package " + name + " from requesting " + classLoader);
+         result = classLoader.getPackageLocally(name);
+         if (result != null)
+         {
+            if (trace)
+               log.trace(this + " got package from requesting " + classLoader + " " + result);
+            return result;
+         }
+      }
+
+      // Try the after attempt
+      result = afterGetPackage(name);
+      if (result != null)
+         return result;
+      
+      // Didn't find it
+      return null;
+   }
+   
+   /**
+    * Load packages from the domain
+    * 
+    * @param classLoader the classloader
+    * @param name the package name
+    * @param allExports whether we should look at all exports
+    * @param packages the packages to add to
+    */
+   void getPackages(BaseClassLoader classLoader, Set<Package> packages, boolean allExports)
+   {
+      boolean trace = log.isTraceEnabled();
+
+      if (getClassLoaderSystem() == null)
+         throw new IllegalStateException("Domain is not registered with a classloader system: " + toLongString());
+
+      // Try the before attempt
+      beforeGetPackages(packages);
+
+      // Work out the rules
+      ClassLoaderInformation info = null;
+      BaseClassLoaderPolicy policy = null;
+      if (classLoader != null)
+      {
+         policy = classLoader.getPolicy();
+         info = infos.get(classLoader);
+         if (policy.isImportAll())
+            allExports = true;
+      }
+
+      // Next we try the old "big ball of mud" model      
+      if (allExports)
+         getPackagesFromExports(classLoader, packages, trace);
+      else if (trace)
+         log.trace(this + " not getting packages from all exports");
+      
+      // Next we try the imports
+      if (info != null)
+         getPackagesFromImports(info, packages, trace);
+
+      // Finally use any requesting classloader
+      if (classLoader != null)
+      {
+         if (trace)
+            log.trace(this + " trying to get packages from requesting " + classLoader);
+         classLoader.getPackagesLocally(packages);
+      }
+
+      // Try the after attempt
+      afterGetPackages(packages);
+   }
+   
+   /**
     * Find a loader for class in exports
     * 
     * @param classLoader the classloader
@@ -556,8 +679,57 @@
          }
       }
    }
+   
+   /**
+    * Load a package from the exports
+    * 
+    * @param classLoader the classloader
+    * @param name the package name
+    * @param trace whether trace is enabled
+    * @return the package
+    */
+   private Package getPackageFromExports(BaseClassLoader classLoader, String name, boolean trace)
+   {
+      List<ClassLoaderInformation> list = classLoadersByPackageName.get(name);
+      if (trace)
+         log.trace(this + " trying to get package " + name + " from all exports " + list);
+      if (list != null && list.isEmpty() == false)
+      {
+         for (ClassLoaderInformation info : list)
+         {
+            BaseDelegateLoader loader = info.getExported();
 
+            Package result = loader.getPackage(name);
+            if (result != null)
+               return result;
+         }
+      }
+      return null;
+   }
+   
    /**
+    * Load packages from the exports
+    * 
+    * @param classLoader the classloader
+    * @param packages the packages to add to
+    * @param trace whether trace is enabled
+    */
+   void getPackagesFromExports(BaseClassLoader classLoader, Set<Package> packages, boolean trace)
+   {
+      List<ClassLoaderInformation> list = classLoaders;
+      if (trace)
+         log.trace(this + " trying to get all packages from all exports " + list);
+      if (list != null && list.isEmpty() == false)
+      {
+         for (ClassLoaderInformation info : list)
+         {
+            BaseDelegateLoader loader = info.getExported();
+            loader.getPackages(packages);
+         }
+      }
+   }
+
+   /**
     * Find a loader for a class in imports
     * 
     * @param info the classloader information
@@ -676,8 +848,60 @@
       for (DelegateLoader delegate : delegates)
          delegate.getResources(name, urls);
    }
+   
+   /**
+    * Load a package from the imports
+    * 
+    * @param info the classloader information
+    * @param name the pacakge name
+    * @param trace whether trace is enabled
+    * @return the package
+    */
+   private Package getPackageFromImports(ClassLoaderInformation info, String name, boolean trace)
+   {
+      List<? extends DelegateLoader> delegates = info.getDelegates();
+      if (delegates == null || delegates.isEmpty())
+      {
+         if (trace)
+            log.trace(this + " not getting package " + name + " from imports it has no delegates");
+         return null;
+      }
 
+      if (trace)
+         log.trace(this + " trying to get package " + name + " from imports " + delegates + " for " + info.getClassLoader());
+
+      for (DelegateLoader delegate : delegates)
+      {
+         Package result = delegate.getPackage(name);
+         if (result != null)
+            return result;
+      }
+      return null;
+   }
+   
    /**
+    * Load packages from the imports
+    * 
+    * @param info the classloader info
+    * @param packages the packages to add to
+    * @param trace whether trace is enabled
+    */
+   void getPackagesFromImports(ClassLoaderInformation info, Set<Package> packages, boolean trace)
+   {
+      List<? extends DelegateLoader> delegates = info.getDelegates();
+      if (delegates == null || delegates.isEmpty())
+      {
+         if (trace)
+            log.trace(this + " not getting all packages from imports it has no delegates");
+         return;
+      }
+      if (trace)
+         log.trace(this + " trying to get all pacakges from imports " + delegates + " for " + info.getClassLoader());
+      for (DelegateLoader delegate : delegates)
+         delegate.getPackages(packages);
+   }
+
+   /**
     * Invoked before classloading is attempted to allow a preload attempt, e.g. from the parent
     * 
     * @param name the class resource name
@@ -722,11 +946,41 @@
    /**
     * Invoked after getResource is attempted to allow a postload attempt, e.g. from the parent
     * 
-    * @param name the class name
+    * @param name the resource name
     * @return the url if found or null otherwise
     */
    protected abstract URL afterGetResource(String name);
    
+   /**
+    * Invoked before getPackages is attempted to allow a preload attempt, e.g. from the parent
+    * 
+    * @param packages the packages to add to
+    */
+   protected abstract void beforeGetPackages(Set<Package> packages);
+   
+   /**
+    * Invoked after getPackages is attempted to allow a postload attempt, e.g. from the parent
+    * 
+    * @param packages the packages to add to
+    */
+   protected abstract void afterGetPackages(Set<Package> packages);
+   
+   /**
+    * Invoked before getPackage is attempted to allow a preload attempt, e.g. from the parent
+    * 
+    * @param name the package name
+    * @return the package if found or null otherwise
+    */
+   protected abstract Package beforeGetPackage(String name);
+   
+   /**
+    * Invoked after getPackage is attempted to allow a postload attempt, e.g. from the parent
+    * 
+    * @param name the package name
+    * @return the url if found or null otherwise
+    */
+   protected abstract Package afterGetPackage(String name);
+   
    public Class<?> loadClass(String name)
    {
       try
@@ -786,6 +1040,39 @@
    {
       getResources(classLoader, name, urls, false);
    }
+   
+   public Package getPackage(String name)
+   {
+      return getPackage(null, name, true);
+   }
+   
+   /**
+    * Get a package from the specified classloader
+    * 
+    * @param classLoader the classloader
+    * @param name the package name
+    * @return the package
+    */
+   Package getPackage(BaseClassLoader classLoader, String name)
+   {
+      return getPackage(classLoader, name, false);
+   }
+   
+   public void getPackages(Set<Package> packages)
+   {
+      getPackages(null, packages, true);
+   }
+   
+   /**
+    * Get the packages from a specified classloader 
+    * 
+    * @param classLoader the classloader
+    * @param packages the packages
+    */
+   void getPackages(BaseClassLoader classLoader, Set<Package> packages)
+   {
+      getPackages(classLoader, packages, false);
+   }
 
    /**
     * A long version of toString()

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -87,6 +87,16 @@
    protected abstract DelegateLoader getExported();
 
    /**
+    * Get a simple name for the classloader
+    * 
+    * @return the name
+    */
+   protected String getName()
+   {
+      return "";
+   }
+   
+   /**
     * Get the exported packages<p>
     *
     * Provides a hint for indexing

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -105,6 +105,36 @@
       classLoader.getResourcesLocally(name, urls);
    }
 
+   public Package getPackage(String name)
+   {
+      BaseClassLoader classLoader;
+      try
+      {
+         classLoader = delegate.getClassLoader();
+      }
+      catch (IllegalStateException e)
+      {
+         log.warn("Not getting package from policy that has no classLoader: " + toLongString());
+         return null;
+      }
+      return classLoader.getPackageLocally(name);
+   }
+
+   public void getPackages(Set<Package> packages)
+   {
+      BaseClassLoader classLoader;
+      try
+      {
+         classLoader = delegate.getClassLoader();
+      }
+      catch (IllegalStateException e)
+      {
+         log.warn("Not getting packages from policy that has no classLoader: " + toLongString());
+         return;
+      }
+      classLoader.getPackagesLocally(packages);
+   }
+   
    /**
     * A long version of toString()
     * 

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/ClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/ClassFilter.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/ClassFilter.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -61,4 +61,12 @@
     * @return true when it matches the filter
     */
    boolean matchesResourcePath(String resourcePath);
+   
+   /** 
+    * Whether the package name matches the filter
+    * 
+    * @param packageName the package path
+    * @return true when it matches the filter
+    */
+   boolean matchesPackageName(String packageName);
 }

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -23,6 +23,7 @@
 
 import java.io.IOException;
 import java.net.URL;
+import java.util.HashSet;
 import java.util.Set;
 
 import org.jboss.classloader.spi.ClassLoaderPolicy;
@@ -121,6 +122,39 @@
          log.trace(this + " " + name + " does NOT match filter=" + filter);
    }
 
+   public Package getPackage(String name)
+   {
+      boolean trace = log.isTraceEnabled();
+      if (filter.matchesPackageName(name))
+      {
+         if (trace)
+            log.trace(this + " " + name + " matches package filter=" + filter);
+         return super.getPackage(name);
+      }
+      if (trace)
+         log.trace(this + " " + name + " does NOT match package filter=" + filter);
+      return null;
+   }
+
+   public void getPackages(Set<Package> packages)
+   {
+      boolean trace = log.isTraceEnabled();
+      
+      Set<Package> allPackages = new HashSet<Package>();
+      super.getPackages(allPackages);
+      for (Package pkge : allPackages)
+      {
+         if (filter.matchesPackageName(pkge.getName()))
+         {
+            if (trace)
+               log.trace(this + " " + pkge + " matches package filter=" + filter);
+            packages.add(pkge);
+         }
+         else if (trace)
+            log.trace(this + " pkge=" + pkge + " does NOT match package filter=" + filter);
+      }
+   }
+
    @Override
    protected void toLongString(StringBuilder builder)
    {

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/PackageClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/PackageClassFilter.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/PackageClassFilter.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -110,7 +110,9 @@
     */
    public PackageClassFilter(String[] packageNames)
    {
-      super(convertPackageNamesToClassPatterns(packageNames), convertPackageNamesToResourcePatterns(packageNames));
+      super(convertPackageNamesToClassPatterns(packageNames), 
+            convertPackageNamesToResourcePatterns(packageNames),
+            packageNames);
       this.packageNames = packageNames;
    }
 

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTestHelper.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTestHelper.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTestHelper.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -162,7 +162,7 @@
    public Class<?> initializeClassLoader(Class<?> clazz, boolean importAll, Class<?>... packages)
    {
       MockClassLoaderPolicy policy = new MockClassLoaderPolicy();
-      Set<Class> classes = new HashSet<Class>();
+      Set<Class<?>> classes = new HashSet<Class<?>>();
       classes.add(clazz);
       for (Class<?> c : packages)
          classes.add(c);
@@ -242,7 +242,7 @@
    public Class<?> initializeClassLoader(Class<?> clazz, ClassFilter parentFilter, boolean importAll, Class<?>... packages)
    {
       MockClassLoaderPolicy policy = new MockClassLoaderPolicy();
-      Set<Class> classes = new HashSet<Class>();
+      Set<Class<?>> classes = new HashSet<Class<?>>();
       classes.add(clazz);
       for (Class<?> c : packages)
          classes.add(c);

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/MockClassLoaderPolicy.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/MockClassLoaderPolicy.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/MockClassLoaderPolicy.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -39,6 +39,7 @@
 import org.jboss.classloader.plugins.filter.PatternClassFilter;
 import org.jboss.classloader.spi.ClassLoaderPolicy;
 import org.jboss.classloader.spi.DelegateLoader;
+import org.jboss.classloader.spi.PackageInformation;
 import org.jboss.classloader.spi.filter.ClassFilter;
 
 /**
@@ -92,7 +93,9 @@
     */
    public MockClassLoaderPolicy(String name)
    {
-      this(name, new String[] { "org\\.jboss\\..+" }, new String[] { "org/jboss/.+" });
+      this(name, new String[] { "org\\.jboss\\..+" }, 
+                 new String[] { "org/jboss/.+" },
+                 new String[] { "org\\.jboss", "org\\.jboss\\..*" });
    }
 
    /**
@@ -101,10 +104,11 @@
     * @param name the name
     * @param classPatterns the class patterns
     * @param resourcePatterns the resourcePatterns
+    * @param packagePatterns the packagePatterns
     */
-   public MockClassLoaderPolicy(String name, String[] classPatterns, String[] resourcePatterns)
+   public MockClassLoaderPolicy(String name, String[] classPatterns, String[] resourcePatterns, String[] packagePatterns)
    {
-      this(name, new PatternClassFilter(classPatterns, resourcePatterns));
+      this(name, new PatternClassFilter(classPatterns, resourcePatterns, packagePatterns));
    }
 
    /**
@@ -124,6 +128,11 @@
       this.nonJDKFilter = nonJDKFilter;
    }
    
+   public String getName()
+   {
+      return name;
+   }
+   
    @Override
    public List<? extends DelegateLoader> getDelegates()
    {
@@ -195,7 +204,7 @@
     * 
     * @param classes the classes to reference to determine the package paths
     */
-   public void setPaths(Class... classes)
+   public void setPaths(Class<?>... classes)
    {
       if (classes == null)
       {
@@ -228,7 +237,7 @@
     * 
     * @param classes the classes to reference to determine the package names
     */
-   public void setPackageNames(Class... classes)
+   public void setPackageNames(Class<?>... classes)
    {
       if (classes == null)
       {
@@ -245,7 +254,7 @@
     * 
     * @param classes the classes to include from the paths
     */
-   public void setIncluded(Class... classes)
+   public void setIncluded(Class<?>... classes)
    {
       if (classes == null)
       {
@@ -262,7 +271,7 @@
     * 
     * @param classes the classes to exclude from the paths
     */
-   public void setExcluded(Class... classes)
+   public void setExcluded(Class<?>... classes)
    {
       if (classes == null)
       {
@@ -279,7 +288,7 @@
     * 
     * @param classes the classes to reference
     */
-   public void setPathsAndPackageNames(Class... classes)
+   public void setPathsAndPackageNames(Class<?>... classes)
    {
       setPaths(classes);
       setPackageNames(classes);
@@ -404,7 +413,7 @@
    @Override
    protected ProtectionDomain getProtectionDomain(String className, String path)
    {
-      final Class clazz;
+      final Class<?> clazz;
       try
       {
          clazz = getClass().getClassLoader().loadClass(className);
@@ -422,6 +431,14 @@
       }, getAccessControlContext());
    }
 
+   @Override
+   public PackageInformation getPackageInformation(String packageName)
+   {
+      PackageInformation pi = new PackageInformation(packageName);
+      pi.implTitle = name;
+      return pi;
+   }
+
    /*
     * Overridden to not expose classes in the nonJDKFilter
     * this is so we don't expose classes from the classpath

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -265,6 +265,21 @@
       }
    }
    
+   protected void assertPackage(Class<?> reference, ClassLoader classLoader) throws Exception
+   {
+      Class<?> clazz = classLoader.loadClass(reference.getName());
+      Package pkge = Package.getPackage(ClassLoaderUtils.getClassPackageName(clazz.getName()));
+      assertEquals(pkge,clazz.getPackage());
+   }
+   
+   protected void assertPackage(Class<?> reference, ClassLoader classLoader, MockClassLoaderPolicy policy) throws Exception
+   {
+      Class<?> clazz = classLoader.loadClass(reference.getName());
+      Package pkge = clazz.getPackage();
+      assertNotNull("Expected a package for " + clazz.getName(), pkge);
+      assertEquals(policy.getName(), pkge.getImplementationTitle());
+   }
+   
    protected void assertFilterMatchesClassName(String test, ClassFilter filter)
    {
       getLog().debug("Checking " + test + " expect it to match filter=" + filter);
@@ -296,6 +311,22 @@
       getLog().debug("Checked " + test + " result was " + result + " for filter=" + filter);
       assertFalse("Expected " + test + " NOT to match " + filter, result);
    }
+   
+   protected void assertFilterMatchesPackageName(String test, ClassFilter filter)
+   {
+      getLog().debug("Checking " + test + " expect it to match filter=" + filter);
+      boolean result = filter.matchesPackageName(test);
+      getLog().debug("Checked " + test + " result was " + result + " for filter=" + filter);
+      assertTrue("Expected " + test + " to match " + filter, result);
+   }
+   
+   protected void assertFilterNoMatchPackageName(String test, ClassFilter filter)
+   {
+      getLog().debug("Checking " + test + " expect it NOT to match filter=" + filter);
+      boolean result = filter.matchesPackageName(test);
+      getLog().debug("Checked " + test + " result was " + result + " for filter=" + filter);
+      assertFalse("Expected " + test + " NOT to match " + filter, result);
+   }
 
    protected void configureLogging()
    {

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/support/TestClass.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/support/TestClass.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/support/TestClass.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -34,7 +34,7 @@
 {
    public Object doSomething() throws Exception
    {
-      Constructor constructor = getClass().getConstructor((Class[]) null);
+      Constructor<?> constructor = getClass().getConstructor((Class[]) null);
       
       Object object = constructor.newInstance((Object[]) null);
       

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -80,8 +80,8 @@
       policy.setPathsAndPackageNames(TestClass.class);
       ClassLoader classLoader = system.registerClassLoaderPolicy(policy);
       
-      Class clazz = assertLoadClass(TestClass.class, classLoader);
-      Constructor constructor = clazz.getConstructor((Class[]) null);
+      Class<?> clazz = assertLoadClass(TestClass.class, classLoader);
+      Constructor<?> constructor = clazz.getConstructor((Class[]) null);
       
       Object object = constructor.newInstance((Object[]) null);
       

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/MatchClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/MatchClassFilter.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/MatchClassFilter.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -36,7 +36,7 @@
    
    public boolean filtered = false;
    
-   public MatchClassFilter(Class clazz)
+   public MatchClassFilter(Class<?> clazz)
    {
       this.className = clazz.getName();
    }
@@ -54,4 +54,11 @@
          filtered = true;
       return true;
    }
+   
+   public boolean matchesPackageName(String packageName)
+   {
+      if (ClassLoaderUtils.getClassPackageName(this.className).equals(packageName))
+         filtered = true;
+      return true;
+   }
 }

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/MockLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/MockLoader.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/MockLoader.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -63,4 +63,14 @@
          return null;
       }
    }
+
+   public Package getPackage(String name)
+   {
+      return null;
+   }
+
+   public void getPackages(Set<Package> packages)
+   {
+      // Nothing
+   }
 }

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/NoMatchClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/NoMatchClassFilter.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/support/NoMatchClassFilter.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -36,7 +36,7 @@
    
    public boolean filtered = false;
    
-   public NoMatchClassFilter(Class clazz)
+   public NoMatchClassFilter(Class<?> clazz)
    {
       this.className = clazz.getName();
    }
@@ -60,4 +60,11 @@
       }
       return true;
    }
+   
+   public boolean matchesPackageName(String packageName)
+   {
+      if (ClassLoaderUtils.getClassPackageName(this.className).equals(packageName))
+         return false;
+      return true;
+   }
 }

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/test/CustomParentLoaderUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/test/CustomParentLoaderUnitTestCase.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/test/CustomParentLoaderUnitTestCase.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -133,7 +133,7 @@
       assertTrue("Should have been filtered", filter.filtered);
    }
    
-   protected void checkGetResource(MockLoader loader, Class... classes)
+   protected void checkGetResource(MockLoader loader, Class<?>... classes)
    {
       if (classes == null || classes.length == 0)
       {
@@ -141,12 +141,12 @@
          return;
       }
       Set<String> resourcePaths = new HashSet<String>();
-      for (Class clazz : classes)
+      for (Class<?> clazz : classes)
          resourcePaths.add(ClassLoaderUtils.classNameToPath(clazz.getName()));
       assertEquals(resourcePaths, loader.getResource);
    }
    
-   protected void checkLoadClass(MockLoader loader, Class... classes)
+   protected void checkLoadClass(MockLoader loader, Class<?>... classes)
    {
       if (classes == null || classes.length == 0)
       {
@@ -154,7 +154,7 @@
          return;
       }
       Set<String> classNames = new HashSet<String>();
-      for (Class clazz : classes)
+      for (Class<?> clazz : classes)
          classNames.add(clazz.getName());
       assertEquals(classNames, loader.loadClass);
    }

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/test/ParentPolicyUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/test/ParentPolicyUnitTestCase.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/domain/test/ParentPolicyUnitTestCase.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -60,7 +60,9 @@
       ClassLoader classLoader = system.registerClassLoaderPolicy(domain, policy);
       
       assertLoadClass(Object.class, classLoader, null, true);
+      assertPackage(ClassLoaderDomain.class, classLoader);
       assertLoadClass(ClassLoaderDomain.class, classLoader, null, true);
+      assertPackage(ClassLoaderDomain.class, classLoader);
    }
    
    public void testBefore() throws Exception
@@ -74,6 +76,7 @@
       
       assertLoadClass(Object.class, classLoader, null, true);
       assertLoadClass(ClassLoaderDomain.class, classLoader, null, true);
+      assertPackage(ClassLoaderDomain.class, classLoader);
    }
    
    public void testBeforeButJavaOnly() throws Exception
@@ -87,6 +90,7 @@
       
       assertLoadClass(Object.class, classLoader, null, true);
       assertLoadClass(ClassLoaderDomain.class, classLoader);
+      assertPackage(ClassLoaderDomain.class, classLoader, policy);
    }
    
    public void testBeforeButJavaOnlyNotFound() throws Exception
@@ -112,6 +116,7 @@
       
       assertLoadClass(Object.class, classLoader, null, true);
       assertLoadClass(ClassLoaderDomain.class, classLoader);
+      assertPackage(ClassLoaderDomain.class, classLoader);
    }
    
    public void testAfterReached() throws Exception
@@ -124,6 +129,7 @@
       
       assertLoadClass(Object.class, classLoader, null, true);
       assertLoadClass(ClassLoaderDomain.class, classLoader, null, true);
+      assertPackage(ClassLoaderDomain.class, classLoader);
    }
    
    public void testAfterButJavaBeforeNotReached() throws Exception
@@ -137,6 +143,7 @@
       
       assertLoadClass(Object.class, classLoader, null, true);
       assertLoadClass(ClassLoaderDomain.class, classLoader);
+      assertPackage(ClassLoaderDomain.class, classLoader);
    }
    
    public void testAfterButJavaBeforeReached() throws Exception
@@ -149,6 +156,7 @@
       
       assertLoadClass(Object.class, classLoader, null, true);
       assertLoadClass(ClassLoaderDomain.class, classLoader, null, true);
+      assertPackage(ClassLoaderDomain.class, classLoader);
    }
    
    public void testBeforeFilteredNotMatched() throws Exception
@@ -165,6 +173,7 @@
       assertLoadClass(Object.class, classLoader, null, true);
       assertLoadClass(ClassLoaderDomain.class, classLoader);
       assertTrue("Should have been filtered", filter.filtered);
+      assertPackage(ClassLoaderDomain.class, classLoader, policy);
    }
    
    public void testBeforeFilteredMatched() throws Exception
@@ -181,6 +190,7 @@
       assertLoadClass(Object.class, classLoader, null, true);
       assertLoadClass(ClassLoaderDomain.class, classLoader, null, true);
       assertTrue("Should have been filtered", filter.filtered);
+      assertPackage(ClassLoaderDomain.class, classLoader);
    }
    
    public void testAfterFilteredNotReached() throws Exception
@@ -197,6 +207,7 @@
       assertLoadClass(Object.class, classLoader, null, true);
       assertLoadClass(ClassLoaderDomain.class, classLoader);
       assertFalse("Should NOT have been filtered", filter.filtered);
+      assertPackage(ClassLoaderDomain.class, classLoader, policy);
    }
    
    public void testAfterFilteredReachedNotMatched() throws Exception
@@ -227,6 +238,7 @@
       assertLoadClass(Object.class, classLoader, null, true);
       assertLoadClass(ClassLoaderDomain.class, classLoader, null, true);
       assertTrue("Should have been filtered", filter.filtered);
+      assertPackage(ClassLoaderDomain.class, classLoader);
    }
    
    public void testNoMatchBeforeAndAfter() throws Exception

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/filter/test/FilterUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/filter/test/FilterUnitTestCase.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/filter/test/FilterUnitTestCase.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -50,6 +50,12 @@
       assertFilterMatchesClassName("gibberish", filter);
       assertFilterMatchesClassName("", filter);
       assertFilterMatchesClassName(null, filter);
+      assertFilterMatchesResourcePath("gibberish", filter);
+      assertFilterMatchesResourcePath("", filter);
+      assertFilterMatchesResourcePath(null, filter);
+      assertFilterMatchesPackageName("gibberish", filter);
+      assertFilterMatchesPackageName("", filter);
+      assertFilterMatchesPackageName(null, filter);
    }
    
    public void testNothing() throws Exception
@@ -58,6 +64,12 @@
       assertFilterNoMatchClassName("gibberish", filter);
       assertFilterNoMatchClassName("", filter);
       assertFilterNoMatchClassName(null, filter);
+      assertFilterNoMatchResourcePath("gibberish", filter);
+      assertFilterNoMatchResourcePath("", filter);
+      assertFilterNoMatchResourcePath(null, filter);
+      assertFilterNoMatchPackageName("gibberish", filter);
+      assertFilterNoMatchPackageName("", filter);
+      assertFilterNoMatchPackageName(null, filter);
    }
    
    public void testJavaOnly() throws Exception
@@ -80,5 +92,35 @@
       assertFilterNoMatchClassName("gibberish", filter);
       assertFilterNoMatchClassName("", filter);
       assertFilterNoMatchClassName(null, filter);
+      assertFilterMatchesResourcePath("java/x", filter);
+      assertFilterMatchesResourcePath("java/lang/Object", filter);
+      assertFilterMatchesResourcePath("java/lang/ref/Method", filter);
+      assertFilterMatchesResourcePath("java/util/Collection", filter);
+      assertFilterMatchesResourcePath("javax/x", filter);
+      assertFilterMatchesResourcePath("javax/naming/Context", filter);
+      assertFilterNoMatchResourcePath("java/", filter);
+      assertFilterNoMatchResourcePath("java", filter);
+      assertFilterNoMatchResourcePath("javaa.", filter);
+      assertFilterNoMatchResourcePath("javaa/whatever", filter);
+      assertFilterNoMatchResourcePath("javax", filter);
+      assertFilterNoMatchResourcePath("javax/", filter);
+      assertFilterNoMatchResourcePath("javaxa/", filter);
+      assertFilterNoMatchResourcePath("javaxa/whatever", filter);
+      assertFilterNoMatchResourcePath("gibberish", filter);
+      assertFilterNoMatchResourcePath("", filter);
+      assertFilterNoMatchResourcePath(null, filter);
+      assertFilterMatchesPackageName("java", filter);
+      assertFilterMatchesPackageName("java.lang", filter);
+      assertFilterMatchesPackageName("java.lang.ref", filter);
+      assertFilterMatchesPackageName("java.util", filter);
+      assertFilterMatchesPackageName("javax", filter);
+      assertFilterMatchesPackageName("javax.naming", filter);
+      assertFilterNoMatchPackageName("javaa.", filter);
+      assertFilterNoMatchPackageName("javaa.whatever", filter);
+      assertFilterNoMatchPackageName("javaxa.", filter);
+      assertFilterNoMatchPackageName("javaxa.whatever", filter);
+      assertFilterNoMatchPackageName("gibberish", filter);
+      assertFilterNoMatchPackageName("", filter);
+      assertFilterNoMatchPackageName(null, filter);
    }
 }

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/filter/test/PackageFilterUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/filter/test/PackageFilterUnitTestCase.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/filter/test/PackageFilterUnitTestCase.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -52,6 +52,9 @@
       assertFilterNoMatchClassName("", filter);
       assertFilterNoMatchClassName(null, filter);
       assertFilterNoMatchResourcePath("x.xml", filter);
+      assertFilterNoMatchPackageName("gibberish", filter);
+      assertFilterNoMatchPackageName("", filter);
+      assertFilterNoMatchPackageName(null, filter);
    }
    
    public void testJavaLang() throws Exception
@@ -66,6 +69,12 @@
       assertFilterNoMatchClassName("", filter);
       assertFilterNoMatchClassName(null, filter);
       assertFilterMatchesResourcePath("java/lang/something.xml", filter);
+      assertFilterMatchesPackageName("java.lang", filter);
+      assertFilterNoMatchPackageName("java.langx", filter);
+      assertFilterNoMatchPackageName("java.lang.X.", filter);
+      assertFilterNoMatchPackageName("gibberish", filter);
+      assertFilterNoMatchPackageName("", filter);
+      assertFilterNoMatchPackageName(null, filter);
    }
    
    public void testJavaLangAndJavaLangReflect() throws Exception
@@ -83,5 +92,14 @@
       assertFilterNoMatchClassName("gibberish", filter);
       assertFilterNoMatchClassName("", filter);
       assertFilterNoMatchClassName(null, filter);
+      assertFilterMatchesPackageName("java.lang", filter);
+      assertFilterNoMatchPackageName("java.langx", filter);
+      assertFilterNoMatchPackageName("java.lang.X.", filter);
+      assertFilterMatchesPackageName("java.lang.reflect", filter);
+      assertFilterNoMatchPackageName("java.lang.reflectx", filter);
+      assertFilterNoMatchPackageName("java.lang.reflect.X", filter);
+      assertFilterNoMatchPackageName("gibberish", filter);
+      assertFilterNoMatchPackageName("", filter);
+      assertFilterNoMatchPackageName(null, filter);
    }
 }

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/junit/test/IsolatedClassLoaderUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/junit/test/IsolatedClassLoaderUnitTestCase.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/junit/test/IsolatedClassLoaderUnitTestCase.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -129,7 +129,7 @@
    
    public void testJavaClass() throws Exception
    {
-      Class clazz = getClass().getClassLoader().loadClass("java.util.Set");
+      Class<?> clazz = getClass().getClassLoader().loadClass("java.util.Set");
       assertEquals(Set.class, clazz);
       clazz = getClass().getClassLoader().loadClass("javax.naming.InitialContext");
       assertEquals(InitialContext.class, clazz);

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -89,16 +89,16 @@
 
          // Load and create an instance of the UserOfBase class
          Class<?> userOfBaseClass = assertLoadClass(UserOfBase.class, cl0);
-         Constructor ctor0 = userOfBaseClass.getConstructor((Class[]) null);
+         Constructor<?> ctor0 = userOfBaseClass.getConstructor((Class[]) null);
          Object userOfBase = ctor0.newInstance((Object[]) null);
 
          // Load and create an instance of the Support class
          Class<?> supportClass = assertLoadClass(Support.class, cl1);
-         Constructor ctor1 = supportClass.getConstructor((Class[]) null);
+         Constructor<?> ctor1 = supportClass.getConstructor((Class[]) null);
          Object support = ctor1.newInstance((Object[]) null);
 
          // Now invoke UserOfBase.testBase(Support)
-         Class[] sig = { supportClass };
+         Class<?>[] sig = { supportClass };
          Method testBase = userOfBaseClass.getMethod("testBase", sig);
          getLog().info(testBase.toString());
          Object[] args = { support };
@@ -124,21 +124,21 @@
       {
          // Load and create an instance of the UserOfLoginInfo class
          Class<?> c0 = assertLoadClass(UserOfLoginInfo.class, cl);
-         Class[] ctorsig0 = {String.class, String.class};
-         Constructor ctor0 = c0.getConstructor(ctorsig0);
+         Class<?>[] ctorsig0 = {String.class, String.class};
+         Constructor<?> ctor0 = c0.getConstructor(ctorsig0);
          Object[] args0 = {"jduke", "theduke"};
          ctor0.newInstance(args0);
 
          // Load and create an instance of the UserOfUsrMgr class
          Class<?> c1 = assertLoadClass(UserOfUsrMgr.class, cl);
-         Class[] ctorsig1 = {String.class, String.class};
-         Constructor ctor1 = c1.getConstructor(ctorsig1);
+         Class<?>[] ctorsig1 = {String.class, String.class};
+         Constructor<?> ctor1 = c1.getConstructor(ctorsig1);
          Object[] args1 = {"jduke", "theduke"};
          Object o1 = ctor1.newInstance(args1);
 
          // Now invoke UserOfUsrMgr.changePassword(char[] password)
          char[] password = "theduke2".toCharArray();
-         Class[] sig = {password.getClass()};
+         Class<?>[] sig = {password.getClass()};
          Method changePassword = c1.getMethod("changePassword", sig);
          getLog().info(changePassword.toString());
          Object[] args = {password};
@@ -282,7 +282,7 @@
       String classname;
       ClassLoader loader;
       ClassLoader expected;
-      Class loadedClass;
+      Class<?> loadedClass;
       Throwable loadError;
       boolean fails;
 

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -68,7 +68,7 @@
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
       final ClassLoader cl = system.registerClassLoaderPolicy(new TestClassLoaderPolicy());
 
-      Class cls = assertLoadClass(Support.class, cl);
+      Class<?> cls = assertLoadClass(Support.class, cl);
 
       Thread thread1 = new Thread(new Runnable()
       {

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java	2008-01-10 09:54:42 UTC (rev 68810)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java	2008-01-10 10:17:47 UTC (rev 68811)
@@ -47,7 +47,7 @@
    public final static int MAX_CLASSES = 10;
    public final static int NUMBER_OF_LOADING = 10;
    public final static int NUMBER_OF_THREADS = 20;
-   private HashSet<Class> classes = new HashSet<Class>();
+   private HashSet<Class<?>> classes = new HashSet<Class<?>>();
    private Vector<Loader> loaders = new Vector<Loader>();
    private Timer newInstanceTimer;
    private int doneCount;
@@ -114,14 +114,14 @@
       public void run()
       {
          int size = classes.size();
-         Class[] theClasses = new Class[size];
+         Class<?>[] theClasses = new Class<?>[size];
          classes.toArray(theClasses);
          getLog().trace("NewInstanceTask, creating " + size + " instances");
          for (int c = 0; c < theClasses.length; ++c)
          {
             try
             {
-               Class clazz = theClasses[c];
+               Class<?> clazz = theClasses[c];
                Object obj = clazz.newInstance();
                getLog().trace("Created instance=" + obj);
             }
@@ -170,7 +170,7 @@
                getLog().trace("before load...");
                long sleep = (long) (500 * Math.random());
                Thread.sleep(sleep);
-               Class clazz = cl.loadClass (className);
+               Class<?> clazz = cl.loadClass(className);
                classes.add(clazz);
                Object obj = clazz.newInstance();
                getLog().trace("Class " + className + " loaded, obj=" + obj);




More information about the jboss-cvs-commits mailing list