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