You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by mn...@apache.org on 2012/07/12 18:31:12 UTC

svn commit: r1360774 - in /aries/trunk/subsystem: subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/DynamicImportTest.java

Author: mnuttall
Date: Thu Jul 12 16:31:12 2012
New Revision: 1360774

URL: http://svn.apache.org/viewvc?rev=1360774&view=rev
Log:
Aries-868: First pass at an approach to handling woven packages

Modified:
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java
    aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/DynamicImportTest.java

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java?rev=1360774&r1=1360773&r2=1360774&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java Thu Jul 12 16:31:12 2012
@@ -41,12 +41,16 @@ import org.apache.aries.subsystem.core.a
 import org.apache.aries.subsystem.core.archive.SubsystemManifest;
 import org.apache.aries.util.filesystem.FileSystem;
 import org.apache.aries.util.filesystem.IDirectory;
+import org.apache.aries.util.manifest.ManifestHeaderProcessor;
 import org.eclipse.equinox.region.Region;
 import org.eclipse.equinox.region.RegionDigraph;
 import org.eclipse.equinox.region.RegionFilter;
 import org.eclipse.equinox.region.RegionFilterBuilder;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.hooks.weaving.WeavingHook;
 import org.osgi.framework.namespace.IdentityNamespace;
 import org.osgi.framework.wiring.BundleRevision;
 import org.osgi.resource.Capability;
@@ -653,6 +657,31 @@ public class SubsystemResource implement
 			String filter = requirement.getDirectives().get(ImportPackageRequirement.DIRECTIVE_FILTER);
 			builder.allow(policy, filter);
 		}
+		
+		// work around https://www.osgi.org/bugzilla/show_bug.cgi?id=144 
+		// In the first instance, what if the various weaving services were to have a property, 
+		// osgi.woven.packages, that was a comma separated list of packages that might be woven 
+		// by that hook. 
+		Collection<String> wovenPackages = getWovenPackages();
+		for (String pkg : wovenPackages) { 
+			builder.allow(policy, "(osgi.wiring.package=" + pkg + ")");
+		}
+	}
+	
+	// First pass at this: really just a sketch. 
+	private Collection<String> getWovenPackages() throws InvalidSyntaxException
+	{
+		// Find all weaving services in our region
+		BundleContext bc = Activator.getInstance().getBundleContext();
+		Collection<ServiceReference<WeavingHook>> weavers = bc.getServiceReferences(WeavingHook.class, null);
+		Collection<String> wovenPackages = new ArrayList<String>();
+		for (ServiceReference<WeavingHook> sr : weavers) { 
+			String someWovenPackages = (String) sr.getProperty("osgi.woven.packages");
+			if (someWovenPackages != null) { 
+				wovenPackages.addAll(ManifestHeaderProcessor.split(someWovenPackages, ","));
+			}
+		}
+		return wovenPackages;
 	}
 	
 	private void setImportIsolationPolicy(RegionFilterBuilder builder, RequireBundleHeader header) throws InvalidSyntaxException {

Modified: aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/DynamicImportTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/DynamicImportTest.java?rev=1360774&r1=1360773&r2=1360774&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/DynamicImportTest.java (original)
+++ aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/DynamicImportTest.java Thu Jul 12 16:31:12 2012
@@ -1,10 +1,14 @@
 package org.apache.aries.subsystem.itests;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.ops4j.pax.exam.CoreOptions.options;
-import static org.ops4j.pax.exam.OptionUtils.combine;
 
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.apache.aries.subsystem.itests.hello.api.Hello;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -12,7 +16,11 @@ import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.Configuration;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.hooks.weaving.WeavingHook;
+import org.osgi.framework.hooks.weaving.WovenClass;
 import org.osgi.service.subsystem.Subsystem;
 import org.osgi.service.subsystem.SubsystemException;
 
@@ -46,9 +54,6 @@ public class DynamicImportTest extends S
 	@Test
 	public void verifyThatDynamicImportNeedsHandling() throws Exception
 	{
-		
-		System.out.println ("Into verifyThatDynamicImportNeedsHandling");
-		
 		Subsystem subsystem = installSubsystemFromFile ("dynamicImport.esa");
 		try { 
 			startSubsystem(subsystem);
@@ -63,8 +68,34 @@ public class DynamicImportTest extends S
 		}
 	}
 	
+	class TokenWeaver implements WeavingHook {
+		@Override
+		public void weave(WovenClass arg0) {} 
+	}
+	
+	@Test
+	public void testFirstPassWeavingApproach() throws Exception
+	{
+		Dictionary<String, String> props = new Hashtable<String, String>();
+		props.put("osgi.woven.packages", "some.woven.package, org.apache.aries.subsystem.itests.hello.api");
+		ServiceRegistration<?> sr = bundleContext.registerService(WeavingHook.class, new TokenWeaver(), props);
+		
+		Subsystem subsystem = installSubsystemFromFile ("dynamicImport.esa");
+		startSubsystem(subsystem);
+		
+		BundleContext bc = subsystem.getBundleContext();
+		Hello h = getOsgiService(bc, Hello.class, null, DEFAULT_TIMEOUT);
+		String message = h.saySomething();
+		assertEquals ("Wrong message back", "Hello, this is something", message); // DynamicImportHelloImpl.java
+		
+		stopSubsystem(subsystem);
+		uninstallSubsystem(subsystem);
+		sr.unregister();
+		
+	}
+	
 	@Configuration
-	public static Option[] extraConfig() 
+	public static Option[] extraBundles() 
 	{
 		return options(
 				mavenBundle("org.apache.aries.subsystem", "org.apache.aries.subsystem.itest.interfaces")