Author: ivaynberg
Date: Wed Jan 31 13:08:08 2007
New Revision: 501997

URL: http://svn.apache.org/viewvc?view=rev&rev=501997
Log:
WICKET-28

Modified:
    
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/main/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java
    
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/test/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactoryTest.java

Modified: 
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/main/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/main/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java?view=diff&rev=501997&r1=501996&r2=501997
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/main/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/main/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactory.java
 Wed Jan 31 13:08:08 2007
@@ -25,11 +25,12 @@
 import wicket.spring.SpringBeanLocator;
 
 /**
- * [EMAIL PROTECTED] IFieldValueFactory} that uses [EMAIL PROTECTED] 
LazyInitProxyFactory} to create proxies for Spring
- * dependencies based on the [EMAIL PROTECTED] SpringBean} annotation applied 
to a field.
- * This class is usually used by the [EMAIL PROTECTED] AnnotSpringInjector} to 
inject
- * objects with lazy init proxies. However, this class can be used on its own 
to
- * create proxies for any field decorated with a [EMAIL PROTECTED] SpringBean} 
annotation.
+ * [EMAIL PROTECTED] IFieldValueFactory} that uses [EMAIL PROTECTED] 
LazyInitProxyFactory} to create
+ * proxies for Spring dependencies based on the [EMAIL PROTECTED] SpringBean} 
annotation
+ * applied to a field. This class is usually used by the
+ * [EMAIL PROTECTED] AnnotSpringInjector} to inject objects with lazy init 
proxies.
+ * However, this class can be used on its own to create proxies for any field
+ * decorated with a [EMAIL PROTECTED] SpringBean} annotation.
  * <p>
  * Example:
  * 
@@ -39,9 +40,9 @@
  * IDependency dependency = (IDependency) factory.getFieldValue(field, obj);
  * </pre>
  * 
- * In the example above the <code>dependency</code> object returned is a lazy 
init proxy
- * that will look up the actual IDependency bean from spring context upon first
- * access to one of the methods.
+ * In the example above the <code>dependency</code> object returned is a lazy
+ * init proxy that will look up the actual IDependency bean from spring context
+ * upon first access to one of the methods.
  * <p>
  * This class will also cache any produced proxies so that the same proxy is
  * always returned for the same spring dependency. This helps cut down on
@@ -55,21 +56,22 @@
  * @author Igor Vaynberg (ivaynberg)
  * 
  */
