Author: alexsmirnov
Date: 2010-06-10 17:35:37 -0400 (Thu, 10 Jun 2010)
New Revision: 17598
Added:
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/BarProvider.java
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/FooProvider.java
Modified:
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/Binding.java
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/DependencyInjector.java
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/DynamicBinding.java
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/InjectorImpl.java
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/ObjectFactory.java
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/ProviderWrapper.java
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/StaticBinding.java
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/Target.java
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/InjectorTest.java
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/TestProviderInjection.java
Log:
Fixed Provider binding implementation
Modified:
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/Binding.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/Binding.java 2010-06-10
16:38:03 UTC (rev 17597)
+++
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/Binding.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -7,5 +7,7 @@
public Object get();
void init(InjectorImpl injectorImpl);
+
+ public abstract Binding getProvider();
}
Modified:
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/DependencyInjector.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/DependencyInjector.java 2010-06-10
16:38:03 UTC (rev 17597)
+++
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/DependencyInjector.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -32,4 +32,6 @@
public <T> T create(Class<T> type);
+ public <T> T create(Class<T> type,String name);
+
}
Modified:
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/DynamicBinding.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/DynamicBinding.java 2010-06-10
16:38:03 UTC (rev 17597)
+++
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/DynamicBinding.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -106,6 +106,10 @@
}
}
+ public Binding getProvider() {
+ return new StaticBinding(this);
+ }
+
void invokeInjectionMethods(Object instance) throws Exception {
for (Method method : injectedMethods.keySet()) {
method.invoke(instance, getArgumentValues(injectedMethods.get(method)));
Modified:
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/InjectorImpl.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/InjectorImpl.java 2010-06-10
16:38:03 UTC (rev 17597)
+++
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/InjectorImpl.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -2,22 +2,26 @@
import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import javax.inject.Provider;
public class InjectorImpl implements DependencyInjector {
- private final Map<Target,Binding> bindings = new HashMap<Target,
Binding>();
+ private final Map<Target,Binding> bindings = new ConcurrentHashMap<Target,
Binding>();
@SuppressWarnings("unchecked")
- public <T> T create(Class<T> type) {
- Target target = Target.create(type);
+ public <T> T create(Class<T> type,String name) {
+ Target target = Target.create(type,name);
return (T) getBinding(target).get();
}
+ public <T> T create(Class<T> type) {
+ return create(type, null);
+ }
+
public void init(BindingModule ... modules){
for (BindingModule bindingModule : modules) {
bindingModule.configure(this);
@@ -53,43 +57,43 @@
Binding binding = registerImplementation(type, type.getRawType());
binding.init(this);
return binding;
+ } else if(type.isProvider()){
+ return getBinding(type.toProviderTarget()).getProvider();
} else {
throw new DependencyException("Type "+type+" has not been
registered");
}
}
- public Binding registerProvider(Target type, Provider<?> provider){
+ public Binding registerProviderInstance(Target type, Provider<?> provider){
StaticBinding binding = new StaticBinding(provider);
- registerProviderWrapper(type, binding);
+ registerProviderBinding(type, binding);
return binding;
}
- public Binding registerProvider(Target type, Class<? extends Provider<?>>
provider){
+ public Binding registerProviderImplementation(Target type, Class<? extends
Provider<?>> provider){
DynamicBinding binding = new DynamicBinding(provider);
- registerProviderWrapper(type, binding);
+ registerProviderBinding(type, binding);
return binding;
}
- private void registerProviderWrapper(Target type, Binding binding) {
- bindings.put(type.toProvider(), binding);
- ProviderWrapper wrapper = new ProviderWrapper(binding);
+ private void registerProviderBinding(Target type, Binding binding) {
+ Binding wrapper = new ProviderWrapper(binding);
bindings.put(type, wrapper);
}
public Binding registerImplementation(Target type, Class<?> implementation){
DynamicBinding provider = new DynamicBinding(implementation);
- registerImplementationProvider(type, provider);
+ registerImplementationBinding(type, provider);
return provider;
}
public Binding registerInstance(Target type, Object instance){
StaticBinding provider = new StaticBinding(instance);
- registerImplementationProvider(type, provider);
+ registerImplementationBinding(type, provider);
return provider;
}
- private void registerImplementationProvider(Target type, Binding provider) {
+ private void registerImplementationBinding(Target type, Binding provider) {
bindings.put(type, provider);
- bindings.put(type.toProvider(), new StaticBinding(provider));
}
}
Modified:
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/ObjectFactory.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/ObjectFactory.java 2010-06-10
16:38:03 UTC (rev 17597)
+++
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/ObjectFactory.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -18,6 +18,10 @@
private ObjectFactory() {
}
+ public static <T> T create(Class<T> target,String name) {
+ return getInjector().create(target,name);
+ }
+
public static <T> T create(Class<T> target) {
return getInjector().create(target);
}
Modified:
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/ProviderWrapper.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/ProviderWrapper.java 2010-06-10
16:38:03 UTC (rev 17597)
+++
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/ProviderWrapper.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -42,24 +42,21 @@
* @see org.richfaces.jsr330.Binding#get()
*/
public Object get() {
- // TODO Auto-generated method stub
- return getProvider().get();
+ return ((Provider) getProvider().get()).get();
}
/* (non-Javadoc)
* @see org.richfaces.jsr330.Binding#getProvider()
*/
- private Provider<?> getProvider() {
- // TODO Auto-generated method stub
- return (Provider<?>) binding.get();
+ public Binding getProvider() {
+ return binding;
}
/* (non-Javadoc)
* @see org.richfaces.jsr330.Binding#init(org.richfaces.jsr330.InjectorImpl)
*/
public void init(InjectorImpl injectorImpl) {
- // TODO Auto-generated method stub
-
+ this.binding.init(injectorImpl);
}
}
Modified:
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/StaticBinding.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/StaticBinding.java 2010-06-10
16:38:03 UTC (rev 17597)
+++
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/StaticBinding.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -45,4 +45,8 @@
// do nothing
}
+ public Binding getProvider() {
+ return new StaticBinding(this);
+ }
+
}
Modified:
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/Target.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/Target.java 2010-06-10
16:38:03 UTC (rev 17597)
+++
root/core/branches/jsr-330/jsr330-impl/src/main/java/org/richfaces/jsr330/Target.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -85,6 +85,18 @@
return target;
}
+ public Target toProviderTarget(){
+ if(isProvider()){
+ return new Target(this.actualTypeArguments[0],name);
+ } else {
+ throw new DependencyException("Type "+this+" not is a Provider
type");
+ }
+ }
+
+ public boolean isProvider(){
+ return Provider.class.isAssignableFrom(rawType) &&
(1==actualTypeArguments.length);
+ }
+
public boolean isConcrete() {
return !Modifier.isAbstract((getRawType()).getModifiers());
}
@@ -166,5 +178,20 @@
return this.actualTypeArguments;
}
-
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append(rawType.getName());
+ if(getActualTypeArguments().length>0){
+ builder.append("< ");
+ for (Type argument : getActualTypeArguments()) {
+ builder.append(getRawClass(argument).getSimpleName()).append('
');
+ }
+ builder.append('>');
+ }
+ if(null != name){
+ builder.append(" :").append(name);
+ }
+ return builder.toString();
+ }
}
Added:
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/BarProvider.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/BarProvider.java
(rev 0)
+++
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/BarProvider.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -0,0 +1,11 @@
+package org.richfaces.jsr330;
+
+import javax.inject.Provider;
+
+public class BarProvider implements Provider<String> {
+
+ public String get() {
+ return "bar";
+ }
+
+}
Property changes on:
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/BarProvider.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/FooProvider.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/FooProvider.java
(rev 0)
+++
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/FooProvider.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -0,0 +1,39 @@
+/*
+ * $Id$
+ *
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.jsr330;
+
+import javax.inject.Provider;
+
+/**
+ * <p class="changed_added_4_0"></p>
+ * @author asmirnov(a)exadel.com
+ *
+ */
+public class FooProvider implements Provider<String> {
+
+ public String get() {
+ return "foo";
+ }
+
+}
Property changes on:
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/FooProvider.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified:
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/InjectorTest.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/InjectorTest.java 2010-06-10
16:38:03 UTC (rev 17597)
+++
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/InjectorTest.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -8,7 +8,7 @@
public class InjectorTest {
@Test
- public void injectConstructor() throws Exception {
+ public void injectByConstructor() throws Exception {
InjectorImpl injector = new InjectorImpl();
injector.init(new BindingModule(){
@@ -25,7 +25,7 @@
}
@Test
- public void injectField() throws Exception {
+ public void injectByField() throws Exception {
InjectorImpl injector = new InjectorImpl();
injector.init(new BindingModule(){
@@ -42,7 +42,7 @@
}
@Test
- public void injectMethod() throws Exception {
+ public void injectByMethod() throws Exception {
InjectorImpl injector = new InjectorImpl();
injector.init(new BindingModule(){
@@ -57,8 +57,9 @@
assertTrue(testInterface instanceof TestMethodInjection);
assertEquals("bar",testInterface.hello());
}
+
@Test
- public void injectProvider() throws Exception {
+ public void injectByProvider() throws Exception {
InjectorImpl injector = new InjectorImpl();
injector.init(new BindingModule(){
@@ -74,4 +75,23 @@
assertEquals("bar",testInterface.hello());
}
+ @Test
+ public void injectProvider() throws Exception {
+ InjectorImpl injector = new InjectorImpl();
+ injector.init(new BindingModule(){
+
+ public void configure(InjectorImpl injector) {
+ injector.registerImplementation(Target.create(TestInterface.class),
TestProviderInjection.class);
+ injector.registerProviderInstance(Target.create(String.class,
"foo"), new FooProvider());
+ injector.registerProviderImplementation(Target.create(String.class,
"bar"), BarProvider.class);
+ }
+
+ });
+ TestInterface testInterface = injector.create(TestInterface.class);
+ assertTrue(testInterface instanceof TestProviderInjection);
+ assertEquals("foo",testInterface.hello());
+ TestProviderInjection instance = (TestProviderInjection) testInterface;
+ assertEquals("bar",instance.bar);
+ assertEquals("foo",instance.foo);
+ }
}
Modified:
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/TestProviderInjection.java
===================================================================
---
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/TestProviderInjection.java 2010-06-10
16:38:03 UTC (rev 17597)
+++
root/core/branches/jsr-330/jsr330-impl/src/test/java/org/richfaces/jsr330/TestProviderInjection.java 2010-06-10
21:35:37 UTC (rev 17598)
@@ -36,6 +36,11 @@
String param;
+ @Inject
+ @Named("bar")
+ String bar;
+
+ String foo;
/**
* <p class="changed_added_4_0"></p>
* @param param the param to set
@@ -49,4 +54,8 @@
return param;
}
+ @Inject
+ public void setFoo(@Named("foo")String foo) {
+ this.foo = foo;
+ }
}