You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by da...@apache.org on 2011/11/28 12:04:27 UTC

svn commit: r1207072 - in /aries/trunk/spi-fly/spi-fly-core/src: main/java/org/apache/aries/spifly/ main/java/org/apache/aries/spifly/api/ test/java/org/apache/aries/spifly/

Author: davidb
Date: Mon Nov 28 11:04:26 2011
New Revision: 1207072

URL: http://svn.apache.org/viewvc?rev=1207072&view=rev
Log:
Handle the service-registry and effective directives.

Modified:
    aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizer.java
    aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/api/SpiFlyConstants.java
    aries/trunk/spi-fly/spi-fly-core/src/test/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizerGenericCapabilityTest.java

Modified: aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizer.java
URL: http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizer.java?rev=1207072&r1=1207071&r2=1207072&view=diff
==============================================================================
--- aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizer.java (original)
+++ aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizer.java Mon Nov 28 11:04:26 2011
@@ -68,9 +68,16 @@ public class ProviderBundleTrackerCustom
 
         List<String> providedServices = null;
         Map<String, Object> customAttributes = new HashMap<String, Object>();
+        Map<String, String> directives = new HashMap<String, String>();
         if (bundle.getHeaders().get("Provide-Capability") != null) {
-            providedServices = readProvideCapability(bundle.getHeaders(), customAttributes);
+            providedServices = readProvideCapability(bundle.getHeaders(), directives, customAttributes);
+
+            if (!"active".equals(directives.get(SpiFlyConstants.EFFECTIVE_DIRECTIVE))) {
+                log(LogService.LOG_INFO, "Effective is not equal to 'active'. Not processing bundle " + bundle.getSymbolicName());
+                return null;
+            }
         }
+
         if (providedServices == null && bundle.getHeaders().get(SpiFlyConstants.SPI_PROVIDER_HEADER) != null) {
             providedServices = new ArrayList<String>();
         }
@@ -142,12 +149,15 @@ public class ProviderBundleTrackerCustom
                         props.put(SpiFlyConstants.SPI_PROVIDER_URL, serviceFile);
                         props.putAll(customAttributes);
 
-                        ServiceRegistration reg = bundle.getBundleContext()
-                                .registerService(registrationClassName, o, props);
-                        registrations.add(reg);
+                        if (!"false".equalsIgnoreCase(directives.get(SpiFlyConstants.SERVICE_REGISTRY_DIRECTIVE))) {
+                            ServiceRegistration reg = bundle.getBundleContext()
+                                    .registerService(registrationClassName, o, props);
+                            registrations.add(reg);
+                            log(LogService.LOG_INFO, "Registered service: " + reg);
+                        }
 
                         activator.registerProviderBundle(registrationClassName, bundle, customAttributes);
-                        log(LogService.LOG_INFO, "Registered service: " + reg);
+                        log(LogService.LOG_INFO, "Registered provider: " + registrationClassName + " in bundle " + bundle.getSymbolicName());
                     } catch (Exception e) {
                         log(LogService.LOG_WARNING,
                                 "Could not load SPI implementation referred from " + serviceFile, e);
@@ -165,7 +175,7 @@ public class ProviderBundleTrackerCustom
     // A return value of null means no SPIs
     // A populated list means: only these SPIs
     @SuppressWarnings("unchecked")
-    private List<String> readProvideCapability(Dictionary<?,?> headers, Map<String, Object> customAttributes) {
+    private List<String> readProvideCapability(Dictionary<?,?> headers, Map<String, String> directives, Map<String, Object> customAttributes) {
         Object capabilityHeader = headers.get(SpiFlyConstants.PROVIDE_CAPABILITY);
         if (capabilityHeader == null)
             return null;
@@ -189,6 +199,8 @@ public class ProviderBundleTrackerCustom
                     customAttributes.put(entry.getKey(), entry.getValue());
                 }
             }
+
+            directives.putAll(cap.getDirectives());
             return serviceNames;
         }
         return null;

