You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2009/04/25 20:28:12 UTC

svn commit: r768572 - in /wicket/trunk/wicket-guice/src: main/java/org/apache/wicket/guice/ test/java/org/apache/wicket/guice/

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;