You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ma...@apache.org on 2009/01/27 19:21:01 UTC

svn commit: r738185 - in /felix/trunk/dependencymanager/src/main/java/org/apache/felix/dependencymanager: ServiceDependency.java ServiceImpl.java

Author: marrs
Date: Tue Jan 27 18:21:01 2009
New Revision: 738185

URL: http://svn.apache.org/viewvc?rev=738185&view=rev
Log:
Slightly modified (improved) the order in which optional dependencies are injected and their callbacks invoked. The callbacks now occur after the start method is invoked, the injections done before.

Modified:
    felix/trunk/dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceDependency.java
    felix/trunk/dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceImpl.java

Modified: felix/trunk/dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceDependency.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceDependency.java?rev=738185&r1=738184&r2=738185&view=diff
==============================================================================
--- felix/trunk/dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceDependency.java (original)
+++ felix/trunk/dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceDependency.java Tue Jan 27 18:21:01 2009
@@ -22,8 +22,11 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.Proxy;
+import java.util.Arrays;
+import java.util.Comparator;
 
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
@@ -93,6 +96,70 @@
         return service;
     }
 
+    public Object lookupService() {
+        Object service = null;
+        if (m_isStarted) {
+            service = m_tracker.getService();
+        }
+        else {
+            ServiceReference[] refs = null;
+            ServiceReference ref = null;
+            if (m_trackedServiceName != null) {
+                if (m_trackedServiceFilter != null) {
+                    try {
+                        refs = m_context.getServiceReferences(m_trackedServiceName.getName(), m_trackedServiceFilter);
+                        if (refs != null) {
+                            Arrays.sort(refs, new Comparator() {
+                                public int getRank(ServiceReference ref) {
+                                    Object ranking = ref.getProperty(Constants.SERVICE_RANKING);
+                                    if (ranking != null && (ranking instanceof Integer)) {
+                                        return ((Integer) ranking).intValue();
+                                    }
+                                    return 0;
+                                }
+
+                                public int compare(Object a, Object b) {
+                                    ServiceReference ra = (ServiceReference) a, rb = (ServiceReference) b;
+                                    int ranka = getRank(ra);
+                                    int rankb = getRank(rb);
+                                    if (ranka < rankb) {
+                                        return -1;
+                                    }
+                                    else if (ranka > rankb) {
+                                        return 1;
+                                    }
+                                    return 0;
+                                }});
+                            ref = refs[0];
+                        }
+                    }
+                    catch (InvalidSyntaxException e) {
+                        throw new IllegalStateException("Invalid filter definition for dependency.");
+                    }
+                }
+                else if (m_trackedServiceReference != null) {
+                    ref = m_trackedServiceReference;
+                }
+                else {
+                    ref = m_context.getServiceReference(m_trackedServiceName.getName());
+                }
+                if (ref != null) {
+                    service = m_context.getService(ref);
+                }
+            }
+            else {
+                throw new IllegalStateException("Could not lookup dependency, no service name specified.");
+            }
+        }
+        if (service == null) {
+            service = getDefaultImplementation();
+            if (service == null) {
+                service = getNullObject();
+            }
+        }
+        return service;
+    }
+
     private Object getNullObject() {
         if (m_nullObject == null) {
             Class trackedServiceName;

Modified: felix/trunk/dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceImpl.java?rev=738185&r1=738184&r2=738185&view=diff
==============================================================================
--- felix/trunk/dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceImpl.java (original)
+++ felix/trunk/dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceImpl.java Tue Jan 27 18:21:01 2009
@@ -503,7 +503,7 @@
             }
         }
     }
-
+    
     private void stopTrackingOptional(State state) {
         Iterator i = state.getDependencies().iterator();
         while (i.hasNext()) {
@@ -767,7 +767,14 @@
             if (dependency instanceof ServiceDependency) {
                 ServiceDependency sd = (ServiceDependency) dependency;
                 if (sd.isAutoConfig()) {
-                    configureImplementation(sd.getInterface(), sd.getService(), sd.getAutoConfigName());
+                    if (sd.isRequired()) {
+                        configureImplementation(sd.getInterface(), sd.getService(), sd.getAutoConfigName());
+                    }
+                    else {
+                        // for optional services, we do an "ad-hoc" lookup to inject the service if it is
+                        // already available even though the tracker has not yet been started
+                        configureImplementation(sd.getInterface(), sd.lookupService(), sd.getAutoConfigName());
+                    }
                 }
                 // for required dependencies, we invoke any callbacks here
                 if (sd.isRequired()) {