You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by al...@apache.org on 2007/11/03 17:22:25 UTC

svn commit: r591645 - in /wicket/trunk/jdk-1.5/wicket-guice/src: main/java/org/apache/wicket/guice/ test/java/org/apache/wicket/guice/

Author: almaw
Date: Sat Nov  3 09:22:24 2007
New Revision: 591645

URL: http://svn.apache.org/viewvc?rev=591645&view=rev
Log:
WICKET-1063 - Support TypeLiteral and Provider injections.

Added:
    wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceTypeStore.java
Modified:
    wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceComponentInjector.java
    wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceInjectorHolder.java
    wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java
    wicket/trunk/jdk-1.5/wicket-guice/src/test/java/org/apache/wicket/guice/GuiceInjectorTest.java
    wicket/trunk/jdk-1.5/wicket-guice/src/test/java/org/apache/wicket/guice/TestComponent.java

Modified: wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceComponentInjector.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceComponentInjector.java?rev=591645&r1=591644&r2=591645&view=diff
==============================================================================
--- wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceComponentInjector.java (original)
+++ wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceComponentInjector.java Sat Nov  3 09:22:24 2007
@@ -20,6 +20,8 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.Component;
@@ -86,11 +88,12 @@
 	 * {@link Injector} instance.
 	 * 
 	 * @param app
-	 * @param modules
+	 * @param injector
 	 */
 	public GuiceComponentInjector(Application app, Injector injector)
 	{
 		app.setMetaData(GuiceInjectorHolder.INJECTOR_KEY, new GuiceInjectorHolder(injector));
+		app.setMetaData(GuiceTypeStore.TYPESTORE_KEY, new GuiceTypeStore());
 	}
 
 	public void inject(Object object)
@@ -107,7 +110,8 @@
 					{
 						Annotation bindingAnnotation = findBindingAnnotation(field.getAnnotations());
 						Object proxy = LazyInitProxyFactory.createProxy(field.getType(),
-								new GuiceProxyTargetLocator(field.getType(), bindingAnnotation));
+								new GuiceProxyTargetLocator(field.getGenericType(),
+										bindingAnnotation));
 
 						if (!field.isAccessible())
 						{
@@ -136,22 +140,32 @@
 				{
 					Annotation[][] paramAnnotations = method.getParameterAnnotations();
 					Class< ? >[] paramTypes = method.getParameterTypes();
+					Type[] genericParamTypes = method.getGenericParameterTypes();
 					Object[] args = new Object[paramTypes.length];
 					for (int i = 0; i < paramTypes.length; i++)
 					{
+						Type paramType;
+						if (genericParamTypes[i] instanceof ParameterizedType)
+						{
+							paramType = ((ParameterizedType)genericParamTypes[i]).getRawType();
+						}
+						else
+						{
+							paramType = paramTypes[i];
+						}
 						try
 						{
 							Annotation bindingAnnotation = findBindingAnnotation(paramAnnotations[i]);
 							args[i] = LazyInitProxyFactory.createProxy(paramTypes[i],
-									new GuiceProxyTargetLocator(paramTypes[i], bindingAnnotation));
+									new GuiceProxyTargetLocator(genericParamTypes[i],
+											bindingAnnotation));
 						}
 						catch (MoreThanOneBindingException e)
 						{
 							throw new RuntimeException(
 									"Can't have more than one BindingAnnotation on parameter " + i +
-											"(" + paramTypes[i].getSimpleName() + ") of method " +
-											method.getName() + " of class " +
-											object.getClass().getName());
+											"(" + paramType + ") of method " + method.getName() +
+											" of class " + object.getClass().getName());
 						}
 					}
 					try

