summaryrefslogtreecommitdiffstats
path: root/sandbox/SPI/implementation-script/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'sandbox/SPI/implementation-script/src/main/java/org')
-rw-r--r--sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementation.java61
-rw-r--r--sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementationActivator.java49
-rw-r--r--sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvoker.java48
-rw-r--r--sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvokerFactory.java74
-rw-r--r--sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptXMLSCDLProcessor.java94
5 files changed, 326 insertions, 0 deletions
diff --git a/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementation.java b/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementation.java
new file mode 100644
index 0000000000..dab22e00f9
--- /dev/null
+++ b/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementation.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.implementation.script;
+
+import org.apache.tuscany.assembly.Implementation;
+import org.apache.tuscany.assembly.impl.ComponentTypeImpl;
+
+/**
+ * Represents a Script implementation.
+ */
+public class ScriptImplementation extends ComponentTypeImpl implements Implementation {
+
+ private String scriptName;
+ private String scriptSrc;
+ private String scriptLanguage;
+
+ public ScriptImplementation() {
+ setUnresolved(true);
+ }
+
+ public String getScriptName() {
+ return scriptName;
+ }
+
+ public String getScriptLanguage() {
+ return scriptLanguage;
+ }
+
+ public String getScriptSrc() {
+ return scriptSrc;
+ }
+
+ public void setScriptSrc(String scriptSrc) {
+ this.scriptSrc = scriptSrc;
+ }
+
+ public void setScriptLanguage(String scriptLanguage) {
+ this.scriptLanguage = scriptLanguage;
+ }
+
+ public void setScriptName(String scriptName) {
+ this.scriptName = scriptName;
+ setURI(scriptName); // TODO: hack to enable getting componentType name
+ }
+}
diff --git a/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementationActivator.java b/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementationActivator.java
new file mode 100644
index 0000000000..f7112d2ed0
--- /dev/null
+++ b/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptImplementationActivator.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.implementation.script;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.assembly.xml.Constants;
+import org.apache.tuscany.spi.implementation.ImplementationActivator;
+import org.apache.tuscany.spi.implementation.InvokerFactory;
+import org.apache.tuscany.spi.implementation.XMLSCDLProcessor;
+
+public class ScriptImplementationActivator implements ImplementationActivator<ScriptImplementation>{
+
+ private static final QName IMPLEMENTATION_SCRIPT_QNAME = new QName(Constants.SCA10_NS, "implementation.script");
+
+ public Class getImplementationClass() {
+ return ScriptImplementation.class;
+ }
+
+ public InvokerFactory getInvokerFactory(ScriptImplementation impl) {
+ return new ScriptInvokerFactory(impl);
+ }
+
+ public QName getModelQName() {
+ return IMPLEMENTATION_SCRIPT_QNAME;
+ }
+
+ public XMLSCDLProcessor getSCDLProcessor() {
+ return new ScriptXMLSCDLProcessor();
+ }
+
+}
diff --git a/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvoker.java b/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvoker.java
new file mode 100644
index 0000000000..bfcee1d6a4
--- /dev/null
+++ b/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvoker.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.implementation.script;
+
+import javax.script.Invocable;
+import javax.script.ScriptException;
+
+import org.apache.tuscany.interfacedef.Operation;
+import org.apache.tuscany.spi.implementation.Invoker;
+
+public class ScriptInvoker implements Invoker {
+
+ private String operationName;
+
+ public ScriptInvoker(ScriptImplementation impl, Operation operation) {
+ this.operationName = operation.getName();
+ }
+
+ public Object invoke(Object instance, Object[] args) {
+ try {
+
+ Invocable scriptEngine = (Invocable)instance;
+
+ return scriptEngine.invokeFunction(operationName, args);
+
+ } catch (ScriptException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
diff --git a/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvokerFactory.java b/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvokerFactory.java
new file mode 100644
index 0000000000..b2afe4a8f3
--- /dev/null
+++ b/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptInvokerFactory.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.implementation.script;
+
+import java.io.StringReader;
+import java.util.Map;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+
+import org.apache.tuscany.interfacedef.Operation;
+import org.apache.tuscany.spi.ObjectCreationException;
+import org.apache.tuscany.spi.implementation.Invoker;
+import org.apache.tuscany.spi.implementation.InvokerFactory;
+
+public class ScriptInvokerFactory implements InvokerFactory {
+
+ private ScriptImplementation impl;
+
+ public ScriptInvokerFactory(ScriptImplementation impl) {
+ this.impl = impl;
+ }
+
+ public Invoker createInvoker(Operation operation) {
+ return new ScriptInvoker(impl, operation);
+ }
+
+ public Object getInstance(Map<String, Object> references, Map<String, Object> properties) {
+ try {
+ ScriptEngineManager manager = new ScriptEngineManager();
+
+ for (String referenceName : references.keySet()) {
+ Object reference = references.get(referenceName);
+ manager.put(referenceName, reference);
+ }
+
+ for (String propertyName : properties.keySet()) {
+ Object propertyValue = properties.get(propertyName);
+ manager.put(propertyName, propertyValue);
+ }
+
+ ScriptEngine engine = manager.getEngineByExtension(impl.getScriptLanguage());
+ if (engine == null) {
+ throw new ObjectCreationException("no script engine found for language: " + impl.getScriptLanguage());
+ }
+
+ engine.eval(new StringReader(impl.getScriptSrc()));
+
+ return engine;
+
+ } catch (ScriptException e) {
+ throw new ObjectCreationException(e);
+ }
+ }
+
+}
diff --git a/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptXMLSCDLProcessor.java b/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptXMLSCDLProcessor.java
new file mode 100644
index 0000000000..56dc885fe8
--- /dev/null
+++ b/sandbox/SPI/implementation-script/src/main/java/org/apache/tuscany/implementation/script/ScriptXMLSCDLProcessor.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.implementation.script;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.tuscany.assembly.Implementation;
+import org.apache.tuscany.spi.implementation.XMLSCDLProcessor;
+
+public class ScriptXMLSCDLProcessor implements XMLSCDLProcessor {
+
+ private static final String SCRIPT = "script";
+ private static final String LANGUAGE = "language";
+
+ public void read(Implementation impl, XMLStreamReader reader) {
+ ScriptImplementation scriptImplementation = (ScriptImplementation)impl;
+
+ String scriptName = reader.getAttributeValue(null, SCRIPT);
+ scriptImplementation.setScriptName(scriptName);
+
+ String scriptLanguage = reader.getAttributeValue(null, LANGUAGE);
+ if (scriptLanguage == null || scriptLanguage.length() < 1) {
+ int i = scriptName.lastIndexOf('.');
+ scriptLanguage = scriptName.substring(i+1);
+ }
+ scriptImplementation.setScriptLanguage(scriptLanguage);
+
+ scriptImplementation.setScriptSrc(readScript(scriptImplementation.getScriptName()));
+ }
+
+ public void write(Implementation impl, XMLStreamWriter writer) {
+ }
+
+ protected String readScript(String scriptName) {
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ URL scriptSrcUrl = cl.getResource(scriptName);
+ if (scriptSrcUrl == null) {
+ throw new RuntimeException("No script: " + scriptName);
+ }
+
+ InputStream is;
+ try {
+ is = scriptSrcUrl.openStream();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ try {
+
+ Reader reader = new InputStreamReader(is, "UTF-8");
+ char[] buffer = new char[1024];
+ StringBuilder source = new StringBuilder();
+ int count;
+ while ((count = reader.read(buffer)) > 0) {
+ source.append(buffer, 0, count);
+ }
+
+ return source.toString();
+
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ } finally {
+ try {
+ is.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+}