You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/07/26 08:59:48 UTC

[1/2] camel git commit: CAMEL-10169: log DEBUG if OSGi filter is invalid

Repository: camel
Updated Branches:
  refs/heads/master fd1c7beeb -> 81ea4398c


CAMEL-10169: log DEBUG if OSGi filter is invalid


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/81ea4398
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/81ea4398
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/81ea4398

Branch: refs/heads/master
Commit: 81ea4398caf120ab400e686782ebb3e47353b511
Parents: 12224bd
Author: B�rcs�k J�zsef <bo...@sch.bme.hu>
Authored: Tue Jul 26 10:45:05 2016 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Jul 26 10:51:03 2016 +0200

----------------------------------------------------------------------
 .../camel/core/osgi/OsgiServiceRegistry.java    | 22 +++++++++++---------
 1 file changed, 12 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/81ea4398/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java
----------------------------------------------------------------------
diff --git a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java
index e6712d6..337061b 100644
--- a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java
+++ b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java
@@ -72,25 +72,27 @@ public class OsgiServiceRegistry extends LifecycleStrategySupport implements Reg
     public Object lookupByName(String name) {
         Object service = null;
         ServiceReference<?> sr = bundleContext.getServiceReference(name);
-        if (sr != null) {
-            // Need to keep the track of Service
-            // and call ungetService when the camel context is closed 
-            serviceReferenceQueue.add(sr);
-            service = bundleContext.getService(sr);
-        } else {
+        if (sr == null) {
             // trying to lookup service by PID if not found by name
+            String filterExpression = "(" + Constants.SERVICE_PID + "=" + name + ")";
             try {
-                ServiceReference<?>[] refs = bundleContext.getServiceReferences((String)null, "(" + Constants.SERVICE_PID + "=" + name + ")");
+                ServiceReference<?>[] refs = bundleContext.getServiceReferences((String)null, filterExpression);
                 if (refs != null && refs.length > 0) {
                     // just return the first one
                     sr = refs[0];
-                    serviceReferenceQueue.add(sr);
-                    service = bundleContext.getService(sr);
                 }
             } catch (InvalidSyntaxException ex) {
-                LOG.error("Invalid filter to lookup bean", ex);
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Invalid OSGi service reference filter, skipped lookup by service.pid. Filter expression: " + filterExpression, ex);
+                }
             }
         }
+        if (sr != null) {
+            // Need to keep the track of Service
+            // and call ungetService when the camel context is closed 
+            serviceReferenceQueue.add(sr);
+            service = bundleContext.getService(sr);
+        }
         return service;
     }
 


[2/2] camel git commit: CAMEL-10169: support service lookup by service.pid in OSGi environment

Posted by da...@apache.org.
CAMEL-10169: support service lookup by service.pid in OSGi environment


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/12224bdf
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/12224bdf
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/12224bdf

Branch: refs/heads/master
Commit: 12224bdf79cad6fa235e1a50a29a1457a8f4d718
Parents: fd1c7be
Author: B�rcs�k J�zsef <bo...@sch.bme.hu>
Authored: Thu Jul 21 17:07:13 2016 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Jul 26 10:51:03 2016 +0200

----------------------------------------------------------------------
 .../camel/core/osgi/OsgiServiceRegistry.java    | 34 +++++++++----
 .../camel/core/osgi/CamelMockBundleContext.java | 50 ++++++++++++++++++--
 .../camel/core/osgi/ServiceRegistryTest.java    |  6 ++-
 3 files changed, 76 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/12224bdf/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java