Modified: wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceInjectorHolder.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceInjectorHolder.java?rev=591645&r1=591644&r2=591645&view=diff
==============================================================================
--- wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceInjectorHolder.java (original)
+++ wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceInjectorHolder.java Sat Nov  3 09:22:24 2007
@@ -47,7 +47,7 @@
 	/**
 	 * Constructor
 	 * 
-	 * @param context
+	 * @param injector
 	 */
 	public GuiceInjectorHolder(Injector injector)
 	{

Modified: wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java?rev=591645&r1=591644&r2=591645&view=diff
==============================================================================
--- wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java (original)
+++ wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceProxyTargetLocator.java Sat Nov  3 09:22:24 2007
@@ -17,38 +17,52 @@
 package org.apache.wicket.guice;
 
 import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.proxy.IProxyTargetLocator;
-import org.apache.wicket.util.lang.Classes;
 
 import com.google.inject.Key;
+import com.google.inject.TypeLiteral;
 
 class GuiceProxyTargetLocator implements IProxyTargetLocator
 {
 	private static final long serialVersionUID = 1L;
 
-	private String typeName;
-	private Annotation bindingAnnotation;
+	private final String typeName;
+	private final Annotation bindingAnnotation;
 
-	GuiceProxyTargetLocator(Class< ? > type, Annotation bindingAnnotation)
+	GuiceProxyTargetLocator(Type type, Annotation bindingAnnotation)
 	{
-		this.typeName = type.getName();
+		// I'm not too happy about
+		typeName = type.toString();
 		this.bindingAnnotation = bindingAnnotation;
+
+		GuiceTypeStore typeStore = (GuiceTypeStore)Application.get().getMetaData(
+				GuiceTypeStore.TYPESTORE_KEY);
+		typeStore.setType(typeName, type);
 	}
 
 	public Object locateProxyTarget()
 	{
-		GuiceInjectorHolder holder = (GuiceInjectorHolder)Application.get().getMetaData(
+		final GuiceInjectorHolder holder = (GuiceInjectorHolder)Application.get().getMetaData(
 				GuiceInjectorHolder.INJECTOR_KEY);
+
+		final GuiceTypeStore typeStore = (GuiceTypeStore)Application.get().getMetaData(
+				GuiceTypeStore.TYPESTORE_KEY);
+		final Type type = typeStore.getType(typeName);
+
+		// 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(Classes.resolveClass(typeName));
+			key = Key.get(TypeLiteral.get(type));
 		}
 		else
 		{
-			key = Key.get(Classes.resolveClass(typeName), bindingAnnotation);
+			key = Key.get(TypeLiteral.get(type), bindingAnnotation);
 		}
 		return holder.getInjector().getInstance(key);
 	}

Added: wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceTypeStore.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceTypeStore.java?rev=591645&view=auto
==============================================================================
--- wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceTypeStore.java (added)
+++ wicket/trunk/jdk-1.5/wicket-guice/src/main/java/org/apache/wicket/guice/GuiceTypeStore.java Sat Nov  3 09:22:24 2007
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.guice;
+
+import org.apache.wicket.MetaDataKey;
+import org.apache.wicket.IClusterable;
+
+import java.lang.reflect.Type;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * This is a holder, of sorts, for a type store of runtime generified types. The reason this exists
+ * is because the generic type information gleaned from fields and methods is not Serializable.
+ * Unfortunately, to support all of the features of Guice, we MUST store this type information or go
+ * about rewriting large portions of it. It's not terribly nasty and it's just holding references,
+ * so it shouldn't be too bad. I hate that it sits in the metadata, but this is the only place to
+ * shelter the type information from Serialization.
+ * 
+ * @author jboyens
+ */
+public class GuiceTypeStore implements IClusterable
+{
+	private static final long serialVersionUID = 1L;
+
+	public static MetaDataKey TYPESTORE_KEY = new MetaDataKey(GuiceTypeStore.class)
+	{
+		private static final long serialVersionUID = 1L;
+	};
+
+	private final Map<String, Type> typeStore = new HashMap<String, Type>();
+
+	public Type getType(String typeName)
+	{
+		return typeStore.get(typeName);
+	}
+
+	public void setType(String typeName, Type type)
+	{
+		typeStore.put(typeName, type);
+	}
+}

Modified: wicket/trunk/jdk-1.5/wicket-guice/src/test/java/org/apache/wicket/guice/GuiceInjectorTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.5/wicket-guice/src/test/java/org/apache/wicket/guice/GuiceInjectorTest.java?rev=591645&r1=591644&r2=591645&view=diff
==============================================================================
--- wicket/trunk/jdk-1.5/wicket-guice/src/test/java/org/apache/wicket/guice/GuiceInjectorTest.java (original)
+++ wicket/trunk/jdk-1.5/wicket-guice/src/test/java/org/apache/wicket/guice/GuiceInjectorTest.java Sat Nov  3 09:22:24 2007
@@ -16,6 +16,9 @@
  */
 package org.apache.wicket.guice;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import junit.framework.TestCase;
 
 import org.apache.wicket.Application;
@@ -28,6 +31,8 @@
 
 import com.google.inject.Binder;
 import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
 
 public class GuiceInjectorTest extends TestCase
 {
@@ -47,6 +52,7 @@
 				return null;
 			}
 
+			@Override
 			protected ISessionStore newSessionStore()
 			{
 				// Don't use a filestore, or we spawn lots of threads, which
@@ -72,6 +78,19 @@
 							TestServiceRed.class);
 					binder.bind(ITestService.class).annotatedWith(Blue.class).to(
 							TestServiceBlue.class);
+					binder.bind(new TypeLiteral<Map<String, String>>()
+					{
+					}).toProvider(new Provider<Map<String, String>>()
+					{
+						public Map<String, String> get()
+						{
+							Map<String, String> strings = new HashMap<String, String>();
+
+							strings.put(ITestService.RESULT, ITestService.RESULT);
+
+							return strings;
+						}
+					});
 				}
 
 			});
