[jboss-osgi-commits] JBoss-OSGI SVN: r99164 - in projects/jboss-osgi: projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/classloading and 2 other directories.

jboss-osgi-commits at lists.jboss.org jboss-osgi-commits at lists.jboss.org
Fri Jan 8 10:22:11 EST 2010


Author: thomas.diesler at jboss.com
Date: 2010-01-08 10:22:10 -0500 (Fri, 08 Jan 2010)
New Revision: 99164

Modified:
   projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleManager.java
   projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleState.java
   projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiFragmentState.java
   projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/classloading/OSGiClassLoaderPolicy.java
   projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/service/internal/PackageAdminImpl.java
   projects/jboss-osgi/trunk/testsuite/functional/src/test/java/org/jboss/test/osgi/fragments/FragmentTestCase.java
Log:
Add support for loadClass, findEntry, getResource on fragment bundle
TODO - move code from bundle state to CL policy

Modified: projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleManager.java
===================================================================
--- projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleManager.java	2010-01-08 15:03:27 UTC (rev 99163)
+++ projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleManager.java	2010-01-08 15:22:10 UTC (rev 99164)
@@ -1331,21 +1331,30 @@
       }
 
       DeploymentUnit unit = bundleState.getDeploymentUnit();
+      String unitName = unit.getName();
+
       ControllerContext context = unit.getAttachment(ControllerContext.class);
-
       ControllerState requiredState = context.getRequiredState();
       DeploymentStage requiredStage = unit.getRequiredStage();
 
       // TODO [JBDEPLOY-226] Allow multiple deployments to change state at once
       try
       {
-         deployerClient.change(unit.getName(), DeploymentStages.CLASSLOADER);
-         deployerClient.checkComplete(unit.getName());
+         deployerClient.change(unitName, DeploymentStages.CLASSLOADER);
+         deployerClient.checkComplete(unitName);
          
+         // Advance the attached fragments to CLASSLOADER 
+         for (OSGiFragmentState fragment : bundleState.getAttachedFragments())
+         {
+            String fragUnitName = fragment.getDeploymentUnit().getName();
+            deployerClient.change(fragUnitName, DeploymentStages.CLASSLOADER);
+            deployerClient.checkComplete(fragUnitName);
+         }
+            
          bundleState.changeState(Bundle.RESOLVED);
          for (OSGiFragmentState fragment : bundleState.getAttachedFragments())
             fragment.changeState(Bundle.RESOLVED);
-            
+         
          return true;
       }
       catch (DeploymentException ex)

Modified: projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleState.java
===================================================================
--- projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleState.java	2010-01-08 15:03:27 UTC (rev 99163)
+++ projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiBundleState.java	2010-01-08 15:22:10 UTC (rev 99164)
@@ -88,16 +88,18 @@
       return Collections.unmodifiableList(attachedFragments);
    }
 
-   public boolean isFragmentAttachable(OSGiFragmentState fragmentState)
+   public boolean isFragmentAttachable(OSGiFragmentState fragState)
    {
       String hostName = getSymbolicName();
       Version hostVersion = getVersion();
 
-      FragmentHost fragmentHost = fragmentState.getFragmentHost();
-      if (hostName.equals(fragmentHost.getSymbolicName()) == false)
+      DeploymentUnit fragUnit = fragState.getDeploymentUnit();
+      OSGiClassLoadingMetaData fragMetaData = (OSGiClassLoadingMetaData)fragUnit.getAttachment(ClassLoadingMetaData.class);
+      FragmentHost fragHost = fragMetaData.getFragmentHost();
+      if (hostName.equals(fragHost.getSymbolicName()) == false)
          return false;
 
-      Version version = fragmentHost.getBundleVersion();
+      Version version = fragHost.getBundleVersion();
       if (version != null && hostVersion.equals(version) == false)
          return false;
 
@@ -118,6 +120,7 @@
 
       log.debug("Attach " + fragmentState + " -> " + this);
       attachedFragments.add(fragmentState);
+      fragmentState.setFragmentHost(this);
 
       // attach classloading metadata to the hosts classloading metadata
       clMetaData.attachedFragmentMetaData(fragMetaData);
@@ -141,8 +144,42 @@
       if (resolveBundle() == false)
          throw new ClassNotFoundException("Cannot load class: " + name);
 
+      Class<?> retClass = null;
+      
       ClassLoader classLoader = getDeploymentUnit().getClassLoader();
-      return classLoader.loadClass(name);
+      ClassNotFoundException cnfEx = null;
+      try
+      {
+         retClass = classLoader.loadClass(name);
+      }
+      catch (ClassNotFoundException ex)
+      {
+         cnfEx = ex;
+      }
+      
+      // Try to load the class in the attached fragments
+      if (retClass == null)
+      {
+         for (OSGiFragmentState fragment : getAttachedFragments())
+         {
+            classLoader = fragment.getDeploymentUnit().getClassLoader();
+            try
+            {
+               retClass = classLoader.loadClass(name);
+               cnfEx = null;
+               break;
+            }
+            catch (ClassNotFoundException ex)
+            {
+               // ignore
+            }
+         }
+      }
+      
+      if (retClass == null && cnfEx != null)
+         throw cnfEx;
+      
+      return retClass;
    }
 
    public URL getResource(String name)
