You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2009/11/21 21:21:15 UTC
svn commit: r882986 - in /cayenne/sandbox/cayenne-di/src:
main/java/org/apache/cayenne/di/ main/java/org/apache/cayenne/di/spi/
test/java/org/apache/cayenne/di/spi/
Author: aadamchik
Date: Sat Nov 21 20:21:12 2009
New Revision: 882986
URL: http://svn.apache.org/viewvc?rev=882986&view=rev
Log:
playing with DI ideas
* unit test reorg
* scopes
* specific instance binding
Added:
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/Scope.java
- copied, changed from r882956, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ValueProvider.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/Scopes.java
- copied, changed from r882956, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/SingletonProvider.java
- copied, changed from r882956, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/SingletonProvider.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/InstanceProvider.java
- copied, changed from r882956, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ValueProvider.java
cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorBindingTest.java
cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorCircularInjectionTest.java
cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorInjectionTest.java
cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorScopeTest.java
Removed:
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/SingletonProvider.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ValueProvider.java
Modified:
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultBindingBuilder.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultListBuilder.java
cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultMapBuilder.java
cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorTest.java
Modified: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java?rev=882986&r1=882985&r2=882986&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java Sat Nov 21 20:21:12 2009
@@ -25,8 +25,12 @@
*/
public interface BindingBuilder<T> {
- void to(Class<? extends T> implementation) throws DIException;
+ BindingBuilder<T> to(Class<? extends T> implementation) throws DIException;
- void toProvider(Class<? extends Provider<? extends T>> providerType)
+ BindingBuilder<T> toInstance(T instance) throws DIException;
+
+ BindingBuilder<T> toProvider(Class<? extends Provider<? extends T>> providerType)
throws DIException;
+
+ void in(Scope scope);
}
Copied: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/Scope.java (from r882956, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ValueProvider.java)
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/Scope.java?p2=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/Scope.java&p1=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ValueProvider.java&r1=882956&r2=882986&rev=882986&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ValueProvider.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/Scope.java Sat Nov 21 20:21:12 2009
@@ -16,20 +16,9 @@
* specific language governing permissions and limitations
* under the License.
****************************************************************/
-package org.apache.cayenne.di.spi;
+package org.apache.cayenne.di;
-import org.apache.cayenne.di.DIException;
-import org.apache.cayenne.di.Provider;
+public interface Scope {
-class ValueProvider<T> implements Provider<T> {
-
- private T value;
-
- ValueProvider(T value) {
- this.value = value;
- }
-
- public T get() throws DIException {
- return value;
- }
+ <T> Provider<T> scope(Provider<T> unscoped);
}
Copied: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/Scopes.java (from r882956, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java)
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/Scopes.java?p2=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/Scopes.java&p1=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java&r1=882956&r2=882986&rev=882986&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/Scopes.java Sat Nov 21 20:21:12 2009
@@ -18,15 +18,36 @@
****************************************************************/
package org.apache.cayenne.di;
-/**
- * A binding builder that helps with fluent binding creation.
- *
- * @param <T> An interface type of the service being bound.
- */
-public interface BindingBuilder<T> {
+public final class Scopes {
- void to(Class<? extends T> implementation) throws DIException;
+ public static final Scope NO_SCOPE;
- void toProvider(Class<? extends Provider<? extends T>> providerType)
- throws DIException;
+ public static final Scope SINGLETON;
+
+ static {
+
+ NO_SCOPE = new Scope() {
+
+ public <T> Provider<T> scope(Provider<T> unscoped) {
+ return unscoped;
+ }
+
+ @Override
+ public String toString() {
+ return "Scopes.NO_SCOPE";
+ }
+ };
+
+ SINGLETON = new Scope() {
+
+ public <T> Provider<T> scope(Provider<T> unscoped) {
+ return new SingletonProvider<T>(unscoped);
+ }
+
+ @Override
+ public String toString() {
+ return "Scopes.SINGLETON";
+ }
+ };
+ }
}
Copied: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/SingletonProvider.java (from r882956, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/SingletonProvider.java)
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/SingletonProvider.java?p2=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/SingletonProvider.java&p1=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/SingletonProvider.java&r1=882956&r2=882986&rev=882986&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/SingletonProvider.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/SingletonProvider.java Sat Nov 21 20:21:12 2009
@@ -16,9 +16,7 @@
* specific language governing permissions and limitations
* under the License.
****************************************************************/
-package org.apache.cayenne.di.spi;
-
-import org.apache.cayenne.di.Provider;
+package org.apache.cayenne.di;
class SingletonProvider<T> implements Provider<T> {
Modified: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultBindingBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultBindingBuilder.java?rev=882986&r1=882985&r2=882986&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultBindingBuilder.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultBindingBuilder.java Sat Nov 21 20:21:12 2009
@@ -21,49 +21,69 @@
import org.apache.cayenne.di.BindingBuilder;
import org.apache.cayenne.di.DIException;
import org.apache.cayenne.di.Provider;
+import org.apache.cayenne.di.Scope;
+import org.apache.cayenne.di.Scopes;
class DefaultBindingBuilder<T> implements BindingBuilder<T> {
private Class<T> interfaceType;
private DefaultInjector injector;
+ private Scope scope;
+ private String key;
DefaultBindingBuilder(Class<T> interfaceType, DefaultInjector injector) {
this.interfaceType = interfaceType;
this.injector = injector;
+ this.key = KeyGenerator.toKey(interfaceType);
}
- public void to(Class<? extends T> implementation) throws DIException {
+ public BindingBuilder<T> to(Class<? extends T> implementation) throws DIException {
- String key = KeyGenerator.toKey(interfaceType);
-
- // creating a provider chain for lazy resolution of singletons...
- ConstructorProvider<T> provider0 = new ConstructorProvider<T>(
+ Provider<T> provider0 = new ConstructorProvider<T>(
interfaceType,
implementation,
injector);
- FieldInjectingProvider<T> provider1 = new FieldInjectingProvider<T>(
- provider0,
- injector,
- key);
- SingletonProvider<T> provider2 = new SingletonProvider<T>(provider1);
+ Provider<T> provider1 = new FieldInjectingProvider<T>(provider0, injector, key);
+ return bindInScope(provider1);
+ }
+
+ public BindingBuilder<T> toInstance(T instance) throws DIException {
+ return bindInScope(new InstanceProvider<T>(instance));
+ };
+
+ public BindingBuilder<T> toProvider(
+ Class<? extends Provider<? extends T>> providerType) {
+
+ Provider<T> provider0 = new ProviderConstructorProvider<T>(providerType);
+ Provider<T> provider1 = new FieldInjectingProvider<T>(provider0, injector, key);
+
+ return bindInScope(provider1);
+ }
+
+ public void in(Scope scope) {
+
+ if (this.scope != scope) {
- // TODO: andrus 11/15/2009 - report overriding the binding??
- injector.getBindings().put(key, provider2);
+ if (this.scope != null) {
+ throw new IllegalStateException(
+ "Can't change binding scope. It is already set to " + this.scope);
+ }
+
+ this.scope = scope;
+
+ if (key != null) {
+ Provider<?> provider = injector.getBindings().get(key);
+ injector.getBindings().put(key, scope.scope(provider));
+ }
+ }
}
- public void toProvider(Class<? extends Provider<? extends T>> providerType) {
- String key = KeyGenerator.toKey(interfaceType);
+ private BindingBuilder<T> bindInScope(Provider<T> provider) {
- // creating a provider chain for lazy resolution of singletons...
- ProviderConstructorProvider<T> provider0 = new ProviderConstructorProvider<T>(
- providerType);
- FieldInjectingProvider<T> provider1 = new FieldInjectingProvider<T>(
- provider0,
- injector,
- key);
- SingletonProvider<T> provider2 = new SingletonProvider<T>(provider1);
+ Scope scope = this.scope != null ? this.scope : Scopes.NO_SCOPE;
// TODO: andrus 11/15/2009 - report overriding existing binding??
- injector.getBindings().put(key, provider2);
+ injector.getBindings().put(key, scope.scope(provider));
+ return this;
}
}
Modified: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultListBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultListBuilder.java?rev=882986&r1=882985&r2=882986&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultListBuilder.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultListBuilder.java Sat Nov 21 20:21:12 2009
@@ -46,7 +46,7 @@
public <E> ListBuilder<T> add(E value) throws DIException {
- ValueProvider<E> provider = new ValueProvider<E>(value);
+ InstanceProvider<E> provider = new InstanceProvider<E>(value);
ListProvider listProvider = injector.getListConfigurations().get(
implementationTypeKey);
Modified: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultMapBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultMapBuilder.java?rev=882986&r1=882985&r2=882986&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultMapBuilder.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultMapBuilder.java Sat Nov 21 20:21:12 2009
@@ -48,7 +48,7 @@
public <E> MapBuilder<T> put(String key, E value) throws DIException {
- ValueProvider<E> provider = new ValueProvider<E>(value);
+ InstanceProvider<E> provider = new InstanceProvider<E>(value);
MapProvider mapProvider = injector.getMapConfigurations().get(
implementationTypeKey);
Copied: cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/InstanceProvider.java (from r882956, cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ValueProvider.java)
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/InstanceProvider.java?p2=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/InstanceProvider.java&p1=cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ValueProvider.java&r1=882956&r2=882986&rev=882986&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ValueProvider.java (original)
+++ cayenne/sandbox/cayenne-di/src/main/java/org/apache/cayenne/di/spi/InstanceProvider.java Sat Nov 21 20:21:12 2009
@@ -21,11 +21,11 @@
import org.apache.cayenne.di.DIException;
import org.apache.cayenne.di.Provider;
-class ValueProvider<T> implements Provider<T> {
+class InstanceProvider<T> implements Provider<T> {
private T value;
- ValueProvider(T value) {
+ InstanceProvider(T value) {
this.value = value;
}
Added: cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorBindingTest.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorBindingTest.java?rev=882986&view=auto
==============================================================================
--- cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorBindingTest.java (added)
+++ cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorBindingTest.java Sat Nov 21 20:21:12 2009
@@ -0,0 +1,100 @@
+/*****************************************************************
+ * 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.cayenne.di.spi;
+
+import junit.framework.TestCase;
+
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.mock.MockImplementation1;
+import org.apache.cayenne.di.mock.MockImplementation1Alt;
+import org.apache.cayenne.di.mock.MockInterface1;
+import org.apache.cayenne.di.mock.MockInterface1Provider;
+
+public class DefaultInjectorBindingTest extends TestCase {
+
+ public void testClassBinding() {
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(MockImplementation1.class);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 service = injector.getInstance(MockInterface1.class);
+ assertNotNull(service);
+ assertEquals("MyName", service.getName());
+ }
+
+ public void testProviderBinding() {
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder
+ .bind(MockInterface1.class)
+ .toProvider(MockInterface1Provider.class);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 service = injector.getInstance(MockInterface1.class);
+ assertNotNull(service);
+ assertEquals("MyName", service.getName());
+ }
+
+ public void testInstanceBinding() {
+
+ final MockImplementation1 instance = new MockImplementation1();
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).toInstance(instance);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 service = injector.getInstance(MockInterface1.class);
+ assertNotNull(service);
+ assertSame(instance, service);
+ }
+
+ public void testClassReBinding() {
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(MockImplementation1.class);
+ binder.bind(MockInterface1.class).to(MockImplementation1Alt.class);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 service = injector.getInstance(MockInterface1.class);
+ assertNotNull(service);
+ assertEquals("alt", service.getName());
+ }
+
+}
Added: cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorCircularInjectionTest.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorCircularInjectionTest.java?rev=882986&view=auto
==============================================================================
--- cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorCircularInjectionTest.java (added)
+++ cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorCircularInjectionTest.java Sat Nov 21 20:21:12 2009
@@ -0,0 +1,74 @@
+/*****************************************************************
+ * 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.cayenne.di.spi;
+
+import junit.framework.TestCase;
+
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.DIException;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.mock.MockImplementation1_DepOn2;
+import org.apache.cayenne.di.mock.MockImplementation1_DepOn2Provider;
+import org.apache.cayenne.di.mock.MockImplementation2;
+import org.apache.cayenne.di.mock.MockInterface1;
+import org.apache.cayenne.di.mock.MockInterface2;
+
+public class DefaultInjectorCircularInjectionTest extends TestCase {
+
+ public void testFieldInjection_CircularDependency() {
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(MockImplementation1_DepOn2.class);
+ binder.bind(MockInterface2.class).to(MockImplementation2.class);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ try {
+ injector.getInstance(MockInterface1.class);
+ fail("Circular dependency is not detected.");
+ }
+ catch (DIException e) {
+ // expected
+ }
+ catch (StackOverflowError e) {
+ fail("Circular dependency is not detected, causing stack overflow");
+ }
+ }
+
+ public void testProviderInjection_CircularDependency() {
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(
+ MockImplementation1_DepOn2Provider.class);
+ binder.bind(MockInterface2.class).to(MockImplementation2.class);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 service = injector.getInstance(MockInterface1.class);
+ assertEquals("MockImplementation2Name", service.getName());
+ }
+}
Added: cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorInjectionTest.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorInjectionTest.java?rev=882986&view=auto
==============================================================================
--- cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorInjectionTest.java (added)
+++ cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorInjectionTest.java Sat Nov 21 20:21:12 2009
@@ -0,0 +1,172 @@
+/*****************************************************************
+ * 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.cayenne.di.spi;
+
+import junit.framework.TestCase;
+
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.mock.MockImplementation1;
+import org.apache.cayenne.di.mock.MockImplementation1_ListConfiguration;
+import org.apache.cayenne.di.mock.MockImplementation1_MapConfiguration;
+import org.apache.cayenne.di.mock.MockImplementation2;
+import org.apache.cayenne.di.mock.MockImplementation2Sub1;
+import org.apache.cayenne.di.mock.MockImplementation2_ConstructorProvider;
+import org.apache.cayenne.di.mock.MockImplementation3;
+import org.apache.cayenne.di.mock.MockImplementation4;
+import org.apache.cayenne.di.mock.MockImplementation5;
+import org.apache.cayenne.di.mock.MockInterface1;
+import org.apache.cayenne.di.mock.MockInterface2;
+import org.apache.cayenne.di.mock.MockInterface3;
+import org.apache.cayenne.di.mock.MockInterface4;
+import org.apache.cayenne.di.mock.MockInterface5;
+
+public class DefaultInjectorInjectionTest extends TestCase {
+
+ public void testFieldInjection() {
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(MockImplementation1.class);
+ binder.bind(MockInterface2.class).to(MockImplementation2.class);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface2 service = injector.getInstance(MockInterface2.class);
+ assertNotNull(service);
+ assertEquals("altered_MyName", service.getAlteredName());
+ }
+
+ public void testFieldInjectionSuperclass() {
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(MockImplementation1.class);
+ binder.bind(MockInterface2.class).to(MockImplementation2Sub1.class);
+ binder.bind(MockInterface3.class).to(MockImplementation3.class);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface2 service = injector.getInstance(MockInterface2.class);
+ assertNotNull(service);
+ assertEquals("altered_MyName:XName", service.getAlteredName());
+ }
+
+ public void testConstructorInjection() {
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(MockImplementation1.class);
+ binder.bind(MockInterface4.class).to(MockImplementation4.class);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface4 service = injector.getInstance(MockInterface4.class);
+ assertNotNull(service);
+ assertEquals("constructor_MyName", service.getName());
+ }
+
+ public void testProviderInjection_Constructor() {
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(MockImplementation1.class);
+ binder.bind(MockInterface2.class).to(
+ MockImplementation2_ConstructorProvider.class);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface2 service = injector.getInstance(MockInterface2.class);
+ assertEquals("altered_MyName", service.getAlteredName());
+ }
+
+ public void testMapInjection() {
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(
+ MockImplementation1_MapConfiguration.class);
+
+ binder
+ .bindMap(MockInterface1.class)
+ .put("x", "xvalue")
+ .put("y", "yvalue")
+ .put("x", "xvalue1");
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 service = injector.getInstance(MockInterface1.class);
+ assertNotNull(service);
+ assertEquals(";x=xvalue1;y=yvalue", service.getName());
+ }
+
+ public void testListInjection_addValue() {
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(
+ MockImplementation1_ListConfiguration.class);
+
+ binder.bindList(MockInterface1.class).add("xvalue").add("yvalue");
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 service = injector.getInstance(MockInterface1.class);
+ assertNotNull(service);
+ assertEquals(";xvalue;yvalue", service.getName());
+ }
+
+ public void testListInjection_addType() {
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface5.class).to(MockImplementation5.class);
+
+ binder.bind(MockInterface1.class).to(
+ MockImplementation1_ListConfiguration.class);
+
+ binder.bindList(MockInterface1.class).add(MockInterface5.class).add(
+ "yvalue");
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 service = injector.getInstance(MockInterface1.class);
+ assertNotNull(service);
+ assertEquals(";xyz;yvalue", service.getName());
+ }
+
+}
Added: cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorScopeTest.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorScopeTest.java?rev=882986&view=auto
==============================================================================
--- cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorScopeTest.java (added)
+++ cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorScopeTest.java Sat Nov 21 20:21:12 2009
@@ -0,0 +1,104 @@
+/*****************************************************************
+ * 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.cayenne.di.spi;
+
+import junit.framework.TestCase;
+
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.Scopes;
+import org.apache.cayenne.di.mock.MockImplementation1;
+import org.apache.cayenne.di.mock.MockInterface1;
+
+public class DefaultInjectorScopeTest extends TestCase {
+
+ public void testNoScope() {
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(MockImplementation1.class);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 instance1 = injector.getInstance(MockInterface1.class);
+ MockInterface1 instance2 = injector.getInstance(MockInterface1.class);
+ MockInterface1 instance3 = injector.getInstance(MockInterface1.class);
+
+ assertNotNull(instance1);
+ assertNotNull(instance2);
+ assertNotNull(instance3);
+
+ assertNotSame(instance1, instance2);
+ assertNotSame(instance2, instance3);
+ assertNotSame(instance3, instance1);
+ }
+
+ public void testNoScope_Explicit() {
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(MockImplementation1.class).in(
+ Scopes.NO_SCOPE);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 instance1 = injector.getInstance(MockInterface1.class);
+ MockInterface1 instance2 = injector.getInstance(MockInterface1.class);
+ MockInterface1 instance3 = injector.getInstance(MockInterface1.class);
+
+ assertNotNull(instance1);
+ assertNotNull(instance2);
+ assertNotNull(instance3);
+
+ assertNotSame(instance1, instance2);
+ assertNotSame(instance2, instance3);
+ assertNotSame(instance3, instance1);
+ }
+
+ public void testSingletonScope() {
+
+ Module module = new Module() {
+
+ public void configure(Binder binder) {
+ binder.bind(MockInterface1.class).to(MockImplementation1.class).in(
+ Scopes.SINGLETON);
+ }
+ };
+
+ DefaultInjector injector = new DefaultInjector(module);
+
+ MockInterface1 instance1 = injector.getInstance(MockInterface1.class);
+ MockInterface1 instance2 = injector.getInstance(MockInterface1.class);
+ MockInterface1 instance3 = injector.getInstance(MockInterface1.class);
+
+ assertNotNull(instance1);
+ assertNotNull(instance2);
+ assertNotNull(instance3);
+
+ assertSame(instance1, instance2);
+ assertSame(instance2, instance3);
+ }
+
+}
Modified: cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorTest.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorTest.java?rev=882986&r1=882985&r2=882986&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorTest.java (original)
+++ cayenne/sandbox/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorTest.java Sat Nov 21 20:21:12 2009
@@ -21,26 +21,7 @@
import junit.framework.TestCase;
import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.DIException;
import org.apache.cayenne.di.Module;
-import org.apache.cayenne.di.mock.MockImplementation1;
-import org.apache.cayenne.di.mock.MockImplementation1Alt;
-import org.apache.cayenne.di.mock.MockImplementation1_DepOn2;
-import org.apache.cayenne.di.mock.MockImplementation1_DepOn2Provider;
-import org.apache.cayenne.di.mock.MockImplementation1_ListConfiguration;
-import org.apache.cayenne.di.mock.MockImplementation1_MapConfiguration;
-import org.apache.cayenne.di.mock.MockImplementation2;
-import org.apache.cayenne.di.mock.MockImplementation2Sub1;
-import org.apache.cayenne.di.mock.MockImplementation2_ConstructorProvider;
-import org.apache.cayenne.di.mock.MockImplementation3;
-import org.apache.cayenne.di.mock.MockImplementation4;
-import org.apache.cayenne.di.mock.MockImplementation5;
-import org.apache.cayenne.di.mock.MockInterface1;
-import org.apache.cayenne.di.mock.MockInterface1Provider;
-import org.apache.cayenne.di.mock.MockInterface2;
-import org.apache.cayenne.di.mock.MockInterface3;
-import org.apache.cayenne.di.mock.MockInterface4;
-import org.apache.cayenne.di.mock.MockInterface5;
public class DefaultInjectorTest extends TestCase {
@@ -86,224 +67,4 @@
assertTrue(configureCalled[1]);
}
- public void testClassBinding() {
-
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder.bind(MockInterface1.class).to(MockImplementation1.class);
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- MockInterface1 service = injector.getInstance(MockInterface1.class);
- assertNotNull(service);
- assertEquals("MyName", service.getName());
- }
-
- public void testFieldInjection() {
-
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder.bind(MockInterface1.class).to(MockImplementation1.class);
- binder.bind(MockInterface2.class).to(MockImplementation2.class);
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- MockInterface2 service = injector.getInstance(MockInterface2.class);
- assertNotNull(service);
- assertEquals("altered_MyName", service.getAlteredName());
- }
-
- public void testFieldInjectionSuperclass() {
-
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder.bind(MockInterface1.class).to(MockImplementation1.class);
- binder.bind(MockInterface2.class).to(MockImplementation2Sub1.class);
- binder.bind(MockInterface3.class).to(MockImplementation3.class);
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- MockInterface2 service = injector.getInstance(MockInterface2.class);
- assertNotNull(service);
- assertEquals("altered_MyName:XName", service.getAlteredName());
- }
-
- public void testConstructorInjection() {
-
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder.bind(MockInterface1.class).to(MockImplementation1.class);
- binder.bind(MockInterface4.class).to(MockImplementation4.class);
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- MockInterface4 service = injector.getInstance(MockInterface4.class);
- assertNotNull(service);
- assertEquals("constructor_MyName", service.getName());
- }
-
- public void testProviderBinding() {
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder
- .bind(MockInterface1.class)
- .toProvider(MockInterface1Provider.class);
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- MockInterface1 service = injector.getInstance(MockInterface1.class);
- assertNotNull(service);
- assertEquals("MyName", service.getName());
- }
-
- public void testClassReBinding() {
-
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder.bind(MockInterface1.class).to(MockImplementation1.class);
- binder.bind(MockInterface1.class).to(MockImplementation1Alt.class);
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- MockInterface1 service = injector.getInstance(MockInterface1.class);
- assertNotNull(service);
- assertEquals("alt", service.getName());
- }
-
- public void testMapInjection() {
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder.bind(MockInterface1.class).to(
- MockImplementation1_MapConfiguration.class);
-
- binder
- .bindMap(MockInterface1.class)
- .put("x", "xvalue")
- .put("y", "yvalue")
- .put("x", "xvalue1");
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- MockInterface1 service = injector.getInstance(MockInterface1.class);
- assertNotNull(service);
- assertEquals(";x=xvalue1;y=yvalue", service.getName());
- }
-
- public void testListInjection_addValue() {
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder.bind(MockInterface1.class).to(
- MockImplementation1_ListConfiguration.class);
-
- binder.bindList(MockInterface1.class).add("xvalue").add("yvalue");
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- MockInterface1 service = injector.getInstance(MockInterface1.class);
- assertNotNull(service);
- assertEquals(";xvalue;yvalue", service.getName());
- }
-
- public void testListInjection_addType() {
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder.bind(MockInterface5.class).to(MockImplementation5.class);
-
- binder.bind(MockInterface1.class).to(
- MockImplementation1_ListConfiguration.class);
-
- binder.bindList(MockInterface1.class).add(MockInterface5.class).add(
- "yvalue");
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- MockInterface1 service = injector.getInstance(MockInterface1.class);
- assertNotNull(service);
- assertEquals(";xyz;yvalue", service.getName());
- }
-
- public void testFieldInjection_CircularDependency() {
-
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder.bind(MockInterface1.class).to(MockImplementation1_DepOn2.class);
- binder.bind(MockInterface2.class).to(MockImplementation2.class);
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- try {
- injector.getInstance(MockInterface1.class);
- fail("Circular dependency is not detected.");
- }
- catch (DIException e) {
- // expected
- }
- catch (StackOverflowError e) {
- fail("Circular dependency is not detected, causing stack overflow");
- }
- }
-
- public void testProviderInjection_Constructor() {
-
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder.bind(MockInterface1.class).to(MockImplementation1.class);
- binder.bind(MockInterface2.class).to(
- MockImplementation2_ConstructorProvider.class);
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- MockInterface2 service = injector.getInstance(MockInterface2.class);
- assertEquals("altered_MyName", service.getAlteredName());
- }
-
- public void testProviderInjection_CircularDependency() {
-
- Module module = new Module() {
-
- public void configure(Binder binder) {
- binder.bind(MockInterface1.class).to(
- MockImplementation1_DepOn2Provider.class);
- binder.bind(MockInterface2.class).to(MockImplementation2.class);
- }
- };
-
- DefaultInjector injector = new DefaultInjector(module);
-
- MockInterface1 service = injector.getInstance(MockInterface1.class);
- assertEquals("MockImplementation2Name", service.getName());
- }
}