-public class AnnotProxyFieldValueFactory implements IFieldValueFactory
-{
+public class AnnotProxyFieldValueFactory implements IFieldValueFactory {
        private ISpringContextLocator contextLocator;
 
        private final ConcurrentHashMap<SpringBeanLocator, Object> cache = new 
ConcurrentHashMap<SpringBeanLocator, Object>();
 
+       /** fail fast tag, see [EMAIL PROTECTED] #setFailFast(boolean)} */
+       private boolean failFast = true;
+
        /**
         * @param contextLocator
         *            spring context locator
         */
-       public AnnotProxyFieldValueFactory(ISpringContextLocator contextLocator)
-       {
-               if (contextLocator == null)
-               {
-                       throw new IllegalArgumentException("[contextLocator] 
argument cannot be null");
+       public AnnotProxyFieldValueFactory(ISpringContextLocator 
contextLocator) {
+               if (contextLocator == null) {
+                       throw new IllegalArgumentException(
+                                       "[contextLocator] argument cannot be 
null");
                }
                this.contextLocator = contextLocator;
        }
@@ -78,33 +80,31 @@
         * @see 
wicket.injection.IFieldValueFactory#getFieldValue(java.lang.reflect.Field,
         *      java.lang.Object)
         */
-       public Object getFieldValue(Field field, Object fieldOwner)
-       {
+       public Object getFieldValue(Field field, Object fieldOwner) {
 
-               if (field.isAnnotationPresent(SpringBean.class))
-               {
+               if (field.isAnnotationPresent(SpringBean.class)) {
                        SpringBean annot = 
field.getAnnotation(SpringBean.class);
-                       SpringBeanLocator locator = new 
SpringBeanLocator(annot.name(), field
-                                       .getType(), contextLocator);
+                       SpringBeanLocator locator = new 
SpringBeanLocator(annot.name(),
+                                       field.getType(), contextLocator);
 
-                       if (cache.containsKey(locator))
-                       {
+                       if (cache.containsKey(locator)) {
                                return cache.get(locator);
                        }
 
                        // fail early - see if the locator can locate the 
spring bean
-                       testLocator(locator, fieldOwner, field);
-                       
-                       Object proxy = 
LazyInitProxyFactory.createProxy(field.getType(), locator);
+                       if (failFast) {
+                               testLocator(locator, fieldOwner, field);
+                       }
+
+                       Object proxy = 
LazyInitProxyFactory.createProxy(field.getType(),
+                                       locator);
                        cache.put(locator, proxy);
                        return proxy;
-               }
-               else
-               {
+               } else {
                        return null;
                }
        }
-       
+
        /**
         * Tests if the locator can retrieve the bean it is responsible for.
         * 
@@ -112,34 +112,36 @@
         * @param fieldOwner
         * @param field
         */
-       private void testLocator(SpringBeanLocator locator, Object fieldOwner, 
Field field)
-       {
-               try
-               {
+       private void testLocator(SpringBeanLocator locator, Object fieldOwner,
+                       Field field) {
+               try {
                        locator.locateProxyTarget();
-               }
-               catch (Throwable e)
-               {
+               } catch (Throwable e) {
                        String errorMessage = "Could not locate spring bean of 
class [["
                                        + locator.getBeanType().getName() + "]] 
";
-                       if (locator.getBeanName() != null && 
locator.getBeanName().length() > 0)
-                       {
+                       if (locator.getBeanName() != null
+                                       && locator.getBeanName().length() > 0) {
                                errorMessage += "and id [[" + 
locator.getBeanName() + "]] ";
                        }
                        errorMessage += "needed in class [["
-                                       + fieldOwner.getClass().getName() + "]] 
field [[" + field.getName()
-                                       + "]]";
+                                       + fieldOwner.getClass().getName() + "]] 
field [["
+                                       + field.getName() + "]]";
                        throw new RuntimeException(errorMessage, e);
                }
        }
 
-
        /**
         * @see 
wicket.injection.IFieldValueFactory#supportsField(java.lang.reflect.Field)
         */
-       public boolean supportsField(Field field)
-       {
+       public boolean supportsField(Field field) {
                return field.isAnnotationPresent(SpringBean.class);
        }
 
+       /**
+        * @param failFast
+        *            true if the locator fails if a bean can't be located
+        */
+       public void setFailFast(boolean failFast) {
+               this.failFast = failFast;
+       }
 }

Modified: 
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/test/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactoryTest.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/test/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactoryTest.java?view=diff&rev=501997&r1=501996&r2=501997
==============================================================================
--- 
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/test/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactoryTest.java
 (original)
+++ 
incubator/wicket/branches/wicket-1.x/wicket-spring-annot/src/test/java/wicket/spring/injection/annot/AnnotProxyFieldValueFactoryTest.java
 Wed Jan 31 13:08:08 2007
@@ -116,4 +116,30 @@
                        // noop
                }
        }
+       
+       public void testFailsIfBeanWithIdIsNotFound() throws Exception
+       {
+               InjectableWithReferenceToNonexistingBean obj = new 
InjectableWithReferenceToNonexistingBean();
+               Field field = obj.getClass().getDeclaredField("nonExisting");
+               try 
+               {
+                       factory.getFieldValue(field, obj);
+                       fail();
+               }
+               catch (RuntimeException e) {                    
+               }
+       }
+       
+       public void testSucceedsIfBeanWithIdIsNotFoundWhenFailFastIsDisabled() 
throws Exception
+       {
+               InjectableWithReferenceToNonexistingBean obj = new 
InjectableWithReferenceToNonexistingBean();
+               Field field = obj.getClass().getDeclaredField("nonExisting");
+               factory.setFailFast(false);
+               factory.getFieldValue(field, obj);
+       }
+       
+       static class InjectableWithReferenceToNonexistingBean {
+               @SpringBean(name="nonExisting")
+               private Bean nonExisting;
+       }
 }


Reply via email to