@@ -154,7 +191,22 @@
       if (resolveBundle() == false)
          return getDeploymentUnit().getResourceLoader().getResource(name);
 
-      return getDeploymentUnit().getClassLoader().getResource(name);
+      ClassLoader classLoader = getDeploymentUnit().getClassLoader();
+      URL resourceURL = classLoader.getResource(name);
+      
+      // Try to find the resource in the attached fragments
+      if (resourceURL == null)
+      {
+         for (OSGiFragmentState fragment : getAttachedFragments())
+         {
+            classLoader = fragment.getDeploymentUnit().getClassLoader();
+            resourceURL = classLoader.getResource(name);
+            if (resourceURL != null)
+               break;
+         }
+      }
+      
+      return resourceURL;
    }
 
    @SuppressWarnings("rawtypes")

Modified: projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiFragmentState.java
===================================================================
--- projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiFragmentState.java	2010-01-08 15:03:27 UTC (rev 99163)
+++ projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/bundle/OSGiFragmentState.java	2010-01-08 15:22:10 UTC (rev 99164)
@@ -26,34 +26,42 @@
 import java.net.URL;
 import java.util.Enumeration;
 
-import org.jboss.classloading.spi.metadata.ClassLoadingMetaData;
 import org.jboss.deployers.structure.spi.DeploymentUnit;
-import org.jboss.osgi.framework.classloading.OSGiClassLoadingMetaData;
-import org.jboss.osgi.framework.classloading.OSGiClassLoadingMetaData.FragmentHost;
 import org.jboss.osgi.spi.NotImplementedException;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleException;
 
 /**
- * OSGiSystemBundle.
+ * The state of a fragment {@link Bundle}.
  * 
  * @author Thomas.Diesler at jboss.com
  * @since 25-Dec-2009
  */
 public class OSGiFragmentState extends AbstractDeployedBundleState
 {
-   /**
-    * Create a new OSGiFragmentState
-    */
+   // The host that this fragment is attached to
+   private OSGiBundleState fragmentHost;
+   
    public OSGiFragmentState(DeploymentUnit unit)
    {
       super(unit);
    }
 
+   public OSGiBundleState getFragmentHost()
+   {
+      return fragmentHost;
+   }
+
+   void setFragmentHost(OSGiBundleState fragmentHost)
+   {
+      this.fragmentHost = fragmentHost;
+   }
+
    public boolean isFragment()
    {
       return true;
    }
-   
+
    public URL getResource(String name)
    {
       // Null if the resource could not be found or if this bundle is a fragment bundle
@@ -92,13 +100,4 @@
    {
       throw new NotImplementedException();
    }
-
-   public FragmentHost getFragmentHost()
-   {
-      FragmentHost fhMetaData = null;
-      ClassLoadingMetaData clMetaData = getDeploymentUnit().getAttachment(ClassLoadingMetaData.class);
-      if (clMetaData != null)
-         fhMetaData = ((OSGiClassLoadingMetaData)clMetaData).getFragmentHost();
-      return fhMetaData;
-   }
 }

Modified: projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/classloading/OSGiClassLoaderPolicy.java
===================================================================
--- projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/classloading/OSGiClassLoaderPolicy.java	2010-01-08 15:03:27 UTC (rev 99163)
+++ projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/classloading/OSGiClassLoaderPolicy.java	2010-01-08 15:22:10 UTC (rev 99164)
@@ -32,20 +32,19 @@
 import org.jboss.deployers.structure.spi.DeploymentUnit;
 import org.jboss.deployers.vfs.plugins.classloader.VFSDeploymentClassLoaderPolicyModule;
 import org.jboss.osgi.framework.bundle.AbstractDeployedBundleState;
-import org.jboss.osgi.framework.deployers.OSGiBundleNativeCodeDeployer;
 import org.jboss.virtual.VirtualFile;
 
 /**
  * The ClassLoaderPolicy for OSGi bundles.
  * 
  * This implementation supports the notion of OSGi Native Code Libraries.
- * The library map is initialized in {@link OSGiBundleNativeCodeDeployer}.
  * 
  * @author Thomas.Diesler at jboss.com
  * @since 11-Sep-2209
  */
 public class OSGiClassLoaderPolicy extends VFSClassLoaderPolicy
 {
+   // Maps the lib name to native code archive
    private Map<String, File> libraryMap = new HashMap<String, File>();
    
    public OSGiClassLoaderPolicy(AbstractDeployedBundleState bundleState, VirtualFile[] roots)

Modified: projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/service/internal/PackageAdminImpl.java
===================================================================
--- projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/service/internal/PackageAdminImpl.java	2010-01-08 15:03:27 UTC (rev 99163)
+++ projects/jboss-osgi/projects/runtime/framework/trunk/src/main/java/org/jboss/osgi/framework/service/internal/PackageAdminImpl.java	2010-01-08 15:22:10 UTC (rev 99164)
@@ -40,6 +40,7 @@
 import org.jboss.osgi.framework.bundle.AbstractDeployedBundleState;
 import org.jboss.osgi.framework.bundle.OSGiBundleManager;
 import org.jboss.osgi.framework.bundle.OSGiBundleState;
+import org.jboss.osgi.framework.bundle.OSGiFragmentState;
 import org.jboss.osgi.framework.plugins.PackageAdminPlugin;
 import org.jboss.osgi.framework.plugins.ResolverPlugin;
 import org.jboss.osgi.framework.plugins.internal.AbstractServicePlugin;
@@ -103,8 +104,14 @@
          AbstractDeploymentClassLoaderPolicyModule deploymentModule = (AbstractDeploymentClassLoaderPolicyModule)module;
          DeploymentUnit unit = deploymentModule.getDeploymentUnit();
          AbstractBundleState bundleState = unit.getAttachment(AbstractBundleState.class);
-         if (bundleState != null && bundleState.getState() != Bundle.INSTALLED)
+         if (bundleState != null)
+         {
+            // Return the fragment's host bundle
+            if (bundleState.isFragment())
+               bundleState = ((OSGiFragmentState)bundleState).getFragmentHost();
+            
             return bundleState.getBundleInternal();
+         }
       }
       return null;
    }

