[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