FELIX-3680 don't recalculate size when not needed, don't set target filter from metadata when config required

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1397887 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
index 12c9197..7329463 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
@@ -1049,11 +1049,14 @@
 
     private void enableDependencyManagers() throws InvalidSyntaxException
     {
-        Iterator it = getDependencyManagers();
-        while ( it.hasNext() )
+        if ( !m_componentMetadata.isConfigurationRequired() )
         {
-            DependencyManager dm = (DependencyManager) it.next();
-            dm.enable();
+            Iterator it = getDependencyManagers();
+            while ( it.hasNext() )
+            {
+                DependencyManager dm = (DependencyManager) it.next();
+                dm.enable();
+            }
         }
     }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
index b6a8c5a..0b5bd42 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
@@ -79,6 +79,8 @@
     private final Collection<ServiceReference> added = new ArrayList<ServiceReference>();
     private final Collection<ServiceReference> removed = new ArrayList<ServiceReference>();
 
+    private boolean registered;
+
 
     /**
      * Constructor that receives several parameters.
@@ -649,8 +651,7 @@
      */
     void disable()
     {
-        BundleContext context = m_componentManager.getActivator().getBundleContext();
-        context.removeServiceListener( this );
+        unregisterServiceListener();
 
         m_size.set( 0 );
     }
@@ -1479,35 +1480,39 @@
         {
             m_componentManager.log( LogService.LOG_DEBUG, "No change in target property for dependency {0}", new Object[]
                     {m_dependencyMetadata.getName()}, null );
+            if (registered)
+            {
+                return;
+            }
+        }
+        m_target = target;
+
+        if ( registered )
+        {
+            unregisterServiceListener();
+        }
+        //compute the new target filter while we wait for other threads to complete.
+        if ( target != null )
+        {
+            m_componentManager.log( LogService.LOG_DEBUG, "Setting target property for dependency {0} to {1}", new Object[]
+                    {m_dependencyMetadata.getName(), target}, null );
+            try
+            {
+                m_targetFilter = m_componentManager.getActivator().getBundleContext().createFilter( target );
+            }
+            catch ( InvalidSyntaxException ise )
+            {
+                m_componentManager.log( LogService.LOG_ERROR, "Invalid syntax in target property for dependency {0} to {1}", new Object[]
+                        {m_dependencyMetadata.getName(), target}, null );
+                // log
+                m_targetFilter = null;
+            }
         }
         else
         {
-            m_target = target;
-
-            m_componentManager.getActivator().getBundleContext().removeServiceListener( this );
-            //compute the new target filter while we wait for other threads to complete.
-            if ( target != null )
-            {
-                m_componentManager.log( LogService.LOG_DEBUG, "Setting target property for dependency {0} to {1}", new Object[]
-                        {m_dependencyMetadata.getName(), target}, null );
-                try
-                {
-                    m_targetFilter = m_componentManager.getActivator().getBundleContext().createFilter( target );
-                }
-                catch ( InvalidSyntaxException ise )
-                {
-                    m_componentManager.log( LogService.LOG_ERROR, "Invalid syntax in target property for dependency {0} to {1}", new Object[]
-                            {m_dependencyMetadata.getName(), target}, null );
-                    // log
-                    m_targetFilter = null;
-                }
-            }
-            else
-            {
-                m_componentManager.log( LogService.LOG_DEBUG, "Clearing target property for dependency {0}", new Object[]
-                        {m_dependencyMetadata.getName()}, null );
-                m_targetFilter = null;
-            }
+            m_componentManager.log( LogService.LOG_DEBUG, "Clearing target property for dependency {0}", new Object[]
+                    {m_dependencyMetadata.getName()}, null );
+            m_targetFilter = null;
         }
         //wait for events to finish processing
         synchronized ( added )
@@ -1553,8 +1558,7 @@
         }
         boolean active = m_componentManager.getDependencyMap() != null;
         // register the service listener
-        String filterString = "(" + Constants.OBJECTCLASS + "=" + m_dependencyMetadata.getInterface() + ")";
-        m_componentManager.getActivator().getBundleContext().addServiceListener( this, filterString );
+        registerServiceListener();
         Collection<ServiceReference> toAdd = new ArrayList<ServiceReference>();
 
         synchronized ( enableLock )
@@ -1601,6 +1605,19 @@
 
     }
 
+    private void registerServiceListener() throws InvalidSyntaxException
+    {
+        String filterString = "(" + Constants.OBJECTCLASS + "=" + m_dependencyMetadata.getInterface() + ")";
+        m_componentManager.getActivator().getBundleContext().addServiceListener( this, filterString );
+        registered = true;
+    }
+
+    private void unregisterServiceListener()
+    {
+        m_componentManager.getActivator().getBundleContext().removeServiceListener( this );
+        registered = false;
+    }
+
 
     /**
      * Returns the target filter of this dependency as a string or