ServiceTracker did note take the trackAllAspects setting into account in the setInitial method causing the ServiceDependencyImpl to remove rather than swap services in some occasions.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1531237 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java
index b83fc31..97458d2 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java
@@ -1051,38 +1051,43 @@
if (list == null) {
return;
}
- Map highestRankedServiceMap = new HashMap(); // <Long, RankedService>
- for (int i = 0; i < list.length; i++) {
- ServiceReference sr = (ServiceReference) list[i];
- if (sr != null) {
- Long serviceId = ServiceUtil.getServiceIdAsLong(sr);
- int ranking = ServiceUtil.getRanking(sr);
-
- RankedService rs = (RankedService) highestRankedServiceMap.get(serviceId);
- if (rs == null) {
- // the service did not exist yet in our map
- highestRankedServiceMap.put(serviceId, new RankedService(ranking, sr));
+ if (m_trackAllAspects) {
+ // not hiding aspects
+ super.setInitial(list);
+ } else {
+ Map highestRankedServiceMap = new HashMap(); // <Long, RankedService>
+ for (int i = 0; i < list.length; i++) {
+ ServiceReference sr = (ServiceReference) list[i];
+ if (sr != null) {
+ Long serviceId = ServiceUtil.getServiceIdAsLong(sr);
+ int ranking = ServiceUtil.getRanking(sr);
+
+ RankedService rs = (RankedService) highestRankedServiceMap.get(serviceId);
+ if (rs == null) {
+ // the service did not exist yet in our map
+ highestRankedServiceMap.put(serviceId, new RankedService(ranking, sr));
+ }
+ else if (ranking > rs.getRanking()) {
+ // the service replaces a lower ranked one
+ hide(rs.getServiceReference());
+ rs.update(ranking, sr);
+ }
+ else {
+ // the service does NOT replace a lower ranked one
+ hide(sr);
+ }
}
- else if (ranking > rs.getRanking()) {
- // the service replaces a lower ranked one
- hide(rs.getServiceReference());
- rs.update(ranking, sr);
- }
- else {
- // the service does NOT replace a lower ranked one
- hide(sr);
- }
- }
- }
- if (highestRankedServiceMap.size() > 0) {
- Object[] result = new Object[highestRankedServiceMap.size()];
- int index = 0;
- for(Iterator it = highestRankedServiceMap.entrySet().iterator(); it.hasNext(); ) {
- Entry entry = (Entry) it.next();
- result[index] = ((RankedService)entry.getValue()).getServiceReference();
- index++;
- }
- super.setInitial(result);
+ }
+ if (highestRankedServiceMap.size() > 0) {
+ Object[] result = new Object[highestRankedServiceMap.size()];
+ int index = 0;
+ for(Iterator it = highestRankedServiceMap.entrySet().iterator(); it.hasNext(); ) {
+ Entry entry = (Entry) it.next();
+ result[index] = ((RankedService)entry.getValue()).getServiceReference();
+ index++;
+ }
+ super.setInitial(result);
+ }
}
}