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