Modified: projects/jboss-osgi/trunk/testsuite/functional/src/test/java/org/jboss/test/osgi/fragments/FragmentTestCase.java
===================================================================
--- projects/jboss-osgi/trunk/testsuite/functional/src/test/java/org/jboss/test/osgi/fragments/FragmentTestCase.java	2010-01-08 15:03:27 UTC (rev 99163)
+++ projects/jboss-osgi/trunk/testsuite/functional/src/test/java/org/jboss/test/osgi/fragments/FragmentTestCase.java	2010-01-08 15:22:10 UTC (rev 99164)
@@ -54,10 +54,13 @@
       {
          OSGiBundle host = runtime.installBundle("fragments-simple-hostA.jar");
          assertBundleState(Bundle.INSTALLED, host.getState());
-         
+
          host.start();
          assertBundleState(Bundle.ACTIVE, host.getState());
-         
+
+         URL entryURL = host.getEntry("resources/resource.txt");
+         assertNull("Entry URL null", entryURL);
+
          URL resourceURL = host.getResource("resources/resource.txt");
          assertNull("Resource URL null", resourceURL);
 
@@ -78,13 +81,13 @@
       {
          OSGiBundle fragment = runtime.installBundle("fragments-simple-frgmA.jar");
          assertBundleState(Bundle.INSTALLED, fragment.getState());
-         
-         URL resourceURL = fragment.getResource("resources/resource.txt");
-         assertNull("Resource URL null", resourceURL);
 
          URL entryURL = fragment.getEntry("resources/resource.txt");
          assertNotNull("Entry URL not null", entryURL);
 
+         URL resourceURL = fragment.getResource("resources/resource.txt");
+         assertNull("Resource URL null", resourceURL);
+
          try
          {
             fragment.start();
@@ -94,7 +97,7 @@
          {
             assertBundleState(Bundle.INSTALLED, fragment.getState());
          }
-         
+
          fragment.uninstall();
          assertBundleState(Bundle.UNINSTALLED, fragment.getState());
       }
@@ -112,23 +115,23 @@
       {
          OSGiBundle host = runtime.installBundle("fragments-simple-hostA.jar");
          assertBundleState(Bundle.INSTALLED, host.getState());
-         
+
          OSGiBundle fragment = runtime.installBundle("fragments-simple-frgmA.jar");
          assertBundleState(Bundle.INSTALLED, fragment.getState());
-         
+
          host.start();
          assertBundleState(Bundle.ACTIVE, host.getState());
          assertBundleState(Bundle.RESOLVED, fragment.getState());
-         
-         OSGiBundle classProvider = host.loadClass(FragmentService.class.getName());
-         assertEquals("Class provided by fragment", host, classProvider);
-         
-         URL resourceURL = host.getResource("resources/resource.txt");
-         assertNotNull("Resource URL not null", resourceURL);
 
          URL entryURL = host.getEntry("resources/resource.txt");
          assertNull("Entry URL null", entryURL);
 
+         URL resourceURL = host.getResource("resources/resource.txt");
+         assertNotNull("Resource URL not null", resourceURL);
+
+         OSGiBundle classProvider = host.loadClass(FragmentService.class.getName());
+         assertEquals("Class provided by fragment", host, classProvider);
+
          host.uninstall();
          assertBundleState(Bundle.UNINSTALLED, host.getState());
          assertBundleState(Bundle.RESOLVED, fragment.getState());



More information about the jboss-osgi-commits mailing list