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")