Author: gseitz
Date: Fri May 28 23:49:38 2010
New Revision: 949322

URL: http://svn.apache.org/viewvc?rev=949322&view=rev
Log:
WICKET-2900: look for bean definition in parent contexts
WICKET-2901: only return a primary bean if it's the only one

Modified:
    
wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/SpringBeanLocator.java
    
wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java

Modified: 
wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/SpringBeanLocator.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/SpringBeanLocator.java?rev=949322&r1=949321&r2=949322&view=diff
==============================================================================
--- 
wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/SpringBeanLocator.java
 (original)
+++ 
wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/SpringBeanLocator.java
 Fri May 28 23:49:38 2010
@@ -26,9 +26,11 @@ import org.apache.wicket.proxy.IProxyTar
 import org.apache.wicket.util.lang.Objects;
 import org.apache.wicket.util.lang.WicketObjects;
 import org.apache.wicket.util.string.Strings;
+import org.springframework.beans.factory.BeanFactory;
 import org.springframework.beans.factory.BeanFactoryUtils;
 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 import org.springframework.beans.factory.config.BeanDefinition;
+import 
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 import org.springframework.beans.factory.support.AbstractBeanDefinition;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.AbstractApplicationContext;
@@ -120,12 +122,15 @@ public class SpringBeanLocator implement
                while (it.hasNext())
                {
                        final String possibility = it.next();
-                       BeanDefinition beanDef = 
((AbstractApplicationContext)ctx).getBeanFactory()
-                                       .getBeanDefinition(possibility);
-                       if (BeanFactoryUtils.isFactoryDereference(possibility) 
||
-                                       possibility.startsWith("scopedTarget.") 
|| !beanDef.isAutowireCandidate())
+                       if (ctx instanceof AbstractApplicationContext)
                        {
-                               it.remove();
+                               BeanDefinition beanDef = 
getBeanDefinition(((AbstractApplicationContext)ctx)
+                                               .getBeanFactory(), possibility);
+                               if 
(BeanFactoryUtils.isFactoryDereference(possibility) ||
+                                               
possibility.startsWith("scopedTarget.") || !beanDef.isAutowireCandidate())
+                               {
+                                       it.remove();
+                               }
                        }
                }
 
@@ -137,18 +142,23 @@ public class SpringBeanLocator implement
                {
                        if (ctx instanceof AbstractApplicationContext)
                        {
+                               List<String> primaries = new 
ArrayList<String>();
                                for (String name : names)
                                {
-                                       BeanDefinition beanDef = 
((AbstractApplicationContext)ctx).getBeanFactory()
-                                                       
.getBeanDefinition(name);
+                                       BeanDefinition beanDef = 
getBeanDefinition(((AbstractApplicationContext)ctx)
+                                                       .getBeanFactory(), 
name);
                                        if (beanDef instanceof 
AbstractBeanDefinition)
                                        {
                                                if 
(((AbstractBeanDefinition)beanDef).isPrimary())
                                                {
-                                                       return name;
+                                                       primaries.add(name);
                                                }
                                        }
                                }
+                               if (primaries.size() == 1)
+                               {
+                                       return primaries.get(0);
+                               }
                        }
 
                        StringBuilder msg = new StringBuilder();
@@ -166,6 +176,28 @@ public class SpringBeanLocator implement
                }
        }
 
