You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2015/06/25 10:39:00 UTC

[1/2] wicket git commit: WICKET-5935 IoC Guice: cache proxies and fail on creation when binding is missing

Repository: wicket
Updated Branches:
  refs/heads/master 17be97395 -> 7d90522c4


WICKET-5935 IoC Guice: cache proxies and fail on creation when binding is missing

- cache proxies in the same way the spring ioc caches them

- If a bean has no binding the exception is now throw on construction
instead of when that bean/proxy is used.

(cherry picked from commit 9d37302580511e75d271a72f523ab97dc02ff261)


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/6dae9283
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/6dae9283
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/6dae9283

Branch: refs/heads/master
Commit: 6dae92835e9c70206b5e127be59064eb547337fe
Parents: 17be973
Author: Thomas Matthijs <th...@actonomy.com>
Authored: Wed Jun 24 15:26:45 2015 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Jun 25 11:34:32 2015 +0300

----------------------------------------------------------------------
 .../wicket/guice/GuiceFieldValueFactory.java    | 35 +++++--
 .../wicket/guice/GuiceProxyTargetLocator.java   | 98 +++++++++++++++-----
 .../guice/JavaxInjectGuiceInjectorTest.java     | 25 +++--
 .../wicket/guice/JavaxInjectTestComponent.java  | 13 ---
 4 files changed, 123 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/6dae9283/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceFieldValueFactory.java
----------------------------------------------------------------------
diff --git a/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceFieldValueFactory.java b/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceFieldValueFactory.java
index 1e63752..2726b2a 100644
--- a/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceFieldValueFactory.java
+++ b/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceFieldValueFactory.java
@@ -19,21 +19,25 @@ package org.apache.wicket.guice;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
+import java.util.concurrent.ConcurrentMap;
 
 import javax.inject.Qualifier;
 
 import org.apache.wicket.injection.IFieldValueFactory;
-import org.apache.wicket.proxy.IProxyTargetLocator;
 import org.apache.wicket.proxy.LazyInitProxyFactory;
 
 import com.google.inject.BindingAnnotation;
 import com.google.inject.Inject;
