Bugfixes related to aspects and general life cycle issues. Committed so others can test against this version.

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1021349 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
index a248cda..e698a6a 100644
--- a/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
+++ b/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
@@ -392,12 +392,15 @@
                 m_isStarted = false;
                 needsStopping = true;
             }
-            m_services.remove(service);
         }
         if (needsStopping) {
             m_tracker.close();
             m_tracker = null;
         }
+        //moved this down
+        synchronized (this) {
+            m_services.remove(service);
+        }
     }
 
     public Object addingService(ServiceReference ref) {
@@ -461,6 +464,7 @@
         synchronized (this) {
             services = m_services.toArray();
         }
+
         for (int i = 0; i < services.length; i++) {
             DependencyService ds = (DependencyService) services[i];
             if (makeUnavailable) {
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 01a84e5..c0217b6 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
@@ -812,7 +812,7 @@
 	class Tracked extends AbstractTracked implements ServiceListener {
 	    /** A list of services that are currently hidden because there is an aspect available with a higher ranking. */
 	    private final List m_hidden = new ArrayList();
-
+	    
 	    /**
 	     * Returns the highest hidden aspect for the specified service ID.
 	     * 
@@ -981,33 +981,30 @@
 						+ event.getType() + "]: " + reference);  
 			}
 
+			long sid = ServiceUtil.getServiceId(reference);
 			switch (event.getType()) {
 				case ServiceEvent.REGISTERED :
 				case ServiceEvent.MODIFIED :
 				    ServiceReference higher = null;
 				    ServiceReference lower = null;
-				    boolean isAspect = ServiceUtil.isAspect(reference);
-				    if (true /* WAS isAspect */) {
-    				    long sid = ServiceUtil.getServiceId(reference);
-    				    ServiceReference sr = highestTracked(sid);
-    				    if (sr != null) {
-    				        int ranking = ServiceUtil.getRanking(reference);
-    				        int trackedRanking = ServiceUtil.getRanking(sr);
-    				        if (ranking > trackedRanking) {
-    				            // found a higher ranked one!
-    				            if (DEBUG) {
-    				                System.out.println("ServiceTracker.Tracked.serviceChanged[" + event.getType() + "]: Found a higher ranked aspect: " + ServiceUtil.toString(reference) + " vs " + ServiceUtil.toString(sr));
-    				            }
-    				            higher = sr;
-    				        }
-    				        else {
-    				            // found lower ranked one!
-                                if (DEBUG) {
-                                    System.out.println("ServiceTracker.Tracked.serviceChanged[" + event.getType() + "]: Found a lower ranked aspect: " + ServiceUtil.toString(reference) + " vs " + ServiceUtil.toString(sr));
-                                }
-    				            lower = sr;
-    				        }
-    				    }
+				    ServiceReference sr = highestTracked(sid);
+				    if (sr != null) {
+				        int ranking = ServiceUtil.getRanking(reference);
+				        int trackedRanking = ServiceUtil.getRanking(sr);
+				        if (ranking > trackedRanking) {
+				            // found a higher ranked one!
+				            if (DEBUG) {
+				                System.out.println("ServiceTracker.Tracked.serviceChanged[" + event.getType() + "]: Found a higher ranked aspect: " + ServiceUtil.toString(reference) + " vs " + ServiceUtil.toString(sr));
+				            }
+				            higher = sr;
+				        }
+				        else {
+				            // found lower ranked one!
+                            if (DEBUG) {
+                                System.out.println("ServiceTracker.Tracked.serviceChanged[" + event.getType() + "]: Found a lower ranked aspect: " + ServiceUtil.toString(reference) + " vs " + ServiceUtil.toString(sr));
+                            }
+				            lower = sr;
+				        }
 				    }
 				    
 					if (listenerFilter != null) { // service listener added with filter
@@ -1060,26 +1057,21 @@
 							 */
 						}
 						else {
-		                    higher = null;
-		                    isAspect = ServiceUtil.isAspect(reference);
-		                    if (true /* WAS isAspect */) {
-		                        long sid = ServiceUtil.getServiceId(reference);
-		                        ServiceReference sr = highestHidden(sid);
-		                        if (sr != null) {
-	                                if (DEBUG) {
-	                                    System.out.println("ServiceTracker.Tracked.serviceChanged[" + event.getType() + "]: Found a hidden aspect: " + ServiceUtil.toString(reference));
-	                                }
-		                            higher = sr;
+		                    ServiceReference ht = highestTracked(sid);
+		                    ServiceReference hh = highestHidden(sid);
+		                    if (reference.equals(ht)) {
+		                        try {
+		                            if (hh != null) {
+		                                unhide(hh);
+		                                track(hh, null);
+		                            }
+		                        }
+		                        finally {
+		                            untrack(reference, event);
 		                        }
 		                    }
-		                    try {
-    		                    if (higher != null) {
-    		                        unhide(higher);
-    		                        track(higher, null);
-    		                    }
-		                    }
-		                    finally {
-		                        untrack(reference, event);
+		                    else {
+		                        unhide(reference);
 		                    }
 							/*
 							 * If the customizer throws an unchecked exception,
@@ -1090,27 +1082,22 @@
 					break;
                 case 8 /* ServiceEvent.MODIFIED_ENDMATCH */ :
 				case ServiceEvent.UNREGISTERING :
-                    higher = null;
-                    isAspect = ServiceUtil.isAspect(reference);
-                    if (true /* WAS isAspect */) {
-                        long sid = ServiceUtil.getServiceId(reference);
-                        ServiceReference sr = highestHidden(sid);
-                        if (sr != null) {
-                            if (DEBUG) {
-                                System.out.println("ServiceTracker.Tracked.serviceChanged[" + event.getType() + "]: Found a hidden aspect: " + ServiceUtil.toString(reference));
-                            }
-                            higher = sr;
-                        }
-                    }
-                    try {
-                        if (higher != null) {
-                            unhide(higher);
-                            track(higher, null);
-                        }
-                    }
-                    finally {
-                        untrack(reference, event);
-                    }
+				    ServiceReference ht = highestTracked(sid);
+				    ServiceReference hh = highestHidden(sid);
+				    if (reference.equals(ht)) {
+				        try {
+    				        if (hh != null) {
+    				            unhide(hh);
+    				            track(hh, null);
+    				        }
+				        }
+				        finally {
+				            untrack(reference, event);
+				        }
+				    }
+				    else {
+				        unhide(reference);
+				    }
 					/*
 					 * If the customizer throws an unchecked exception, it is
 					 * safe to let it propagate