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()) {