You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2014/10/11 17:53:01 UTC

svn commit: r1631069 - in /felix/sandbox/pderop/dependencymanager-prototype: org.apache.felix.dependencymanager.runtime/.settings/ org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ org.apache.felix.dependencymanager/src/org/ap...

Author: pderop
Date: Sat Oct 11 15:53:01 2014
New Revision: 1631069

URL: http://svn.apache.org/r1631069
Log:
Moved org/apache/felix/dm/impl/DependencyImpl.java to org/apache/felix/dm/context/AbstractDependency.java.
Now, any external/custom DM Dependencies can extend the AbstractDependency class, instead of implementing
all the methods from the DependencyContext interface.
(see org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ToggleServiceDependency.java
for example, which is now simpler).

Added:
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java
      - copied, changed from r1629079, felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/DependencyImpl.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/SimpleServiceDependency.java
Removed:
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/DependencyImpl.java
Modified:
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/.settings/org.eclipse.jdt.core.prefs
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/.settings/org.eclipse.jdt.ui.prefs
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ToggleServiceDependency.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleDependencyImpl.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ConfigurationDependencyImpl.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceDependencyImpl.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ComponentTest.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ConcurrencyTest.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ConfigurationTest.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ServiceRaceTest.java

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/.settings/org.eclipse.jdt.core.prefs?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/.settings/org.eclipse.jdt.core.prefs (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/.settings/org.eclipse.jdt.core.prefs Sat Oct 11 15:53:01 2014
@@ -45,18 +45,18 @@ org.eclipse.jdt.core.formatter.blank_lin
 org.eclipse.jdt.core.formatter.blank_lines_before_package=0
 org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
 org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line_on_wrap
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line_on_wrap
 org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=next_line_on_wrap
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line_on_wrap
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line_on_wrap
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line_on_wrap
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line_on_wrap
 org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line_on_wrap
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line_on_wrap
 org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
 org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
 org.eclipse.jdt.core.formatter.comment.format_block_comments=false
@@ -89,7 +89,7 @@ org.eclipse.jdt.core.formatter.indent_em
 org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
 org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
 org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
 org.eclipse.jdt.core.formatter.indentation.size=4
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
@@ -101,11 +101,11 @@ org.eclipse.jdt.core.formatter.insert_ne
 org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
 org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
 org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/.settings/org.eclipse.jdt.ui.prefs
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/.settings/org.eclipse.jdt.ui.prefs?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/.settings/org.eclipse.jdt.ui.prefs (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/.settings/org.eclipse.jdt.ui.prefs Sat Oct 11 15:53:01 2014
@@ -1,3 +1,3 @@
 eclipse.preferences.version=1
-formatter_profile=_Apache Felix Eclipse Template
+formatter_profile=_Apache Dependency Manager
 formatter_settings_version=12

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ToggleServiceDependency.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ToggleServiceDependency.java?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ToggleServiceDependency.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager.runtime/src/org/apache/felix/dm/runtime/ToggleServiceDependency.java Sat Oct 11 15:53:01 2014
@@ -18,18 +18,11 @@
  */
 package org.apache.felix.dm.runtime;
 
-import java.util.Collection;
 import java.util.Dictionary;
-import java.util.Map;
-import java.util.Set;
 
-import org.apache.felix.dm.ComponentDependencyDeclaration;
-import org.apache.felix.dm.Dependency;
-import org.apache.felix.dm.context.ComponentContext;
+import org.apache.felix.dm.context.AbstractDependency;
 import org.apache.felix.dm.context.DependencyContext;
 import org.apache.felix.dm.context.Event;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
 
 /**
  * This is a custom DependencyManager Dependency, allowing to take control of
@@ -39,12 +32,7 @@ import org.osgi.framework.BundleContext;
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class ToggleServiceDependency implements Dependency, ComponentDependencyDeclaration, DependencyContext {
-    private volatile boolean m_isAvailable;
-    protected volatile ComponentContext m_component;
-    protected boolean m_instanceBound;
-    private volatile boolean m_isStarted; // volatile because accessed by getState method
-    
+public class ToggleServiceDependency extends AbstractDependency<ToggleServiceDependency> {
     public static class ToggleEvent implements Event {
         @Override
         public boolean equals(Object e) {
@@ -53,12 +41,12 @@ public class ToggleServiceDependency imp
             }
             return false;
         }
-        
+
         @Override
         public int hashCode() {
             return ToggleEvent.class.hashCode();
         }
-        
+
         @Override
         public int compareTo(Object o) {
             return 0;
@@ -74,20 +62,22 @@ public class ToggleServiceDependency imp
         }
 
         @Override
-        public Dictionary getProperties()
-        {
+        public Dictionary getProperties() {
             return null;
         }
     }
-
+    
     public ToggleServiceDependency() {
+        super.setRequired(true);
+    }
+
+    public ToggleServiceDependency(ToggleServiceDependency prototype) {
+        super(prototype);
     }
 
-    public ToggleServiceDependency(ToggleServiceDependency other) {
-        m_component = other.m_component;
-        m_instanceBound = other.m_instanceBound;
-        m_isAvailable = other.m_isAvailable;
-        m_isStarted = other.m_isStarted;
+    @Override
+    public DependencyContext createCopy() {
+        return new ToggleServiceDependency(this);
     }
 
     public void activate(boolean active) {
@@ -97,159 +87,14 @@ public class ToggleServiceDependency imp
             remove(new ToggleEvent());
         }
     }
-    
-    @Override
-    public void setAvailable(boolean available) {
-        m_isAvailable = available;
-    }
-
-    @Override
-    public void invokeAdd(Event e) {
-    }
-
-    @Override
-    public void invokeChange(Event e) {
-    }
-
-    @Override
-    public void invokeRemove(Event e) {
-    }
-    
-    public void invokeSwap(Event event, Event newEvent) {        
-    }
-
-    @Override
-    public void add(final Event e) {
-        m_component.getExecutor().execute(new Runnable() {
-            @Override
-            public void run() {
-                m_component.handleAdded(ToggleServiceDependency.this, e);
-            }
-        });
-    }
-
-    @Override
-    public void change(Event e) {
-    }
-
-    @Override
-    public void remove(final Event e) {
-        m_component.getExecutor().execute(new Runnable() {
-            @Override
-            public void run() {
-                m_component.handleRemoved(ToggleServiceDependency.this, e);
-            }
-        });
-    }
-
-    @Override
-    public void setComponentContext(ComponentContext component) {
-        m_component = component;
-    }
-
-    @Override
-    public void start() {
-        m_isStarted = true;
-    }
-
-    @Override
-    public void stop() {
-        m_isStarted = false;
-    }
-
-    @Override
-    public boolean isAvailable() {
-        return m_isAvailable;
-    }
-
-    @Override
-    public boolean isRequired() {
-        return true;
-    }
-
-    @Override
-    public boolean isInstanceBound() {
-        return m_instanceBound;
-    }
-
-    @Override
-    public void setInstanceBound(boolean instanceBound) {
-        m_instanceBound = instanceBound;
-    }
-
-    @Override
-    public boolean needsInstance() {
-        return false;
-    }
-
-    @Override
-    public Class getAutoConfigType() {
-        return null;
-    }
-
-    @Override
-    public Event getService() {
-        return null;
-    }
-    
-    @Override
-    public void copyToCollection(Collection to) {
-    }
-    
-    @Override
-    public boolean isAutoConfig() {
-        return false;
-    }
-
-    @Override
-    public String getAutoConfigName() {
-        return null;
-    }
-
-    @Override
-    public DependencyContext createCopy() {
-        return new ToggleServiceDependency(this);
-    }
-
-    @Override
-    public boolean isPropagated() {
-        return false;
-    }
-
-    @Override
-    public Dictionary getProperties() {
-        return null;
-    }
 
     @Override
     public String getName() {
-        return "" + m_isAvailable;
+        return "" + isAvailable();
     }
 
     @Override
     public String getType() {
         return "toggle";
     }
-
-    @Override
-    public int getState() {
-        if (m_isStarted) {
-            return (isAvailable() ? 1 : 0) + (isRequired() ? 2 : 0);
-        }
-        else {
-            return isRequired() ? ComponentDependencyDeclaration.STATE_REQUIRED
-                : ComponentDependencyDeclaration.STATE_OPTIONAL;
-        }
-    }
-
-    @Override
-    public boolean isStarted()
-    {
-        return m_isStarted;
-    }
-
-    @Override
-    public void copyToMap(Map<Object, Dictionary> map)
-    {        
-    }
 }

Copied: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java (from r1629079, felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/DependencyImpl.java)
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java?p2=felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java&p1=felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/DependencyImpl.java&r1=1629079&r2=1631069&rev=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/DependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java Sat Oct 11 15:53:01 2014
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.impl;
+package org.apache.felix.dm.context;
 
 import java.util.Collection;
 import java.util.Dictionary;
@@ -26,98 +26,164 @@ import java.util.Set;
 
 import org.apache.felix.dm.ComponentDependencyDeclaration;
 import org.apache.felix.dm.Dependency;
-import org.apache.felix.dm.context.ComponentContext;
-import org.apache.felix.dm.context.DependencyContext;
-import org.apache.felix.dm.context.Event;
+import org.apache.felix.dm.impl.EventImpl;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 
-public class DependencyImpl<T extends Dependency> implements Dependency, DependencyContext {
-	protected volatile ComponentContext m_component;
-	protected volatile boolean m_available; // volatile because accessed by getState method
-	protected boolean m_instanceBound;
-	protected volatile boolean m_required; // volatile because accessed by getState method
-	protected String m_add;
-	protected String m_change;
-	protected String m_remove;
-	protected boolean m_autoConfig;
-	protected String m_autoConfigInstance;
-	protected boolean m_autoConfigInvoked;
-    private volatile boolean m_isStarted; // volatile because accessed by getState method
-    private Object m_callbackInstance;
+/**
+ * Abstract class for implementing Dependencies
+ *
+ * @param <T> The type of the interface representing a Dependency Manager Dependency (must extends the Dependency interface).
+ */
+public abstract class AbstractDependency<T extends Dependency> implements Dependency, DependencyContext, ComponentDependencyDeclaration
+{
+    protected volatile ComponentContext m_component;
+    protected volatile boolean m_available; // volatile because accessed by getState method
+    protected boolean m_instanceBound;
+    protected volatile boolean m_required; // volatile because accessed by getState method
+    protected String m_add;
+    protected String m_change;
+    protected String m_remove;
+    protected boolean m_autoConfig;
+    protected String m_autoConfigInstance;
+    protected boolean m_autoConfigInvoked;
+    protected volatile boolean m_isStarted; // volatile because accessed by getState method
+    protected Object m_callbackInstance;
     protected volatile boolean m_propagate;
     protected volatile Object m_propagateCallbackInstance;
     protected volatile String m_propagateCallbackMethod;
     protected final BundleContext m_context;
     protected final Bundle m_bundle;
+    private final static Dictionary EMPTY_PROPERTIES = new Hashtable<>(0);
 
-	public DependencyImpl() {	
+    public AbstractDependency() {
         this(true, null);
-	}
+    }
 
-	public DependencyImpl(boolean autoConfig, BundleContext bc) {	
+    public AbstractDependency(boolean autoConfig, BundleContext bc) {
         m_autoConfig = autoConfig;
         m_context = bc;
         m_bundle = m_context != null ? m_context.getBundle() : null;
-	}
-	
-	public DependencyImpl(DependencyImpl<T> prototype) {
-		m_component = prototype.m_component;
-		m_instanceBound = prototype.m_instanceBound;
-		m_required = prototype.m_required;
-		m_add = prototype.m_add;
-		m_change = prototype.m_change;
-		m_remove = prototype.m_remove;
-		m_autoConfig = prototype.m_autoConfig;
-		m_autoConfigInstance = prototype.m_autoConfigInstance;
-		m_autoConfigInvoked = prototype.m_autoConfigInvoked;
-		m_callbackInstance = prototype.m_callbackInstance;
+    }
+
+    public AbstractDependency(AbstractDependency<T> prototype) {
+        m_component = prototype.m_component;
+        m_instanceBound = prototype.m_instanceBound;
+        m_required = prototype.m_required;
+        m_add = prototype.m_add;
+        m_change = prototype.m_change;
+        m_remove = prototype.m_remove;
+        m_autoConfig = prototype.m_autoConfig;
+        m_autoConfigInstance = prototype.m_autoConfigInstance;
+        m_autoConfigInvoked = prototype.m_autoConfigInvoked;
+        m_callbackInstance = prototype.m_callbackInstance;
         m_propagate = prototype.m_propagate;
         m_propagateCallbackInstance = prototype.m_propagateCallbackInstance;
         m_propagateCallbackMethod = prototype.m_propagateCallbackMethod;
         m_context = prototype.m_context;
         m_bundle = prototype.m_bundle;
-	}
-	
-	public void add(final Event e) {
-		// since this method can be invoked by anyone from any thread, we need to
-		// pass on the event to a runnable that we execute using the component's
-		// executor
-		m_component.getExecutor().execute(new Runnable() {
-			@Override
-			public void run() {
-			    m_component.handleAdded(DependencyImpl.this, e);
-			}
-		});
-	}
-	
-	public void change(final Event e) {
-		// since this method can be invoked by anyone from any thread, we need to
-		// pass on the event to a runnable that we execute using the component's
-		// executor
-		m_component.getExecutor().execute(new Runnable() {
-			@Override
-			public void run() {
-                m_component.handleChanged(DependencyImpl.this, e);
-			}
-		});
-	}
-	
-	public void remove(final Event e) {
-		// since this method can be invoked by anyone from any thread, we need to
-		// pass on the event to a runnable that we execute using the component's
-		// executor
-		m_component.getExecutor().execute(new Runnable() {
-			@Override
-			public void run() {
-			    try {
-			        m_component.handleRemoved(DependencyImpl.this, e);	
-			    } finally {
-			        e.close();
-			    }
-			}
-		});
-	}
+    }
+
+    // ----------------------- Dependency interface -----------------------------
+
+    @Override
+    public boolean isRequired() {
+        return m_required;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return m_available;
+    }
+
+    @Override
+    public boolean isAutoConfig() {
+        return m_autoConfig;
+    }
+
+    @Override
+    public String getAutoConfigName() {
+        return m_autoConfigInstance;
+    }
+
+    @Override
+    public boolean isPropagated() {
+        return m_propagate;
+    }
+
+    @Override
+    public Dictionary getProperties() {
+        return EMPTY_PROPERTIES;
+    }
+
+    // -------------- DependencyContext -----------------------------------------------
+
+    @Override
+    public void invokeAdd(Event e) {
+        if (m_add != null) {
+            invoke(m_add, e);
+        }
+    }
+
+    @Override
+    public void invokeChange(Event e) {
+        if (m_change != null) {
+            invoke(m_change, e);
+        }
+    }
+
+    @Override
+    public void invokeRemove(Event e) {
+        if (m_remove != null) {
+            invoke(m_remove, e);
+        }
+    }
+
+    @Override
+    public void invokeSwap(Event event, Event newEvent) {
+        // Has to be implemented by sub classes
+        throw new IllegalStateException("This method must be implemented by the class " + getClass().getName());
+    }
+
+    public void add(final Event e) {
+        // since this method can be invoked by anyone from any thread, we need to
+        // pass on the event to a runnable that we execute using the component's
+        // executor
+        m_component.getExecutor().execute(new Runnable() {
+            @Override
+            public void run() {
+                m_component.handleAdded(AbstractDependency.this, e);
+            }
+        });
+    }
+
+    public void change(final Event e) {
+        // since this method can be invoked by anyone from any thread, we need to
+        // pass on the event to a runnable that we execute using the component's
+        // executor
+        m_component.getExecutor().execute(new Runnable() {
+            @Override
+            public void run() {
+                m_component.handleChanged(AbstractDependency.this, e);
+            }
+        });
+    }
+
+    public void remove(final Event e) {
+        // since this method can be invoked by anyone from any thread, we need to
+        // pass on the event to a runnable that we execute using the component's
+        // executor
+        m_component.getExecutor().execute(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    m_component.handleRemoved(AbstractDependency.this, e);
+                } finally {
+                    e.close();
+                }
+            }
+        });
+    }
 
     public void swap(final Event event, final Event newEvent) {
         // since this method can be invoked by anyone from any thread, we need to
@@ -127,7 +193,7 @@ public class DependencyImpl<T extends De
             @Override
             public void run() {
                 try {
-                    m_component.handleSwapped(DependencyImpl.this, event, newEvent);  
+                    m_component.handleSwapped(AbstractDependency.this, event, newEvent);
                 } finally {
                     event.close();
                 }
@@ -136,31 +202,36 @@ public class DependencyImpl<T extends De
     }
 
     @Override
-	public void setComponentContext(ComponentContext component) {
-		m_component = component;
-	}
-	
-	@Override
-	public void start() {
-	    if (! m_isStarted) {
-	        startTracking();
-	        m_isStarted = true;
-	    }
-	}
-
-	@Override
-	public void stop() {
-	    if (m_isStarted) {
-	        stopTracking();
-	        m_isStarted = false;
-	    }
-	}
-
-	@Override
-	public boolean isAvailable() {
-		return m_available;
-	}
-	
+    public void setComponentContext(ComponentContext component) {
+        m_component = component;
+    }
+
+    @Override
+    public void start() {
+        if (!m_isStarted) {
+            startTracking();
+            m_isStarted = true;
+        }
+    }
+
+    @Override
+    public void stop() {
+        if (m_isStarted) {
+            stopTracking();
+            m_isStarted = false;
+        }
+    }
+
+    @Override
+    public boolean isStarted() {
+        return m_isStarted;
+    }
+
+    @Override
+    public void setAvailable(boolean available) {
+        m_available = available;
+    }
+
     public T setPropagate(boolean propagate) {
         ensureNotActive();
         m_propagate = propagate;
@@ -173,144 +244,83 @@ public class DependencyImpl<T extends De
         m_propagateCallbackMethod = method;
         return (T) this;
     }
-    
-	@Override
-	public void setAvailable(boolean available) {
-	    m_available = available;
-	}
-	
-	@Override
-	public boolean isRequired() {
-		return m_required;
-	}
-	
-	public boolean isInstanceBound() {
-		return m_instanceBound;
-	}
-	
-	public void setInstanceBound(boolean instanceBound) {
-		m_instanceBound = instanceBound;
-	}
-	
-	public T setCallbacks(String add, String remove) {
-	    return setCallbacks(add, null, remove);
-	}
-	
-	public T setCallbacks(String add, String change, String remove) {
-		return setCallbacks(null, add, change, remove);		
-	}
-	
-	public T setCallbacks(Object instance, String add, String remove) {
-		return setCallbacks(instance, add, null, remove);
-	}
-	
-	public T setCallbacks(Object instance, String add, String change, String remove) {
+
+    public boolean isInstanceBound() {
+        return m_instanceBound;
+    }
+
+    public void setInstanceBound(boolean instanceBound) {
+        m_instanceBound = instanceBound;
+    }
+
+    public T setCallbacks(String add, String remove) {
+        return setCallbacks(add, null, remove);
+    }
+
+    public T setCallbacks(String add, String change, String remove) {
+        return setCallbacks(null, add, change, remove);
+    }
+
+    public T setCallbacks(Object instance, String add, String remove) {
+        return setCallbacks(instance, add, null, remove);
+    }
+
+    public T setCallbacks(Object instance, String add, String change, String remove) {
         if ((add != null || change != null || remove != null) && !m_autoConfigInvoked) {
             setAutoConfig(false);
         }
         m_callbackInstance = instance;
-		m_add = add;
-		m_change = change;
-		m_remove = remove;
-		return (T) this;
-	}
-	
-	@Override
-	public void invokeAdd(Event e) {
-		if (m_add != null) {
-		    invoke(m_add, e);
-		}
-	}
-	
-    @Override	
-	public void invokeChange(Event e) {
-		if (m_change != null) {
-		    invoke(m_change, e);
-		}
-	}
-	
-    @Override   
-    public void invokeRemove(Event e) {
-		if (m_remove != null) {
-		    invoke(m_remove, e);
-		}
-	}
-    
-    @Override   
-    public void invokeSwap(Event event, Event newEvent) {
-        // Has to be implemented by sub classes
-        throw new IllegalStateException("This method must be implemented by the class " + getClass().getName());
+        m_add = add;
+        m_change = change;
+        m_remove = remove;
+        return (T) this;
     }
-	
-	public Object[] getInstances() {
+
+    public Object[] getInstances() {
         if (m_callbackInstance == null) {
-        	return m_component.getInstances();
+            return m_component.getInstances();
         } else {
-            return new Object[]{m_callbackInstance};
+            return new Object[] { m_callbackInstance };
         }
-	}
+    }
+
+    public void invoke(String method, Event e, Object[] instances) {
+        // specific for this type of dependency
+        m_component.invokeCallbackMethod(instances, method, new Class[][] { {} }, new Object[][] { {} });
+    }
+
+    public void invoke(String method, Event e) {
+        invoke(method, e, getInstances());
+    }
+
+    public T setRequired(boolean required) {
+        m_required = required;
+        return (T) this;
+    }
 
-	public void invoke(String method, Event e, Object[] instances) {
-		// specific for this type of dependency
-		m_component.invokeCallbackMethod(instances, method, new Class[][] {{}}, new Object[][] {{}});
-	}
-	
-	public void invoke(String method, Event e) {
-		invoke(method, e, getInstances());
-	}
-	
-	public T setRequired(boolean required) {
-		m_required = required;
-		return (T) this;
-	}
-	
     @Override
     public boolean needsInstance() {
         return false;
     }
-    
+
     @Override
     public Class<?> getAutoConfigType() {
-        return null; // must be implemented by subclasses
-    }
-    
-    @Override
-    public boolean isAutoConfig() {
-        return m_autoConfig;
-    }
-    
-    @Override
-    public String getAutoConfigName() {
-        return m_autoConfigInstance;
+        return null; // must be implemented by subclasses if autoconfig mode is enabled
     }
-    
+
     public T setAutoConfig(boolean autoConfig) {
         m_autoConfig = autoConfig;
         m_autoConfigInvoked = true;
         return (T) this;
     }
-    
+
     public T setAutoConfig(String instanceName) {
         m_autoConfig = (instanceName != null);
         m_autoConfigInstance = instanceName;
         m_autoConfigInvoked = true;
         return (T) this;
     }
-    
-    @Override
-    public DependencyContext createCopy() {
-        return new DependencyImpl(this);
-    }
-    
-    public int getState() { // Can be called from any threads, but our class attributes are volatile
-    	if (m_isStarted) {
-    		return (isAvailable() ? 1 : 0) + (isRequired() ? 2 : 0);
-    	}
-    	else {
-    		return isRequired() ? ComponentDependencyDeclaration.STATE_REQUIRED : ComponentDependencyDeclaration.STATE_OPTIONAL;
-    	}
-    }
-   
+
     @Override
     public Event getService() {
         Event event = m_component.getDependencyEvent(this);
@@ -322,7 +332,7 @@ public class DependencyImpl<T extends De
         }
         return event;
     }
-    
+
     @Override
     public void copyToCollection(Collection<Object> services) {
         Set<Event> events = m_component.getDependencyEvents(this);
@@ -337,7 +347,7 @@ public class DependencyImpl<T extends De
             }
         }
     }
