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 2010/10/11 15:55:03 UTC

svn commit: r1021349 - in /felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm: impl/dependencies/ServiceDependencyImpl.java tracker/ServiceTracker.java

Author: marrs
Date: Mon Oct 11 13:55:02 2010
New Revision: 1021349

URL: http://svn.apache.org/viewvc?rev=1021349&view=rev
Log:
Bugfixes related to aspects and general life cycle issues. Committed so others can test against this version.

Modified:
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java?rev=1021349&r1=1021348&r2=1021349&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java Mon Oct 11 13:55:02 2010
@@ -392,12 +392,15 @@ public class ServiceDependencyImpl exten
                 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 @@ public class ServiceDependencyImpl exten
         synchronized (this) {
             services = m_services.toArray();
         }
+
         for (int i = 0; i < services.length; i++) {
             DependencyService ds = (DependencyService) services[i];
             if (makeUnavailable) {

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java?rev=1021349&r1=1021348&r2=1021349&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/tracker/ServiceTracker.java Mon Oct 11 13:55:02 2010
@@ -812,7 +812,7 @@ public class ServiceTracker implements S
 	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 @@ public class ServiceTracker implements S
 						+ 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 @@ public class ServiceTracker implements S
 							 */
 						}
 						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 @@ public class ServiceTracker implements S
 					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