Author: gokturk
Date: Wed Jul  4 16:57:15 2012
New Revision: 1357336

URL: http://svn.apache.org/viewvc?rev=1357336&view=rev
Log:
Fix-2 for Felix-3576:
* Code is improved to detect correct BC injection among multiple constructors.
* Fix is moved to its own method.

Modified:
    
felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java

Modified: 
felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java?rev=1357336&r1=1357335&r2=1357336&view=diff
==============================================================================
--- 
felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
 (original)
+++ 
felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
 Wed Jul  4 16:57:15 2012
@@ -203,13 +203,30 @@ public class InstanceManager implements 
             m_handlers[i].init(this, metadata, configuration);
         }
         
-        /* Fix for Felix-3576
-         * BundleContext injection is not registered with the InstanceManager.
-         * We're iterating through factory's all constructors and register 
first
-         * BundleContext parameter as constructor injection. So rest of the 
code
-         * don't have to do anything to handle BundleContext mixed with other
-         * injections.
-         */
+        // Fix for Felix-3576
+        handleBCInjections();
+
+        // Check that the constructor parameter are continuous.
+        if (m_constructorRegistration != null) {
+            for (int i = 0; i < m_constructorRegistration.size(); i++) {
+                if (! m_constructorRegistration.containsKey(new Integer(i))) {
+                    throw new ConfigurationException("The constructor 
parameter " + i + " is not managed");
+                }
+            }
+        }
+    }
+    
+    /**
+     * BundleContext injection is not registered with the InstanceManager.
+     * We're iterating through factory's all constructors and register first
+     * BundleContext parameter as constructor injection. So rest of the code
+     * don't have to do anything to handle BundleContext mixed with other
+     * injections.
+     * 
+     * @throws ConfigurationException
+     */
+    private void handleBCInjections() throws ConfigurationException
+    {
         MethodMetadata[] constructors = 
getFactory().getPojoMetadata().getConstructors();
         for(int i=0; i < constructors.length; i++ )
         {
@@ -218,24 +235,49 @@ public class InstanceManager implements 
                {
                        
if(ctorArguments[index].equals(BundleContext.class.getName()))
                        {
-                               Property contextInjection = 
-                                               new Property("__context", null, 
null, index, null, 
-                                                               
BundleContext.class.getName(), this, null);
+                               //Check if its used with only other injections.
+                               boolean injectionsConsistent = true;
+                               for(int siblingIndex = 0; siblingIndex < 
ctorArguments.length; siblingIndex++)
+                               {
+                                       if(siblingIndex == index){
+                                               continue;
+                                       }
+                                       
+                                       String injectionType = 
ctorArguments[siblingIndex];
+                                       
if(m_constructorRegistration.containsKey(new Integer(siblingIndex)))
+                                       {
+                                               ConstructorInjector 
siblingInjector = 
+                                                               
(ConstructorInjector)m_constructorRegistration.get(new Integer(siblingIndex));
+                                               Class injectorClass = 
siblingInjector.getConstructorParameterType(siblingIndex);
+                                               
+                                               if(injectorClass == null && ! 
injectorClass.getName().equals(injectionType))
+                                               {
+                                                       injectionsConsistent = 
false;
+                                                       break;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               injectionsConsistent = false;
+                                               break;
+                                       }
+                               }
                                
-                               contextInjection.setValue(getContext());        
                        
-                               register(index, contextInjection);
+                               if(injectionsConsistent)
+                               {
+                                       Property contextInjection = 
+                                               new Property("__context", null, 
null, index, null, 
+                                                               
BundleContext.class.getName(), this, null);
+                               
+                               contextInjection.setValue(getContext());        
                        
+                               register(index, contextInjection);
+                               
+                               // We register the first valid BC injection.
+                               break;
+                               }
                        }
                }
         }
-
-        // Check that the constructor parameter are continuous.
-        if (m_constructorRegistration != null) {
-            for (int i = 0; i < m_constructorRegistration.size(); i++) {
-                if (! m_constructorRegistration.containsKey(new Integer(i))) {
-                    throw new ConfigurationException("The constructor 
parameter " + i + " is not managed");
-                }
-            }
-        }
     }
 
     /**


Reply via email to