-    
+
     @Override
     public void copyToMap(Map<Object, Dictionary> map) {
         Set<Event> events = m_component.getDependencyEvents(this);
@@ -352,40 +362,45 @@ public class DependencyImpl<T extends De
             }
         }
     }
-    
-    @Override
-    public boolean isStarted() {
-    	return m_isStarted;
+
+    public ComponentContext getComponentContext() {
+        return m_component;
     }
 
-	@Override
-	public boolean isPropagated() {
-		return m_propagate;
-	}
-
-	@Override
-	public Dictionary getProperties() {
-		// specific for this type of dependency
-		return null;
-	}
-	
-	public ComponentContext getComponentContext() {
-		return m_component;
-	}
-	
     protected Object getDefaultService() {
         return null;
     }
-        
+
     protected void ensureNotActive() {
         if (isStarted()) {
             throw new IllegalStateException("Cannot modify state while active.");
         }
     }
-    
+
     protected void startTracking() {
     }
-    
+
     protected void stopTracking() {
     }
+
+    @Override
+    public abstract DependencyContext createCopy();
+
+    // -------------- DependencyContext -----------------------------------------------
+
+    @Override
+    public abstract String getName();
+
+    @Override
+    public abstract String getType();
+
+    @Override
+    public int getState() { // Can be called from any threads, but our class attributes are volatile
+        if (m_isStarted) {
+            return (isAvailable() ? 1 : 0) + (isRequired() ? 2 : 0);
+        } else {
+            return isRequired() ? ComponentDependencyDeclaration.STATE_REQUIRED
+                : ComponentDependencyDeclaration.STATE_OPTIONAL;
+        }
+    }
 }

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java Sat Oct 11 15:53:01 2014
@@ -22,8 +22,10 @@ import java.util.Collection;
 import java.util.Dictionary;
 import java.util.Map;
 
