[jboss-cvs] JBossAS SVN: r93160 - in projects/jboss-osgi/projects/runtime/microcontainer/trunk/src: main/java/org/jboss/osgi/plugins/facade/classloading and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Sep 3 08:25:58 EDT 2009


Author: thomas.diesler at jboss.com
Date: 2009-09-03 08:25:57 -0400 (Thu, 03 Sep 2009)
New Revision: 93160

Added:
   projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiClassLoaderDomain.java
Modified:
   projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/bundle/OSGiBundleManager.java
   projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiBundleClassLoadingDeployer.java
   projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiClassLoaderSystem.java
   projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/test/java/org/jboss/test/osgi/classloader/test/ClassLoaderDomainUnitTestCase.java
   projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/test/resources/bootstrap/bootstrap.xml
Log:
Add OSGiClassLoaderDomain

Modified: projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/bundle/OSGiBundleManager.java
===================================================================
--- projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/bundle/OSGiBundleManager.java	2009-09-03 11:46:03 UTC (rev 93159)
+++ projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/bundle/OSGiBundleManager.java	2009-09-03 12:25:57 UTC (rev 93160)
@@ -582,6 +582,10 @@
     */
    public boolean resolve(OSGiBundleState bundleState, boolean errorOnFail)
    {
+      int state = bundleState.getState();
+      if (state == Bundle.RESOLVED || state == Bundle.ACTIVE)
+         return true;
+      
       try
       {
          String name = bundleState.getDeploymentUnit().getName();
@@ -839,6 +843,10 @@
     */
    public void initFramework()
    {
+      // Log INFO about this implementation
+      log.info(getClass().getPackage().getImplementationTitle());
+      log.info(getClass().getPackage().getImplementationVersion());
+      
       int state = systemBundle.getState();
 
       // This method does nothing if called when this Framework is in the STARTING, ACTIVE or STOPPING state

Modified: projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiBundleClassLoadingDeployer.java
===================================================================
--- projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiBundleClassLoadingDeployer.java	2009-09-03 11:46:03 UTC (rev 93159)
+++ projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiBundleClassLoadingDeployer.java	2009-09-03 12:25:57 UTC (rev 93160)
@@ -21,10 +21,11 @@
 */
 package org.jboss.osgi.plugins.facade.classloading;
 
+// $Id: $
+
 import java.util.List;
 
 import org.jboss.classloader.spi.ClassLoaderDomain;
-import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.classloading.spi.metadata.CapabilitiesMetaData;
 import org.jboss.classloading.spi.metadata.ClassLoadingMetaData;
 import org.jboss.classloading.spi.metadata.RequirementsMetaData;
@@ -45,11 +46,12 @@
  * This deployer maps osgi metadata into our classloading metadata.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author Thomas.Diesler at jboss.com
  * @version $Revision: 1.1 $
  */
 public class OSGiBundleClassLoadingDeployer extends AbstractSimpleRealDeployer<OSGiMetaData>
 {
-   private ClassLoaderSystem classLoaderSystem;
+   private ClassLoaderDomain domain;
    
    /**
     * Create a new OSGiBundleClassLoadingDeployer.
@@ -63,9 +65,9 @@
       setTopLevelOnly(true);
    }
 
-   public void setClassLoaderSystem(ClassLoaderSystem classLoaderSystem)
+   public void setDomain(ClassLoaderDomain domain)
    {
-      this.classLoaderSystem = classLoaderSystem;
+      this.domain = domain;
    }
 
    @Override
@@ -83,13 +85,8 @@
       ClassLoadingMetaData classLoadingMetaData = new ClassLoadingMetaData();
       classLoadingMetaData.setName(osgiMetaData.getBundleSymbolicName());
       classLoadingMetaData.setVersion(osgiMetaData.getBundleVersion());
+      classLoadingMetaData.setDomain(domain != null ? domain.getName() : null);
 
-      if (classLoaderSystem != null)
-      {
-         ClassLoaderDomain defaultDomain = classLoaderSystem.getDefaultDomain();
-         classLoadingMetaData.setParentDomain(defaultDomain.getName());
-      }
-
       CapabilitiesMetaData capabilities = classLoadingMetaData.getCapabilities();
       RequirementsMetaData requirements = classLoadingMetaData.getRequirements();
       

Added: projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiClassLoaderDomain.java
===================================================================
--- projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiClassLoaderDomain.java	                        (rev 0)
+++ projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiClassLoaderDomain.java	2009-09-03 12:25:57 UTC (rev 93160)
@@ -0,0 +1,132 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, 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.osgi.plugins.facade.classloading;
+
+// $Id: $
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jboss.classloader.spi.ClassLoaderDomain;
+import org.jboss.classloader.spi.ClassLoaderPolicy;
+import org.jboss.classloader.spi.ClassLoaderSystem;
+import org.jboss.classloader.spi.ParentPolicy;
+import org.jboss.classloader.spi.base.BaseClassLoader;
+import org.jboss.classloader.spi.filter.ClassFilter;
+import org.jboss.classloader.spi.filter.PackageClassFilter;
+import org.jboss.classloading.spi.vfs.policy.VFSClassLoaderPolicy;
+import org.jboss.osgi.plugins.facade.api.SystemPackagesPlugin;
+import org.jboss.osgi.plugins.facade.bundle.OSGiBundleManager;
+import org.jboss.virtual.VFS;
+import org.jboss.virtual.VirtualFile;
+
+/**
+ * OSGiClassLoaderDomain.<p>
+ * 
+ * @author Thomas.Diesler at jboss.com
+ * @since 03-Sep-2009
+ */
+public class OSGiClassLoaderDomain extends ClassLoaderDomain
+{
+   private ClassLoaderSystem classLoaderSystem;
+   private OSGiBundleManager bundleManager;
+   private List<URL> classPath = new ArrayList<URL>();
+
+   /**
+    * Create a new OSGiClassLoaderDomain.
+    * @param domainName the domain name
+    * @throws IllegalArgumentException for a null bundle manager
+    */
+   public OSGiClassLoaderDomain(String domainName)
+   {
+      super(domainName);
+   }
+
+   public void setClassLoaderSystem(ClassLoaderSystem classLoaderSystem)
+   {
+      this.classLoaderSystem = classLoaderSystem;
+   }
+
+   public void setBundleManager(OSGiBundleManager bundleManager)
+   {
+      this.bundleManager = bundleManager;
+   }
+
+   public void setClassPath(List<URL> classPath)
+   {
+      this.classPath = classPath;
+   }
+
+   @Override
+   protected Class<?> loadClass(BaseClassLoader classLoader, String name, boolean allExports) throws ClassNotFoundException
+   {
+      return super.loadClass(classLoader, name, allExports);
+   }
+
+   public void start() throws IOException
+   {
+      if (classLoaderSystem == null)
+         throw new IllegalArgumentException("Null classLoaderSystem");
+      if (bundleManager == null)
+         throw new IllegalArgumentException("Null bundleManager");
+      if (classPath == null)
+         throw new IllegalArgumentException("Null classPath");
+
+      // Register the domain with the ClassLoaderSystem
+      classLoaderSystem.registerDomain(this);
+
+      // Initialize the configured system packages
+      String filteredPackages = getSystemPackagesAsString();
+      PackageClassFilter classFilter = PackageClassFilter.createPackageClassFilterFromString(filteredPackages);
+      classFilter.setIncludeJava(true);
+
+      // Setup the domain's parent policy
+      setParentPolicy(new ParentPolicy(classFilter, ClassFilter.NOTHING));
+
+      // Initialize the configured policy roots
+      VirtualFile[] roots = new VirtualFile[classPath.size()];
+      for (int i = 0; i < classPath.size(); i++)
+         roots[i] = VFS.createNewRoot(classPath.get(i));
+
+      // Create and register the ClassLoaderPolicy
+      ClassLoaderPolicy systemPolicy = new VFSClassLoaderPolicy("OSGiSystemPolicy", roots);
+      classLoaderSystem.registerClassLoaderPolicy(getName(), systemPolicy);
+   }
+
+   private String getSystemPackagesAsString()
+   {
+      SystemPackagesPlugin syspackPlugin = bundleManager.getPlugin(SystemPackagesPlugin.class);
+      List<String> sysPackages = syspackPlugin.getSystemPackages();
+      StringBuffer sysPackageString = new StringBuffer();
+      for (String name : sysPackages)
+      {
+         int semiIndex = name.indexOf(';');
+         if (semiIndex > 0)
+            name = name.substring(0, semiIndex);
+
+         sysPackageString.append(name + ",");
+      }
+      return sysPackageString.toString();
+   }
+}
\ No newline at end of file

Modified: projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiClassLoaderSystem.java
===================================================================
--- projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiClassLoaderSystem.java	2009-09-03 11:46:03 UTC (rev 93159)
+++ projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/main/java/org/jboss/osgi/plugins/facade/classloading/OSGiClassLoaderSystem.java	2009-09-03 12:25:57 UTC (rev 93160)
@@ -21,20 +21,13 @@
 */
 package org.jboss.osgi.plugins.facade.classloading;
 
-import java.util.List;
-
-import org.jboss.classloader.plugins.filter.PatternClassFilter;
 import org.jboss.classloader.plugins.jdk.AbstractJDKChecker;
 import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.ClassLoaderPolicy;
 import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.classloader.spi.ParentPolicy;
 import org.jboss.classloader.spi.base.BaseClassLoader;
-import org.jboss.classloader.spi.filter.ClassFilter;
-import org.jboss.classloader.spi.filter.PackageClassFilter;
-import org.jboss.osgi.plugins.facade.api.SystemPackagesPlugin;
 import org.jboss.osgi.plugins.facade.bundle.AbstractBundleState;
-import org.jboss.osgi.plugins.facade.bundle.OSGiBundleManager;
 import org.jboss.osgi.plugins.facade.bundle.OSGiBundleState;
 
 /**
@@ -51,19 +44,11 @@
     * @param bundleManager the bundleManager
     * @throws IllegalArgumentException for a null bundle manager
     */
-   public OSGiClassLoaderSystem(OSGiBundleManager bundleManager)
+   public OSGiClassLoaderSystem()
    {
-      if (bundleManager == null)
-         throw new IllegalArgumentException("Null bundle manager");
-      
       ClassLoaderDomain domain = getDefaultDomain();
       
-      // Initialize the configured system packages
-      String sysPackageString = getSystemPackagesAsString(bundleManager);
-      PatternClassFilter filter = PackageClassFilter.createPackageClassFilterFromString(sysPackageString);
-      filter.setIncludeJava(true);
-      
-      domain.setParentPolicy(new ParentPolicy(filter, ClassFilter.NOTHING));
+      domain.setParentPolicy(ParentPolicy.BEFORE_BUT_JAVA_ONLY);
       AbstractJDKChecker.getExcluded().add(AbstractBundleState.class);
       AbstractJDKChecker.getExcluded().add(OSGiBundleState.class);
    }
@@ -78,21 +63,4 @@
    {
       return new OSGiBundleClassLoader(policy);
    }
-
-   private String getSystemPackagesAsString(OSGiBundleManager bundleManager)
-   {
-      SystemPackagesPlugin syspackPlugin = bundleManager.getPlugin(SystemPackagesPlugin.class);
-      List<String> sysPackages = syspackPlugin.getSystemPackages();
-      StringBuffer sysPackageString = new StringBuffer();
-      for (String name : sysPackages)
-      {
-         int semiIndex = name.indexOf(';');
-         if (semiIndex > 0)
-            name = name.substring(0, semiIndex);
-         
-         sysPackageString.append(name + ",");
-      }
-      return sysPackageString.toString();
-   }
-
 }
\ No newline at end of file

Modified: projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/test/java/org/jboss/test/osgi/classloader/test/ClassLoaderDomainUnitTestCase.java
===================================================================
--- projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/test/java/org/jboss/test/osgi/classloader/test/ClassLoaderDomainUnitTestCase.java	2009-09-03 11:46:03 UTC (rev 93159)
+++ projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/test/java/org/jboss/test/osgi/classloader/test/ClassLoaderDomainUnitTestCase.java	2009-09-03 12:25:57 UTC (rev 93160)
@@ -21,16 +21,22 @@
 */
 package org.jboss.test.osgi.classloader.test;
 
-import static org.junit.Assert.*;
+// $Id$
 
+import static org.junit.Assert.fail;
+
 import java.net.URL;
 
+import org.jboss.classloader.plugins.jdk.AbstractJDKChecker;
 import org.jboss.classloader.plugins.system.DefaultClassLoaderSystem;
 import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.ClassLoaderPolicy;
 import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.classloader.spi.ParentPolicy;
+import org.jboss.classloader.spi.filter.ClassFilter;
+import org.jboss.classloader.spi.filter.PackageClassFilter;
 import org.jboss.classloading.spi.vfs.policy.VFSClassLoaderPolicy;
+import org.jboss.logging.Logger;
 import org.jboss.osgi.plugins.facade.bundle.OSGiBundleManager;
 import org.jboss.osgi.spi.testing.OSGiTestHelper;
 import org.jboss.virtual.VFS;
@@ -43,7 +49,7 @@
  * ClassLoaderDomainUnitTestCase.
  * 
  * @author Thomas.Diesler at jboss.com
- * @version $Revision$
+ * @since 03-Sep-2009
  */
 public class ClassLoaderDomainUnitTestCase
 {
@@ -54,24 +60,53 @@
    public void setUp()
    {
       classLoaderSystem = new DefaultClassLoaderSystem();
+      AbstractJDKChecker.getExcluded().add(getClass());
    }
 
    @Test
    public void testSystemPolicy() throws Exception
    {
       ClassLoaderDomain domain = new ClassLoaderDomain(OSGI_CLASSLOADER_DOMAIN);
-      domain.setParentPolicy(ParentPolicy.BEFORE_BUT_JAVA_ONLY);
-      domain.setParent(null);
       classLoaderSystem.registerDomain(domain);
+      
+      // Setup the class filter
+      String filteredPackages = Logger.class.getPackage().getName();
+      PackageClassFilter classFilter = PackageClassFilter.createPackageClassFilterFromString(filteredPackages);
+      classFilter.setIncludeJava(true);
 
+      domain.setParentPolicy(new ParentPolicy(classFilter, ClassFilter.NOTHING));
+
       URL coreURL = new OSGiTestHelper().getTestArchiveURL("bundles/org.osgi.core.jar");
       VirtualFile coreVF = VFS.createNewRoot(coreURL);
 
       ClassLoaderPolicy systemPolicy = new VFSClassLoaderPolicy("OSGiSystemPolicy", new VirtualFile[] { coreVF });
-      classLoaderSystem.registerClassLoaderPolicy(OSGI_CLASSLOADER_DOMAIN, systemPolicy);
+      ClassLoader classLoader = classLoaderSystem.registerClassLoaderPolicy(OSGI_CLASSLOADER_DOMAIN, systemPolicy);
 
-      assertNotNull("Can load JDK class", domain.loadClass(String.class.getName()));
-      //assertNotNull("Can load OSGi Framework class", domain.loadClass(Bundle.class.getName()));
-      assertNull("Cannot load OSGiBundleManager", domain.loadClass(OSGiBundleManager.class.getName()));
+      // Load JDK class
+      assertLoadClass(classLoader, String.class.getName(), true);
+      
+      // Load from org.osgi.core
+      assertLoadClass(classLoader, Bundle.class.getName(), true);
+      
+      // Load from system classpath 
+      assertLoadClass(classLoader, Logger.class.getName(), true);
+      
+      // No access to implementation
+      assertLoadClass(classLoader, OSGiBundleManager.class.getName(), false);
    }
+   
+   private void assertLoadClass(ClassLoader classLoader, String name, boolean success)
+   {
+      try
+      {
+         classLoader.loadClass(name);
+         if (success == false)
+            fail("Expected ClassNotFoundException for '" + name + "' from " + classLoader);
+      }
+      catch (ClassNotFoundException ex)
+      {
+         if (success)
+            fail("Cannot load '" + name + "' from " + classLoader);
+      }
+   }
 }

Modified: projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/test/resources/bootstrap/bootstrap.xml
===================================================================
--- projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/test/resources/bootstrap/bootstrap.xml	2009-09-03 11:46:03 UTC (rev 93159)
+++ projects/jboss-osgi/projects/runtime/microcontainer/trunk/src/test/resources/bootstrap/bootstrap.xml	2009-09-03 12:25:57 UTC (rev 93160)
@@ -24,7 +24,12 @@
           org.jboss.osgi.spi.management;version=1.0,
           org.jboss.osgi.spi.service;version=1.0,
           org.jboss.osgi.spi.testing;version=1.0,
-          org.jboss.osgi.spi.util;version=1.0
+          org.jboss.osgi.spi.util;version=1.0,
+          
+          org.osgi.framework,
+          org.osgi.framework.launch,
+          org.osgi.service.startlevel,
+          org.osgi.service.packageadmin
         </value></entry>
       </map>
     </property>
@@ -96,7 +101,9 @@
   <bean name="OSGiBundleStateDeployer" class="org.jboss.osgi.plugins.deployers.bundle.OSGiBundleStateDeployer">
     <constructor><parameter><inject bean="OSGiBundleManager" /></parameter></constructor>
   </bean>
-  <bean name="OSGiBundleClassLoadingDeployer" class="org.jboss.osgi.plugins.facade.classloading.OSGiBundleClassLoadingDeployer"/>
+  <bean name="OSGiBundleClassLoadingDeployer" class="org.jboss.osgi.plugins.facade.classloading.OSGiBundleClassLoadingDeployer">
+    <property name="domain"><inject bean="OSGiClassLoaderDomain"/></property>
+  </bean>
   <bean name="OSGiBundleActivatorDeployer" class="org.jboss.osgi.plugins.deployers.bundle.OSGiBundleActivatorDeployer" />
 
   <!--
@@ -107,10 +114,13 @@
   ********************************
   -->
   
-  <!-- ClassLoading -->
-  <bean name="ClassLoaderSystem" class="org.jboss.osgi.plugins.facade.classloading.OSGiClassLoaderSystem" >
-    <constructor><parameter><inject bean="OSGiBundleManager" /></parameter></constructor>
+  <bean name="OSGiClassLoaderSystem" class="org.jboss.osgi.plugins.facade.classloading.OSGiClassLoaderSystem" />
+  <bean name="OSGiClassLoaderDomain" class="org.jboss.osgi.plugins.facade.classloading.OSGiClassLoaderDomain" >
+    <constructor><parameter>OSGiClassLoaderDomain</parameter></constructor>
+    <property name="classLoaderSystem"><inject bean="OSGiClassLoaderSystem"/></property>
+    <property name="bundleManager"><inject bean="OSGiBundleManager" /></property>
   </bean>
+   
   <bean name="ClassLoading" class="org.jboss.classloading.spi.dependency.ClassLoading">
     <incallback method="addModule" state="Configured" />
     <uncallback method="removeModule" state="Configured" />
@@ -126,7 +136,7 @@
   </bean>
   <bean name="ClassLoaderDeployer" class="org.jboss.deployers.plugins.classloading.AbstractLevelClassLoaderSystemDeployer">
     <property name="classLoading"><inject bean="ClassLoading" /></property>
-    <property name="system"><inject bean="ClassLoaderSystem" /></property>
+    <property name="system"><inject bean="OSGiClassLoaderSystem" /></property>
   </bean>
 
 </deployment>




More information about the jboss-cvs-commits mailing list