+import org.apache.wicket.util.lang.Generics;
 
 /**
  *
  */
 public class GuiceFieldValueFactory implements IFieldValueFactory
 {
+	private final ConcurrentMap<GuiceProxyTargetLocator, Object> cache = Generics.newConcurrentHashMap();
+	private static final Object NULL_SENTINEL = new Object();
+
 	private final boolean wrapInProxies;
 
 	/**
@@ -64,15 +68,34 @@ public class GuiceFieldValueFactory implements IFieldValueFactory
 				{
 					boolean optional = injectAnnotation != null && injectAnnotation.optional();
 					Annotation bindingAnnotation = findBindingAnnotation(field.getAnnotations());
-					final IProxyTargetLocator locator = new GuiceProxyTargetLocator(field, bindingAnnotation, optional);
+					final GuiceProxyTargetLocator locator = new GuiceProxyTargetLocator(field, bindingAnnotation, optional);
+
+					Object cachedValue = cache.get(locator);
+					if (cachedValue != null)
+					{
+						return cachedValue;
+					}
 
-					if (wrapInProxies)
+					target = locator.locateProxyTarget();
+					if (target == null)
 					{
-						target = LazyInitProxyFactory.createProxy(field.getType(), locator);
+						// Optional without a binding, return null
 					}
 					else
 					{
-						target = locator.locateProxyTarget();
+						if (wrapInProxies)
+						{
+							target = LazyInitProxyFactory.createProxy(field.getType(), locator);
+						}
+					}
+
+					if (locator.isSingletonScope())
+					{
+						Object tmpTarget = cache.putIfAbsent(locator, target == null ? NULL_SENTINEL : target);
+						if (tmpTarget != null)
+						{
+							target = tmpTarget;
+						}
 					}
 
 					if (!field.isAccessible())
@@ -89,7 +112,7 @@ public class GuiceFieldValueFactory implements IFieldValueFactory
 			}
 		}
 
-		return target;
+		return target == NULL_SENTINEL ? null : target;
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/6dae9283/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java
----------------------------------------------------------------------
diff --git a/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java b/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java
index a7b63b4..bc2be96 100644
--- a/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java
+++ b/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java
@@ -20,13 +20,16 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.lang.reflect.Type;
 
+import com.google.inject.ConfigurationException;
 import com.google.inject.Injector;
 import com.google.inject.Key;
+import com.google.inject.Scopes;
 import com.google.inject.TypeLiteral;
 import org.apache.wicket.Application;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.proxy.IProxyTargetLocator;
 import org.apache.wicket.core.util.lang.WicketObjects;
+import org.apache.wicket.util.lang.Objects;
 
 class GuiceProxyTargetLocator implements IProxyTargetLocator
 {
@@ -40,8 +43,10 @@ class GuiceProxyTargetLocator implements IProxyTargetLocator
 
 	private final String fieldName;
 
+	private Boolean isSingletonCache = null;
+
 	public GuiceProxyTargetLocator(final Field field, final Annotation bindingAnnotation,
-	                               final boolean optional)
+								   final boolean optional)
 	{
 		this.bindingAnnotation = bindingAnnotation;
 		this.optional = optional;
@@ -52,9 +57,34 @@ class GuiceProxyTargetLocator implements IProxyTargetLocator
 	@Override
 	public Object locateProxyTarget()
 	{
-		final GuiceInjectorHolder holder = Application.get().getMetaData(
-				GuiceInjectorHolder.INJECTOR_KEY);
+		Injector injector = getInjector();
+
+		final Key<?> key = newGuiceKey();
+
+		// if the Inject annotation is marked optional and no binding is found
+		// then skip this injection (WICKET-2241)
+		if (optional)
+		{
+			// Guice 2.0 throws a ConfigurationException if no binding is find while 1.0 simply
+			// returns null.
+			try
+			{
+				if (injector.getBinding(key) == null)
+				{
+					return null;
+				}
+			}
+			catch (RuntimeException e)
+			{
+				return null;
+			}
+		}
+
+		return injector.getInstance(key);
+	}
 
+	private Key<?> newGuiceKey()
+	{
 		final Type type;
 		try
 		{
@@ -65,43 +95,67 @@ class GuiceProxyTargetLocator implements IProxyTargetLocator
 		catch (Exception e)
 		{
 			throw new WicketRuntimeException("Error accessing member: " + fieldName +
-					" of class: " + className, e);
+				" of class: " + className, e);
 		}
 
 		// using TypeLiteral to retrieve the key gives us automatic support for
 		// Providers and other injectable TypeLiterals
-		final Key<?> key;
-
 		if (bindingAnnotation == null)
 		{
-			key = Key.get(TypeLiteral.get(type));
+			return Key.get(TypeLiteral.get(type));
 		}
 		else
 		{
-			key = Key.get(TypeLiteral.get(type), bindingAnnotation);
+			return Key.get(TypeLiteral.get(type), bindingAnnotation);
 		}
+	}
 
-		Injector injector = holder.getInjector();
-
-		// if the Inject annotation is marked optional and no binding is found
-		// then skip this injection (WICKET-2241)
-		if (optional)
+	public boolean isSingletonScope()
+	{
+		if (isSingletonCache == null)
 		{
-			// Guice 2.0 throws a ConfigurationException if no binding is find while 1.0 simply
-			// returns null.
 			try
 			{
-				if (injector.getBinding(key) == null)
-				{
-					return null;
-				}
+				isSingletonCache = Scopes.isSingleton(getInjector().getBinding(newGuiceKey()));
 			}
-			catch (RuntimeException e)
+			catch (ConfigurationException ex)
 			{
-				return null;
+				// No binding, if optional can pretend this is null singleton
+				if (optional)
+					isSingletonCache = true;
+				else
+					throw ex;
 			}
 		}
+		return isSingletonCache;
+	}
 
-		return injector.getInstance(key);
+	private Injector getInjector()
+	{
+		final GuiceInjectorHolder holder = Application.get().getMetaData(
+			GuiceInjectorHolder.INJECTOR_KEY);
+
+		return holder.getInjector();
 	}
+
+	@Override
+	public boolean equals(Object o)
+	{
+		if (this == o)
+			return true;
+		if (!(o instanceof GuiceProxyTargetLocator))
+			return false;
+		GuiceProxyTargetLocator that = (GuiceProxyTargetLocator) o;
+		return Objects.equal(optional, that.optional) &&
+				Objects.equal(bindingAnnotation, that.bindingAnnotation) &&
+				Objects.equal(className, that.className) &&
+				Objects.equal(fieldName, that.fieldName);
+	}
+
+	@Override
+	public int hashCode()
+	{
+		return Objects.hashCode(bindingAnnotation, optional, className, fieldName);
+	}
+
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/6dae9283/wicket-guice/src/test/java/org/apache/wicket/guice/JavaxInjectGuiceInjectorTest.java
----------------------------------------------------------------------
diff --git a/wicket-guice/src/test/java/org/apache/wicket/guice/JavaxInjectGuiceInjectorTest.java b/wicket-guice/src/test/java/org/apache/wicket/guice/JavaxInjectGuiceInjectorTest.java
index 4f2869c..1ea6598 100644
--- a/wicket-guice/src/test/java/org/apache/wicket/guice/JavaxInjectGuiceInjectorTest.java
+++ b/wicket-guice/src/test/java/org/apache/wicket/guice/JavaxInjectGuiceInjectorTest.java
@@ -25,6 +25,8 @@ import org.junit.Test;
 import com.google.inject.ConfigurationException;
 import com.google.inject.spi.Message;
 
+import javax.inject.Inject;
+
 /**
  */
 public class JavaxInjectGuiceInjectorTest extends AbstractInjectorTest
@@ -51,15 +53,10 @@ public class JavaxInjectGuiceInjectorTest extends AbstractInjectorTest
 	@Test
 	public void required()
 	{
-		JavaxInjectTestComponent component = newTestComponent("id");
-
-		// get the lazy proxy
-		IAjaxCallListener nonExisting = component.getNonExisting();
-
 		try
 		{
-			// call any method on the lazy proxy
-			nonExisting.getAfterHandler(null);
+			JavaxInjectTestComponent component = new MyJavaxInjectWithNonExistingTestComponent();
+			// Throws exception because component.getNonExisting() cannot be injected
 			fail("Fields annotated with @javax.inject.Inject are required!");
 		}
 		catch (ConfigurationException cx)
@@ -68,4 +65,18 @@ public class JavaxInjectGuiceInjectorTest extends AbstractInjectorTest
 			assertThat(message.getMessage(), is(equalTo("No implementation for org.apache.wicket.ajax.attributes.IAjaxCallListener was bound.")));
 		}
 	}