@@ -101,5 +120,13 @@
 		assertEquals(ITestService.RESULT, component.getInjectedMethod().getString());
 		assertEquals(ITestService.RESULT_BLUE, component.getInjectedMethodBlue().getString());
 		assertEquals(ITestService.RESULT_RED, component.getInjectedMethodRed().getString());
+
+		assertEquals(ITestService.RESULT, component.getInjectedFieldProvider().get().getString());
+		assertEquals(ITestService.RESULT, component.getInjectedMethodProvider().get().getString());
+
+		assertEquals(ITestService.RESULT, component.getInjectedTypeLiteralField().get(
+				ITestService.RESULT));
+		assertEquals(ITestService.RESULT, component.getInjectedTypeLiteralMethod().get(
+				ITestService.RESULT));
 	}
 }

Modified: wicket/trunk/jdk-1.5/wicket-guice/src/test/java/org/apache/wicket/guice/TestComponent.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.5/wicket-guice/src/test/java/org/apache/wicket/guice/TestComponent.java?rev=591645&r1=591644&r2=591645&view=diff
==============================================================================
--- wicket/trunk/jdk-1.5/wicket-guice/src/test/java/org/apache/wicket/guice/TestComponent.java (original)
+++ wicket/trunk/jdk-1.5/wicket-guice/src/test/java/org/apache/wicket/guice/TestComponent.java Sat Nov  3 09:22:24 2007
@@ -16,10 +16,13 @@
  */
 package org.apache.wicket.guice;
 
+import java.util.Map;
+
 import org.apache.wicket.Component;
 import org.apache.wicket.markup.MarkupStream;
 
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 
 public class TestComponent extends Component
 {
@@ -37,41 +40,30 @@
 	private ITestService injectedFieldBlue;
 
 	@Inject
-	public void injectService(ITestService service)
-	{
-		injectedMethod = service;
-	}
+	private Provider<ITestService> injectedFieldProvider;
 
 	@Inject
-	public void injectServiceRed(@Red
-	ITestService service)
-	{
-		injectedMethodRed = service;
-	}
-
-	@Inject
-	public void injectServiceBlue(@Blue
-	ITestService service)
-	{
-		injectedMethodBlue = service;
-	}
+	private Map<String, String> injectedTypeLiteralField;
 
 	private ITestService injectedMethod, injectedMethodRed, injectedMethodBlue;
 
+	private Provider<ITestService> injectedMethodProvider;
+
+	private Map<String, String> injectedTypeLiteralMethod;
+
 	public TestComponent(String id)
 	{
 		super(id);
 	}
 
-	@Override
-	protected void onRender(MarkupStream markupStream)
+	public ITestService getInjectedField()
 	{
-		// Do nothing.
+		return injectedField;
 	}
 
-	public ITestService getInjectedField()
+	public ITestService getInjectedFieldBlue()
 	{
-		return injectedField;
+		return injectedFieldBlue;
 	}
 
 	public ITestService getInjectedFieldRed()
@@ -79,14 +71,14 @@
 		return injectedFieldRed;
 	}
 
-	public ITestService getInjectedFieldBlue()
+	public ITestService getInjectedMethod()
 	{
-		return injectedFieldBlue;
+		return injectedMethod;
 	}
 
-	public ITestService getInjectedMethod()
+	public ITestService getInjectedMethodBlue()
 	{
-		return injectedMethod;
+		return injectedMethodBlue;
 	}
 
 	public ITestService getInjectedMethodRed()
@@ -94,8 +86,61 @@
 		return injectedMethodRed;
 	}
 
-	public ITestService getInjectedMethodBlue()
+	public Provider<ITestService> getInjectedFieldProvider()
 	{
-		return injectedMethodBlue;
+		return injectedFieldProvider;
+	}
+
+	public Map<String, String> getInjectedTypeLiteralField()
+	{
+		return injectedTypeLiteralField;
+	}
+
+	public Provider<ITestService> getInjectedMethodProvider()
+	{
+		return injectedMethodProvider;
+	}
+
+	public Map<String, String> getInjectedTypeLiteralMethod()
+	{
+		return injectedTypeLiteralMethod;
+	}
+
+	@Inject
+	public void injectProvider(Provider<ITestService> provider)
+	{
+		injectedMethodProvider = provider;
+	}
+
+	@Inject
+	public void injectService(ITestService service)
+	{
+		injectedMethod = service;
+	}
+
+	@Inject
+	public void injectServiceBlue(@Blue
+	ITestService service)
+	{
+		injectedMethodBlue = service;
+	}
+
+	@Inject
+	public void injectServiceRed(@Red
+	ITestService service)
+	{
+		injectedMethodRed = service;
+	}
+
+	@Inject
+	public void injectTypeLiteral(Map<String, String> map)
+	{
+		injectedTypeLiteralMethod = map;
+	}
+
+	@Override
+	protected void onRender(MarkupStream markupStream)
+	{
+		// Do nothing.
 	}
 }