You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jm...@apache.org on 2006/05/23 17:53:06 UTC
svn commit: r408945 - in
/incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src:
main/java/org/apache/tuscany/container/groovy/
main/java/org/apache/tuscany/container/groovy/injectors/
test/java/org/apache/tuscany/container/groovy/
Author: jmarino
Date: Tue May 23 08:53:05 2006
New Revision: 408945
URL: http://svn.apache.org/viewvc?rev=408945&view=rev
Log:
support for property injection in groovy
Added:
incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/InjectionException.java
incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/PropertyInjector.java
incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/injectors/
incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/injectors/SingletonInjector.java
incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/PropertyTestCase.java
incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/ScriptInvokeTestCase.java
incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/WireTestCase.java
- copied, changed from r408842, incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/InvocationTestCase.java
Removed:
incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/InvocationTestCase.java
Modified:
incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyAtomicContext.java
incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyComponentBuilder.java
Modified: incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyAtomicContext.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyAtomicContext.java?rev=408945&r1=408944&r2=408945&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyAtomicContext.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyAtomicContext.java Tue May 23 08:53:05 2006
@@ -17,19 +17,20 @@
package org.apache.tuscany.container.groovy;
import java.lang.reflect.Method;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
-import org.apache.tuscany.spi.model.Scope;
import org.apache.tuscany.spi.ObjectCreationException;
import org.apache.tuscany.spi.context.CompositeContext;
import org.apache.tuscany.spi.context.InstanceWrapper;
import org.apache.tuscany.spi.context.TargetException;
import org.apache.tuscany.spi.extension.AtomicContextExtension;
-import org.apache.tuscany.spi.wire.TargetInvoker;
+import org.apache.tuscany.spi.model.Scope;
import org.apache.tuscany.spi.wire.SourceWire;
+import org.apache.tuscany.spi.wire.TargetInvoker;
import org.codehaus.groovy.control.CompilationFailedException;
/**
@@ -39,12 +40,15 @@
private String script;
private List<Class<?>> services;
+ private List<PropertyInjector> injectors;
- public GroovyAtomicContext(String name, String script, List<Class<?>>services, Scope scope, CompositeContext parent) {
+ public GroovyAtomicContext(String name, String script, List<Class<?>>services, Scope scope,
+ List<PropertyInjector> injectors, CompositeContext parent) {
super(name, parent);
this.script = script;
this.services = services;
this.scope = scope;
+ this.injectors = (injectors != null) ? injectors : new ArrayList<PropertyInjector>();
}
public String getScript() {
@@ -60,11 +64,20 @@
}
public InstanceWrapper createInstance() throws ObjectCreationException {
- ClassLoader parent = getClass().getClassLoader();
- GroovyClassLoader loader = new GroovyClassLoader(parent);
try {
+ ClassLoader parent = getClass().getClassLoader();
+ GroovyClassLoader loader = new GroovyClassLoader(parent);
Class groovyClass = loader.parseClass(script);
- return new GroovyInstanceWrapper(this, (GroovyObject) groovyClass.newInstance());
+ GroovyObject object = (GroovyObject) groovyClass.newInstance();
+ // inject properties
+ for (PropertyInjector injector : injectors) {
+ injector.inject(object);
+ }
+ // inject wires
+ for (SourceWire wire : sourceWires) {
+ object.setProperty(wire.getReferenceName(), wire.getTargetService());
+ }
+ return new GroovyInstanceWrapper(this, object);
} catch (CompilationFailedException e) {
throw new ObjectCreationException(e);
} catch (IllegalAccessException e) {
@@ -90,11 +103,6 @@
}
public void init(Object instance) throws TargetException {
- GroovyObject object = (GroovyObject) instance;
- for (SourceWire wire : sourceWires) {
- //wire from the groovy script to targets
- object.setProperty(wire.getReferenceName(), wire.getTargetService());
- }
}
public void destroy(Object instance) throws TargetException {
Modified: incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyComponentBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyComponentBuilder.java?rev=408945&r1=408944&r2=408945&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyComponentBuilder.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/GroovyComponentBuilder.java Tue May 23 08:53:05 2006
@@ -30,6 +30,6 @@
String script = component.getImplementation().getScript();
String name = component.getName();
Scope scope = component.getImplementation().getComponentType().getLifecycleScope();
- return new GroovyAtomicContext(name, script, services, scope, parent);
+ return new GroovyAtomicContext(name, script, services, scope, null,parent);
}
}
Added: incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/InjectionException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/InjectionException.java?rev=408945&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/InjectionException.java (added)
+++ incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/InjectionException.java Tue May 23 08:53:05 2006
@@ -0,0 +1,23 @@
+package org.apache.tuscany.container.groovy;
+
+import org.apache.tuscany.spi.TuscanyRuntimeException;
+
+/**
+ * @version $$Rev$$ $$Date$$
+ */
+public class InjectionException extends TuscanyRuntimeException {
+ public InjectionException() {
+ }
+
+ public InjectionException(String string) {
+ super(string);
+ }
+
+ public InjectionException(String string, Throwable throwable) {
+ super(string, throwable);
+ }
+
+ public InjectionException(Throwable throwable) {
+ super(throwable);
+ }
+}
Added: incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/PropertyInjector.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/PropertyInjector.java?rev=408945&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/PropertyInjector.java (added)
+++ incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/PropertyInjector.java Tue May 23 08:53:05 2006
@@ -0,0 +1,13 @@
+package org.apache.tuscany.container.groovy;
+
+import groovy.lang.GroovyObject;
+
+/**
+ * Injects a property on a {@link groovy.lang.GroovyObject}
+ * @version $$Rev$$ $$Date$$
+ */
+public interface PropertyInjector {
+
+ public void inject(GroovyObject instance) throws InjectionException;
+
+}
Added: incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/injectors/SingletonInjector.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/injectors/SingletonInjector.java?rev=408945&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/injectors/SingletonInjector.java (added)
+++ incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/main/java/org/apache/tuscany/container/groovy/injectors/SingletonInjector.java Tue May 23 08:53:05 2006
@@ -0,0 +1,24 @@
+package org.apache.tuscany.container.groovy.injectors;
+
+import groovy.lang.GroovyObject;
+import org.apache.tuscany.container.groovy.InjectionException;
+import org.apache.tuscany.container.groovy.PropertyInjector;
+
+/**
+ * Implements a simple injector that just returns an object
+ *
+ * @version $$Rev$$ $$Date$$
+ */
+public class SingletonInjector implements PropertyInjector {
+ private String name;
+ private Object val;
+
+ public SingletonInjector(String name, Object val) {
+ this.name = name;
+ this.val = val;
+ }
+
+ public void inject(GroovyObject instance) throws InjectionException {
+ instance.setProperty(name, val);
+ }
+}
Added: incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/PropertyTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/PropertyTestCase.java?rev=408945&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/PropertyTestCase.java (added)
+++ incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/PropertyTestCase.java Tue May 23 08:53:05 2006
@@ -0,0 +1,47 @@
+package org.apache.tuscany.container.groovy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tuscany.container.groovy.mock.Greeting;
+import org.apache.tuscany.container.groovy.injectors.SingletonInjector;
+import org.apache.tuscany.core.context.scope.ModuleScopeContext;
+import org.apache.tuscany.spi.model.Scope;
+import org.apache.tuscany.spi.wire.SourceWire;
+import org.jmock.Mock;
+import org.jmock.MockObjectTestCase;
+
+/**
+ * @version $$Rev$$ $$Date$$
+ */
+public class PropertyTestCase extends MockObjectTestCase {
+
+ private static final String SCRIPT = "import org.apache.tuscany.container.groovy.mock.Greeting;" +
+ "class Foo implements Greeting{" +
+ " String property;" +
+ " public String greet(String name){" +
+ " return property; " +
+ " }" +
+ "}";
+
+
+ /**
+ * Tests a basic invocation down a source wire
+ */
+ public void testPropertyInjection() throws Exception {
+ ModuleScopeContext scope = new ModuleScopeContext(null);
+ scope.start();
+ List<Class<?>> services = new ArrayList<Class<?>>();
+ services.add(Greeting.class);
+ List<PropertyInjector> injectors = new ArrayList<PropertyInjector>();
+ injectors.add(new SingletonInjector("property","bar"));
+ GroovyAtomicContext<Greeting> context = new GroovyAtomicContext<Greeting>("source", PropertyTestCase.SCRIPT,
+ services, Scope.MODULE, injectors, null);
+ context.setScopeContext(scope);
+ Greeting greeting = context.getService();
+ assertEquals("bar", greeting.greet("foo"));
+ scope.stop();
+ }
+
+
+}
Added: incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/ScriptInvokeTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/ScriptInvokeTestCase.java?rev=408945&view=auto
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/ScriptInvokeTestCase.java (added)
+++ incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/ScriptInvokeTestCase.java Tue May 23 08:53:05 2006
@@ -0,0 +1,35 @@
+package org.apache.tuscany.container.groovy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import groovy.lang.GroovyObject;
+import org.apache.tuscany.container.groovy.mock.Greeting;
+import org.apache.tuscany.core.context.scope.ModuleScopeContext;
+import org.apache.tuscany.spi.model.Scope;
+import org.jmock.MockObjectTestCase;
+
+/**
+ * @version $$Rev$$ $$Date$$
+ */
+public class ScriptInvokeTestCase extends MockObjectTestCase {
+
+ private String script2 = "def greet(name) { return name }";
+
+ /**
+ * Tests the invocation of a Groovy "script" as opposed to a class
+ */
+ public void testBasicScriptInvocation() throws Exception {
+ ModuleScopeContext scope = new ModuleScopeContext(null);
+ scope.start();
+ List<Class<?>> services = new ArrayList<Class<?>>();
+ services.add(Greeting.class);
+ GroovyAtomicContext<GroovyObject> context = new GroovyAtomicContext<GroovyObject>("source", script2,
+ services, Scope.MODULE, null, null);
+ context.setScopeContext(scope);
+ GroovyObject object = context.getService();
+ assertEquals("foo", object.invokeMethod("greet", "foo"));
+ scope.stop();
+ }
+
+}
Copied: incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/WireTestCase.java (from r408842, incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/InvocationTestCase.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/WireTestCase.java?p2=incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/WireTestCase.java&p1=incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/InvocationTestCase.java&r1=408842&r2=408945&rev=408945&view=diff
==============================================================================
--- incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/InvocationTestCase.java (original)
+++ incubator/tuscany/sandbox/jboynes/sca/containers/container.groovy/src/test/java/org/apache/tuscany/container/groovy/WireTestCase.java Tue May 23 08:53:05 2006
@@ -3,20 +3,21 @@
import java.util.ArrayList;
import java.util.List;
-import groovy.lang.GroovyObject;
import org.apache.tuscany.container.groovy.mock.Greeting;
import org.apache.tuscany.core.context.scope.ModuleScopeContext;
import org.apache.tuscany.spi.model.Scope;
import org.apache.tuscany.spi.wire.SourceWire;
+import org.apache.tuscany.spi.wire.TargetInvoker;
import org.jmock.Mock;
import org.jmock.MockObjectTestCase;
/**
+ *
* @version $$Rev$$ $$Date$$
*/
-public class InvocationTestCase extends MockObjectTestCase {
+public class WireTestCase extends MockObjectTestCase {
- private String script1 = "import org.apache.tuscany.container.groovy.mock.Greeting;" +
+ private static final String SCRIPT = "import org.apache.tuscany.container.groovy.mock.Greeting;" +
"class Foo implements Greeting{" +
" Greeting wire;" +
" public String greet(String name){" +
@@ -24,14 +25,22 @@
" }" +
"}";
- private String script2 = "def greet(name) { return name }";
+ private static final String SCRIPT2 = "import org.apache.tuscany.container.groovy.mock.Greeting;" +
+ "class Foo implements Greeting{" +
+ " public String greet(String name){" +
+ " return name; " +
+ " }" +
+ "}";
- public void testBasicClassAndWireInvocation() throws Exception {
+ /**
+ * Tests a basic invocation down a source wire
+ */
+ public void testSourceWireInvocation() throws Exception {
ModuleScopeContext scope = new ModuleScopeContext(null);
scope.start();
List<Class<?>> services = new ArrayList<Class<?>>();
services.add(Greeting.class);
- GroovyAtomicContext<Greeting> context = new GroovyAtomicContext<Greeting>("source", script1, services, Scope.MODULE, null);
+ GroovyAtomicContext<Greeting> context = new GroovyAtomicContext<Greeting>("source", SCRIPT, services, Scope.MODULE,null, null);
context.setScopeContext(scope);
Mock mock = mock(SourceWire.class);
mock.expects(atLeastOnce()).method("getTargetService").will(
@@ -40,7 +49,7 @@
return name;
}
}));
- mock.stubs().method("getReferenceName").will(returnValue("wire"));
+ mock.expects(atLeastOnce()).method("getReferenceName").will(returnValue("wire"));
SourceWire<Greeting> wire = (SourceWire<Greeting>) mock.proxy();
context.addSourceWire(wire);
Greeting greeting = context.getService();
@@ -49,15 +58,19 @@
}
- public void testBasicScriptInvocation() throws Exception {
+ /**
+ * Tests a basic invocation to a target
+ */
+ public void testTargetInvocation() throws Exception {
ModuleScopeContext scope = new ModuleScopeContext(null);
scope.start();
List<Class<?>> services = new ArrayList<Class<?>>();
services.add(Greeting.class);
- GroovyAtomicContext<GroovyObject> context = new GroovyAtomicContext<GroovyObject>("source", script2, services, Scope.MODULE, null);
+ GroovyAtomicContext<Greeting> context = new GroovyAtomicContext<Greeting>("source", SCRIPT2, services,
+ Scope.MODULE,null, null);
context.setScopeContext(scope);
- GroovyObject object = context.getService();
- assertEquals("foo", object.invokeMethod("greet", "foo"));
+ TargetInvoker invoker = context.createTargetInvoker("greeting",Greeting.class.getMethod("greet", String.class));
+ assertEquals("foo", invoker.invokeTarget(new String[]{"foo"}));
scope.stop();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org