+import org.apache.felix.dm.Dependency;
 
-public interface DependencyContext {
+
+public interface DependencyContext extends Dependency {
 	public void invokeAdd(Event e);
 	public void invokeChange(Event e);
 	public void invokeRemove(Event e);
@@ -39,11 +41,8 @@ public interface DependencyContext {
 	public void stop();
 	
 	public boolean isStarted();
-	public boolean isAvailable();
 	public void setAvailable(boolean available);
-	
-	public boolean isRequired();
-	
+		
 	public boolean isInstanceBound();
 	public void setInstanceBound(boolean instanceBound);
 	
@@ -54,9 +53,5 @@ public interface DependencyContext {
     public Event getService();
     public void copyToCollection(Collection<Object> coll);
     public void copyToMap(Map<Object, Dictionary> map);
-    public boolean isAutoConfig();
-    public String getAutoConfigName();
     public DependencyContext createCopy();
-    public boolean isPropagated();
-    public Dictionary getProperties();
 }

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleDependencyImpl.java?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleDependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleDependencyImpl.java Sat Oct 11 15:53:01 2014
@@ -26,6 +26,7 @@ import java.util.Set;
 import org.apache.felix.dm.BundleDependency;
 import org.apache.felix.dm.ComponentDependencyDeclaration;
 import org.apache.felix.dm.context.DependencyContext;
+import org.apache.felix.dm.context.AbstractDependency;
 import org.apache.felix.dm.context.Event;
 import org.apache.felix.dm.tracker.BundleTracker;
 import org.apache.felix.dm.tracker.BundleTrackerCustomizer;
@@ -39,7 +40,7 @@ import org.osgi.service.log.LogService;
 /**
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class BundleDependencyImpl extends DependencyImpl<BundleDependency> implements BundleDependency, BundleTrackerCustomizer, ComponentDependencyDeclaration {
+public class BundleDependencyImpl extends AbstractDependency<BundleDependency> implements BundleDependency, BundleTrackerCustomizer, ComponentDependencyDeclaration {
     private BundleTracker m_tracker;
     private int m_stateMask = Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE;
     private Bundle m_bundleInstance;

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ConfigurationDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ConfigurationDependencyImpl.java?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ConfigurationDependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ConfigurationDependencyImpl.java Sat Oct 11 15:53:01 2014
@@ -26,6 +26,7 @@ import java.util.concurrent.atomic.Atomi
 import org.apache.felix.dm.ConfigurationDependency;
 import org.apache.felix.dm.PropertyMetaData;
 import org.apache.felix.dm.context.DependencyContext;
+import org.apache.felix.dm.context.AbstractDependency;
 import org.apache.felix.dm.context.Event;
 import org.apache.felix.dm.impl.metatype.MetaTypeProviderImpl;
 import org.osgi.framework.BundleContext;
@@ -34,7 +35,7 @@ import org.osgi.framework.ServiceRegistr
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedService;
 
-public class ConfigurationDependencyImpl extends DependencyImpl<ConfigurationDependency> implements ConfigurationDependency, ManagedService {
+public class ConfigurationDependencyImpl extends AbstractDependency<ConfigurationDependency> implements ConfigurationDependency, ManagedService {
     private Dictionary<?,?> m_settings;
     private String m_callback = "updated";
 	private final Logger m_logger;

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceDependencyImpl.java?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceDependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceDependencyImpl.java Sat Oct 11 15:53:01 2014
@@ -30,6 +30,7 @@ import org.apache.felix.dm.ComponentDepe
 import org.apache.felix.dm.ResourceDependency;
 import org.apache.felix.dm.ResourceHandler;
 import org.apache.felix.dm.context.DependencyContext;
+import org.apache.felix.dm.context.AbstractDependency;
 import org.apache.felix.dm.context.Event;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
@@ -38,7 +39,7 @@ import org.osgi.service.log.LogService;
 /**
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class ResourceDependencyImpl extends DependencyImpl<ResourceDependency> implements ResourceDependency, ResourceHandler, ComponentDependencyDeclaration {
+public class ResourceDependencyImpl extends AbstractDependency<ResourceDependency> implements ResourceDependency, ResourceHandler, ComponentDependencyDeclaration {
     private volatile ServiceRegistration m_registration;
     private volatile String m_resourceFilter;
     private volatile URL m_trackedResource;

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java Sat Oct 11 15:53:01 2014
@@ -23,9 +23,7 @@ import java.lang.reflect.Proxy;
 import java.util.AbstractMap;
 import java.util.Arrays;
 import java.util.Dictionary;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Hashtable;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
@@ -33,18 +31,18 @@ import java.util.Set;
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ComponentDeclaration;
 import org.apache.felix.dm.ServiceDependency;
+import org.apache.felix.dm.context.AbstractDependency;
 import org.apache.felix.dm.context.DependencyContext;
 import org.apache.felix.dm.context.Event;
 import org.apache.felix.dm.tracker.ServiceTracker;
 import org.apache.felix.dm.tracker.ServiceTrackerCustomizer;
-import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.log.LogService;
 
-public class ServiceDependencyImpl extends DependencyImpl<ServiceDependency> implements ServiceDependency, ServiceTrackerCustomizer {
+public class ServiceDependencyImpl extends AbstractDependency<ServiceDependency> implements ServiceDependency, ServiceTrackerCustomizer {
 	protected volatile ServiceTracker m_tracker;
     private final Logger m_logger;
     protected String m_swap;
@@ -291,11 +289,7 @@ public class ServiceDependencyImpl exten
             {new ServicePropertiesMap(se.getReference()), se.getEvent()}}
 		);
 	}
-	
-    public void invoke(String method, Event e) {
-		invoke(method, e, getInstances());
-	}
-	
+		
 	@Override
     public Class<?> getAutoConfigType() {
         return m_trackedServiceName;

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ComponentTest.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ComponentTest.java?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ComponentTest.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ComponentTest.java Sat Oct 11 15:53:01 2014
@@ -22,8 +22,8 @@ import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ComponentState;
 import org.apache.felix.dm.ComponentStateListener;
 import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.context.AbstractDependency;
 import org.apache.felix.dm.impl.ComponentImpl;
-import org.apache.felix.dm.impl.DependencyImpl;
 import org.apache.felix.dm.impl.EventImpl;
 import org.junit.Assert;
 import org.junit.Test;
@@ -73,7 +73,7 @@ public class ComponentTest {
 	@Test
 	public void testAddDependencyFromInitCallback() {
 		final Ensure e = new Ensure();
-		final DependencyImpl d = new DependencyImpl();
+		final AbstractDependency d = new SimpleServiceDependency();
 		d.setRequired(true);
 		ComponentImpl c = new ComponentImpl();
 		c.setImplementation(new Object() {
@@ -104,9 +104,9 @@ public class ComponentTest {
     @Test
     public void testAddAvailableDependencyFromInitCallback() {
         final Ensure e = new Ensure();
-        final DependencyImpl d = new DependencyImpl();
+        final AbstractDependency d = new SimpleServiceDependency();
         d.setRequired(true);
-        final DependencyImpl d2 = new DependencyImpl();
+        final AbstractDependency d2 = new SimpleServiceDependency();
         d2.setRequired(true);
         ComponentImpl c = new ComponentImpl();
         c.setImplementation(new Object() {
@@ -143,10 +143,10 @@ public class ComponentTest {
 	@Test
 	public void testAtomicallyAddMultipleDependenciesFromInitCallback() {
 		final Ensure e = new Ensure();
-		final DependencyImpl d = new DependencyImpl();
+		final AbstractDependency d = new SimpleServiceDependency();
 		d.setRequired(true);
 
-		final DependencyImpl d2 = new DependencyImpl();
+		final AbstractDependency d2 = new SimpleServiceDependency();
 		d2.setRequired(true);
 
 		ComponentImpl c = new ComponentImpl();
@@ -184,7 +184,7 @@ public class ComponentTest {
 	public void createComponentAddDependencyAndStartComponent() {
 		ComponentImpl c = new ComponentImpl();
 		c.setImplementation(MyComponent.class);
-		DependencyImpl d = new DependencyImpl();
+		AbstractDependency d = new SimpleServiceDependency();
 		d.setRequired(true);
 		c.add(d);
 		c.start();
@@ -197,7 +197,7 @@ public class ComponentTest {
 	public void createComponentStartItAndAddDependency() {
 		ComponentImpl c = new ComponentImpl();
 		c.setImplementation(MyComponent.class);
-		DependencyImpl d = new DependencyImpl();
+		AbstractDependency d = new SimpleServiceDependency();
 		d.setRequired(true);
 		c.start();
 		Assert.assertEquals("should be available when started", true, c.isAvailable());
@@ -212,7 +212,7 @@ public class ComponentTest {
 	public void createComponentStartItAddDependencyAndMakeDependencyAvailable() {
 		ComponentImpl c = new ComponentImpl();
 		c.setImplementation(MyComponent.class);
-		DependencyImpl d = new DependencyImpl();
+		AbstractDependency d = new SimpleServiceDependency();
 		d.setRequired(true);
 		c.start();
 		c.add(d);
@@ -231,7 +231,7 @@ public class ComponentTest {
 	public void createComponentStartItAddDependencyAndListenerMakeDependencyAvailableAndUnavailableImmediately() {
 		ComponentImpl c = new ComponentImpl();
 		c.setImplementation(MyComponent.class);
-		final DependencyImpl d = new DependencyImpl();
+		final AbstractDependency d = new SimpleServiceDependency();
 		d.setRequired(true);
 		ComponentStateListener l = new ComponentStateListener() {
 			@Override
@@ -262,9 +262,9 @@ public class ComponentTest {
 	public void createComponentAddTwoDependenciesMakeBothAvailableAndUnavailable() {
 		ComponentImpl c = new ComponentImpl();
 		c.setImplementation(MyComponent.class);
-		DependencyImpl d1 = new DependencyImpl();
+		AbstractDependency d1 = new SimpleServiceDependency();
 		d1.setRequired(true);
-		DependencyImpl d2 = new DependencyImpl();
+		AbstractDependency d2 = new SimpleServiceDependency();
 		d2.setRequired(true);
 		c.start();
 		c.add(d1);
@@ -298,7 +298,7 @@ public class ComponentTest {
 				e.step(3);
 			}
 		});
-		DependencyImpl d1 = new DependencyImpl();
+		AbstractDependency d1 = new SimpleServiceDependency();
 		d1.setCallbacks("add", "remove");
 		d1.setRequired(true);
 		// add the dependency to the component
@@ -329,7 +329,7 @@ public class ComponentTest {
 				e.step(3);
 			}
 		});
-		DependencyImpl d1 = new DependencyImpl();
+		AbstractDependency d1 = new SimpleServiceDependency();
 		d1.setCallbacks("add", "remove");
 		d1.setRequired(true);
 		// start the ComponentImpl (it should become available)
@@ -361,10 +361,10 @@ public class ComponentTest {
 				e.step();
 			}
 		});
-		DependencyImpl d1 = new DependencyImpl();
+		AbstractDependency d1 = new SimpleServiceDependency();
 		d1.setCallbacks("add", "remove");
 		d1.setRequired(true);
-		DependencyImpl d2 = new DependencyImpl();
+		AbstractDependency d2 = new SimpleServiceDependency();
 		d2.setCallbacks("add", "remove");
 		d2.setRequired(true);
 		// start the component, which should become active because there are no
@@ -409,10 +409,10 @@ public class ComponentTest {
 		});
 		// start the component, it should become available
 		c.start();
-		DependencyImpl d1 = new DependencyImpl();
+		AbstractDependency d1 = new SimpleServiceDependency();
 		d1.setCallbacks("add", "remove");
 		d1.setRequired(true);
-		DependencyImpl d2 = new DependencyImpl();
+		AbstractDependency d2 = new SimpleServiceDependency();
 		d2.setCallbacks("add", "remove");
 		d2.setRequired(true);
 		// add the first dependency, ComponentImpl should be unavailable
@@ -452,10 +452,10 @@ public class ComponentTest {
 		});
 		// start component
 		c.start();
-		DependencyImpl d1 = new DependencyImpl();
+		AbstractDependency d1 = new SimpleServiceDependency();
 		d1.setCallbacks("add", "remove");
 		d1.setRequired(true);
-		DependencyImpl d2 = new DependencyImpl();
+		AbstractDependency d2 = new SimpleServiceDependency();
 		d2.setCallbacks("add", "remove");
 		d2.setRequired(true);
 		c.add(d1);
@@ -506,7 +506,7 @@ public class ComponentTest {
 				e.step(5);
 			}
 		});
-		DependencyImpl d1 = new DependencyImpl();
+		AbstractDependency d1 = new SimpleServiceDependency();
 		d1.setCallbacks("add", "change", "remove");
 		d1.setRequired(true);
 		// add the dependency to the component
@@ -543,7 +543,7 @@ public class ComponentTest {
 				e.step(5);
 			}
 		});
-		DependencyImpl d1 = new DependencyImpl();
+		AbstractDependency d1 = new SimpleServiceDependency();
 		d1.setCallbacks("add", "change", "remove");
 		d1.setRequired(false);
 		// add the dependency to the component
@@ -581,10 +581,10 @@ public class ComponentTest {
 				e.step();
 			}
 		});
-		DependencyImpl d1 = new DependencyImpl();
+		AbstractDependency d1 = new SimpleServiceDependency();
 		d1.setCallbacks("add", "remove");
 		d1.setRequired(false);
-		DependencyImpl d2 = new DependencyImpl();
+		AbstractDependency d2 = new SimpleServiceDependency();
 		d2.setCallbacks("add", "remove");
 		d2.setRequired(true);
 		// add the dependencies to the component
@@ -632,7 +632,7 @@ public class ComponentTest {
 				e.step(5);
 			}
 		});
-		DependencyImpl d = new DependencyImpl();
+		AbstractDependency d = new SimpleServiceDependency();
 		d.setCallbacks("add", "remove");
 		d.setRequired(true);
 		// add the dependency to the component
@@ -675,7 +675,7 @@ public class ComponentTest {
 			}
 		};		
 		
-		DependencyImpl d = new DependencyImpl();
+		AbstractDependency d = new SimpleServiceDependency();
 		d.setCallbacks(callbackInstance, "add", "remove");
 		d.setRequired(true);
 		// add the dependency to the component

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ConcurrencyTest.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ConcurrencyTest.java?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ConcurrencyTest.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ConcurrencyTest.java Sat Oct 11 15:53:01 2014
@@ -27,8 +27,8 @@ import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ComponentState;
 import org.apache.felix.dm.ComponentStateListener;
 import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.context.AbstractDependency;
 import org.apache.felix.dm.impl.ComponentImpl;
-import org.apache.felix.dm.impl.DependencyImpl;
 import org.apache.felix.dm.impl.EventImpl;
 import org.junit.Assert;
 import org.junit.Test;
@@ -43,9 +43,9 @@ public class ConcurrencyTest {
 	public void createComponentAddDependencyAndListenerAndAddAnotherDependencyInAParallelThread() {
 		final Semaphore s = new Semaphore(0);
 		final ComponentImpl c = new ComponentImpl();
-		final DependencyImpl d = new DependencyImpl();
+		final AbstractDependency d = new SimpleServiceDependency();
 		d.setRequired(true);
-		final DependencyImpl d2 = new DependencyImpl();
+		final AbstractDependency d2 = new SimpleServiceDependency();
 		d2.setRequired(true);
 		final Thread t = new Thread() {
 			public void run() {
@@ -103,7 +103,7 @@ public class ConcurrencyTest {
 			e.execute(new Runnable() {
 				@Override
 				public void run() {
-				    DependencyImpl d = new DependencyImpl();
+				    AbstractDependency d = new SimpleServiceDependency();
 					d.setRequired(true);
 					c.add(d);
 //					d.changed(new EventImpl(true));

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ConfigurationTest.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ConfigurationTest.java?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ConfigurationTest.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ConfigurationTest.java Sat Oct 11 15:53:01 2014
@@ -23,9 +23,9 @@ import java.util.Hashtable;
 
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.context.AbstractDependency;
 import org.apache.felix.dm.impl.ComponentImpl;
 import org.apache.felix.dm.impl.ConfigurationDependencyImpl;
-import org.apache.felix.dm.impl.DependencyImpl;
 import org.apache.felix.dm.impl.EventImpl;
 import org.junit.Test;
 import org.osgi.service.cm.ConfigurationException;
@@ -39,7 +39,7 @@ public class ConfigurationTest extends T
         final ConfigurationDependencyImpl conf = new ConfigurationDependencyImpl();
 
         // Create another required dependency
-        final DependencyImpl requiredDependency = new DependencyImpl();
+        final AbstractDependency requiredDependency = new SimpleServiceDependency();
         requiredDependency.setRequired(true);
         requiredDependency.setCallbacks("addDep", null);
 

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ServiceRaceTest.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ServiceRaceTest.java?rev=1631069&r1=1631068&r2=1631069&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ServiceRaceTest.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/ServiceRaceTest.java Sat Oct 11 15:53:01 2014
@@ -28,10 +28,10 @@ import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ComponentState;
 import org.apache.felix.dm.ComponentStateListener;
 import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.context.AbstractDependency;
 import org.apache.felix.dm.context.Event;
 import org.apache.felix.dm.impl.ComponentImpl;
 import org.apache.felix.dm.impl.ConfigurationDependencyImpl;
-import org.apache.felix.dm.impl.DependencyImpl;
 import org.apache.felix.dm.impl.EventImpl;
 import org.junit.Assert;
 import org.junit.Test;
@@ -95,9 +95,9 @@ public class ServiceRaceTest extends Tes
         client.setImplementation(theClient);
 
         // Create client service dependencies
-        final DependencyImpl[] dependencies = new DependencyImpl[DEPENDENCIES];
+        final AbstractDependency[] dependencies = new AbstractDependency[DEPENDENCIES];
         for (int i = 0; i < DEPENDENCIES; i++) {
-            dependencies[i] = new DependencyImpl();
+            dependencies[i] = new SimpleServiceDependency();
             dependencies[i].setRequired(true);
             dependencies[i].setCallbacks("add", "remove");
             client.add(dependencies[i]);
@@ -140,7 +140,7 @@ public class ServiceRaceTest extends Tes
                 // We *must* do this after having started the component (in a reality, the dependencies can be 
                 // injected only one the tracker has been opened ...
                 for (int i = 0; i < DEPENDENCIES; i++) {
-                    final DependencyImpl dep = dependencies[i];
+                    final AbstractDependency dep = dependencies[i];
                     final Event added = new EventImpl(i);
                     m_threadpool.execute(new Runnable() {
                         public void run() {
@@ -161,7 +161,7 @@ public class ServiceRaceTest extends Tes
 
         // Stop the client and all dependencies concurrently.
         for (int i = 0; i < DEPENDENCIES; i++) {
-            final DependencyImpl dep = dependencies[i];
+            final AbstractDependency dep = dependencies[i];
             final Event removed = new EventImpl(i);
             m_threadpool.execute(new Runnable() {
                 public void run() {

Added: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/SimpleServiceDependency.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/SimpleServiceDependency.java?rev=1631069&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/SimpleServiceDependency.java (added)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/test/test/SimpleServiceDependency.java Sat Oct 11 15:53:01 2014
@@ -0,0 +1,22 @@
+package test;
+
+import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.context.AbstractDependency;
+import org.apache.felix.dm.context.DependencyContext;
+
+public class SimpleServiceDependency extends AbstractDependency<Dependency> {
+    @Override
+    public String getType() {
+        return "SimpleServiceDependency";
+    }
+
+    @Override
+    public String getName() {
+        return "SimpleServiceDependency";
+    }
+
+    @Override
+    public DependencyContext createCopy() {
+        return new SimpleServiceDependency();
+    }
+}