+
+	private static class MyJavaxInjectWithNonExistingTestComponent extends JavaxInjectTestComponent {
+		@Inject
+		private IAjaxCallListener nonExisting;
+
+		public MyJavaxInjectWithNonExistingTestComponent() {
+			super("id");
+		}
+
+
+		public IAjaxCallListener getNonExisting() {
+			return nonExisting;
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/6dae9283/wicket-guice/src/test/java/org/apache/wicket/guice/JavaxInjectTestComponent.java
----------------------------------------------------------------------
diff --git a/wicket-guice/src/test/java/org/apache/wicket/guice/JavaxInjectTestComponent.java b/wicket-guice/src/test/java/org/apache/wicket/guice/JavaxInjectTestComponent.java
index 9f5673e..ad1b1a1 100644
--- a/wicket-guice/src/test/java/org/apache/wicket/guice/JavaxInjectTestComponent.java
+++ b/wicket-guice/src/test/java/org/apache/wicket/guice/JavaxInjectTestComponent.java
@@ -24,7 +24,6 @@ import javax.inject.Named;
 import org.apache.wicket.Component;
 
 import com.google.inject.Provider;
-import org.apache.wicket.ajax.attributes.IAjaxCallListener;
 
 /**
  */
@@ -57,13 +56,6 @@ public class JavaxInjectTestComponent extends Component implements TestComponent
 	@Named("named2")
 	private String named2;
 
-	/**
-     * A non-existing bean.
-     * IResourceSettings is chosen randomly. Any non-primitive type would suffice
-     */
-	@Inject
-	private IAjaxCallListener nonExisting;
-
 	private final JavaxInjectTestNoComponent noComponent;
 
 	@Inject
@@ -149,11 +141,6 @@ public class JavaxInjectTestComponent extends Component implements TestComponent
 		return injectedTypeLiteralField;
 	}
 
-	public IAjaxCallListener getNonExisting()
-	{
-		return nonExisting;
-	}
-
 	@Override
 	protected void onRender()
 	{


[2/2] wicket git commit: WICKET-5926 Arquillian Support with Container ServletContext in BaseWicketTester/WicketTester.

Posted by mg...@apache.org.
WICKET-5926 Arquillian Support with Container ServletContext in BaseWicketTester/WicketTester.

Fix the asserting after removing JUnit's Assert from BaseWicketTester


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/7d90522c
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/7d90522c
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/7d90522c

Branch: refs/heads/master
Commit: 7d90522c4847b6222ca231cd6e10799984c22d52
Parents: 6dae928
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Jun 25 11:38:17 2015 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Jun 25 11:38:17 2015 +0300

----------------------------------------------------------------------
 .../testing/servletcontext/ArquillianContainerProvidedTest.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/7d90522c/testing/wicket-arquillian/src/test/java/org/apache/wicket/arquillian/testing/servletcontext/ArquillianContainerProvidedTest.java
----------------------------------------------------------------------
diff --git a/testing/wicket-arquillian/src/test/java/org/apache/wicket/arquillian/testing/servletcontext/ArquillianContainerProvidedTest.java b/testing/wicket-arquillian/src/test/java/org/apache/wicket/arquillian/testing/servletcontext/ArquillianContainerProvidedTest.java
index 24ab51a..a3ec33c 100644
--- a/testing/wicket-arquillian/src/test/java/org/apache/wicket/arquillian/testing/servletcontext/ArquillianContainerProvidedTest.java
+++ b/testing/wicket-arquillian/src/test/java/org/apache/wicket/arquillian/testing/servletcontext/ArquillianContainerProvidedTest.java
@@ -101,8 +101,8 @@ public class ArquillianContainerProvidedTest extends AbstractDeploymentTest {
 			log.info("Trying to use a null application.");
 			setWicketTester(new WicketTester(null, false));
 			fail("WebApplication cannot be null");
-		} catch (AssertionError e) {
-			assertEquals("WebApplication cannot be null", e.getMessage());
+		} catch (IllegalArgumentException iax) {
+			assertEquals("Argument 'application' may not be null.", iax.getMessage());
 		}
 		assertNull(wicketTester);
 	}