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