Fixed a scenario where aspects that were part of the initial set of tracked services were not correctly identified as such, causing them to show up (instead of being properly hidden).
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@987468 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/tracker/ServiceTracker.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/tracker/ServiceTracker.java
index 3b42585..9bc1c2b 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/tracker/ServiceTracker.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/tracker/ServiceTracker.java
@@ -878,6 +878,7 @@
* @param ref the service reference to add to the hidden list
*/
private void hide(ServiceReference ref) {
+ if (DEBUG) { System.out.println("ServiceTracker.Tracked.hide " + ServiceUtil.toString(ref)); }
m_hidden.add(ref);
}
@@ -887,6 +888,7 @@
* @param ref the service reference to remove from the hidden list
*/
private void unhide(ServiceReference ref) {
+ if (DEBUG) { System.out.println("ServiceTracker.Tracked.unhide " + ServiceUtil.toString(ref)); }
m_hidden.remove(ref);
}
@@ -896,6 +898,58 @@
Tracked() {
super();
}
+
+ void setInitial(Object[] list) {
+ if (list == null) {
+ return;
+ }
+ // we need to split this list into the highest matching service references for each aspect
+ // and a list of 'hidden' service references
+ int counter = list.length;
+ for (int i = 0; i < list.length; i++) {
+ ServiceReference sr = (ServiceReference) list[i];
+ if (sr != null) {
+ for (int j = 0; j < list.length; j++) {
+ ServiceReference sr2 = (ServiceReference) list[j];
+ if (sr2 != null && j != i) {
+ long sid = ServiceUtil.getServiceId(sr);
+ long sid2 = ServiceUtil.getServiceId(sr2);
+ if (sid == sid2) {
+ long r = ServiceUtil.getRanking(sr);
+ long r2 = ServiceUtil.getRanking(sr2);
+ if (r > r2) {
+ if (DEBUG) { System.out.println("ServiceTracker.Tracked.setInitial: hiding " + ServiceUtil.toString(sr2)); }
+ hide(sr2);
+ list[j] = null;
+ counter--;
+ }
+ else {
+ if (DEBUG) { System.out.println("ServiceTracker.Tracked.setInitial: hiding " + ServiceUtil.toString(sr)); }
+ hide(sr);
+ list[i] = null;
+ counter--;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (counter > 0) {
+ Object[] result = new Object[counter];
+ int index = 0;
+ for (int i = 0; i < list.length; i++) {
+ if (list[i] != null) {
+ if (DEBUG) { System.out.println("ServiceTracker.Tracked.setInitial: propagating " + ServiceUtil.toString((ServiceReference) list[i])); }
+ result[index] = list[i];
+ index++;
+ }
+ }
+ // we only invoke super if we actually have
+ // results in our initial list
+ super.setInitial(result);
+ }
+ }
/**
* <code>ServiceListener</code> method for the