FELIX-4297 Make sure that all EdgeInfos are completely unlocked before a failed activation attempt is abandoned

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1536844 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java
index 80a48dc..66a2a62 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/EdgeInfo.java
@@ -121,6 +121,14 @@
     {
         this.open = open;
     }
+    
+    public void ignore()
+    {
+        open = Integer.MAX_VALUE;
+        close = Integer.MAX_VALUE - 1;
+        openLatch.countDown();
+        closeLatch.countDown();
+    }
 
     public boolean outOfRange( int trackingCount )
     {
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
index dc72b8c..0838bb2 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
@@ -266,34 +266,47 @@
 
         // 4. Bind the target services
 
+        DependencyManager<S, ?> failedDm = null;
         for ( DependencyManager<S, ?> dm: getDependencyManagers())
         {
-            // if a dependency turned unresolved since the validation check,
-            // creating the instance fails here, so we deactivate and return
-            // null.
-            boolean open = dm.open( implementationObject, componentContext.getEdgeInfo( dm ) );
-            if ( !open )
+            if ( failedDm == null )
             {
-                log( LogService.LOG_ERROR, "Cannot create component instance due to failure to bind reference {0}",
-                        new Object[]
-                                {dm.getName()}, null );
-
-                // make sure, we keep no bindings. Only close the dm's we opened.
-                boolean skip = true;
-                for ( DependencyManager md: getReversedDependencyManagers() )
+                // if a dependency turned unresolved since the validation check,
+                // creating the instance fails here, so we deactivate and return
+                // null.
+                boolean open = dm.open( implementationObject, componentContext.getEdgeInfo( dm ) );
+                if ( !open )
                 {
-                    if ( skip && dm == md ) {
-                        skip = false;
-                    }
-                    if ( !skip )
-                    {
-                        md.close( implementationObject, componentContext.getEdgeInfo( md ) );
-                    }
-                }
+                    log( LogService.LOG_ERROR, "Cannot create component instance due to failure to bind reference {0}",
+                            new Object[] { dm.getName() }, null );
 
-                setter.resetImplementationObject( implementationObject );
-                return null;
+                    failedDm = dm;
+
+                }
             }
+            else
+            {
+                componentContext.getEdgeInfo( dm ).ignore();
+            }
+        }
+        if (failedDm != null)
+        {
+            // make sure, we keep no bindings. Only close the dm's we opened.
+            boolean skip = true;
+            for ( DependencyManager md: getReversedDependencyManagers() )
+            {
+                if ( skip && failedDm == md )
+                {
+                    skip = false;
+                }
+                if ( !skip )
+                {
+                    md.close( implementationObject, componentContext.getEdgeInfo( md ) );
+                }
+            }
+            setter.resetImplementationObject( implementationObject );
+            return null;
+
         }
 
         // 5. Call the activate method, if present