FELIX-1733 Prevent recreation of dead components when the components
of a ConfiguredComponentHolder have to be disposed off

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@824123 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/config/ConfiguredComponentHolder.java b/scr/src/main/java/org/apache/felix/scr/impl/config/ConfiguredComponentHolder.java
index 2e88527..49e729d 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/config/ConfiguredComponentHolder.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/config/ConfiguredComponentHolder.java
@@ -264,10 +264,15 @@
 
     public void disposeComponents( final int reason )
     {
+        // FELIX-1733: get a copy of the single component and clear
+        // the field to prevent recreation in disposed(ICM)
+        final ImmediateComponentManager singleComponent = m_singleComponent;
+        m_singleComponent = null;
+
         final ImmediateComponentManager[] cms = getComponentManagers( true );
         if ( cms == null )
         {
-            m_singleComponent.dispose( reason );
+            singleComponent.dispose( reason );
         }
         else
         {
@@ -284,12 +289,15 @@
         // ensure the component is removed from the components map
         synchronized ( m_components )
         {
-            for ( Iterator vi = m_components.values().iterator(); vi.hasNext(); )
+            if ( !m_components.isEmpty() )
             {
-                if ( component == vi.next() )
+                for ( Iterator vi = m_components.values().iterator(); vi.hasNext(); )
                 {
-                    vi.remove();
-                    break;
+                    if ( component == vi.next() )
+                    {
+                        vi.remove();
+                        break;
+                    }
                 }
             }
         }