Modified: aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/api/SpiFlyConstants.java
URL: http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/api/SpiFlyConstants.java?rev=1207072&r1=1207071&r2=1207072&view=diff
==============================================================================
--- aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/api/SpiFlyConstants.java (original)
+++ aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/api/SpiFlyConstants.java Mon Nov 28 11:04:26 2011
@@ -28,9 +28,13 @@ public interface SpiFlyConstants {
 
     String SPI_CAPABILITY_NAMESPACE = "osgi.spi.provider";
     String EXTENDER_CAPABILITY_NAMESPACE = "osgi.jse.serviceloader";
+
     String BUNDLE_VERSION_ATTRIBUTE = "bundle-version";
     String SERVICE_ATTRIBUTE = "service";
 
+    String EFFECTIVE_DIRECTIVE = "effective";
+    String SERVICE_REGISTRY_DIRECTIVE = "service-registry";
+
     String PROCESSED_SPI_CONSUMER_HEADER = "X-SpiFly-Processed-SPI-Consumer";
 
     String SPI_PROVIDER_URL = "spi.provider.url";

Modified: aries/trunk/spi-fly/spi-fly-core/src/test/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizerGenericCapabilityTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-core/src/test/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizerGenericCapabilityTest.java?rev=1207072&r1=1207071&r2=1207072&view=diff
==============================================================================
--- aries/trunk/spi-fly/spi-fly-core/src/test/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizerGenericCapabilityTest.java (original)
+++ aries/trunk/spi-fly/spi-fly-core/src/test/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizerGenericCapabilityTest.java Mon Nov 28 11:04:26 2011
@@ -102,7 +102,7 @@ public class ProviderBundleTrackerCustom
         EasyMock.replay(sreg);
 
         BundleContext implBC = mockSPIBundleContext(sreg);
-        Bundle implBundle = mockSPIBundle(implBC, "osgi.spi.provider; effective:=active; approval=global");
+        Bundle implBundle = mockSPIBundle(implBC, "osgi.spi.provider; effective:=active; service-registry:=true; approval=global");
 
         List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
         assertEquals(1, registrations.size());
@@ -181,7 +181,48 @@ public class ProviderBundleTrackerCustom
 
     @Test
     public void testNoServiceRegistration() throws Exception {
+        Bundle spiBundle = EasyMock.createMock(Bundle.class);
+        EasyMock.replay(spiBundle);
+        BaseActivator activator = new BaseActivator() {
+            @Override
+            public void start(BundleContext context) throws Exception {}
+        };
+
+        ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, spiBundle);
 
+        ServiceRegistration sreg = EasyMock.createMock(ServiceRegistration.class);
+        EasyMock.replay(sreg);
+
+        BundleContext implBC = mockSPIBundleContext(sreg);
+        Bundle implBundle = mockSPIBundle(implBC, "osgi.spi.provider; effective:=active; service-registry:=false");
+
+        List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
+        assertEquals(0, registrations.size());
+        Collection<Bundle> bundles = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
+        assertEquals(1, bundles.size());
+        assertSame(implBundle, bundles.iterator().next());
+    }
+
+    @Test
+    public void testNoEffectiveValue() throws Exception {
+        Bundle spiBundle = EasyMock.createMock(Bundle.class);
+        EasyMock.replay(spiBundle);
+        BaseActivator activator = new BaseActivator() {
+            @Override
+            public void start(BundleContext context) throws Exception {}
+        };
+
+        ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, spiBundle);
+
+        ServiceRegistration sreg = EasyMock.createMock(ServiceRegistration.class);
+        EasyMock.replay(sreg);
+
+        BundleContext implBC = mockSPIBundleContext(sreg);
+        Bundle implBundle = mockSPIBundle(implBC, "osgi.spi.provider");
+
+        assertNull(customizer.addingBundle(implBundle, null));
+        Collection<Bundle> bundles = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
+        assertEquals(0, bundles.size());
     }
 
     @Test