FELIX-2875 Relaxed the methods a bit and consolidated all logic into a private method that does the real work.

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1079396 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 e89dab0..6f98c76 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
@@ -599,79 +599,95 @@
      * @return this service dependency
      */
     public synchronized ServiceDependency setService(Class serviceName) {
-        ensureNotActive();
-        if (serviceName == null) {
-            throw new IllegalArgumentException("Service name cannot be null.");
-        }
-        m_trackedServiceName = serviceName;
-        m_trackedServiceReference = null;
-        m_trackedServiceFilter = null;
+        setService(serviceName, null, null);
         return this;
     }
     
     /**
      * Sets the name of the service that should be tracked. You can either specify
-     * only the name, or the name and a filter. In the latter case, the filter is used
+     * only the name, only the filter, or the name and a filter.
+     * <p>
+     * If you specify name and filter, the filter is used
      * to track the service and should only return services of the type that was specified
      * in the name. To make sure of this, the filter is actually extended internally to
      * filter on the correct name.
+     * <p>
+     * If you specify only the filter, the name is assumed to be a service of type
+     * <code>Object</code> which means that, when auto configuration is on, instances
+     * of that service will be injected in any field of type <code>Object</code>.
      * 
      * @param serviceName the name of the service
      * @param serviceFilter the filter condition
      * @return this service dependency
      */
     public synchronized ServiceDependency setService(Class serviceName, String serviceFilter) {
-        ensureNotActive();
-        if (serviceName == null) {
-            throw new IllegalArgumentException("Service name cannot be null.");
-        }
-        m_trackedServiceName = serviceName;
-        if (serviceFilter != null) {
-            m_trackedServiceFilterUnmodified = serviceFilter;
-            m_trackedServiceFilter ="(&(" + Constants.OBJECTCLASS + "=" + serviceName.getName() + ")" + serviceFilter + ")";
-        }
-        else {
-            m_trackedServiceFilterUnmodified = null;
-            m_trackedServiceFilter = null;
-        }
-        m_trackedServiceReference = null;
+        setService(serviceName, null, serviceFilter);
         return this;
     }
     
+    /**
+     * Sets the name of the service that should be tracked. The name is assumed to be 
+     * a service of type <code>Object</code> which means that, when auto configuration 
+     * is on, instances of that service will be injected in any field of type 
+     * <code>Object</code>.
+     * 
+     * @param serviceFilter the filter condition
+     * @return this service dependency
+     */
     public synchronized ServiceDependency setService(String serviceFilter) {
-        ensureNotActive();
         if (serviceFilter == null) {
             throw new IllegalArgumentException("Service filter cannot be null.");
         }
-        m_trackedServiceName = Object.class;
-        if (serviceFilter != null) {
-            m_trackedServiceFilterUnmodified = serviceFilter;
-            m_trackedServiceFilter = serviceFilter;
-        }
-        m_trackedServiceReference = null;
+        setService(null, null, serviceFilter);
         return this;
     }
 
     /**
-     * Sets the name of the service that should be tracked. You can either specify
-     * only the name, or the name and a reference. In the latter case, the service reference
-     * is used to track the service and should only return services of the type that was 
-     * specified in the name.
+     * Sets the name of the service that should be tracked. By specifying the service
+     * reference of the service you want to track, you can directly track a single
+     * service. The name you use must match the type of service referred to by the
+     * service reference and it is up to you to make sure that is the case.
      * 
      * @param serviceName the name of the service
      * @param serviceReference the service reference to track
      * @return this service dependency
      */
     public synchronized ServiceDependency setService(Class serviceName, ServiceReference serviceReference) {
+        setService(serviceName, serviceReference, null);
+        return this;
+    }
+
+    /** Internal method to set the name, service reference and/or filter. */
+    private void setService(Class serviceName, ServiceReference serviceReference, String serviceFilter) {
         ensureNotActive();
         if (serviceName == null) {
-            throw new IllegalArgumentException("Service name cannot be null.");
+            m_trackedServiceName = Object.class;
         }
-        m_trackedServiceName = serviceName;
-        m_trackedServiceReference = serviceReference;
-        m_trackedServiceFilterUnmodified = null;
-        m_trackedServiceFilter = null;
-        return this;
+        else {
+            m_trackedServiceName = serviceName;
+        }
+        if (serviceFilter != null) {
+            m_trackedServiceFilterUnmodified = serviceFilter;
+            if (serviceName == null) {
+                m_trackedServiceFilter = serviceFilter;
+            }
+            else {
+                m_trackedServiceFilter ="(&(" + Constants.OBJECTCLASS + "=" + serviceName.getName() + ")" + serviceFilter + ")";
+            }
+        }
+        else {
+            m_trackedServiceFilterUnmodified = null;
+            m_trackedServiceFilter = null;
+        }
+        if (serviceReference != null) {
+            m_trackedServiceReference = serviceReference;
+            if (serviceFilter != null) {
+                throw new IllegalArgumentException("Cannot specify both a filter and a service reference.");
+            }
+        }
+        else {
+            m_trackedServiceReference = null;
+        }
     }
     
     /**