From ece4fd35da7b7fc76264776f81705e6b5b52d3e0 Mon Sep 17 00:00:00 2001 From: lresende Date: Wed, 11 Nov 2009 23:11:48 +0000 Subject: Moving 1.x branches git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@835140 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/containers/container.rhino/pom.xml | 68 ++ .../rhino/assembly/JavaScriptImplementation.java | 74 ++ .../builder/JavaScriptContextFactoryBuilder.java | 132 ++++ .../rhino/builder/JavaScriptTargetWireBuilder.java | 40 ++ .../rhino/config/JavaScriptContextFactory.java | 114 +++ .../rhino/context/JavaScriptComponentContext.java | 140 ++++ .../loader/JavaScriptImplementationLoader.java | 168 +++++ .../container/rhino/rhino/E4XDataBinding.java | 108 +++ .../container/rhino/rhino/RhinoE4XScript.java | 76 ++ .../tuscany/container/rhino/rhino/RhinoScript.java | 290 ++++++++ .../container/rhino/shell/ScriptEngine.java | 573 +++++++++++++++ .../container/rhino/shell/TuscanyShell.java | 42 ++ .../src/main/resources/META-INF/LICENSE.txt | 777 +++++++++++++++++++++ .../src/main/resources/META-INF/NOTICE | 18 + .../src/main/resources/META-INF/README.txt | 35 + .../src/main/resources/system.fragment | 32 + .../integration/AbstractJavaScriptTestCase.java | 46 ++ .../container/rhino/integration/BasicTestCase.java | 27 + .../container/rhino/integration/E4XTestCase.java | 29 + .../container/rhino/integration/HelloWorld.java | 26 + .../rhino/integration/InitializationTestCase.java | 33 + .../rhino/integration/PropertiesTestCase.java | 33 + .../container/rhino/integration/Salutation.java | 25 + .../rhino/integration/ServiceRefsTestCase.java | 27 + .../container/rhino/integration/TestMethods.java | 30 + .../rhino/rhino/RhinoE4XScriptTestCase.java | 89 +++ .../container/rhino/rhino/RhinoScriptTestCase.java | 186 +++++ .../rhino/rhino/RhinoE4XScriptTestCase.js | 11 + .../container/rhino/rhino/RhinoScriptTestCase.js | 22 + .../tuscany/container/rhino/rhino/helloworld.wsdl | 97 +++ .../container.rhino/src/test/resources/sca.module | 66 ++ .../resources/tests/HelloWorldImpl1.componentType | 9 + .../src/test/resources/tests/HelloWorldImpl1.js | 20 + .../resources/tests/HelloWorldImpl2.componentType | 11 + .../src/test/resources/tests/HelloWorldImpl2.js | 20 + .../resources/tests/HelloWorldImpl3a.componentType | 13 + .../src/test/resources/tests/HelloWorldImpl3a.js | 20 + .../resources/tests/HelloWorldImpl4.componentType | 9 + .../src/test/resources/tests/HelloWorldImpl4.js | 26 + .../resources/tests/HelloWorldImpl5.componentType | 9 + .../src/test/resources/tests/HelloWorldImpl5.js | 29 + .../resources/tests/SalutationImpl.componentType | 11 + .../src/test/resources/tests/SalutationImpl.js | 20 + .../src/test/resources/tests/e4x.componentType | 9 + .../src/test/resources/tests/e4x.js | 28 + .../src/test/resources/wsdl/helloworld.wsdl | 97 +++ 46 files changed, 3765 insertions(+) create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/pom.xml create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/assembly/JavaScriptImplementation.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptContextFactoryBuilder.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptTargetWireBuilder.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/config/JavaScriptContextFactory.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/context/JavaScriptComponentContext.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/loader/JavaScriptImplementationLoader.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/E4XDataBinding.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScript.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScript.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/shell/ScriptEngine.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/shell/TuscanyShell.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/LICENSE.txt create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/NOTICE create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/README.txt create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/system.fragment create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/AbstractJavaScriptTestCase.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/BasicTestCase.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XTestCase.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/HelloWorld.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/InitializationTestCase.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/PropertiesTestCase.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/Salutation.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/ServiceRefsTestCase.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/TestMethods.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.java create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.js create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.js create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/helloworld.wsdl create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/sca.module create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.componentType create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.js create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.componentType create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.js create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.componentType create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.js create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.componentType create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.js create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.componentType create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.js create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.componentType create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.js create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/e4x.componentType create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/e4x.js create mode 100644 sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/wsdl/helloworld.wsdl (limited to 'sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino') diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/pom.xml b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/pom.xml new file mode 100644 index 0000000000..3f8d8fe9cd --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/pom.xml @@ -0,0 +1,68 @@ + + + + + + org.apache.tuscany.sca.containers + tuscany-sca-containers + incubating-M1 + + + 4.0.0 + tuscany-container-rhino + Tuscany Rhino JavaScript Container + Tuscany Rhino JavaScript Container + incubating-M1 + + + + org.apache.tuscany + tuscany-core + ${pom.version} + compile + + + + rhino + js + 1.6R2 + compile + + + + org.apache.tuscany.databinding + tuscany-databinding-sdo + ${pom.version} + compile + + + + xmlbeans + xbean + 2.1.0 + compile + + + + junit + junit + 3.8.1 + test + + + + diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/assembly/JavaScriptImplementation.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/assembly/JavaScriptImplementation.java new file mode 100644 index 0000000000..c68bf239a3 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/assembly/JavaScriptImplementation.java @@ -0,0 +1,74 @@ +/** + * + * 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.assembly; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.model.assembly.impl.AtomicImplementationImpl; + +import commonj.sdo.helper.TypeHelper; + +/** + * Default implementation of a JavScript component implementation type + * + * @version $Rev$ $Date$ + */ +public class JavaScriptImplementation extends AtomicImplementationImpl { + + private String scriptFile; + + private String script; + + private ResourceLoader resourceLoader; + + private TypeHelper typeHelper; + + public JavaScriptImplementation() { + super(); + } + + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + public ResourceLoader getResourceLoader() { + return resourceLoader; + } + + public TypeHelper getTypeHelper() { + return typeHelper; + } + + public void setTypeHelper(TypeHelper typeHelper) { + this.typeHelper = typeHelper; + } + + public String getScriptFile() { + return scriptFile; + } + + public void setScriptFile(String fn) { + scriptFile = fn; + } + + public String getScript() { + return script; + } + + public void setScript(String script) { + this.script = script; + } +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptContextFactoryBuilder.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptContextFactoryBuilder.java new file mode 100644 index 0000000000..2012971014 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptContextFactoryBuilder.java @@ -0,0 +1,132 @@ +/** + * + * 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.builder; + +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 org.apache.tuscany.container.rhino.assembly.JavaScriptImplementation; +import org.apache.tuscany.container.rhino.config.JavaScriptContextFactory; +import org.apache.tuscany.container.rhino.rhino.E4XDataBinding; +import org.apache.tuscany.container.rhino.rhino.RhinoE4XScript; +import org.apache.tuscany.container.rhino.rhino.RhinoScript; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.extension.ContextFactoryBuilderSupport; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.ServiceContract; +import org.apache.tuscany.model.types.wsdl.WSDLServiceContract; + +import commonj.sdo.helper.TypeHelper; + +/** + * Builds {@link org.apache.tuscany.container.rhino.config.JavaScriptContextFactory}s from a JavaScript component type + * + * @version $Rev$ $Date$ + */ +@org.osoa.sca.annotations.Scope("MODULE") +public class JavaScriptContextFactoryBuilder extends ContextFactoryBuilderSupport { + + @Override + protected ContextFactory createContextFactory(String componentName, JavaScriptImplementation jsImplementation, Scope scope) { + + Map services = new HashMap(); + for (Service service : jsImplementation.getComponentType().getServices()) { + services.put(service.getName(), service.getServiceContract().getInterface()); + } + + Map defaultProperties = new HashMap(); + for (org.apache.tuscany.model.assembly.Property property : jsImplementation.getComponentType().getProperties()) { + defaultProperties.put(property.getName(), property.getDefaultValue()); + } + + String script = jsImplementation.getScript(); + ClassLoader cl = jsImplementation.getResourceLoader().getClassLoader(); + + RhinoScript invoker; + if (isE4XStyle(componentName, jsImplementation.getComponentType().getServices())) { + E4XDataBinding dataBinding = createDataBinding(jsImplementation); + invoker = new RhinoE4XScript(componentName, script, defaultProperties, cl, dataBinding); + } else { + invoker = new RhinoScript(componentName, script, defaultProperties, cl); + } + + Map properties = new HashMap(); + JavaScriptContextFactory contextFactory = new JavaScriptContextFactory(componentName, scope, services, properties, invoker); + + return contextFactory; + } + + /** + * Tests if this should be an E4X style service + * Its E4X if the JavaScript component uses WSDL to define its interface + */ + protected boolean isE4XStyle(String componentName, List services) { + Boolean isE4XStyle = null; + for (Service service : services) { + ServiceContract sc = service.getServiceContract(); + if (sc instanceof WSDLServiceContract) { + if (isE4XStyle != null && !isE4XStyle.booleanValue()) { + throw new BuilderConfigException("mixed service interface types not supportted"); + } + isE4XStyle = Boolean.TRUE; + } else { + isE4XStyle = Boolean.FALSE; + } + } + return isE4XStyle.booleanValue(); + } + + /** + * Create the data binding for the component initialized for each operation in the service + */ + protected E4XDataBinding createDataBinding(JavaScriptImplementation jsImplementation) { + ClassLoader classLoader = jsImplementation.getResourceLoader().getClassLoader(); + TypeHelper typeHelper = jsImplementation.getTypeHelper(); + E4XDataBinding dataBinding = new E4XDataBinding(classLoader, typeHelper); + for (Service service : jsImplementation.getComponentType().getServices()) { + ServiceContract sc = service.getServiceContract(); + if (sc instanceof WSDLServiceContract) { + PortType pt = ((WSDLServiceContract) sc).getPortType(); + for (Object o : pt.getOperations()) { + Operation operation = (Operation) o; + 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) { + Part part = (Part) parts.get(0); + dataBinding.addElementQName(operation.getName(), part.getElementName()); + } + } + } + } + } + } + return dataBinding; + } + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptTargetWireBuilder.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptTargetWireBuilder.java new file mode 100644 index 0000000000..0c45aee35e --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptTargetWireBuilder.java @@ -0,0 +1,40 @@ +/** + * + * 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.builder; + +import java.lang.reflect.Method; + +import org.apache.tuscany.container.rhino.config.JavaScriptContextFactory; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.extension.ComponentTargetInvoker; +import org.apache.tuscany.core.extension.WireBuilderSupport; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.osoa.sca.annotations.Scope; + +/** + * Responsible for bridging source- and target-side invocations chains when the target type is a JavaScript implementation + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class JavaScriptTargetWireBuilder extends WireBuilderSupport { + + protected TargetInvoker createInvoker(QualifiedName targetName, Method operation, ScopeContext context, boolean downScope) { + return new ComponentTargetInvoker(targetName, operation, context); + } +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/config/JavaScriptContextFactory.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/config/JavaScriptContextFactory.java new file mode 100644 index 0000000000..28a0302a4f --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/config/JavaScriptContextFactory.java @@ -0,0 +1,114 @@ +/** + * + * 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.config; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.container.rhino.context.JavaScriptComponentContext; +import org.apache.tuscany.container.rhino.rhino.RhinoScript; +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Creates instance contexts for JavaScript component types + * + * @version $Rev$ $Date$ + */ +public class JavaScriptContextFactory implements ContextFactory, ContextResolver { + + private Scope scope; + + private String name; + + private Map targetProxyFactories = new HashMap(); + + private List sourceProxyFactories = new ArrayList(); + + private Map services; + + private Map properties; + + private RhinoScript invoker; + + private CompositeContext parentContext; + + public JavaScriptContextFactory(String name, Scope scope, Map services, Map properties, RhinoScript invoker) { + this.name = name; + this.scope = scope; + this.services = services; + this.properties = properties; + this.invoker = invoker; + } + + public AtomicContext createContext() throws ContextCreationException { + return new JavaScriptComponentContext(name, services, properties, sourceProxyFactories, targetProxyFactories, invoker.copy()); + } + + public Scope getScope() { + return scope; + } + + public String getName() { + return name; + } + + public void addProperty(String propertyName, Object value) { + properties.put(propertyName, value); + } + + public void addTargetWireFactory(String serviceName, TargetWireFactory factory) { + targetProxyFactories.put(serviceName, factory); + } + + public TargetWireFactory getTargetWireFactory(String serviceName) { + return targetProxyFactories.get(serviceName); + } + + public Map getTargetWireFactories() { + return targetProxyFactories; + } + + public void addSourceWireFactory(String referenceName, SourceWireFactory factory) { + sourceProxyFactories.add(factory); + } + + public void addSourceWireFactories(String referenceName, Class referenceInterface, List factories, boolean multiplicity) { + sourceProxyFactories.addAll(factories); + } + + public List getSourceWireFactories() { + return sourceProxyFactories; + } + + public void prepare(CompositeContext parent) { + parentContext = parent; + } + + public CompositeContext getCurrentContext() { + return parentContext; + } + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/context/JavaScriptComponentContext.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/context/JavaScriptComponentContext.java new file mode 100644 index 0000000000..bfa4eeaffb --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/context/JavaScriptComponentContext.java @@ -0,0 +1,140 @@ +/** + * + * 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.context; + +import org.apache.tuscany.container.rhino.rhino.RhinoScript; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.event.InstanceCreated; +import org.apache.tuscany.core.context.impl.AbstractContext; +import org.apache.tuscany.core.wire.ProxyCreationException; +import org.apache.tuscany.core.wire.WireFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.osoa.sca.ServiceRuntimeException; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class JavaScriptComponentContext extends AbstractContext implements AtomicContext { + + private Map services; + + private RhinoScript rhinoInvoker; + + private Map properties; + + private List sourceProxyFactories; + + private Map targetProxyFactories; + + private Object instance; + + public JavaScriptComponentContext(String name, Map services, Map properties, + List sourceProxyFactories, Map targetProxyFactories, RhinoScript invoker) { + super(name); + assert (services != null) : "No service interface mapping specified"; + assert (properties != null) : "No properties specified"; + this.services = services; + this.properties = properties; + this.rhinoInvoker = invoker; + this.sourceProxyFactories = sourceProxyFactories; + this.targetProxyFactories = targetProxyFactories; + } + + public Object getInstance(QualifiedName qName) throws TargetException { + return getInstance(qName, true); + } + + public void init() throws TargetException { + getInstance(null, false); + } + + public void destroy() throws TargetException { + + } + + private synchronized Object getInstance(QualifiedName qName, boolean notify) throws TargetException { + String portName = qName.getPortName(); + WireFactory targetFactory; + if (portName != null) { + targetFactory = targetProxyFactories.get(portName); + } else { + //FIXME The port name is null here, either locateService needs more information (the expected interface) to + // select the correct port, or we need to return a factory that matches the whole set of services exposed by + // the component. + targetFactory = targetProxyFactories.values().iterator().next(); + } + if (targetFactory == null) { + TargetException e = new TargetException("Target service not found"); + e.setIdentifier(qName.getPortName()); + e.addContextName(getName()); + throw e; + } + try { + Object proxy = targetFactory.createProxy(); //createProxy(new Class[] { iface }); + if (notify) { + publish(new InstanceCreated(this)); + } + return proxy; + } catch (ProxyCreationException e) { + TargetException te = new TargetException("Error returning target", e); + e.setIdentifier(qName.getPortName()); + e.addContextName(getName()); + throw te; + } + } + + public Object getTargetInstance() throws TargetException { + rhinoInvoker.updateScriptScope(createServiceReferences()); // create references + rhinoInvoker.updateScriptScope(properties); // create prop values + return rhinoInvoker; + } + + /** + * Creates a map containing any ServiceReferences + */ + private Map createServiceReferences() { + try { + Map context = new HashMap(); + for (SourceWireFactory proxyFactory : sourceProxyFactories) { + context.put(proxyFactory.getConfiguration().getReferenceName(), proxyFactory.createProxy()); + } + return context; + } catch (ProxyCreationException e) { + throw new ServiceRuntimeException(e); + } + } + + public boolean isEagerInit() { + return false; + } + + public boolean isDestroyable() { + return false; + } + + public void start() throws CoreRuntimeException { + } + + public void stop() throws CoreRuntimeException { + } + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/loader/JavaScriptImplementationLoader.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/loader/JavaScriptImplementationLoader.java new file mode 100644 index 0000000000..e28776049c --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/loader/JavaScriptImplementationLoader.java @@ -0,0 +1,168 @@ +/** + * + * 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 { + + 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); + } + + 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; + } + } +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/E4XDataBinding.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/E4XDataBinding.java new file mode 100644 index 0000000000..3969735b23 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/E4XDataBinding.java @@ -0,0 +1,108 @@ +/** + * 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.io.ByteArrayInputStream; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.core.wire.InvocationRuntimeException; +import org.apache.tuscany.databinding.sdo.SDOXMLHelper; +import org.apache.xmlbeans.XmlObject; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.Scriptable; + +import commonj.sdo.helper.TypeHelper; + +/** + * DataBinding to convert between Java objects and JavaScript E4X XML objects. This uses SDO to do the conversion between XML and Java so WSDL/XSDs + * need to have be registered with the SDO runtime. + * + * TODO: suport non-wrapped WSDL + */ +public class E4XDataBinding { + + private ClassLoader classLoader; + + private TypeHelper typeHelper; + + private Map function2ElementMap; + + private static final boolean IS_WRAPPED = true; + + public E4XDataBinding(ClassLoader classLoader, TypeHelper typeHelper) { + this.classLoader = classLoader; + this.typeHelper = typeHelper; + this.function2ElementMap = new HashMap(); + } + + /** + * Convert E4X XML to Java objects + * + * @param e4xXML + * @return the array of Objects + */ + public Object[] toObjects(Scriptable e4xXML) { + byte[] xmlBytes = e4xXML.toString().getBytes(); + Object[] os = SDOXMLHelper.toObjects(classLoader, typeHelper, xmlBytes, IS_WRAPPED); + return os; + } + + /** + * Convert request Java objects to XML + * + * @param functionName + * @param os + * @param scope + * @return a JavaScript E4X XML object + */ + public Scriptable toE4X(String functionName, Object[] os, Scriptable scope) { + QName elementQN = function2ElementMap.get(functionName); + byte[] xmlBytes = SDOXMLHelper.toXMLBytes(classLoader, typeHelper, os, elementQN, IS_WRAPPED); + + XmlObject xmlObject; + try { + xmlObject = XmlObject.Factory.parse(new ByteArrayInputStream(xmlBytes)); + } catch (Exception e) { + throw new InvocationRuntimeException(e); + } + + Context cx = Context.enter(); + try { + + Object xml = cx.getWrapFactory().wrap(cx, scope, xmlObject, XmlObject.class); + Scriptable jsXML = cx.newObject(scope, "XML", new Object[] { xml }); + + return jsXML; + + } finally { + Context.exit(); + } + } + + /** + * Add the XML element name to use for an operation when converting from + * Java objects to XML. + * + * @param functionName + * @param elementQN + */ + public void addElementQName(String functionName, QName elementQN) { + function2ElementMap.put(functionName, elementQN); + } +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScript.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScript.java new file mode 100644 index 0000000000..5f42f6d164 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScript.java @@ -0,0 +1,76 @@ +/** + * 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.Map; + +import org.mozilla.javascript.Function; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.xml.XMLObject; + +/** + * Invokes a JavaScript/E4X function with argument and return values that may be E4X XML objects. + */ +public class RhinoE4XScript extends RhinoScript { + + private E4XDataBinding dataBinding; + + public RhinoE4XScript(String scriptName, String script, Map context, ClassLoader cl, E4XDataBinding dataBinding) { + super(scriptName, script, context, cl); + this.dataBinding = dataBinding; + } + + protected RhinoE4XScript(String scriptName, String script, Scriptable scriptScope, E4XDataBinding dataBinding) { + super(scriptName, script, scriptScope); + this.dataBinding = dataBinding; + } + + /** + * Turn args to JS objects and convert any OMElement to E4X XML + */ + @Override + protected Object[] processArgs(String functionName, Object[] args, Scriptable scope) { + return new Object[] { dataBinding.toE4X(functionName, args, scope) }; + } + + /** + * Unwrap and convert response converting any E4X XML into Java objects + */ + @Override + protected Object processResponse(String functionName, Object response, Class responseClass) { + if (response instanceof XMLObject) { + Object[] os = dataBinding.toObjects((XMLObject) response); + if (os == null || os.length < 1) { + return null; + } else { + return os[0]; + } + } else { + return super.processResponse(functionName, response, responseClass); + } + } + + @Override + protected Function getFunction(Scriptable scope, String functionName) { + return super.getFunction(scope, "process"); + } + + @Override + public RhinoE4XScript copy() { + return new RhinoE4XScript(scriptName, script, scriptScope, dataBinding); + } + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScript.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScript.java new file mode 100644 index 0000000000..5518159f69 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScript.java @@ -0,0 +1,290 @@ +/** + * + * 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.Iterator; +import java.util.Map; + +import org.apache.tuscany.core.extension.ExternalServiceInvoker; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.ContextFactory; +import org.mozilla.javascript.Function; +import org.mozilla.javascript.ImporterTopLevel; +import org.mozilla.javascript.Script; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.Wrapper; + +/** + * Represents, and is responsible for dispatching to, a JavaScript artifact in Rhino + */ +public class RhinoScript implements ExternalServiceInvoker { + + protected String scriptName; + + protected String script; + + protected Scriptable scriptScope; + + private Scriptable sharedScope; + + /* + * 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 TODO: need to review how ths fits in with Tuscany scopes + */ + 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 RhinoInvoker. + * + * @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. + */ + public RhinoScript(String scriptName, String script, Map context, ClassLoader cl) { + this.scriptName = scriptName; + this.script = script; + initScriptScope(scriptName, script, context, cl); + initSharedScope(); + } + + /** + * Construct a RhinoInvoker from another RhinoInvoker object. This uses the original script scope so the script + * doesn't need to be recompiled. + */ + protected RhinoScript(String scriptName, String script, Scriptable scriptScope) { + this.scriptName = scriptName; + this.script = script; + this.scriptScope = scriptScope; + initSharedScope(); + } + + /** + * Invoke a script function + * + * @param functionName the name of the function to invoke. + * @param arg arguments to the function, may be a single object or an array of objects. + * @return the function return value. + */ + public Object invoke(String functionName, Object[] args) { + return invoke(functionName, args, null, null); + } + + /** + * Invoke a script function + * + * @param functionName the name of the function to invoke. + * @param arg arguments to the function, may be a single object or an array of objects. + * @param contexts a Map of name-value pairs which are added to the wire Scope to enable the script to access + * the values by using the variable in name. + * @return the function return value. + */ + public Object invoke(String functionName, Object[] args, Map contexts) { + return invoke(functionName, args, null, contexts); + } + + /** + * Invoke a script function + * + * @param functionName the name of the function to invoke. + * @param arg arguments to the function, may be a single object or an array of objects. + * @param responseClass the desired class of the response object. + * @param contexts a Map of name-value pairs which are added to the wire Scope to enable the script to access + * the values by using the variable in name. + * @return the function return value. + */ + public Object invoke(String functionName, Object[] args, Class responseClass, Map contexts) { + Context cx = Context.enter(); + try { + Function function = getFunction(scriptScope, functionName); + Scriptable invocationScope = getInvocationScope(cx, contexts); + Object[] jsArgs = processArgs(functionName, args, invocationScope); + Object jsResponse = function.call(cx, invocationScope, invocationScope, jsArgs); + Object response = processResponse(functionName, jsResponse, responseClass); + return response; + } finally { + Context.exit(); + } + } + + /** + * Turn args to JS objects and convert any OMElement to E4X XML + */ + protected Object[] processArgs(String functionName, Object[] arg, Scriptable scope) { + Object[] args; + if (arg == null) { + args = new Object[] { null }; + } else if (arg.getClass().isArray()) { + args = (Object[]) arg; + for (int i = 0; i < args.length; i++) { + args[i] = Context.toObject(args[i], scope); + } + } else { + args = new Object[] { Context.toObject(arg, scope) }; + } + return args; + } + + /** + * Unwrap and convert response + */ + protected Object processResponse(String functionName, Object response, Class responseClass) { + if (Context.getUndefinedValue().equals(response)) { + response = null; + } else if (response instanceof Wrapper) { + response = ((Wrapper) response).unwrap(); + } else { + if (responseClass != null) { + response = Context.jsToJava(response, responseClass); + } else { + response = Context.jsToJava(response, String.class); + } + } + return response; + } + + /** + * 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(); + } + } + + /** + * Initializes the shared scope + */ + protected void initSharedScope() { + Context cx = Context.enter(); + try { + + this.sharedScope = cx.newObject(scriptScope); + sharedScope.setPrototype(scriptScope); + sharedScope.setParentScope(null); + + } finally { + Context.exit(); + } + } + + /** + * Get a Rhino scope for the function wire. If the wire has no context objects then this will use the + * shared scope otherwise a new scope is created to hold the context objects. Any new variables the executing script + * might define will go in the sharedScope. This new scope is just to hold the wire specific context objects. + */ + protected Scriptable getInvocationScope(Context cx, Map contexts) { + + Scriptable scope; + if (contexts == null || contexts.size() == 0) { + scope = sharedScope; + } else { + scope = cx.newObject(sharedScope); + scope.setPrototype(sharedScope); + scope.setParentScope(null); + addContexts(scope, contexts); + } + + return scope; + } + + /** + * 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)); + } + } + } + } + + /** + * Get the Rhino Function object for the named script function + */ + protected Function getFunction(Scriptable scope, String functionName) { + + Object handleObj = scope.get(functionName, scope); + + if (!(handleObj instanceof Function)) { + throw new RuntimeException("script function '" + functionName + "' is undefined or not a function in script " + + scriptName); + } + + return (Function) handleObj; + } + + /** + * Make a copy of this RhinoScript object. This shares the script scope to avoid the overhead of recompiling the + * script, and to allow any initialization done by the script to be shared. + */ + public RhinoScript copy() { + return new RhinoScript(scriptName, script, scriptScope); + } + + /** + * Update the scope where the script is complied with new context values + * + * @param properties + */ + public void updateScriptScope(Map context) { + Context.enter(); + try { + addContexts(scriptScope, context); + } finally { + Context.exit(); + } + } + +} \ No newline at end of file diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/shell/ScriptEngine.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/shell/ScriptEngine.java new file mode 100644 index 0000000000..e8e6605300 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/shell/ScriptEngine.java @@ -0,0 +1,573 @@ +/** + * + * 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.shell; + +import java.io.BufferedReader; +import java.io.CharArrayWriter; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.net.URL; +import java.net.URLClassLoader; + +import org.apache.tuscany.core.client.TuscanyRuntime; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.Function; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.ScriptableObject; +import org.mozilla.javascript.WrappedException; +import org.osoa.sca.CurrentModuleContext; +import org.osoa.sca.ModuleContext; + +/** + * + * This class implements a Scripting Engine for the Tuscany runitme. This engine uses the Rhino javaScript Engine. + * + *

+ * The defulat script functions supported by this engine are the follwing: + *

    + *
  • echo
  • + *
  • version
  • + *
  • load
  • + *
  • help
  • + *
  • exit
  • + *
  • printStackTrace
  • + *
  • loadModule
  • + *
  • listComponents
  • + *
  • getComponent
  • + *
  • listServices
  • + *
  • getService
  • + *
+ * + * This class was based on ideas in the Rhino shell sample at http://lxr.mozilla.org/mozilla/source/js/rhino/examples/Shell.java + */ +public class ScriptEngine extends ScriptableObject implements Runnable { + + /** + * The context with which this script engine will be run + */ + private Context jsContext = null; + + /** + * Set of parameters passes to the script engine + */ + private String[] params = null; + + /** + * instance of Tuscany runtime + */ + private TuscanyRuntime tuscany; + + /** + * A reference to the old class loader + */ + private ClassLoader oldClassLoader = null; + + /** + * Flag to indicate, if the shoutdown has requested by the user + */ + private boolean shutdown; + + /** + * The current output stream + */ + private static PrintStream out = System.out; + + /** + * The current error output stream + */ + private PrintStream err = System.err; + + /** + * The current input stream + */ + private InputStream in = System.in; + + /** + * The prompt used + */ + private String prompt = "js> "; + + /** + * The last exception that occured, used for debugging + */ + private Throwable lastException = null; + + /** + * Names of the global functions particular to the shell. Note that these functions are not part of ECMA. + */ + public static final String[] SCRIPT_FUNCTIONS = { "echo", "version", "load", "help", "exit", "printStackTrace", "loadModule", "listComponents", + "getComponent", "listServices", "getService", }; + + /** + * get the class name + * + * @return "global" + */ + @Override + public String getClassName() { + return "global"; + } + + /** + * Construct a script engine + * + * @param command + * line arguments + */ + public ScriptEngine(String[] params) { + this.params = params; + } + + /** + * Run the script engine. Invoking this method will initialize the script engine, Tuscany Runtime and load any SCA modules if found in the + * classpath. + * + */ + public void run() { + // Associate a new Context with this thread + jsContext = Context.enter(); + try { + // initialize standard objects + jsContext.initStandardObjects(this); + // define supported script functions + this.defineFunctionProperties(SCRIPT_FUNCTIONS, ScriptEngine.class, ScriptableObject.DONTENUM); + + // init the tuscany runtime + // this.initTuscanyRuntime(); + // initialize the script engine + this.startScriptEngin(); + } finally { + if (tuscany != null) { + tuscany.stop(); + } + Thread.currentThread().setContextClassLoader(oldClassLoader); + Context.exit(); + } + } + + /** + * Print the help message. + * + * This method is defined as a script function. + */ + public void help() { + final String helpMsg = "Command Description \n" + "======= =========== \n" + + "help() Display this message. \n" + + "load(['f1.js', ...]) Load and execute javaScript source files named f1.js, etc. \n" + + "echo([expr ...]) Evaluate and print a variable or an expressions. \n" + "exit() Exit this shell. \n" + + "version([number]) Get or set the javaScript version. \n" + + "printStackTrace() Print the stacktrace of the last exception \n" + "loadModule(jar|war) Not yet implemented. \n" + + "listComponents() Not yet implemented. \n" + + "getComponent('name') Get an instance of the component with the given name. \n" + + "listServices() Not yet implemented. \n" + "getService('name') Not yet implemented. \n"; + + out.println(); + out.println(helpMsg); + } + + /** + * Load a given module with the tuscany runtime + * + * This method is defined as a script function. + * + * @param moduleName + * absolute path of the module + */ + public void loadModule(final String moduleName) { + // TODO complete this method + if (tuscany != null) { + tuscany.stop(); + } + + try { + File file = new File(moduleName); + URL[] urls = new URL[] { file.toURL(), }; + final ClassLoader newCL = new URLClassLoader(urls); + Thread.currentThread().setContextClassLoader(newCL); + + tuscany = new TuscanyRuntime(moduleName, null); + tuscany.start(); + + } catch (Exception e) { + e.printStackTrace(); + err.println(e.getMessage()); + lastException = e; + } + } + + /** + * List the components available within the current module + * + * This method is defined as a script function. + */ + public void listComponents() { + // TODO complete this method + } + + /** + * Get the component available within the current module with a given name + * + * This method is defined as a script function. + * + * @param name + * name of the component + * @return service component object represented by the given name + */ + public Object getComponent(String name) { + ModuleContext tuscanyContext = CurrentModuleContext.getContext(); + Object component = tuscanyContext.locateService(name); + + return component; + } + + /** + * List the external services available within the current module + * + * This method is defined as a script function. + */ + public void listServices() { + // TODO complete this method + } + + /** + * Get an external service defined within the current module with a given name + * + * This method is defined as a script function. + * + * @param name + * name of the service + * @return service object represented by the given name + */ + public Object getService(String name) { + // get a service proxy + ModuleContext tuscanyContext = CurrentModuleContext.getContext(); + Object service = tuscanyContext.locateService(name); + out.println("service obj = " + service); + + return service; + } + + /** + * Echo a variable or a message. + * + * This method is defined as a script function. + * + * @param jsContext + * @param thisObj + * @param args + * @param function + */ + public static void echo(Context jsContext, Scriptable thisObj, Object[] args, Function function) { + if (args.length > 0) { + out.println(args[0]); + for (int i = 1; i < args.length; i++) { + out.print(" " + Context.toString(args[i])); + } + } + out.println(); + } + + /** + * print the stacktrace of the last exception + * + * This method is defined as a script function. + */ + public void printStackTrace() { + if (lastException == null) { + out.println("No stacktrace available"); + } else { + err.println(getStackTrace(lastException)); + } + } + + /** + * Exit the shell when it is in the interactive mode. + * + * This method is defined as a script function. + */ + public void exit() { + shutdown = true; + } + + /** + * Get and set the language version. + * + * This method is defined as a JavaScript function. + * + * @param jsContext + * @param thisObj + * @param args + * @param function + */ + public static double version(Context jsContext, Scriptable thisObj, Object[] args, Function function) { + if (args.length > 0) { + int i = (int) Context.toNumber(args[0]); + jsContext.setLanguageVersion(i); + } + return (double) jsContext.getLanguageVersion(); + } + + /** + * Load and execute a set of JavaScript source files. + * + * This method is defined as a JavaScript function. + * + * @param jsContext + * @param thisObj + * @param args + * @param function + */ + public static void load(Context jsContext, Scriptable thisObj, Object[] args, Function function) { + ScriptEngine engine = (ScriptEngine) getTopLevelScope(thisObj); + for (int i = 0; i < args.length; i++) { + engine.processFile(Context.toString(args[i])); + } + } + + /** + * Get the current output stream + * + * @return current output stream + */ + public PrintStream getOut() { + return out; + } + + /** + * Set the current output stream + * + * @param out + * the new output stream + */ + public void setOut(PrintStream out) { + ScriptEngine.out = out; + } + + /** + * Get the current error output stream + * + * @return Returns the current error output stream. + */ + public PrintStream getErr() { + return err; + } + + /** + * Set the current error output stream + * + * @param err + * The new error output stream to set. + */ + public void setErr(PrintStream err) { + this.err = err; + } + + /** + * Get the current input stream + * + * @return Returns the current input stream. + */ + public InputStream getIn() { + return in; + } + + /** + * Set the current input stream + * + * @param in + * The new input stream to set. + */ + public void setIn(InputStream in) { + this.in = in; + } + + /** + * initialize the Tuscany runtime + * + */ + protected void initTuscanyRuntime() { + + // Required to allow the SDO runtime to use the correct classloader + oldClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + + // Obtain and start the Tuscany runtime + try { + tuscany = new TuscanyRuntime("TuscanyClient", null); + tuscany.start(); + + // this will get the module name; either specified by user or from the classpath + String moduleName = getCurrentModuleName(); + // TODO how do we get all the components, services exposed by this module ? + + } catch (Exception ce) { + ce.printStackTrace(); + err.println("Failed to start Tuscany runtime: " + ce.getMessage()); + // ce.printStackTrace(err); + lastException = ce; + } + } + + /** + * start the script engine + * + */ + protected void startScriptEngin() { + + out.println("Tuscany SCA Shell 0.1, type help() for a list of supported functions."); + + // set up "arguments" in the global scope + if (params.length > 1) { + int length = params.length - 1; + Object obj[] = new Object[length]; + System.arraycopy(params, 1, obj, 0, length); + + Scriptable argsObj = jsContext.newArray(this, obj); + this.defineProperty("arguments", argsObj, ScriptableObject.DONTENUM); + } + + if (params.length == 0) { + // no file name specified, go to interactive mode + this.startInteractiveMode(); + } else { + // TODO this could be a jar file or a script file + // process the specified file + this.processFile(params[0]); + } + System.gc(); + } + + /** + * Evaluate JavaScript source in the interactive mode. + * + */ + private void startInteractiveMode() { + // see if org.mozilla.javascript.tools.shell.Main.processSource() can handle this + // Main.setErr(this.getErr()); + // Main.setOut(this.getOut()); + // Main.setIn(this.getIn()); + // Main.processSource(jsContext, filename); + + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + int currentLine = 1; + boolean done = false; + while (!shutdown && !done) { + out.print(prompt); + out.flush(); + int lineToCompile = currentLine; + try { + StringBuffer source = new StringBuffer(); + // read the next line entered by user + boolean compilable = false; + while (!compilable) { + String nextLine = reader.readLine(); + if (nextLine != null) { + currentLine += 1; + source.append(nextLine).append("\n"); + compilable = jsContext.stringIsCompilableUnit(source.toString()); + } else { + // TODO check if this can handle Ctrl+C + System.out.println("=== Ctrl+C pressed =="); + // break both the loops + done = true; + compilable = true; + } + } + Object result = jsContext.evaluateString(this, source.toString(), "", lineToCompile, null); + if (result != Context.getUndefinedValue()) { + out.println(Context.toString(result)); + } + } catch (Exception e) { + if (e instanceof WrappedException) { + WrappedException we = (WrappedException) e; + err.println(we.getWrappedException().getMessage()); + } + err.println(e.getMessage()); + // e.printStackTrace(err); + lastException = e; + } + } + out.println(); + } + + /** + * Read the contents from a script file and execute it. + * + * @param filename + * the name of the file to compile + */ + private void processFile(String fileName) { + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader(fileName)); + jsContext.evaluateReader(this, reader, fileName, 1, null); + } catch (Exception e) { + if (e instanceof WrappedException) { + WrappedException we = (WrappedException) e; + err.println(we.getWrappedException().getMessage()); + } + err.println(e.getLocalizedMessage()); + // e.printStackTrace(err); + lastException = e; + } finally { + try { + reader.close(); + } catch (IOException ioe) { + err.println(ioe.getLocalizedMessage()); + // ioe.printStackTrace(err); + lastException = ioe; + } + } + } + + /** + * Find the SCA module name. If the user have specified one, use that, otherwise, if there is a module definition in the path, pick it up. + * + * @return name of the module + */ + private String getCurrentModuleName() { + String moduleName = ""; + + // TODO parse the arguments to see if there is an SCA module name + return moduleName; + } + + /** + * Get the stacktrace for a give exception + * + * @param t + * Throwable from which the stacktrace need to be obtained + * @return char array containing the stack trace + */ + private char[] getStackTrace(Throwable t) { + CharArrayWriter charWriter = new CharArrayWriter(2048); + PrintWriter writer = new PrintWriter(charWriter); + t.printStackTrace(writer); + + return charWriter.toCharArray(); + } + + public static void main(String args[]) { + new ScriptEngine(args).run(); + } +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/shell/TuscanyShell.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/shell/TuscanyShell.java new file mode 100644 index 0000000000..c26dd213b1 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/shell/TuscanyShell.java @@ -0,0 +1,42 @@ +/** + * 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.shell; + +/** + * This class provides a scripting shell that can be used as a Tuscany client. + * This shell extends from the Rhino JavaScript Engine's shell and + * provides capablities for working with the Tuscany Runtime. + * + *

+ * This shell initializt the Tuscany Engine, using the input parameters that point + * to an SCA jar or war or a directory with an sca.module file. The Shell will + * load that module and then all the components and external services in the + * sca.module become available in the Shell, so that you can invoke them dynamically. + * + */ +public class TuscanyShell { + + /** + * Main entry point into the shell. This method invokes the ScriptEngine. + * + */ + public static void main(String args[]) { + ScriptEngine engine = new ScriptEngine(args); + new Thread(engine).start(); + } + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/LICENSE.txt b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/LICENSE.txt new file mode 100644 index 0000000000..4095b1af76 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/LICENSE.txt @@ -0,0 +1,777 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + +=============================================================================== + +For the Rhino JavaScript project: + +Netscape Public License V1.1 + + AMENDMENTS + + The Netscape Public License Version 1.1 ("NPL") consists of the + Mozilla Public License Version 1.1 with the following Amendments, + including Exhibit A-Netscape Public License. Files identified with + "Exhibit A-Netscape Public License" are governed by the Netscape + Public License Version 1.1. + + Additional Terms applicable to the Netscape Public License. + I. Effect. + These additional terms described in this Netscape Public + License -- Amendments shall apply to the Mozilla Communicator + client code and to all Covered Code under this License. + + II. "Netscape's Branded Code" means Covered Code that Netscape + distributes and/or permits others to distribute under one or more + trademark(s) which are controlled by Netscape but which are not + licensed for use under this License. + + III. Netscape and logo. + This License does not grant any rights to use the trademarks + "Netscape", the "Netscape N and horizon" logo or the "Netscape + lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript", + "Smart Browsing" even if such marks are included in the Original + Code or Modifications. + + IV. Inability to Comply Due to Contractual Obligation. + Prior to licensing the Original Code under this License, Netscape + has licensed third party code for use in Netscape's Branded Code. + To the extent that Netscape is limited contractually from making + such third party code available under this License, Netscape may + choose to reintegrate such code into Covered Code without being + required to distribute such code in Source Code form, even if + such code would otherwise be considered "Modifications" under + this License. + + V. Use of Modifications and Covered Code by Initial Developer. + V.1. In General. + The obligations of Section 3 apply to Netscape, except to + the extent specified in this Amendment, Section V.2 and V.3. + + V.2. Other Products. + Netscape may include Covered Code in products other than the + Netscape's Branded Code which are released by Netscape + during the two (2) years following the release date of the + Original Code, without such additional products becoming + subject to the terms of this License, and may license such + additional products on different terms from those contained + in this License. + + V.3. Alternative Licensing. + Netscape may license the Source Code of Netscape's Branded + Code, including Modifications incorporated therein, without + such Netscape Branded Code becoming subject to the terms of + this License, and may license such Netscape Branded Code on + different terms from those contained in this License. + + VI. Litigation. + Notwithstanding the limitations of Section 11 above, the + provisions regarding litigation in Section 11(a), (b) and (c) of + the License shall apply to all disputes relating to this License. + + EXHIBIT A-Netscape Public License. + + "The contents of this file are subject to the Netscape Public + License Version 1.1 (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.mozilla.org/NPL/ + + Software distributed under the License is distributed on an "AS + IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + implied. See the License for the specific language governing + rights and limitations under the License. + + The Original Code is Mozilla Communicator client code, released + March 31, 1998. + + The Initial Developer of the Original Code is Netscape + Communications Corporation. Portions created by Netscape are + Copyright (C) 1998-1999 Netscape Communications Corporation. All + Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the + terms of the _____ license (the "[___] License"), in which case + the provisions of [______] License are applicable instead of + those above. If you wish to allow use of your version of this + file only under the terms of the [____] License and not to allow + others to use your version of this file under the NPL, indicate + your decision by deleting the provisions above and replace them + with the notice and other provisions required by the [___] + License. If you do not delete the provisions above, a recipient + may use your version of this file under either the NPL or the + [___] License." + + ---------------------------------------------------------------------- + + MOZILLA PUBLIC LICENSE + Version 1.1 + + --------------- + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (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.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] + diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/NOTICE b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/NOTICE new file mode 100644 index 0000000000..d48810c0ec --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/NOTICE @@ -0,0 +1,18 @@ +========================================================================= +== NOTICE file corresponding to the section 4 d of == +== the Apache License, Version 2.0, == +== in this case for the Apache Tuscany distribution. == +========================================================================= + +This product includes software developed by the Apache Software Foundation +(http://www.apache.org/). + +This product also includes software developed by: +- the Eclipse Modeling Framework project (http://www.eclipse.org/emf/) +- the Celtix project (http://celtix.objectweb.org/) +- the Mozilla Rhino project (http://www.mozilla.org/rhino/) +- the GlassFish JAX-WS project (https://jax-ws.dev.java.net/) + +Please read the LICENSE.txt file present in the root directory of this +distribution. + diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/README.txt b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/META-INF/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/system.fragment b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/system.fragment new file mode 100644 index 0000000000..840efd10bc --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/main/resources/system.fragment @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/AbstractJavaScriptTestCase.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/AbstractJavaScriptTestCase.java new file mode 100644 index 0000000000..ee6b533ddf --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/AbstractJavaScriptTestCase.java @@ -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(); + } +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/BasicTestCase.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/BasicTestCase.java new file mode 100644 index 0000000000..f66f2e1079 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/BasicTestCase.java @@ -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); + } + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XTestCase.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XTestCase.java new file mode 100644 index 0000000000..d6060aea90 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XTestCase.java @@ -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); + } + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/HelloWorld.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/HelloWorld.java new file mode 100644 index 0000000000..3a90be0102 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/HelloWorld.java @@ -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); + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/InitializationTestCase.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/InitializationTestCase.java new file mode 100644 index 0000000000..138d9a8452 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/InitializationTestCase.java @@ -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); + } + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/PropertiesTestCase.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/PropertiesTestCase.java new file mode 100644 index 0000000000..7b14376dbe --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/PropertiesTestCase.java @@ -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); + } + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/Salutation.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/Salutation.java new file mode 100644 index 0000000000..42d46c16d1 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/Salutation.java @@ -0,0 +1,25 @@ +/** + * + * 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 interface Salutation { + + public String getSalutation(); + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/ServiceRefsTestCase.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/ServiceRefsTestCase.java new file mode 100644 index 0000000000..27993c2b99 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/ServiceRefsTestCase.java @@ -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("HelloWorldComponent3a"); + String response = helloworldService.getGreetings("petra"); + assertEquals("Guten Tag petra", response); + } + +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/TestMethods.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/TestMethods.java new file mode 100644 index 0000000000..327edd1cbb --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/TestMethods.java @@ -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; + } +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.java new file mode 100644 index 0000000000..714814f2cf --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.java @@ -0,0 +1,89 @@ +/* + * 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 java.io.InputStream; +import java.net.URL; + +import javax.xml.namespace.QName; + +import junit.framework.TestCase; + +import org.apache.tuscany.sdo.helper.XSDHelperImpl; +import org.apache.tuscany.sdo.util.SDOUtil; + +import commonj.sdo.helper.TypeHelper; +import commonj.sdo.helper.XSDHelper; + +/** + * Tests for the RhinoE4XScript + */ +public class RhinoE4XScriptTestCase extends TestCase { + + private static final String scriptName = "RhinoE4XScriptTestCase.js"; + + private String script; + + private E4XDataBinding dataBinding; + + protected void setUp() throws Exception { + super.setUp(); + this.script = readResource(scriptName); + TypeHelper th = SDOUtil.createTypeHelper(); + XSDHelper xsdHelper = new XSDHelperImpl(th); + URL url = getClass().getResource("helloworld.wsdl"); + xsdHelper.define(url.openStream(), null); + + dataBinding = new E4XDataBinding(getClass().getClassLoader(),th); + dataBinding.addElementQName("getGreetings", new QName("http://helloworld.samples.tuscany.apache.org", "getGreetings")); + } + + public void testSimpleInvocation() throws IOException { + RhinoE4XScript ri = new RhinoE4XScript(scriptName, script, null, null, dataBinding); + Object x = ri.invoke("getGreetings", new Object[] { "petra" }, null); + assertEquals(x, "hello petra"); + } + + /** + * Read a resource into a String + */ + private String readResource(String name) { + try { + URL url = getClass().getResource(name); + if (url == null) { + throw new RuntimeException("resource not found: " + name); + } + InputStream inputStream = url.openStream(); + + StringBuffer resource = new StringBuffer(); + int n = 0; + + while ((n = inputStream.read()) != -1) { + resource.append((char) n); + } + + inputStream.close(); + + String s = resource.toString(); + return s; + + } catch (IOException e) { + throw new RuntimeException("IOException reading resource " + name, e); + } + } + +} \ No newline at end of file diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.java b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.java new file mode 100644 index 0000000000..19c0d9bcf6 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.java @@ -0,0 +1,186 @@ +/* + * 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 java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import junit.framework.TestCase; + +import org.apache.tuscany.container.rhino.rhino.RhinoScript; +import org.mozilla.javascript.EcmaError; + +/** + * Tests for the RhinoScript + */ +public class RhinoScriptTestCase extends TestCase { + + private static final String scriptName = "RhinoScriptTestCase.js"; + + private String script; + + protected void setUp() throws Exception { + super.setUp(); + this.script = readResource(scriptName); + } + + public void testSimpleInvocation() { + RhinoScript ri = new RhinoScript(scriptName, script); + Object x = ri.invoke("echo", new Object[] { "petra" }, null); + assertEquals("petra", x); + } + + public void testCopy() { + RhinoScript ri = new RhinoScript(scriptName, script); + Object x = ri.invoke("echo", new Object[] { "petra" }, null); + assertEquals("petra", x); + + ri = ri.copy(); + x = ri.invoke("echo", new Object[] { "sue" }, null); + assertEquals("sue", x); + + } + + public void testContexts1() { + RhinoScript ri = new RhinoScript(scriptName, script); + Map contexts = new HashMap(); + contexts.put("a", "petra"); + Object x = ri.invoke("getA", null, contexts); + assertEquals("petra", x); + } + + /** + * Tests context not accessable across invocations + */ + public void testContexts2() { + RhinoScript ri = new RhinoScript(scriptName, script); + Map contexts = new HashMap(); + contexts.put("a", "petra"); + Object x = ri.invoke("getA", null, contexts); + assertEquals("petra", x); + + try { + x = ri.invoke("getA", null, null); + assertTrue("expected ReferenceError", false); + } catch (EcmaError e) { + assertEquals("ReferenceError", e.getName()); + } + } + + /** + * Tests shared scope is accessable across invocations + */ + public void testScopes1() { + RhinoScript ri = new RhinoScript(scriptName, script); + ri.invoke("setGlobalVarY", new Object[] { "petra" }, null); + + Object x = ri.invoke("getGlobalVarY", null, null); + assertEquals("petra", x); + } + + /** + * Tests local vars are NOT accessable across invocations + */ + public void testScopes2() { + RhinoScript ri = new RhinoScript(scriptName, script); + ri.invoke("setLocalVarY", new Object[] { "petra" }, null); + + try { + ri.invoke("getGlobalVarY", null, null); + assertTrue("expected ReferenceError", false); + } catch (EcmaError e) { + assertEquals("ReferenceError", e.getName()); + } + } + + /** + * Tests shared scope is accessable when using contexts (ie an wire scope) + */ + public void testScopes3() { + RhinoScript ri = new RhinoScript(scriptName, script); + ri.invoke("setGlobalVarY", new Object[] { "petra" }, null); + + Map contexts = new HashMap(); + contexts.put("a", "sue"); + Object x = ri.invoke("getGlobalVarY", null, contexts); + assertEquals("petra", x); + + x = ri.invoke("getA", null, contexts); + assertEquals("sue", x); + + } + + /** + * Tests a copy only retains the script scope not the shared scope + */ + public void testScopes4() { + RhinoScript ri = new RhinoScript(scriptName, script); + ri.invoke("setGlobalVarY", new Object[] { "petra" }, null); + + ri = ri.copy(); + try { + ri.invoke("getGlobalVarY", null, null); + assertTrue("expected ReferenceError", false); + } catch (EcmaError e) { + assertEquals("ReferenceError", e.getName()); + } + try { + ri.invoke("getA", null, null); + assertTrue("expected ReferenceError", false); + } catch (EcmaError e) { + assertEquals("ReferenceError", e.getName()); + } + + } + + public void testGetInt() { + RhinoScript ri = new RhinoScript(scriptName, script); + Object x = ri.invoke("getInt", null, Integer.TYPE, null); + assertEquals(Integer.class, x.getClass()); + } + + /** + * Read a resource into a String + */ + private String readResource(String name) { + try { + URL url = getClass().getResource(name); + if (url == null) { + throw new RuntimeException("resource not found: " + name); + } + InputStream inputStream = url.openStream(); + + StringBuffer resource = new StringBuffer(); + int n = 0; + + while ((n = inputStream.read()) != -1) { + resource.append((char) n); + } + + inputStream.close(); + + String s = resource.toString(); + return s; + + } catch (IOException e) { + throw new RuntimeException("IOException reading resource " + name, e); + } + } + +} \ No newline at end of file diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.js b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.js new file mode 100644 index 0000000000..20dc2245f9 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.js @@ -0,0 +1,11 @@ + +function process(inXML) { + + var greeting = "hello " + inXML..*::in0; + var outXML = + + { greeting } + ; + + return outXML; +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.js b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.js new file mode 100644 index 0000000000..2de740d5f8 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.js @@ -0,0 +1,22 @@ + +function echo(x) { + return x; +} + +function getA(x) { + return a; +} + +function setGlobalVarY(x) { + y = x; +} +function setLocalVarY(x) { + var y = x; +} +function getGlobalVarY(x) { + return y; +} + +function getInt(x) { + return 42; +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/helloworld.wsdl b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/helloworld.wsdl new file mode 100644 index 0000000000..a402cc4d7c --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/helloworld.wsdl @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/sca.module b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/sca.module new file mode 100644 index 0000000000..f78a41381a --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/sca.module @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + Guten Tag + + + + + + + SalutationComponent3b + + + + + + + Guten Tag + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.componentType b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.componentType new file mode 100644 index 0000000000..90b6c09015 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.componentType @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.js b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.js new file mode 100644 index 0000000000..b3104f78a5 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.js @@ -0,0 +1,20 @@ +/** + * + * 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. + */ + +function getGreetings(name) { + return "jsHello " + name; +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.componentType b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.componentType new file mode 100644 index 0000000000..33208811bf --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.componentType @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.js b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.js new file mode 100644 index 0000000000..4f91dba40e --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.js @@ -0,0 +1,20 @@ +/** + * + * 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. + */ + +function getGreetings(name) { + return salutation + " " + name; +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.componentType b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.componentType new file mode 100644 index 0000000000..1bc6922e6d --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.componentType @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.js b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.js new file mode 100644 index 0000000000..f3160f6f65 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.js @@ -0,0 +1,20 @@ +/** + * + * 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. + */ + +function getGreetings(name) { + return SalutationService.getSalutation() + " " + name; +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.componentType b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.componentType new file mode 100644 index 0000000000..90b6c09015 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.componentType @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.js b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.js new file mode 100644 index 0000000000..338c3ac3cd --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.js @@ -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. + */ + +initSalutation(); + +function getGreetings(name) { + return SALUTATION + name; +} + +function initSalutation() { + SALUTATION = "Bonjour "; +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.componentType b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.componentType new file mode 100644 index 0000000000..90b6c09015 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.componentType @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.js b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.js new file mode 100644 index 0000000000..f01cd1727f --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.js @@ -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. + */ + +//importPackage(Packages.sample.utils); +importClass(Packages.org.apache.tuscany.container.rhino.integration.TestMethods); + +initSalutation(); + +function getGreetings(name) { + return SALUTATION.getSalutation() + " " + name; +} + +function initSalutation() { + SALUTATION = new TestMethods(); +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.componentType b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.componentType new file mode 100644 index 0000000000..1c819bff32 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.componentType @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.js b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.js new file mode 100644 index 0000000000..2116e40ae3 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.js @@ -0,0 +1,20 @@ +/** + * + * 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. + */ + +function getSalutation() { + return GREETING; +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/e4x.componentType b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/e4x.componentType new file mode 100644 index 0000000000..6bf89d2ef8 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/e4x.componentType @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/e4x.js b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/e4x.js new file mode 100644 index 0000000000..7fe882df55 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/tests/e4x.js @@ -0,0 +1,28 @@ +/** + * + * 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. + */ + +function process(xmlIn) { + + var greeting = "e4xHello " + xmlIn..*::in0; + + var xmlOut = + + { greeting } + ; + + return xmlOut; +} diff --git a/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/wsdl/helloworld.wsdl b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/wsdl/helloworld.wsdl new file mode 100644 index 0000000000..7bcb48dcf2 --- /dev/null +++ b/sca-java-1.x/branches/java-post-M1/sca/containers/container.rhino/src/test/resources/wsdl/helloworld.wsdl @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3