Work in progress, internal refactorings and bugfixes.

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1035252 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 dc7474b..e1e471b 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
@@ -31,12 +31,14 @@
 import java.util.Properties;
 import java.util.Set;
 
+import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ComponentDependencyDeclaration;
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.DependencyService;
+import org.apache.felix.dm.InvocationUtil;
 import org.apache.felix.dm.ServiceDependency;
+import org.apache.felix.dm.ServiceUtil;
 import org.apache.felix.dm.impl.DefaultNullObject;
-import org.apache.felix.dm.impl.InvocationUtil;
 import org.apache.felix.dm.impl.Logger;
 import org.apache.felix.dm.tracker.ServiceTracker;
 import org.apache.felix.dm.tracker.ServiceTrackerCustomizer;
@@ -463,6 +465,8 @@
     public void removedService(ServiceReference ref, Object service) {
         boolean makeUnavailable = makeUnavailable();
         
+        System.out.println("removedService: " + makeUnavailable + " for " + ServiceUtil.toString(ref));
+        
         Object[] services;
         synchronized (this) {
             services = m_services.toArray();
@@ -488,6 +492,8 @@
 
     public void invokeAdded(DependencyService dependencyService, ServiceReference reference, Object service) {
         invoke(dependencyService, reference, service, m_callbackAdded);
+        //marrs
+        m_refs.add(reference);
     }
     
     public void invokeChanged(DependencyService dependencyService, ServiceReference reference, Object service) {
@@ -496,13 +502,21 @@
 
     public void invokeRemoved(DependencyService dependencyService, ServiceReference reference, Object service) {
         invoke(dependencyService, reference, service, m_callbackRemoved);
+        //marrs
+        m_refs.remove(reference);
     }
 
     public void invoke(DependencyService dependencyService, ServiceReference reference, Object service, String name) {
         if (name != null) {
             dependencyService.invokeCallbackMethod(getCallbackInstances(dependencyService), name, 
-                new Class[][] {{ServiceReference.class, m_trackedServiceName}, {ServiceReference.class, Object.class}, {ServiceReference.class}, {m_trackedServiceName}, {Object.class}, {}, {Map.class, m_trackedServiceName}},
-                new Object[][] {{reference, service}, {reference, service}, {reference}, {service}, {service}, {}, {new ServicePropertiesMap(reference), service}}    
+                new Class[][] {
+                    {Component.class, ServiceReference.class, m_trackedServiceName}, {Component.class, ServiceReference.class, Object.class}, {Component.class, ServiceReference.class}, {Component.class, m_trackedServiceName}, {Component.class, Object.class}, {Component.class}, {Component.class, Map.class, m_trackedServiceName},
+                    {ServiceReference.class, m_trackedServiceName}, {ServiceReference.class, Object.class}, {ServiceReference.class}, {m_trackedServiceName}, {Object.class}, {}, {Map.class, m_trackedServiceName}
+                },
+                new Object[][] {
+                    {dependencyService, reference, service}, {dependencyService, reference, service}, {dependencyService, reference}, {dependencyService, service}, {dependencyService, service}, {dependencyService}, {dependencyService, new ServicePropertiesMap(reference), service},
+                    {reference, service}, {reference, service}, {reference}, {service}, {service}, {}, {new ServicePropertiesMap(reference), service}
+                }    
             );
         }
     }
@@ -795,28 +809,48 @@
         return "service";
     }
 
+    private List m_refs = new ArrayList();
+    
     public void invokeAdded(DependencyService service) {
         ServiceReference[] refs = m_tracker.getServiceReferences();
         if (refs != null) {
             for (int i = 0; i < refs.length; i++) {
                 ServiceReference sr = refs[i];
                 Object svc = m_context.getService(sr);
+                System.out.println("invokeAdded " + i + " " + ServiceUtil.toString(sr));
                 invokeAdded(service, sr, svc);
+                
+                //marrs
+                m_refs.add(sr);
             }
         }
         m_references = refs;
+        
     }
     
     public void invokeRemoved(DependencyService service) {
         ServiceReference[] refs = m_references;
+        
+        
         if (refs != null) {
+            //marrs
+            refs = (ServiceReference[]) m_refs.toArray(refs);
+            
             for (int i = 0; i < refs.length; i++) {
                 ServiceReference sr = refs[i];
                 Object svc = m_context.getService(sr);
+                System.out.println("invokeRemoved " + i + " " + ServiceUtil.toString(sr));
+                if (sr.getBundle() == null) {
+                    System.out.println("invokeRemoved OLD SHIT .. SKIPPING .. not");
+//                    break;
+                }
                 invokeRemoved(service, sr, svc);
             }
         }
         m_references = null;
+        
+        //marrs
+        m_refs.clear();
     }
 
     public Dictionary getProperties() {
@@ -867,4 +901,6 @@
         m_propagateCallbackMethod = method;
         return this;
     }
+    
+    // TODO add equals and hashCode methods, so you can compare dependencies
 }