Author: ivaynberg
Date: Sat Apr 25 18:28:11 2009
New Revision: 768572

URL: http://svn.apache.org/viewvc?rev=768572&view=rev
Log:
WICKET-2241 Guice integration doesn't honour optional bindings

Modified:
    
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceComponentInjector.java
    
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java
    
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/InjectionFlagCachingGuiceComponentInjector.java
    
wicket/trunk/wicket-guice/src/test/java/org/apache/wicket/guice/GuiceInjectorTest.java
    
wicket/trunk/wicket-guice/src/test/java/org/apache/wicket/guice/TestComponent.java

Modified: 
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceComponentInjector.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceComponentInjector.java?rev=768572&r1=768571&r2=768572&view=diff
==============================================================================
--- 
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceComponentInjector.java
 (original)
+++ 
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceComponentInjector.java
 Sat Apr 25 18:28:11 2009
@@ -104,14 +104,15 @@
                        Field[] currentFields = current.getDeclaredFields();
                        for (final Field field : currentFields)
                        {
-                               if (!Modifier.isStatic(field.getModifiers()) &&
-                                               
field.getAnnotation(Inject.class) != null)
+                               Inject injectAnnotation = 
field.getAnnotation(Inject.class);
+                               if (!Modifier.isStatic(field.getModifiers()) && 
injectAnnotation != null)
                                {
                                        try
                                        {
                                                Annotation bindingAnnotation = 
findBindingAnnotation(field.getAnnotations());
                                                Object proxy = 
LazyInitProxyFactory.createProxy(field.getType(),
-                                                               new 
GuiceProxyTargetLocator(field, bindingAnnotation));
+                                                               new 
GuiceProxyTargetLocator(field, bindingAnnotation,
+                                                                               
injectAnnotation.optional()));
 
                                                if (!field.isAccessible())
                                                {
@@ -136,8 +137,8 @@
                        Method[] currentMethods = current.getDeclaredMethods();
                        for (final Method method : currentMethods)
                        {
-                               if (!Modifier.isStatic(method.getModifiers()) &&
-                                               
method.getAnnotation(Inject.class) != null)
+                               Inject injectAnnotation = 
method.getAnnotation(Inject.class);
+                               if (!Modifier.isStatic(method.getModifiers()) 
&& injectAnnotation != null)
                                {
                                        Annotation[][] paramAnnotations = 
method.getParameterAnnotations();
                                        Class< ? >[] paramTypes = 
method.getParameterTypes();
@@ -158,7 +159,8 @@
                                                {
                                                        Annotation 
bindingAnnotation = findBindingAnnotation(paramAnnotations[i]);
                                                        args[i] = 
LazyInitProxyFactory.createProxy(paramTypes[i],
-                                                                       new 
GuiceProxyTargetLocator(method, i, bindingAnnotation));
+                                                                       new 
GuiceProxyTargetLocator(method, i, bindingAnnotation,
+                                                                               
        injectAnnotation.optional()));
                                                }
                                                catch 
(MoreThanOneBindingException e)
                                                {

Modified: 
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java?rev=768572&r1=768571&r2=768572&view=diff
==============================================================================
--- 
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java
 (original)
+++ 
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java
 Sat Apr 25 18:28:11 2009
@@ -25,6 +25,7 @@
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.proxy.IProxyTargetLocator;
 
+import com.google.inject.Injector;
 import com.google.inject.Key;
 import com.google.inject.TypeLiteral;
 
@@ -34,23 +35,28 @@
 
        private final Annotation bindingAnnotation;
 
+       private final boolean optional;
+
        private final String[] data;
 
        /** index of argument in the method being injected, or -1 for field */
        private final int argIndex;
 
-       GuiceProxyTargetLocator(Field field, Annotation bindingAnnotation)
+       GuiceProxyTargetLocator(Field field, Annotation bindingAnnotation, 
boolean optional)
        {
                this.bindingAnnotation = bindingAnnotation;
+               this.optional = optional;
                data = new String[2];
                data[0] = field.getDeclaringClass().getName();
                data[1] = field.getName();
                argIndex = -1;
        }
 
-       GuiceProxyTargetLocator(Method method, int argIndex, Annotation 
bindingAnnotation)
+       GuiceProxyTargetLocator(Method method, int argIndex, Annotation 
bindingAnnotation,
+                       boolean optional)
        {
                this.bindingAnnotation = bindingAnnotation;
+               this.optional = optional;
                data = new String[2 + method.getParameterTypes().length];
                data[0] = method.getDeclaringClass().getName();
                data[1] = method.getName();
@@ -105,6 +111,16 @@
                {
                        key = Key.get(TypeLiteral.get(type), bindingAnnotation);
                }
-               return holder.getInjector().getInstance(key);
+
+               Injector injector = holder.getInjector();
+
+               // if the Inject annotation is marked optional and no binding 
is found
+               // then skip this injection (WICKET-2241)
+               if (optional && injector.getBinding(key) == null)
+               {
+                       return null;
+               }
+
+               return injector.getInstance(key);
        }
 }

Modified: 
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/InjectionFlagCachingGuiceComponentInjector.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/InjectionFlagCachingGuiceComponentInjector.java?rev=768572&r1=768571&r2=768572&view=diff
==============================================================================
--- 
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/InjectionFlagCachingGuiceComponentInjector.java
 (original)
+++ 
wicket/trunk/wicket-guice/src/main/java/org/apache/wicket/guice/InjectionFlagCachingGuiceComponentInjector.java
 Sat Apr 25 18:28:11 2009
@@ -80,14 +80,16 @@
                        Field[] currentFields = current.getDeclaredFields();
                        for (final Field field : currentFields)
                        {
-                               if (field.getAnnotation(Inject.class) != null)
+                               Inject injectAnnotation = 
field.getAnnotation(Inject.class);
+                               if (injectAnnotation != null)
                                {
                                        actualDoInject = true;
                                        try
                                        {
                                                Annotation bindingAnnotation = 
findBindingAnnotation(field.getAnnotations());
                                                Object proxy = 
LazyInitProxyFactory.createProxy(field.getType(),
-                                                               new 
GuiceProxyTargetLocator(field, bindingAnnotation));
+                                                               new 
GuiceProxyTargetLocator(field, bindingAnnotation,
+                                                                               
injectAnnotation.optional()));
                                                if (!field.isAccessible())
                                                {
                                                        
field.setAccessible(true);
@@ -112,7 +114,8 @@
                        Method[] currentMethods = current.getDeclaredMethods();
                        for (final Method method : currentMethods)
                        {
-                               if (method.getAnnotation(Inject.class) != null)
+                               Inject injectAnnotation = 
method.getAnnotation(Inject.class);
+                               if (injectAnnotation != null)
                                {
                                        actualDoInject = true;
                                        Annotation[][] paramAnnotations = 
method.getParameterAnnotations();
@@ -134,7 +137,8 @@
                                                {
                                                        Annotation 
bindingAnnotation = findBindingAnnotation(paramAnnotations[i]);
                                                        args[i] = 
LazyInitProxyFactory.createProxy(paramTypes[i],
-                                                                       new 
GuiceProxyTargetLocator(method, i, bindingAnnotation));
+                                                                       new 
GuiceProxyTargetLocator(method, i, bindingAnnotation,
+                                                                               
        injectAnnotation.optional()));
                                                }
                                                catch 
(MoreThanOneBindingException e)
                                                {

Modified: 
wicket/trunk/wicket-guice/src/test/java/org/apache/wicket/guice/GuiceInjectorTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-guice/src/test/java/org/apache/wicket/guice/GuiceInjectorTest.java?rev=768572&r1=768571&r2=768572&view=diff
==============================================================================
--- 
wicket/trunk/wicket-guice/src/test/java/org/apache/wicket/guice/GuiceInjectorTest.java
 (original)
+++ 
wicket/trunk/wicket-guice/src/test/java/org/apache/wicket/guice/GuiceInjectorTest.java
 Sat Apr 25 18:28:11 2009
@@ -115,6 +115,7 @@
        private void doChecksForComponent(TestComponent component)
        {
                assertEquals(ITestService.RESULT, 
component.getInjectedField().getString());
+               assertEquals(null, component.getInjectedOptionalField());
                assertEquals(ITestService.RESULT_RED, 
component.getInjectedFieldRed().getString());
                assertEquals(ITestService.RESULT_BLUE, 
component.getInjectedFieldBlue().getString());
                assertEquals(ITestService.RESULT, 
component.getInjectedMethod().getString());

Modified: 
wicket/trunk/wicket-guice/src/test/java/org/apache/wicket/guice/TestComponent.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-guice/src/test/java/org/apache/wicket/guice/TestComponent.java?rev=768572&r1=768571&r2=768572&view=diff
==============================================================================
--- 
wicket/trunk/wicket-guice/src/test/java/org/apache/wicket/guice/TestComponent.java
 (original)
+++ 
wicket/trunk/wicket-guice/src/test/java/org/apache/wicket/guice/TestComponent.java
 Sat Apr 25 18:28:11 2009
@@ -23,6 +23,7 @@
 
 import com.google.inject.Inject;
 import com.google.inject.Provider;
+import com.google.inject.name.Named;
 
 public class TestComponent extends Component
 {
@@ -31,6 +32,10 @@
        @Inject
        private ITestService injectedField;
 
+       @Inject(optional = true)
+       @Named("optional")
+       private String injectedOptionalField;
+
        @Inject
        @Red
        private ITestService injectedFieldRed;
@@ -91,6 +96,16 @@
                return injectedFieldProvider;
        }
 
+       /**
+        * Gets injectedOptionalField.
+        * 
+        * @return injectedOptionalField
+        */
+       public String getInjectedOptionalField()
+       {
+               return injectedOptionalField;
+       }
+
        public Map<String, String> getInjectedTypeLiteralField()
        {
                return injectedTypeLiteralField;


Reply via email to