Added:
trunk/israfil-micro-container/src/main/java/net/israfil/micro/container/DefaultAutoWiringAdaptableContainer.java
Modified:
trunk/israfil-micro-container/src/main/java/net/israfil/micro/container/Container.java
trunk/israfil-micro-container/src/main/java/net/israfil/micro/container/DefaultContainer.java
trunk/israfil-micro-container/src/test/java/net/israfil/micro/container/AutoWiringAdaptableContainerTest.java
trunk/israfil-micro-container/src/test/java/net/israfil/micro/container/LifecycleTest.java
Log:
fix up lifecycle and other tests.
Modified: trunk/israfil-micro-container/src/main/java/net/israfil/micro/container/Container.java
==============================================================================
---
trunk/israfil-micro-container/src/main/java/net/israfil/micro/container/Container.java (original)
+++
trunk/israfil-micro-container/src/main/java/net/israfil/micro/container/Container.java
Sun Aug 3 18:33:08 2008
@@ -70,7 +70,7 @@
* the start() call. Subsequent start() calls should be ignored.
*/
public void start();
-
+
/**
* Returns true if the container has been started, and false if it has
* not been started.
Added: trunk/israfil-micro-container/src/main/java/net/israfil/micro/container/DefaultAutoWiringAdaptableContainer.java
==============================================================================
--- (empty file)
+++
trunk/israfil-micro-container/src/main/java/net/israfil/micro/container/DefaultAutoWiringAdaptableContainer.java
Sun Aug 3 18:33:08 2008
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2008 Israfil Consulting Services Corporation
+ * Copyright (c) 2008 Christian Edward Gruber
+ * All Rights Reserved
+ *
+ * This software is licensed under the Berkeley Standard Distribution license,
+ * (BSD license), as defined below:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
notice, this
+ * list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of Israfil Consulting Services nor the names of
its contributors
+ * may be used to endorse or promote products derived from this
software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * $Id: Copyright.java 618 2008-04-14 14:03:03Z christianedwardgruber $
+ */
+package net.israfil.micro.container;
+
+
+
+/**
+ * A deprecated class that was the old name for DefaultContainer.
+ * Maintained to reduce API breakage.
+ * @Deprecated Class renamed to DefaultContainer.
+ */
+public class DefaultAutoWiringAdaptableContainer extends
DefaultContainer {
+
+ public DefaultAutoWiringAdaptableContainer() {
+ super();
+ }
+
+ public DefaultAutoWiringAdaptableContainer(boolean failEarly) {
+ super(failEarly);
+ }
+
+ public DefaultAutoWiringAdaptableContainer(Container parent,
+ boolean failEarly) {
+ super(parent, failEarly);
+ }
+
+ public DefaultAutoWiringAdaptableContainer(Container parent) {
+ super(parent);
+ }
+
+
+}
Modified: trunk/israfil-micro-container/src/main/java/net/israfil/micro/container/DefaultContainer.java
==============================================================================
---
trunk/israfil-micro-container/src/main/java/net/israfil/micro/container/DefaultContainer.java (original)
+++
trunk/israfil-micro-container/src/main/java/net/israfil/micro/container/DefaultContainer.java
Sun Aug 3 18:33:08 2008
@@ -148,6 +148,14 @@
CyclicalReferenceDetectionUtil.detectCircularDependencies(this.registry,
nds, componentAdapter);
}
+ /**
+ * This method wires the object up with its dependencies, providing said
+ * dependencies to the object's adapter. It also starts the object if its
+ * startable
+ * @param originalKey
+ * @param adapter
+ * @return
+ */
private Object wireObject(Object originalKey, AutoWiringAdapter
adapter) {
Object[] dependencies = adapter.dependencies();
Object[] parameters = new Object[dependencies.length];
@@ -157,7 +165,15 @@
if (parameters[depn] == null) throw new
UnsatisfiedDependencyError("Could not materialize dependency for key "
+ key);
}
try {
- return adapter.create(parameters);
+ Object o = adapter.create(parameters);
+ if (o == null) throw new InstantiationException("Could not create a
non-null object. Adapter " + adapter.getClass().getName() + " returned null.");
+ else {
+ try {
+ Startable s = ((Startable)o);
+ if (!s.isRunning()) s.start();
+ } catch (ClassCastException e) {}
+ return o;
+ }
} catch (IllegalAccessException e) {
throw new CouldNotCreateComponentError("Could not create
component " + originalKey + " of type " + adapter.getType(),e);
} catch (InstantiationException e) {
@@ -171,7 +187,7 @@
synchronized (CREATION_MUTEX) {
if (component == null) { // in case following thread gets in just
after storage.
component = wireObject(key,(AutoWiringAdapter)registry.get(key));
- if (component != null) store(key, component);
+ store(key, component);
}
}
}
Modified: trunk/israfil-micro-container/src/test/java/net/israfil/micro/container/AutoWiringAdaptableContainerTest.java
==============================================================================
---
trunk/israfil-micro-container/src/test/java/net/israfil/micro/container/AutoWiringAdaptableContainerTest.java (original)
+++
trunk/israfil-micro-container/src/test/java/net/israfil/micro/container/AutoWiringAdaptableContainerTest.java
Sun Aug 3 18:33:08 2008
@@ -40,7 +40,7 @@
public class AutoWiringAdaptableContainerTest {
- TestableAutoWiringAdaptableContainer container = null;
+ TestableDefaultContainer container = null;
/** @testng.before-method alwaysRun = "true" */
public void setUp() {
@@ -54,7 +54,7 @@
/** @testng.test */
public void testAutoWiringContainer() {
- container = new TestableAutoWiringAdaptableContainer();
+ container = new TestableDefaultContainer();
container.registerType(A.class, A1.class);
container.registerType(B.class,B.adapter);
container.registerType(D.class,D.adapter); // out of order
@@ -201,7 +201,7 @@
protected E() {}
}
- public static class TestableAutoWiringAdaptableContainer extends
DefaultContainer {
+ public static class TestableDefaultContainer extends DefaultContainer {
public boolean isStored(Object key) {
return super.isStored(key);
}
Modified: trunk/israfil-micro-container/src/test/java/net/israfil/micro/container/LifecycleTest.java
==============================================================================
---
trunk/israfil-micro-container/src/test/java/net/israfil/micro/container/LifecycleTest.java (original)
+++
trunk/israfil-micro-container/src/test/java/net/israfil/micro/container/LifecycleTest.java
Sun Aug 3 18:33:08 2008
@@ -34,6 +34,7 @@
package net.israfil.micro.container;
import net.israfil.micro.container.adapters.AbstractAutoWiringAdapter;
+import net.israfil.micro.container.adapters.IndependentAutoWiringAdapter;
import org.testng.Assert;
@@ -52,14 +53,53 @@
container = null;
}
-
/** @testng.test */
- public void testMissingDependenciesWiringEarly() {
- AutoWiringAdaptableContainer container = new DefaultContainer(true);
- container.registerType(A.class,A1.class);
- container.registerType(B.class,B.adapter);
+ public void testAbstractStartable() {
+ Startable s = new AbstractStartable() {};
+ Assert.assertFalse(s.isRunning());
+ s.start();
+ Assert.assertTrue(s.isRunning());
+ }
+
+ /** @testng.test */
+ public void testStartupOfSingleComponent() {
+ AutoWiringAdaptableContainer container = new DefaultContainer();
+ final A1 a1 = new A1();
+ container.registerType(A.class, new
IndependentAutoWiringAdapter(A1.class) {
+ public Object create(Object[] args) { return a1; }
+ });
+ Assert.assertFalse(a1.isRunning());
+ container.start();
+ container.getComponent(A.class);
+ Assert.assertTrue(a1.isRunning());
+ }
+
+ /** @testng.test */
+ public void testStartupOfMultipleComponents() {
+ AutoWiringAdaptableContainer container = new DefaultContainer();
+ final A1 a1 = new A1();
+ final C c = new C(a1);
+ container.registerType(A.class, new
IndependentAutoWiringAdapter(A1.class) {
+ public Object create(Object[] args) { return a1; }
+ });
+ container.registerType(B.class, B.adapter);
+ container.registerType(C.class, new AbstractAutoWiringAdapter(
+ C.class,
+ new Object[] {A.class}
+ ) {
+ public Object create(Object[] param) throws IllegalAccessException,
InstantiationException {
+ return c;
+ }
+ });
+ Assert.assertFalse(a1.isRunning());
+ Assert.assertFalse(c.isRunning());
container.start();
- Assert.assertNotNull(container.getComponent(B.class));
+ container.getComponent(A.class);
+ Assert.assertFalse(c.isRunning());
+ Assert.assertTrue(a1.isRunning());
+ container.getComponent(C.class);
+ Assert.assertTrue(c.isRunning());
+ Assert.assertTrue(a1.isRunning());
}
public static interface A {
@@ -89,6 +129,14 @@
this.a = a;
}
public void start() { super.start(); }
+ public static final AutoWiringAdapter adapter = new AbstractAutoWiringAdapter(
+ C.class,
+ new Object[] {A.class}
+ ) {
+ public Object create(Object[] param) throws IllegalAccessException,
InstantiationException {
+ return new C((A)param[0]);
+ }
+ };
}
}