diff options
Diffstat (limited to 'sandbox/SPI/implementation-script/src/main/java/org')
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 + } + } + } +} |