+       private BeanDefinition 
getBeanDefinition(ConfigurableListableBeanFactory beanFactory,
+                       String name)
+       {
+               if (beanFactory.containsBeanDefinition(name))
+               {
+                       return beanFactory.getBeanDefinition(name);
+               }
+               else
+               {
+                       BeanFactory parent = beanFactory.getParentBeanFactory();
+                       if (parent != null && parent instanceof 
ConfigurableListableBeanFactory)
+                       {
+                               return getBeanDefinition(beanFactory, name);
+                       }
+                       else
+                       {
+                               return null;
+                       }
+               }
+       }
+
+
        /**
         * @return returns whether the bean (the locator is supposed to 
istantiate) is a singleton or
         *         not

Modified: 
wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java?rev=949322&r1=949321&r2=949322&view=diff
==============================================================================
--- 
wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java
 (original)
+++ 
wicket/trunk/wicket-spring/src/main/java/org/apache/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java
 Fri May 28 23:49:38 2010
@@ -29,8 +29,10 @@ import org.apache.wicket.spring.ISpringC
 import org.apache.wicket.spring.SpringBeanLocator;
 import org.apache.wicket.util.lang.Generics;
 import org.apache.wicket.util.string.Strings;
+import org.springframework.beans.factory.BeanFactory;
 import org.springframework.beans.factory.BeanFactoryUtils;
 import org.springframework.beans.factory.config.BeanDefinition;
+import 
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 import org.springframework.beans.factory.support.AbstractBeanDefinition;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.AbstractApplicationContext;
@@ -187,12 +189,15 @@ public class AnnotProxyFieldValueFactory
                while (it.hasNext())
                {
                        final String possibility = it.next();
-                       BeanDefinition beanDef = 
((AbstractApplicationContext)ctx).getBeanFactory()
-                                       .getBeanDefinition(possibility);
-                       if (BeanFactoryUtils.isFactoryDereference(possibility) 
||
-                                       possibility.startsWith("scopedTarget.") 
|| !beanDef.isAutowireCandidate())
+                       if (ctx instanceof AbstractApplicationContext)
                        {
-                               it.remove();
+                               BeanDefinition beanDef = 
getBeanDefinition(((AbstractApplicationContext)ctx)
+                                               .getBeanFactory(), possibility);
+                               if 
(BeanFactoryUtils.isFactoryDereference(possibility) ||
+                                               
possibility.startsWith("scopedTarget.") || !beanDef.isAutowireCandidate())
+                               {
+                                       it.remove();
+                               }
                        }
                }
 
@@ -204,18 +209,23 @@ public class AnnotProxyFieldValueFactory
                {
                        if (ctx instanceof AbstractApplicationContext)
                        {
+                               List<String> primaries = new 
ArrayList<String>();
                                for (String name : names)
                                {
-                                       BeanDefinition beanDef = 
((AbstractApplicationContext)ctx).getBeanFactory()
-                                                       
.getBeanDefinition(name);
+                                       BeanDefinition beanDef = 
getBeanDefinition(((AbstractApplicationContext)ctx)
+                                                       .getBeanFactory(), 
name);
                                        if (beanDef instanceof 
AbstractBeanDefinition)
                                        {
                                                if 
(((AbstractBeanDefinition)beanDef).isPrimary())
                                                {
-                                                       return name;
+                                                       primaries.add(name);
                                                }
                                        }
                                }
+                               if (primaries.size() == 1)
+                               {
+                                       return primaries.get(0);
+                               }
                        }
                        StringBuilder msg = new StringBuilder();
                        msg.append("More than one bean of type [");
@@ -232,6 +242,28 @@ public class AnnotProxyFieldValueFactory
                }
        }
 
+       private BeanDefinition 
getBeanDefinition(ConfigurableListableBeanFactory beanFactory,
+                       String name)
+       {
+               if (beanFactory.containsBeanDefinition(name))
+               {
+                       return beanFactory.getBeanDefinition(name);
+               }
+               else
+               {
+                       BeanFactory parent = beanFactory.getParentBeanFactory();
+                       if (parent != null && parent instanceof 
ConfigurableListableBeanFactory)
+                       {
+                               return getBeanDefinition(beanFactory, name);
+                       }
+                       else
+                       {
+                               return null;
+                       }
+               }
+       }
+
+
        /**
         * @see 
org.apache.wicket.injection.IFieldValueFactory#supportsField(java.lang.reflect.Field)
         */


Reply via email to