You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by an...@apache.org on 2006/06/16 16:59:24 UTC

svn commit: r414844 [2/3] - in /incubator/tuscany/sandbox/ant/tuscany-container-rhino: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/tuscany/ src/main/java/org/apache/tuscany/container/ src/main/...

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/e4x/E4XInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/e4x/E4XInterceptor.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/e4x/E4XInterceptor.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/e4x/E4XInterceptor.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,65 @@
+package org.apache.tuscany.container.rhino.e4x;
+
+import java.io.ByteArrayInputStream;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.core.message.Message;
+import org.apache.tuscany.core.wire.Interceptor;
+import org.apache.tuscany.core.wire.InvocationRuntimeException;
+import org.apache.tuscany.databinding.sdo.SDOXMLHelper;
+import org.apache.xmlbeans.XmlObject;
+
+import commonj.sdo.helper.TypeHelper;
+
+public class E4XInterceptor implements Interceptor {
+
+    private Interceptor next;
+
+    private QName elementQN;
+
+    private TypeHelper typeHelper;
+
+    private ClassLoader classLoader;
+
+    E4XInterceptor(QName elementQN, TypeHelper typeHelper, ClassLoader classLoader) {
+        this.elementQN = elementQN;
+        this.typeHelper = typeHelper;
+        this.classLoader = classLoader;
+    }
+
+    public Message invoke(Message message) {
+        toXmlObject(message);
+        Message responseMessage = next.invoke(message);
+        fromXmlObject(responseMessage);
+        return responseMessage;
+    }
+
+    protected void toXmlObject(Message message) {
+        Object[] body = (Object[]) message.getBody();
+        byte[] xmlBytes = SDOXMLHelper.toXMLBytes(classLoader, typeHelper, body, elementQN, true);
+        try {
+            message.setBody(new Object[] { XmlObject.Factory.parse(new ByteArrayInputStream(xmlBytes)) });
+        } catch (Exception e) {
+            throw new InvocationRuntimeException(e);
+        }
+    }
+
+    protected void fromXmlObject(Message message) {
+        Object body = message.getBody();
+        if (body instanceof XmlObject) {
+            byte[] xmlBytes = ((XmlObject) body).toString().getBytes();
+            Object[] os = SDOXMLHelper.toObjects(classLoader, typeHelper, xmlBytes, true);
+            if (os == null || os.length < 1) {
+                message.setBody(os);
+            } else {
+                message.setBody(os[0]);
+            }
+        }
+    }
+
+    public void setNext(Interceptor next) {
+        this.next = next;
+    }
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/e4x/E4XPolicyBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/e4x/E4XPolicyBuilder.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/e4x/E4XPolicyBuilder.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/e4x/E4XPolicyBuilder.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,117 @@
+/**
+ *
+ *  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed 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.tuscany.container.rhino.e4x;
+
+import java.util.List;
+
+import javax.wsdl.Input;
+import javax.wsdl.Message;
+import javax.wsdl.Operation;
+import javax.wsdl.PortType;
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.container.rhino.assembly.JavaScriptImplementation;
+import org.apache.tuscany.core.builder.BuilderException;
+import org.apache.tuscany.core.builder.SourcePolicyBuilder;
+import org.apache.tuscany.core.builder.TargetPolicyBuilder;
+import org.apache.tuscany.core.builder.system.PolicyBuilderRegistry;
+import org.apache.tuscany.core.system.annotation.Autowire;
+import org.apache.tuscany.core.wire.TargetInvocationConfiguration;
+import org.apache.tuscany.core.wire.WireSourceConfiguration;
+import org.apache.tuscany.core.wire.WireTargetConfiguration;
+import org.apache.tuscany.model.assembly.AtomicComponent;
+import org.apache.tuscany.model.assembly.AtomicImplementation;
+import org.apache.tuscany.model.assembly.ConfiguredReference;
+import org.apache.tuscany.model.assembly.ConfiguredService;
+import org.apache.tuscany.model.assembly.Part;
+import org.apache.tuscany.model.assembly.Service;
+import org.apache.tuscany.model.assembly.ServiceContract;
+import org.apache.tuscany.model.types.wsdl.WSDLServiceContract;
+import org.osoa.sca.annotations.Init;
+
+import commonj.sdo.helper.TypeHelper;
+
+/**
+ */
+@org.osoa.sca.annotations.Scope("MODULE")
+public class E4XPolicyBuilder implements SourcePolicyBuilder, TargetPolicyBuilder {
+
+    private PolicyBuilderRegistry builderRegistry;
+
+    public E4XPolicyBuilder() {
+    }
+
+    @Init(eager = true)
+    public void init() {
+        builderRegistry.registerSourceBuilder(this);
+        builderRegistry.registerTargetBuilder(this);
+    }
+
+    @Autowire
+    public void setBuilderRegistry(PolicyBuilderRegistry builderRegistry) {
+        this.builderRegistry = builderRegistry;
+    }
+
+    public void build(ConfiguredReference service, List<WireSourceConfiguration> wireSourceConfigurations) throws BuilderException {
+    }
+
+    public void build(ConfiguredService service, WireTargetConfiguration wireTargetConfiguration) throws BuilderException {
+        Part part = service.getPart();
+        if (part instanceof AtomicComponent) {
+            AtomicImplementation implementation = ((AtomicComponent) part).getImplementation();
+            if (implementation instanceof JavaScriptImplementation) {
+                JavaScriptImplementation javaScriptImplementation = (JavaScriptImplementation) implementation;
+                for (TargetInvocationConfiguration configuration : wireTargetConfiguration.getInvocationConfigurations().values()) {
+                    TypeHelper typeHelper = javaScriptImplementation.getTypeHelper();
+                    ClassLoader classLoader = javaScriptImplementation.getResourceLoader().getClassLoader();
+                    String methodName = configuration.getMethod().getName();
+                    QName responseQN = getElementQName(javaScriptImplementation, methodName);
+                    if (responseQN != null) {
+                        configuration.addInterceptor(new E4XInterceptor(responseQN, typeHelper, classLoader));
+                    }
+                }
+            }
+        }
+    }
+
+    protected QName getElementQName(JavaScriptImplementation javaScriptImplementation, String methodName) {
+        for (Service service : javaScriptImplementation.getComponentType().getServices()) {
+            ServiceContract sc = service.getServiceContract();
+            if (sc instanceof WSDLServiceContract) {
+                PortType pt = ((WSDLServiceContract) sc).getPortType();
+                for (Object o : pt.getOperations()) {
+                    Operation operation = (Operation) o;
+                    if (methodName.equals(operation.getName())) {
+                        Input input = operation.getInput();
+                        if (input != null) {
+                            Message message = input.getMessage();
+                            if (message != null) {
+                                List parts = message.getOrderedParts(null);
+                                if (parts != null && parts.size() > 0) {
+                                    javax.wsdl.Part part = (javax.wsdl.Part) parts.get(0);
+                                    return part.getElementName();
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/loader/JavaScriptImplementationLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/loader/JavaScriptImplementationLoader.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/loader/JavaScriptImplementationLoader.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/loader/JavaScriptImplementationLoader.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,169 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed 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.tuscany.container.rhino.loader;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.tuscany.common.resource.ResourceLoader;
+import org.apache.tuscany.container.rhino.assembly.JavaScriptImplementation;
+import org.apache.tuscany.core.config.ConfigurationLoadException;
+import org.apache.tuscany.core.config.InvalidRootElementException;
+import org.apache.tuscany.core.config.MissingResourceException;
+import org.apache.tuscany.core.config.SidefileLoadException;
+import org.apache.tuscany.core.loader.LoaderContext;
+import org.apache.tuscany.core.loader.StAXElementLoader;
+import org.apache.tuscany.core.loader.StAXLoaderRegistry;
+import org.apache.tuscany.core.loader.assembly.AssemblyConstants;
+import org.apache.tuscany.core.system.annotation.Autowire;
+import org.apache.tuscany.model.assembly.ComponentType;
+import org.osoa.sca.annotations.Destroy;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Scope;
+
+/**
+ * @version $Rev$ $Date$
+ */
+@Scope("MODULE")
+public class JavaScriptImplementationLoader implements StAXElementLoader<JavaScriptImplementation> {
+
+    public static final QName IMPLEMENTATION_JS = new QName("http://org.apache.tuscany/xmlns/js/0.9", "implementation.js");
+
+    protected StAXLoaderRegistry registry;
+
+    private XMLInputFactory xmlFactory;
+
+    public JavaScriptImplementationLoader() {
+        // todo make this a reference to a system service
+        xmlFactory = XMLInputFactory.newInstance();
+    }
+
+    @Autowire
+    public void setRegistry(StAXLoaderRegistry registry) {
+        this.registry = registry;
+    }
+
+    @Init(eager = true)
+    public void start() {
+        registry.registerLoader(IMPLEMENTATION_JS, this);
+    }
+
+    @Destroy
+    public void stop() {
+        registry.unregisterLoader(IMPLEMENTATION_JS, this);
+    }
+
+    @SuppressWarnings("deprecation")
+    public JavaScriptImplementation load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException {
+        String scriptFile = reader.getAttributeValue(null, "scriptFile");
+        String script = loadScript(scriptFile, loaderContext.getResourceLoader());
+        ComponentType componentType = loadComponentType(scriptFile, loaderContext);
+
+        JavaScriptImplementation jsImpl = new JavaScriptImplementation();
+        jsImpl.setComponentType(componentType);
+        jsImpl.setScriptFile(scriptFile);
+        jsImpl.setScript(script);
+        jsImpl.setResourceLoader(loaderContext.getResourceLoader());
+        jsImpl.setTypeHelper(registry.getContext().getTypeHelper());
+        return jsImpl;
+    }
+
+    protected String loadScript(String scriptFile, ResourceLoader resourceLoader) throws ConfigurationLoadException {
+        URL url = resourceLoader.getResource(scriptFile);
+        if (url == null) {
+            throw new ConfigurationLoadException(scriptFile);
+        }
+        InputStream inputStream;
+        try {
+            inputStream = url.openStream();
+        } catch (IOException e) {
+            throw new ConfigurationLoadException(scriptFile, e);
+        }
+        try {
+            StringBuilder sb = new StringBuilder(1024);
+            int n;
+            while ((n = inputStream.read()) != -1) {
+                sb.append((char) n);
+            }
+            return sb.toString();
+        } catch (IOException e) {
+            throw new ConfigurationLoadException(scriptFile, e);
+        } finally {
+            try {
+                inputStream.close();
+            } catch (IOException e) {
+                // ignore
+            }
+        }
+    }
+
+    protected ComponentType loadComponentType(String scriptFile, LoaderContext loaderContext) throws SidefileLoadException, MissingResourceException{
+        String sidefile = scriptFile.substring(0, scriptFile.lastIndexOf('.')) + ".componentType";
+        URL componentTypeFile = loaderContext.getResourceLoader().getResource(sidefile);
+        if (componentTypeFile == null) {
+            throw new MissingResourceException(sidefile);
+        }
+
+        try {
+            XMLStreamReader reader;
+            InputStream is;
+                is = componentTypeFile.openStream();
+            try {
+                reader = xmlFactory.createXMLStreamReader(is);
+                try {
+                    reader.nextTag();
+                    if (!AssemblyConstants.COMPONENT_TYPE.equals(reader.getName())) {
+                        InvalidRootElementException e = new InvalidRootElementException(AssemblyConstants.COMPONENT_TYPE, reader.getName());
+                        e.setResourceURI(componentTypeFile.toString());
+                        throw e;
+                    }
+                    return (ComponentType) registry.load(reader, loaderContext);
+                } finally {
+                    try {
+                        reader.close();
+                    } catch (XMLStreamException e) {
+                        // ignore
+                    }
+                }
+            } finally {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+        } catch (IOException e) {
+            SidefileLoadException sfe = new SidefileLoadException(e.getMessage());
+            sfe.setResourceURI(componentTypeFile.toString());
+            throw sfe;
+        } catch (XMLStreamException e) {
+            SidefileLoadException sfe = new SidefileLoadException(e.getMessage());
+            sfe.setResourceURI(componentTypeFile.toString());
+            throw sfe;
+        } catch (ConfigurationLoadException e) {
+            SidefileLoadException sfe = new SidefileLoadException(e.getMessage());
+            sfe.setResourceURI(componentTypeFile.toString());
+            throw sfe;
+        }
+    }
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoFunctionInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoFunctionInvoker.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoFunctionInvoker.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoFunctionInvoker.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,79 @@
+package org.apache.tuscany.container.rhino.rhino;
+
+import org.apache.xmlbeans.XmlObject;
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+import org.mozilla.javascript.Wrapper;
+import org.mozilla.javascript.xml.XMLObject;
+
+/**
+ * An invoker for a specific function in a JavaScript script
+ */
+public class RhinoFunctionInvoker {
+
+    private Scriptable instanceScope;
+
+    private Function function;
+
+    private Class responseClass;
+
+    public RhinoFunctionInvoker(Scriptable instanceScope, Function function, Class responseClass) {
+        this.instanceScope = instanceScope;
+        this.function = function;
+        this.responseClass = responseClass;
+    }
+
+    public Object invoke(Object[] args) {
+        Context cx = Context.enter();
+        try {
+
+            Object[] jsArgs = toJavaScript(args, instanceScope, cx);
+            Object jsResponse = function.call(cx, instanceScope, instanceScope, jsArgs);
+            Object response = fromJavaScript(jsResponse);
+            return response;
+
+        } finally {
+            Context.exit();
+        }
+    }
+
+    protected Object[] toJavaScript(Object[] arg, Scriptable scope, Context cx) {
+        Object[] jsArgs;
+        if (arg == null) {
+            jsArgs = new Object[0];
+        } else if (arg.length == 1 && arg[0] instanceof XmlObject) {
+            Object jsXML = cx.getWrapFactory().wrap(cx, scope, (XmlObject) arg[0], XmlObject.class);
+            jsArgs = new Object[] { cx.newObject(scope, "XML", new Object[] { jsXML }) };
+        } else {
+            jsArgs = (Object[]) arg;
+            for (int i = 0; i < jsArgs.length; i++) {
+                jsArgs[i] = Context.toObject(jsArgs[i], scope);
+            }
+        }
+        return jsArgs;
+    }
+
+    protected Object fromJavaScript(Object o) {
+        Object response;
+        if (Context.getUndefinedValue().equals(o)) {
+            response = null;
+        } else if (o instanceof XMLObject) {
+            // TODO: E4X Bug? Shouldn't need this copy, but without it the outer element gets lost???
+            Scriptable jsXML = (Scriptable) ScriptableObject.callMethod((Scriptable) o, "copy", new Object[0]);
+            Wrapper wrapper = (Wrapper) ScriptableObject.callMethod(jsXML, "getXmlObject", new Object[0]);
+            response = wrapper.unwrap();
+        } else if (o instanceof Wrapper) {
+            response = ((Wrapper) o).unwrap();
+        } else {
+            if (responseClass != null) {
+                response = Context.jsToJava(o, responseClass);
+            } else {
+                response = Context.jsToJava(o, String.class);
+            }
+        }
+        return response;
+    }
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScript.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScript.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScript.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScript.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,194 @@
+/**
+ *
+ *  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed 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.tuscany.container.rhino.rhino;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.ContextFactory;
+import org.mozilla.javascript.ImporterTopLevel;
+import org.mozilla.javascript.Script;
+import org.mozilla.javascript.Scriptable;
+
+/**
+ * A RhinoScript represents a compiled JavaScript script
+ */
+public class RhinoScript {
+
+    protected String scriptName;
+
+    protected String script;
+
+    protected Scriptable scriptScope;
+
+    protected Map<String, Class> responseClasses;
+
+    /*
+     * Enable dynamic scopes so a script can be used concurrently with a global shared scope and individual execution scopes. See
+     * http://www.mozilla.org/rhino/scopes.html 
+     */
+    private static class MyFactory extends ContextFactory {
+        protected boolean hasFeature(Context cx, int featureIndex) {
+            if (featureIndex == Context.FEATURE_DYNAMIC_SCOPE) {
+                return true;
+            }
+            return super.hasFeature(cx, featureIndex);
+        }
+    }
+
+    static {
+        ContextFactory.initGlobal(new MyFactory());
+    }
+
+    /**
+     * Create a new RhinoScript.
+     * 
+     * @param scriptName
+     *            the name of the script. Can be anything, only used in messages to identify the script
+     * @param script
+     *            the complete script
+     */
+    public RhinoScript(String scriptName, String script) {
+        this(scriptName, script, (Map) null, null);
+    }
+
+    /**
+     * Create a new RhinoInvoker.
+     * 
+     * @param scriptName
+     *            the name of the script. Can be anything, only used in messages to identify the script
+     * @param script
+     *            the complete script
+     * @param context
+     *            name-value pairs that are added in to the scope where the script is compiled. May be null. The value objects are made available to
+     *            the script by using a variable with the name.
+     * @param classLoader
+     *            the ClassLoader Rhino should use to locate any user Java classes used in the script
+     */
+    public RhinoScript(String scriptName, String script, Map context, ClassLoader cl) {
+        this.scriptName = scriptName;
+        this.script = script;
+        this.responseClasses = new HashMap<String, Class>();
+        initScriptScope(scriptName, script, context, cl);
+    }
+
+    /**
+     * Create a new invokeable instance of the script
+     * 
+     * @return a RhinoScriptInstance
+     */
+    public RhinoScriptInstance createRhinoScriptInstance() {
+        return createRhinoScriptInstance(null);
+    }
+
+    /**
+     * Create a new invokeable instance of the script
+     * 
+     * @param context
+     *            objects to add to scope of the script instance
+     * @return a RhinoScriptInstance
+     */
+    public RhinoScriptInstance createRhinoScriptInstance(Map<String, Object> context) {
+        Scriptable instanceScope = createInstanceScope(context);
+        RhinoScriptInstance rsi = new RhinoScriptInstance(scriptScope, instanceScope, context, responseClasses);
+        return rsi;
+    }
+
+    /**
+     * Initialize the Rhino Scope for this script instance
+     */
+    protected Scriptable createInstanceScope(Map<String, Object> context) {
+        Context cx = Context.enter();
+        try {
+
+            Scriptable instanceScope = cx.newObject(scriptScope);
+            instanceScope.setPrototype(scriptScope);
+            instanceScope.setParentScope(null);
+
+            addContexts(instanceScope, context);
+
+            return instanceScope;
+
+        } finally {
+            Context.exit();
+        }
+    }
+
+    /**
+     * Create a Rhino scope and compile the script into it
+     */
+    protected void initScriptScope(String fileName, String scriptCode, Map context, ClassLoader cl) {
+        Context cx = Context.enter();
+        try {
+            if (cl != null) {
+                cx.setApplicationClassLoader(cl);
+            }
+            this.scriptScope = new ImporterTopLevel(cx, true);
+            Script compiledScript = cx.compileString(scriptCode, fileName, 1, null);
+            compiledScript.exec(cx, scriptScope);
+            addContexts(scriptScope, context);
+
+        } finally {
+            Context.exit();
+        }
+    }
+
+    /**
+     * Add the context to the scope. This will make the objects available to a script by using the name it was added with.
+     */
+    protected void addContexts(Scriptable scope, Map contexts) {
+        if (contexts != null) {
+            for (Iterator i = contexts.keySet().iterator(); i.hasNext();) {
+                String name = (String) i.next();
+                Object value = contexts.get(name);
+                if (value != null) {
+                    scope.put(name, scope, Context.toObject(value, scope));
+                }
+            }
+        }
+    }
+
+    public String getScript() {
+        return script;
+    }
+
+    public String getScriptName() {
+        return scriptName;
+    }
+
+    public Scriptable getScriptScope() {
+        return scriptScope;
+    }
+
+    public Map<String, Class> getResponseClasses() {
+        return responseClasses;
+    }
+
+    /**
+     * Set the Java type of a response value. JavaScript is dynamically typed so Rhino
+     * cannot always work out what the intended Java type of a response should be, for 
+     * example should the statement "return 42" be a Java int, or Integer or Double etc.
+     * When Rhino can't determine the type it will default to returning a String, using
+     * this method enables overriding the Rhino default to use a specific Java type.   
+     */
+    public void setResponseClass(String functionName, Class responseClasses) {
+        this.responseClasses.put(functionName, responseClasses);
+    }
+
+}
\ No newline at end of file

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptInstance.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptInstance.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptInstance.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptInstance.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,82 @@
+package org.apache.tuscany.container.rhino.rhino;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.UniqueTag;
+
+/**
+ * An invokeable instance of a JavaScript script.
+ */
+public class RhinoScriptInstance {
+
+    private Scriptable scriptScope;
+
+    private Scriptable instanceScope;
+
+    private Map<String, Class> responseClasses;
+
+    public RhinoScriptInstance(Scriptable scriptScope, Scriptable instanceScope, Map<String, Object> context, Map<String, Class> responseClasses) {
+        this.scriptScope = scriptScope;
+        this.instanceScope = instanceScope;
+        this.responseClasses = responseClasses;
+        if (this.responseClasses == null) {
+            this.responseClasses = new HashMap<String, Class>();
+        }
+        addContexts(instanceScope, context);
+    }
+
+    public Object invokeFunction(String functionName, Object[] args) {
+        RhinoFunctionInvoker invoker = createRhinoFunctionInvoker(functionName);
+        return invoker.invoke(args);
+    }
+
+    public RhinoFunctionInvoker createRhinoFunctionInvoker(String functionName) {
+        Function function = getFunction(functionName);
+        Class responseClass = responseClasses.get(functionName);
+        RhinoFunctionInvoker invoker = new RhinoFunctionInvoker(instanceScope, function, responseClass);
+        return invoker;
+    }
+
+    /**
+     * Add the context to the scope. This will make the objects available to a script by using the name it was added with.
+     */
+    protected void addContexts(Scriptable scope, Map contexts) {
+        if (contexts != null) {
+            Context.enter();
+            try {
+                for (Iterator i = contexts.keySet().iterator(); i.hasNext();) {
+                    String name = (String) i.next();
+                    Object value = contexts.get(name);
+                    if (value != null) {
+                        scope.put(name, scope, Context.toObject(value, scope));
+                    }
+                }
+            } finally {
+                Context.exit();
+            }
+        }
+    }
+
+    /**
+     * Get the Rhino Function object for the named script function
+     */
+    protected Function getFunction(String functionName) {
+
+        Object handleObj = scriptScope.get(functionName, instanceScope);
+        if (UniqueTag.NOT_FOUND.equals(handleObj)) {
+            // Bit of a hack so E4X scripts don't need to define a function for every operation 
+            handleObj = scriptScope.get("process", instanceScope);
+        }
+        if (!(handleObj instanceof Function)) {
+            throw new RuntimeException("script function '" + functionName + "' is undefined or not a function");
+        }
+
+        return (Function) handleObj;
+    }
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/resources/system.fragment
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/resources/system.fragment?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/resources/system.fragment (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/main/resources/system.fragment Fri Jun 16 07:59:20 2006
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--
+  Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+  Licensed 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.
+ -->
+<moduleFragment xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+        xmlns:tuscany="http://org.apache.tuscany/xmlns/system/0.9"
+		name="org.apache.tuscany.container.rhino">
+
+    <component name="org.apache.tuscany.container.rhino.builder.JavaScriptContextFactoryBuilder">
+        <tuscany:implementation.system class="org.apache.tuscany.container.rhino.builder.JavaScriptContextFactoryBuilder"/>
+    </component>
+
+    <component name="org.apache.tuscany.container.rhino.builder.JavaScriptTargetWireBuilder">
+        <tuscany:implementation.system class="org.apache.tuscany.container.rhino.builder.JavaScriptTargetWireBuilder"/>
+    </component>
+
+    <component name="org.apache.tuscany.container.rhino.loader.JavaScriptImplementationLoader">
+        <tuscany:implementation.system class="org.apache.tuscany.container.rhino.loader.JavaScriptImplementationLoader"/>
+    </component>
+
+    <component name="org.apache.tuscany.container.rhino.e4x.E4XPolicyBuilder">
+        <tuscany:implementation.system class="org.apache.tuscany.container.rhino.e4x.E4XPolicyBuilder"/>
+    </component>
+
+</moduleFragment>

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/builder/JavaScriptContextFactoryBuilderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/builder/JavaScriptContextFactoryBuilderTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/builder/JavaScriptContextFactoryBuilderTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/builder/JavaScriptContextFactoryBuilderTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.tuscany.container.rhino.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl;
+import org.apache.tuscany.container.rhino.assembly.JavaScriptImplementation;
+import org.apache.tuscany.container.rhino.context.JavaScriptComponentContext;
+import org.apache.tuscany.core.builder.ContextFactory;
+import org.apache.tuscany.core.extension.ExternalServiceInvoker;
+import org.apache.tuscany.model.assembly.AssemblyContext;
+import org.apache.tuscany.model.assembly.AssemblyInitializationException;
+import org.apache.tuscany.model.assembly.AssemblyVisitor;
+import org.apache.tuscany.model.assembly.ComponentType;
+import org.apache.tuscany.model.assembly.Property;
+import org.apache.tuscany.model.assembly.Reference;
+import org.apache.tuscany.model.assembly.Service;
+
+/**
+ * Tests for the RhinoScript
+ */
+public class JavaScriptContextFactoryBuilderTestCase extends TestCase {
+
+    public JavaScriptContextFactoryBuilderTestCase() {
+
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testSimpleConstructor() {
+        JavaScriptContextFactoryBuilder builder = new JavaScriptContextFactoryBuilder();
+        JavaScriptImplementation jsImpl = createMockJSImpl();
+        jsImpl.setScript("function foo() { return 'petra';}");
+
+        ContextFactory cf = builder.createContextFactory("foo", jsImpl, null);
+        assertNotNull(cf);
+
+        JavaScriptComponentContext context = (JavaScriptComponentContext) cf.createContext();
+        assertNotNull(context);
+
+        ExternalServiceInvoker invoker = (ExternalServiceInvoker) context.getTargetInstance();
+        assertNotNull(invoker);
+
+        Object response = invoker.invoke("foo", new Object[0]);
+        assertEquals("petra", response);
+    }
+
+    private JavaScriptImplementation createMockJSImpl() {
+        JavaScriptImplementation jsImpl = new JavaScriptImplementation();
+
+        jsImpl.setComponentType(new ComponentType() {
+
+            public List<Service> getServices() {
+                return new ArrayList<Service>();
+            }
+
+            public Service getService(String name) {
+                return null;
+            }
+
+            public List<Reference> getReferences() {
+                return null;
+            }
+
+            public Reference getReference(String name) {
+                return null;
+            }
+
+            public List<Property> getProperties() {
+                return new ArrayList<Property>();
+            }
+
+            public Property getProperty(String name) {
+                return null;
+            }
+
+            public List<Object> getExtensibilityElements() {
+                return null;
+            }
+
+            public List<Object> getExtensibilityAttributes() {
+                return null;
+            }
+
+            public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException {
+            }
+
+            public void freeze() {
+            }
+
+            public boolean accept(AssemblyVisitor visitor) {
+                return false;
+            }
+        });
+
+        jsImpl.setResourceLoader(new ResourceLoaderImpl(getClass().getClassLoader()));
+
+        return jsImpl;
+    }
+
+}
\ No newline at end of file

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/e4x/E4XInterceptorTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/e4x/E4XInterceptorTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/e4x/E4XInterceptorTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/e4x/E4XInterceptorTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.tuscany.container.rhino.e4x;
+
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.core.message.Message;
+import org.apache.tuscany.core.wire.Interceptor;
+import org.apache.tuscany.core.wire.MessageChannel;
+import org.apache.tuscany.core.wire.TargetInvoker;
+import org.apache.tuscany.sdo.util.DataObjectUtil;
+import org.apache.tuscany.sdo.util.SDOUtil;
+import org.apache.xmlbeans.XmlObject;
+
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XSDHelper;
+
+/**
+ * Tests for the E4XInterceptor
+ */
+public class E4XInterceptorTestCase extends TestCase {
+
+    private E4XInterceptor interceptor;
+
+    private Message msg;
+
+    public E4XInterceptorTestCase() {
+    }
+
+    public void testFromXmlObject() {
+        msg.setBody(new Object[] { "petra" });
+
+        interceptor.toXmlObject(msg);
+        assertTrue(((Object[])msg.getBody())[0] instanceof XmlObject);
+
+        msg.setBody(((Object[])msg.getBody())[0]);
+        interceptor.fromXmlObject(msg);
+        assertEquals("petra", msg.getBody());
+    }
+
+    public void testToXmlObject() {
+        msg.setBody(new Object[] { "petra" });
+        interceptor.toXmlObject(msg);
+        assertTrue(((Object[])msg.getBody())[0] instanceof XmlObject);
+    }
+
+    public void testInvoke() {
+        msg.setBody(new Object[] { "petra" });
+        interceptor.invoke(msg);
+        assertEquals("petra", msg.getBody());
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        DataObjectUtil.initRuntime();
+        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+
+            TypeHelper typeHelper = SDOUtil.createTypeHelper();
+            XSDHelper xsdHelper = SDOUtil.createXSDHelper(typeHelper);
+
+            URL url = getClass().getResource("helloworld.wsdl");
+            xsdHelper.define(url.openStream(), null);
+
+            QName qn = new QName("http://integration.rhino.container.tuscany.apache.org", "getGreetings");
+            this.interceptor = new E4XInterceptor(qn, typeHelper, getClass().getClassLoader());
+            interceptor.setNext(new Interceptor() {
+                public Message invoke(Message msg) {
+                    msg.setBody(((Object[])msg.getBody())[0]);
+                    return msg;
+                }
+                public void setNext(Interceptor next) {
+                }});
+
+            this.msg = createMessage();
+
+        } finally {
+            Thread.currentThread().setContextClassLoader(cl);
+        }
+    }
+
+    private Message createMessage() {
+        Message msg = new Message() {
+
+            Object body;
+
+            public Object getBody() {
+                return body;
+            }
+
+            public void setBody(Object body) {
+                this.body = body;
+            }
+
+            public void setTargetInvoker(TargetInvoker invoker) {
+            }
+
+            public TargetInvoker getTargetInvoker() {
+                return null;
+            }
+
+            public MessageChannel getCallbackChannel() {
+                return null;
+            }
+
+            public Message getRelatedCallbackMessage() {
+                return null;
+            }
+        };
+        return msg;
+    }
+
+}
\ No newline at end of file

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/e4x/E4XPolicyBuilderTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/e4x/E4XPolicyBuilderTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/e4x/E4XPolicyBuilderTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/e4x/E4XPolicyBuilderTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,325 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.tuscany.container.rhino.e4x;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.wsdl.Input;
+import javax.wsdl.Message;
+import javax.wsdl.Operation;
+import javax.wsdl.Part;
+import javax.wsdl.PortType;
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl;
+import org.apache.tuscany.container.rhino.assembly.JavaScriptImplementation;
+import org.apache.tuscany.core.wire.Interceptor;
+import org.apache.tuscany.core.wire.TargetInvocationConfiguration;
+import org.apache.tuscany.core.wire.WireTargetConfiguration;
+import org.apache.tuscany.model.assembly.AssemblyContext;
+import org.apache.tuscany.model.assembly.AssemblyInitializationException;
+import org.apache.tuscany.model.assembly.AssemblyVisitor;
+import org.apache.tuscany.model.assembly.AtomicComponent;
+import org.apache.tuscany.model.assembly.AtomicImplementation;
+import org.apache.tuscany.model.assembly.ComponentType;
+import org.apache.tuscany.model.assembly.Composite;
+import org.apache.tuscany.model.assembly.ConfiguredProperty;
+import org.apache.tuscany.model.assembly.ConfiguredReference;
+import org.apache.tuscany.model.assembly.ConfiguredService;
+import org.apache.tuscany.model.assembly.Property;
+import org.apache.tuscany.model.assembly.Reference;
+import org.apache.tuscany.model.assembly.Service;
+import org.apache.tuscany.model.assembly.ServiceContract;
+import org.apache.tuscany.model.types.wsdl.impl.WSDLServiceContractImpl;
+
+import com.ibm.wsdl.InputImpl;
+import com.ibm.wsdl.MessageImpl;
+import com.ibm.wsdl.OperationImpl;
+import com.ibm.wsdl.PartImpl;
+import com.ibm.wsdl.PortTypeImpl;
+
+/**
+ * Tests for the E4XPolicyBuilder
+ */
+public class E4XPolicyBuilderTestCase extends TestCase {
+
+    public E4XPolicyBuilderTestCase() {
+
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGetElementQName() {
+        E4XPolicyBuilder builder = new E4XPolicyBuilder();
+        QName qn = new QName("foo");
+        JavaScriptImplementation jsImpl = createMockJSImpl("foo", qn);
+        QName qn2 = builder.getElementQName(jsImpl, "foo");
+        assertEquals(qn, qn2);
+    }
+
+    public void testBuild() throws SecurityException, NoSuchMethodException {
+        E4XPolicyBuilder builder = new E4XPolicyBuilder();
+        ConfiguredService service = createMockConfiguredService();
+        WireTargetConfiguration config = createMockWireTargetConfiguration();
+        builder.build(service, config);
+        Map<Method, TargetInvocationConfiguration> configs = config.getInvocationConfigurations();
+        assertNotNull(configs);
+        assertEquals(1, configs.size());
+        TargetInvocationConfiguration tic = configs.values().iterator().next();
+        Interceptor interceptor = tic.getHeadInterceptor();
+        assertTrue(interceptor instanceof E4XInterceptor);
+    }
+
+    private WireTargetConfiguration createMockWireTargetConfiguration() throws SecurityException, NoSuchMethodException {
+        Map<Method, TargetInvocationConfiguration> configs = new HashMap<Method, TargetInvocationConfiguration>();
+        Method foo = Foo.class.getMethod("foo", new Class[0]);
+        TargetInvocationConfiguration config = new TargetInvocationConfiguration(foo);
+        configs.put(foo, config);
+        WireTargetConfiguration wtf = new WireTargetConfiguration(null, configs, null, null);
+        return wtf;
+    }
+
+    interface Foo {
+        public void foo();
+    }
+
+    private ConfiguredService createMockConfiguredService() {
+        ConfiguredService service = new ConfiguredService() {
+
+            public String getName() {
+                return null;
+            }
+
+            public void setName(String name) {
+            }
+
+            public Service getPort() {
+                return null;
+            }
+
+            public void setPort(Service port) {
+            }
+
+            public org.apache.tuscany.model.assembly.Part getPart() {
+                return createPart();
+            }
+
+            public void setPart(org.apache.tuscany.model.assembly.Part part) {
+            }
+
+            public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException {
+            }
+
+            public void freeze() {
+            }
+
+            public boolean accept(AssemblyVisitor visitor) {
+                return false;
+            }
+
+            public void setProxyFactory(Object proxyFactory) {
+            }
+
+            public Object getProxyFactory() {
+                return null;
+            }
+        };
+
+        return service;
+    }
+
+    private org.apache.tuscany.model.assembly.Part createPart() {
+        org.apache.tuscany.model.assembly.Part part = new AtomicComponent() {
+
+            public AtomicImplementation getImplementation() {
+                return createMockJSImpl("foo", new QName("foo"));
+            }
+
+            public void setImplementation(AtomicImplementation value) {
+            }
+
+            public List<ConfiguredProperty> getConfiguredProperties() {
+                return null;
+            }
+
+            public ConfiguredProperty getConfiguredProperty(String name) {
+                return null;
+            }
+
+            public List<ConfiguredReference> getConfiguredReferences() {
+                return null;
+            }
+
+            public ConfiguredReference getConfiguredReference(String name) {
+                return null;
+            }
+
+            public List<ConfiguredService> getConfiguredServices() {
+                return null;
+            }
+
+            public ConfiguredService getConfiguredService(String name) {
+                return null;
+            }
+
+            public String getName() {
+                return null;
+            }
+
+            public void setName(String value) {
+            }
+
+            public Composite getComposite() {
+                return null;
+            }
+
+            public void setComposite(Composite composite) {
+            }
+
+            public List<Object> getExtensibilityElements() {
+                return null;
+            }
+
+            public List<Object> getExtensibilityAttributes() {
+                return null;
+            }
+
+            public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException {
+            }
+
+            public void freeze() {
+            }
+
+            public boolean accept(AssemblyVisitor visitor) {
+                return false;
+            }
+
+            public void setContextFactory(Object contextFactory) {
+            }
+
+            public Object getContextFactory() {
+                return null;
+            }
+        };
+        return part;
+    }
+
+    private JavaScriptImplementation createMockJSImpl(final String name, final QName qn) {
+        JavaScriptImplementation jsImpl = new JavaScriptImplementation();
+
+        jsImpl.setComponentType(new ComponentType() {
+
+            public List<Service> getServices() {
+                return Arrays.asList(new Service[] { createMockService(name, qn) });
+            }
+
+            public Service getService(String name) {
+                return null;
+            }
+
+            public List<Reference> getReferences() {
+                return null;
+            }
+
+            public Reference getReference(String name) {
+                return null;
+            }
+
+            public List<Property> getProperties() {
+                return new ArrayList<Property>();
+            }
+
+            public Property getProperty(String name) {
+                return null;
+            }
+
+            public List<Object> getExtensibilityElements() {
+                return null;
+            }
+
+            public List<Object> getExtensibilityAttributes() {
+                return null;
+            }
+
+            public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException {
+            }
+
+            public void freeze() {
+            }
+
+            public boolean accept(AssemblyVisitor visitor) {
+                return false;
+            }
+        });
+
+        jsImpl.setResourceLoader(new ResourceLoaderImpl(getClass().getClassLoader()));
+
+        return jsImpl;
+    }
+
+    private Service createMockService(final String name, final QName qn) {
+        Service service = new Service() {
+
+            public ServiceContract getServiceContract() {
+                WSDLServiceContractImpl sc = new WSDLServiceContractImpl();
+                PortType pt = new PortTypeImpl();
+                Operation op = new OperationImpl();
+                op.setName(name);
+                Input input = new InputImpl();
+                Message msg = new MessageImpl();
+                Part p = new PartImpl();
+                p.setElementName(qn);
+                msg.addPart(p);
+                input.setMessage(msg);
+                op.setInput(input);
+                pt.addOperation(op);
+                sc.setPortType(pt);
+                return sc;
+            }
+
+            public void setServiceContract(ServiceContract contract) {
+            }
+
+            public String getName() {
+                return null;
+            }
+
+            public void setName(String name) {
+            }
+
+            public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException {
+            }
+
+            public void freeze() {
+            }
+
+            public boolean accept(AssemblyVisitor visitor) {
+                return false;
+            }
+        };
+        return service;
+    }
+
+}
\ No newline at end of file

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/AbstractJavaScriptTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/AbstractJavaScriptTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/AbstractJavaScriptTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/AbstractJavaScriptTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,46 @@
+/**
+ * 
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ * 
+ * Licensed 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.tuscany.container.rhino.integration;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.core.client.TuscanyRuntime;
+import org.osoa.sca.CurrentModuleContext;
+import org.osoa.sca.ModuleContext;
+
+/**
+ * Integration tests for JavaScript components
+ */
+public abstract class AbstractJavaScriptTestCase extends TestCase {
+
+    protected TuscanyRuntime tuscany;
+
+    protected ModuleContext moduleContext;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        tuscany = new TuscanyRuntime("tests", null);
+        tuscany.start();
+        moduleContext = CurrentModuleContext.getContext();
+
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        tuscany.stop();
+    }
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/BasicTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/BasicTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/BasicTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/BasicTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,27 @@
+/**
+ * 
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ * 
+ * Licensed 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.tuscany.container.rhino.integration;
+
+/**
+ * Integration tests for JavaScript components
+ */
+public class BasicTestCase extends AbstractJavaScriptTestCase {
+
+    public void testBasicInvocation() throws Exception {
+        HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponent1");
+        String response = helloworldService.getGreetings("petra");
+        assertEquals("jsHello petra", response);
+    }
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XServiceRefsTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XServiceRefsTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XServiceRefsTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XServiceRefsTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,31 @@
+/**
+ * 
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ * 
+ * Licensed 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.tuscany.container.rhino.integration;
+
+
+/**
+ * Integration tests for JavaScript components and composite contexts
+ * 
+ * @version $Rev$ $Date$
+ */
+public class E4XServiceRefsTestCase extends AbstractJavaScriptTestCase {
+
+    public void testE4X() throws Exception {
+        //TODO: E4X serviceRefs don't work yet
+//        HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponentE4XProxy");
+//        String response = helloworldService.getGreetings("petra");
+//        assertEquals("e4xHello proxy:petra", response);
+    }
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,29 @@
+/**
+ * 
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ * 
+ * Licensed 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.tuscany.container.rhino.integration;
+
+/**
+ * Integration tests for JavaScript components and composite contexts
+ * 
+ * @version $Rev$ $Date$
+ */
+public class E4XTestCase extends AbstractJavaScriptTestCase {
+
+    public void testE4X() throws Exception {
+        HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponentE4X");
+        String response = helloworldService.getGreetings("petra");
+        assertEquals("e4xHello petra", response);
+    }
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/HelloWorld.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/HelloWorld.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/HelloWorld.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/HelloWorld.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,26 @@
+/**
+ *
+ *  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed 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.tuscany.container.rhino.integration;
+
+/**
+ * This is the business interface of the HelloWorld service component.
+ */
+public interface HelloWorld {
+
+    public String getGreetings(String name);
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/InitializationTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/InitializationTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/InitializationTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/InitializationTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,33 @@
+/**
+ * 
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ * 
+ * Licensed 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.tuscany.container.rhino.integration;
+
+/**
+ * Integration tests for JavaScript components
+ */
+public class InitializationTestCase extends AbstractJavaScriptTestCase {
+
+    public void testInitialization() throws Exception {
+        HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponent4");
+        String response = helloworldService.getGreetings("petra");
+        assertEquals("Bonjour petra", response);
+    }
+
+    public void testImports1() throws Exception {
+        HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponent5");
+        String response = helloworldService.getGreetings("petra");
+        assertEquals("Kia ora petra", response);
+    }
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/PropertiesTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/PropertiesTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/PropertiesTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/PropertiesTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,33 @@
+/**
+ * 
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ * 
+ * Licensed 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.tuscany.container.rhino.integration;
+
+/**
+ * Integration tests for JavaScript components
+ */
+public class PropertiesTestCase extends AbstractJavaScriptTestCase {
+
+    public void testDefaultProperty() throws Exception {
+        HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponent2a");
+        String response = helloworldService.getGreetings("petra");
+        assertEquals("Hi petra", response);
+    }
+
+    public void testOverrideProperty() throws Exception {
+        HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponent2b");
+        String response = helloworldService.getGreetings("petra");
+        assertEquals("Guten Tag petra", response);
+    }
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/ServiceRefsTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/ServiceRefsTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/ServiceRefsTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/ServiceRefsTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,27 @@
+/**
+ * 
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ * 
+ * Licensed 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.tuscany.container.rhino.integration;
+
+/**
+ * Integration tests for JavaScript components
+ */
+public class ServiceRefsTestCase extends AbstractJavaScriptTestCase {
+
+    public void testServiceReference() throws Exception {
+        HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldProxyComponent");
+        String response = helloworldService.getGreetings("petra");
+        assertEquals("Hi proxy:petra", response);
+    }
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/TestMethods.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/TestMethods.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/TestMethods.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/integration/TestMethods.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,30 @@
+/**
+ *
+ *  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed 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.tuscany.container.rhino.integration;
+
+public class TestMethods {
+
+    private String salutation = "Kia ora";
+
+    public String getSalutation() {
+        return salutation;
+    }
+
+    public void getSalutation(String s) {
+        salutation = s;
+    }
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/Foo.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/Foo.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/Foo.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/Foo.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,16 @@
+package org.apache.tuscany.container.rhino.rhino;
+
+class Foo {
+    private String s;
+
+    public Foo() {
+    }
+
+    public String getS() {
+        return s;
+    }
+
+    public void setS(String s) {
+        this.s = s;
+    }
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoFunctionInvokerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoFunctionInvokerTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoFunctionInvokerTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoFunctionInvokerTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.tuscany.container.rhino.rhino;
+
+import java.io.IOException;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.container.rhino.rhino.RhinoFunctionInvoker;
+import org.apache.tuscany.container.rhino.rhino.RhinoScript;
+import org.apache.tuscany.container.rhino.rhino.RhinoScriptInstance;
+import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlObject;
+
+/**
+ * Tests for the RhinoScript
+ */
+public class RhinoFunctionInvokerTestCase extends TestCase {
+    
+    public RhinoFunctionInvokerTestCase() {
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testNoArgsInvoke() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getPetra() {return 'petra';}");
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getPetra");
+        assertNotNull(invoker);
+        assertEquals("petra", invoker.invoke(null));
+    }
+
+    public void testOneArgInvoke() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getS(s) {return s;}");
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getS");
+        assertNotNull(invoker);
+        assertEquals("petra", invoker.invoke(new Object[]{"petra"}));
+    }
+
+    public void testMultiArgsInvoke() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function concat(x, y) {return x + y}");
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("concat");
+        assertNotNull(invoker);
+        assertEquals("petrasue", invoker.invoke(new Object[] { "petra", "sue"}));
+    }
+
+    public void testNoResponseInvoke() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getNull() {}");
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getNull");
+        assertNotNull(invoker);
+        assertEquals(null, invoker.invoke(new Object[0]));
+    }
+    
+    public void testNullResponseInvoke() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getNull() {return null;}");
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getNull");
+        assertNotNull(invoker);
+        assertEquals(null, invoker.invoke(new Object[0]));
+    }
+    
+    public void testResponseTypeDefaultString() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getTrue() {return true;}");
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getTrue");
+        assertNotNull(invoker);
+        Object o = invoker.invoke(new Object[0]);
+        assertTrue(o instanceof String);
+        assertEquals( "true", o);
+    }
+
+    public void testResponseTypeBoolean() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getTrue() {return true;}");
+        rhinoScript.setResponseClass("getTrue", Boolean.class);
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getTrue");
+        assertNotNull(invoker);
+        assertTrue((Boolean)invoker.invoke(new Object[0]));
+    }
+
+    public void testResponseTypeStringArray() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getAs() {var as = new Array(1);as[0]='petra';return as;}");
+        rhinoScript.setResponseClass("getAs", new String[0].getClass());
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getAs");
+        assertNotNull(invoker);
+        Object o = invoker.invoke(new Object[0]);
+        assertNotNull(o);
+        assertTrue(o.getClass().isArray());
+        assertEquals("petra", ((Object[])o)[0]);
+    }
+
+
+    public void testResponseTypeBooleanArray() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getBs() {var bs = new Array(1);bs[0]=true;return bs;}");
+        rhinoScript.setResponseClass("getBs", new Boolean[0].getClass());
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getBs");
+        assertNotNull(invoker);
+        Object o = invoker.invoke(new Object[0]);
+        assertNotNull(o);
+        assertTrue(o.getClass().isArray());
+        assertTrue(((Boolean[])o)[0]);
+    }
+
+    public void testRequestCustomType() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getFooS(foo) {return foo.getS();}");
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getFooS");
+        assertNotNull(invoker);
+        
+        Foo foo = new Foo();
+        foo.setS("petra");
+        Object o = invoker.invoke(new Object[] {foo});
+        assertEquals(foo.getS(), o);
+    }
+
+    public void testResponseCustomType() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "importClass(Packages.org.apache.tuscany.container.rhino.rhino.Foo);function getFoo(s) {var foo = new Foo(); foo.setS(s);return foo;}");
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getFoo");
+        assertNotNull(invoker);
+        
+        Object o = invoker.invoke(new Object[] {"petra"});
+        assertNotNull(o);
+        assertEquals("petra", ((Foo)o).getS());
+    }
+
+    public void testXMLRequest() throws XmlException, IOException {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function isXML(x) {return 'xml' == (typeof x);}");
+        rhinoScript.setResponseClass("isXML", Boolean.class);
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("isXML");
+        assertNotNull(invoker);
+
+        Object xml =  XmlObject.Factory.parse("<a><b/></a>");
+        assertTrue((Boolean) invoker.invoke(new Object[]{xml}));
+
+        Object notXML = "notXML";
+        assertFalse((Boolean) invoker.invoke(new Object[]{notXML}));
+    }
+    
+    public void testXMLResponse() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getXML(s) {return <a> { s } </a>;}");
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getXML");
+        assertNotNull(invoker);
+
+        Object xml = invoker.invoke(new Object[]{"petra"});
+        assertNotNull(xml);
+        assertTrue(xml instanceof XmlObject);
+        assertEquals("<a>petra</a>",((XmlObject)xml).toString());
+    }
+
+}

Added: incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptInstanceTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptInstanceTestCase.java?rev=414844&view=auto
==============================================================================
--- incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptInstanceTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/tuscany-container-rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptInstanceTestCase.java Fri Jun 16 07:59:20 2006
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.tuscany.container.rhino.rhino;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for the RhinoScript
+ */
+public class RhinoScriptInstanceTestCase extends TestCase {
+    
+    public RhinoScriptInstanceTestCase() {
+        
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testInvokeFunction() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getPetra() {return 'petra';}");
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        assertEquals("petra", instance.invokeFunction("getPetra", new Object[0]));
+    }
+
+    public void testCreateRhinoFunctionInvoker() {
+        RhinoScript rhinoScript = new RhinoScript("foo", "function getPetra() {return 'petra';}");
+        RhinoScriptInstance instance = rhinoScript.createRhinoScriptInstance();
+        RhinoFunctionInvoker invoker = instance.createRhinoFunctionInvoker("getPetra");
+        assertNotNull(invoker);
+        assertEquals("petra", invoker.invoke(new Object[0]));
+    }
+
+}
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org