----------------------------------------------------------------------
diff --git a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java
index b916355..e6712d6 100644
--- a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java
+++ b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java
@@ -28,12 +28,17 @@ import org.apache.camel.spi.Registry;
 import org.apache.camel.support.LifecycleStrategySupport;
 import org.apache.camel.util.ObjectHelper;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The OsgiServiceRegistry support to get the service object from the bundle context
  */
 public class OsgiServiceRegistry extends LifecycleStrategySupport implements Registry {
+    private static final Logger LOG = LoggerFactory.getLogger(OsgiCamelContextHelper.class);
     private final BundleContext bundleContext;
     private final Queue<ServiceReference<?>> serviceReferenceQueue = new ConcurrentLinkedQueue<ServiceReference<?>>();
     
@@ -62,18 +67,29 @@ public class OsgiServiceRegistry extends LifecycleStrategySupport implements Reg
     }
 
     /**
-     * It's only support to look up the ServiceReference with Class name
+     * It's only support to look up the ServiceReference with Class name or service PID
      */
     public Object lookupByName(String name) {
         Object service = null;
-        if (service == null) {
-            ServiceReference<?> sr = bundleContext.getServiceReference(name);            
-            if (sr != null) {
-                // Need to keep the track of Service
-                // and call ungetService when the camel context is closed 
-                serviceReferenceQueue.add(sr);
-                service = bundleContext.getService(sr);
-            } 
+        ServiceReference<?> sr = bundleContext.getServiceReference(name);
+        if (sr != null) {
+            // Need to keep the track of Service
+            // and call ungetService when the camel context is closed 
+            serviceReferenceQueue.add(sr);
+            service = bundleContext.getService(sr);
+        } else {
+            // trying to lookup service by PID if not found by name
+            try {
+                ServiceReference<?>[] refs = bundleContext.getServiceReferences((String)null, "(" + Constants.SERVICE_PID + "=" + name + ")");
+                if (refs != null && refs.length > 0) {
+                    // just return the first one
+                    sr = refs[0];
+                    serviceReferenceQueue.add(sr);
+                    service = bundleContext.getService(sr);
+                }
+            } catch (InvalidSyntaxException ex) {
+                LOG.error("Invalid filter to lookup bean", ex);
+            }
         }
         return service;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/12224bdf/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java
----------------------------------------------------------------------
diff --git a/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java b/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java
index b6a410f..0c16ae1 100644
--- a/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java
+++ b/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java
@@ -35,6 +35,8 @@ import org.springframework.osgi.mock.MockBundleContext;
 import org.springframework.osgi.mock.MockServiceReference;
 
 public class CamelMockBundleContext extends MockBundleContext {
+    
+    public static final String SERVICE_PID_PREFIX = "test.";
 
     public CamelMockBundleContext(Bundle bundle) {
         super(bundle);
@@ -42,9 +44,13 @@ public class CamelMockBundleContext extends MockBundleContext {
 
     public Object getService(@SuppressWarnings("rawtypes") ServiceReference reference) {
         String[] classNames = (String[]) reference.getProperty(Constants.OBJECTCLASS);        
-        if (classNames[0].equals("org.apache.camel.core.osgi.test.MyService")) {
+        String classNames0 = classNames != null ? classNames[0] : null;
+        String pid = (String)reference.getProperty(Constants.SERVICE_PID);
+        if (classNames0 != null && classNames0.equals("org.apache.camel.core.osgi.test.MyService")) {
+            return new MyService();
+        } else if (pid != null && pid.equals(SERVICE_PID_PREFIX + "org.apache.camel.core.osgi.test.MyService")) {
             return new MyService();
-        } else if (classNames[0].equals(ComponentResolver.class.getName())) {
+        } else if (classNames0 != null && classNames0.equals(ComponentResolver.class.getName())) {
             return new ComponentResolver() {
                 public Component resolveComponent(String name, CamelContext context) throws Exception {
                     if (name.equals("file_test")) {
@@ -53,7 +59,7 @@ public class CamelMockBundleContext extends MockBundleContext {
                     return null;
                 }
             };
-        } else if (classNames[0].equals(LanguageResolver.class.getName())) {
+        } else if (classNames0 != null && classNames0.equals(LanguageResolver.class.getName())) {
             return new LanguageResolver() {
                 public Language resolveLanguage(String name, CamelContext context) {
                     if (name.equals("simple")) {
@@ -66,6 +72,36 @@ public class CamelMockBundleContext extends MockBundleContext {
             return null;
         }    
     }
+
+    public ServiceReference getServiceReference(String clazz) {
+        // lookup Java class if clazz contains dot (.) symbol
+        if (clazz.contains(".")) {
+            try {
+                final Class c = Class.forName(clazz);
+                return super.getServiceReference(clazz);
+            } catch (ClassNotFoundException ex) {
+                return null; // class not found so no service reference is returned
+            }
+        } else {
+            return super.getServiceReference(clazz);
+        }
+    }
+    
+    private static void addServicePID(ServiceReference[] srs, String filter) {
+        for (ServiceReference sr : srs) {
+            if (sr instanceof MockServiceReference) {
+                Dictionary properties = new Hashtable();
+                String pid = filter.replace("(" + Constants.SERVICE_PID + "=", "").replace(")", "");
+                properties.put(Constants.SERVICE_PID, pid);
+                for (String key : sr.getPropertyKeys()) {
+                    if (properties.get(key) == null) {
+                        properties.put(key, sr.getProperty(key));
+                    }
+                }
+                ((MockServiceReference)sr).setProperties(properties);
+            }
+        }
+    }
     
     @SuppressWarnings("rawtypes")
     public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
@@ -73,7 +109,13 @@ public class CamelMockBundleContext extends MockBundleContext {
         if (filter != null && filter.indexOf("name=test") > 0) {
             return null;
         } else {
-            return super.getServiceReferences(clazz, filter);
+            ServiceReference[] srs = super.getServiceReferences(clazz, filter);
+            
+            // set service.pid property by filter
+            if (filter != null && filter.indexOf(Constants.SERVICE_PID + "=") > 0) {
+                addServicePID(srs, filter);
+            }
+            return srs;
         }
     }
    

http://git-wip-us.apache.org/repos/asf/camel/blob/12224bdf/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java
----------------------------------------------------------------------
diff --git a/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java b/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java
index 5fc3d61..78578fb 100644
--- a/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java
+++ b/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java
@@ -39,7 +39,11 @@ public class ServiceRegistryTest extends CamelOsgiTestSupport {
         Object service = context.getRegistry().lookupByName(MyService.class.getName());
         assertNotNull("MyService should not be null", service);
         assertTrue("It should be the instance of MyService ", service instanceof MyService);
-
+        
+        Object serviceByPid = context.getRegistry().lookupByName(CamelMockBundleContext.SERVICE_PID_PREFIX + MyService.class.getName());
+        assertNotNull("MyService should not be null", serviceByPid);
+        assertTrue("It should be the instance of MyService ", serviceByPid instanceof MyService);
+        
         Map<String, MyService> collection = context.getRegistry().findByTypeWithName(MyService.class);
         assertNotNull("MyService should not be null", collection);
         assertNotNull("There should have one MyService.", collection.get(MyService.class.getName()));