diff options
author | dims <dims@13f79535-47bb-0310-9956-ffa450edef68> | 2008-06-17 00:23:01 +0000 |
---|---|---|
committer | dims <dims@13f79535-47bb-0310-9956-ffa450edef68> | 2008-06-17 00:23:01 +0000 |
commit | bdd0a41aed7edf21ec2a65cfa17a86af2ef8c48a (patch) | |
tree | 38a92061c0793434c4be189f1d70c3458b6bc41d /tags/java/sca/0.90-incubating/modules/implementation-script/src/main |
Move Tuscany from Incubator to top level.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@668359 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'tags/java/sca/0.90-incubating/modules/implementation-script/src/main')
12 files changed, 1382 insertions, 0 deletions
diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/AbstractImplementation.java b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/AbstractImplementation.java new file mode 100644 index 0000000000..3b7b7fdbdb --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/AbstractImplementation.java @@ -0,0 +1,101 @@ +/* + * 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.spi; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.sca.assembly.ConstrainingType; +import org.apache.tuscany.sca.assembly.Implementation; +import org.apache.tuscany.sca.assembly.Property; +import org.apache.tuscany.sca.assembly.Reference; +import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.policy.Intent; +import org.apache.tuscany.sca.policy.PolicySet; + +/** + * TODO: couldn't something like this class be provided by the runtime? + */ +public abstract class AbstractImplementation implements Implementation { + + private List<Service> services = new ArrayList<Service>(); + private List<Reference> references = new ArrayList<Reference>(); + private List<Property> properties = new ArrayList<Property>(); + private ConstrainingType constrainingType; + private String uri; + private boolean unresolved = true; + private List<Intent> intents; + private List<PolicySet> policySets; + + public AbstractImplementation() { + } + + public List<Property> getProperties() { + return properties; + } + + public List<Reference> getReferences() { + return references; + } + + public List<Service> getServices() { + return services; + } + + public String getURI() { + return uri; + } + + public void setURI(String uri) { + this.uri = uri; + } + + public ConstrainingType getConstrainingType() { + return constrainingType; + } + + public void setConstrainingType(ConstrainingType constrainingType) { + this.constrainingType = constrainingType; + } + + public List<Intent> getRequiredIntents() { + return intents; + } + + public List<PolicySet> getPolicySets() { + return policySets; + } + + public List<Object> getExtensions() { + // TODO what is this for? + return null; + } + + public boolean isUnresolved() { + // TODO what is this for? + return unresolved; + } + + public void setUnresolved(boolean unresolved) { + // TODO what is this for? + this.unresolved = unresolved; + } + +} diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/AbstractStAXArtifactProcessor.java b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/AbstractStAXArtifactProcessor.java new file mode 100644 index 0000000000..275b0ff0a3 --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/AbstractStAXArtifactProcessor.java @@ -0,0 +1,78 @@ +/* + * 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.spi; + +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.ComponentType; +import org.apache.tuscany.sca.assembly.Implementation; +import org.apache.tuscany.sca.assembly.Property; +import org.apache.tuscany.sca.assembly.Reference; +import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.contribution.service.ContributionResolveException; + +/** + * TODO: couldn't something like this class be provided by the runtime? + * Each impl shouldn't have to have their own .componentType merging code + */ +public abstract class AbstractStAXArtifactProcessor<I extends Implementation> implements StAXArtifactProcessor<I> { + + private AssemblyFactory assemblyFactory; + + public AbstractStAXArtifactProcessor(AssemblyFactory assemblyFactory) { + this.assemblyFactory = assemblyFactory; + } + + public void resolve(I model, ModelResolver resolver) throws ContributionResolveException { + addSideFileComponentType(model.getURI(), model, resolver); + model.setUnresolved(false); + } + + protected void addSideFileComponentType(String name, Implementation impl, ModelResolver resolver) { + int lastDot = name.lastIndexOf('.'); + if (lastDot < 0) { + return; + } + String sideFileName = name.substring(0, lastDot) + ".componentType"; + + ComponentType componentType = assemblyFactory.createComponentType(); + componentType.setURI(sideFileName); + componentType.setUnresolved(true); + + componentType = resolver.resolveModel(ComponentType.class, componentType); + + if (!componentType.isUnresolved()) { + for (Reference reference : componentType.getReferences()) { + impl.getReferences().add(reference); + } + for (Service service : componentType.getServices()) { + impl.getServices().add(service); + } + for (Property property : componentType.getProperties()) { + impl.getProperties().add(property); + } + if (componentType.getConstrainingType() != null) { + impl.setConstrainingType(componentType.getConstrainingType()); + } + } + } + +} diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/PropertyValueObjectFactory.java b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/PropertyValueObjectFactory.java new file mode 100644 index 0000000000..53385f55b5 --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/PropertyValueObjectFactory.java @@ -0,0 +1,226 @@ +/*
+ * 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.spi;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.apache.tuscany.sca.assembly.Property;
+import org.apache.tuscany.sca.databinding.Mediator;
+import org.apache.tuscany.sca.databinding.SimpleTypeMapper;
+import org.apache.tuscany.sca.databinding.impl.SimpleTypeMapperImpl;
+import org.apache.tuscany.sca.factory.ObjectCreationException;
+import org.apache.tuscany.sca.factory.ObjectFactory;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * TODO: Shouldn't this class be provided by the runtime?
+ */
+public class PropertyValueObjectFactory {
+ // protected DataBindingRegistry dbRegistry = new DataBindingRegistryImpl();
+ protected Mediator mediator = null;
+ protected SimpleTypeMapper simpleTypeMapper = new SimpleTypeMapperImpl();
+ boolean isSimpleType;
+
+ public PropertyValueObjectFactory(Mediator mediator) {
+ this.mediator = mediator;
+ }
+
+ public ObjectFactory createValueFactory(Property property) {
+ isSimpleType = isSimpleType(property);
+ Document doc = (Document)property.getValue();
+ Element rootElement = doc.getDocumentElement();
+
+ //FIXME : since scripts use dynamic types we need to generate a dynamic java type using the
+ //xml structure of the property value. Should this be done in the JavaBeansDataBinding...
+ Class javaType = null;
+
+ if (property.isMany()) {
+ if (isSimpleType) {
+ String value = "";
+ if (rootElement.getChildNodes().getLength() > 0) {
+ value = rootElement.getChildNodes().item(0).getTextContent();
+ }
+ List<String> values =
+ getSimplePropertyValues(value, javaType);
+ return new ListObjectFactoryImpl(property,
+ values,
+ isSimpleType,
+ javaType);
+ } else {
+ return new ListObjectFactoryImpl(property,
+ getComplexPropertyValues(doc),
+ isSimpleType,
+ javaType);
+ }
+ } else {
+ if (isSimpleType) {
+ String value = "";
+ if (rootElement.getChildNodes().getLength() > 0) {
+ value = rootElement.getChildNodes().item(0).getTextContent();
+ }
+ return new ObjectFactoryImpl(property,
+ value,
+ isSimpleType,
+ javaType);
+ } else {
+ Object value = getComplexPropertyValues(doc).get(0);
+ return new ObjectFactoryImpl(property,
+ value,
+ isSimpleType,
+ javaType);
+ }
+
+ }
+ }
+
+ private boolean isSimpleType(Property property) {
+ if (property.getXSDType() != null) {
+ return SimpleTypeMapperImpl.isSimpleXSDType(property.getXSDType());
+ } else {
+ if (property instanceof Document) {
+ Document doc = (Document)property;
+ Element element = doc.getDocumentElement();
+ if (element.getChildNodes().getLength() == 1 &&
+ element.getChildNodes().item(0).getNodeType() == Element.TEXT_NODE) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private List<String> getSimplePropertyValues(String concatenatedValue, Class javaType) {
+ List<String> propValues = new ArrayList<String>();
+ StringTokenizer st = null;
+ if ( javaType.getName().equals("java.lang.String")) {
+ st = new StringTokenizer(concatenatedValue, "\"");
+ } else {
+ st = new StringTokenizer(concatenatedValue);
+ }
+ String aToken = null;
+ while (st.hasMoreTokens()) {
+ aToken = st.nextToken();
+ if (aToken.trim().length() > 0) {
+ propValues.add(aToken);
+ }
+ }
+ return propValues;
+ }
+
+ private List<Node> getComplexPropertyValues(Document document) {
+ Element rootElement = document.getDocumentElement();
+ List<Node> propValues = new ArrayList<Node>();
+ for (int count = 0 ; count < rootElement.getChildNodes().getLength() ; ++count) {
+ if (rootElement.getChildNodes().item(count).getNodeType() == Document.ELEMENT_NODE) {
+ propValues.add(rootElement.getChildNodes().item(count));
+ }
+ }
+ return propValues;
+ }
+
+ public abstract class ObjectFactoryImplBase implements ObjectFactory {
+ protected SimpleTypeMapper simpleTypeMapper = new SimpleTypeMapperImpl();
+ protected Property property;
+ protected Object propertyValue;
+ protected Class javaType;
+ protected DataType<XMLType> sourceDataType;
+ protected DataType<?> targetDataType;
+ boolean isSimpleType;
+
+ public ObjectFactoryImplBase(Property property, Object propertyValue, boolean isSimpleType, Class javaType) {
+
+ this.isSimpleType = isSimpleType;
+ this.property = property;
+ this.propertyValue = propertyValue;
+ this.javaType = javaType;
+ //FIXME : fix this when we have managed to generate dynamic java types
+ /*sourceDataType =
+ new DataTypeImpl<XMLType>(DOMDataBinding.NAME, Node.class,
+ new XMLType(null, this.property.getXSDType()));
+ TypeInfo typeInfo = null;
+ if (this.property.getXSDType() != null) {
+ if (SimpleTypeMapperExtension.isSimpleXSDType(this.property.getXSDType())) {
+ typeInfo = new TypeInfo(property.getXSDType(), true, null);
+ } else {
+ typeInfo = new TypeInfo(property.getXSDType(), false, null);
+ }
+ } else {
+ typeInfo = new TypeInfo(property.getXSDType(), false, null);
+ }
+
+ XMLType xmlType = new XMLType(typeInfo);
+ String dataBinding = null; //(String)property.getExtensions().get(DataBinding.class.getName());
+ if (dataBinding != null) {
+ targetDataType = new DataTypeImpl<XMLType>(dataBinding, javaType, xmlType);
+ } else {
+ targetDataType = new DataTypeImpl<XMLType>(dataBinding, javaType, xmlType);
+ mediator.getDataBindingRegistry().introspectType(targetDataType, null);
+ }*/
+ }
+ }
+
+ public class ObjectFactoryImpl extends ObjectFactoryImplBase {
+ public ObjectFactoryImpl(Property property, Object propertyValue, boolean isSimpleType, Class javaType) {
+ super(property, propertyValue, isSimpleType, javaType);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getInstance() throws ObjectCreationException {
+ if (isSimpleType) {
+ return simpleTypeMapper.toJavaObject(property.getXSDType(), (String)propertyValue, null);
+ } else {
+ return mediator.mediate(propertyValue, sourceDataType, targetDataType, null);
+ //return null;
+ }
+ }
+ }
+
+ public class ListObjectFactoryImpl extends ObjectFactoryImplBase {
+ public ListObjectFactoryImpl(Property property, List<?>propertyValues, boolean isSimpleType, Class javaType) {
+ super(property, propertyValues, isSimpleType, javaType);
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<?> getInstance() throws ObjectCreationException {
+ if (isSimpleType) {
+ List<Object> values = new ArrayList<Object>();
+ for (String aValue : (List<String>)propertyValue) {
+ values.add(simpleTypeMapper.toJavaObject(property.getXSDType(), aValue, null));
+ }
+ return values;
+ } else {
+ List instances = new ArrayList();
+ for (Node aValue : (List<Node>)propertyValue) {
+ instances.add(mediator.mediate(aValue,
+ sourceDataType,
+ targetDataType,
+ null));
+ }
+ return instances;
+ }
+ }
+ }
+}
+
\ No newline at end of file diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/ResourceHelper.java b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/ResourceHelper.java new file mode 100644 index 0000000000..ed2efb64bb --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/implementation/spi/ResourceHelper.java @@ -0,0 +1,72 @@ +/* + * 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.spi; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; + +import org.apache.tuscany.sca.contribution.service.ContributionReadException; + +/** + * TODO: Shouldn't this be using the contrabution service? + */ +public class ResourceHelper { + + public static String readResource(String scriptName) throws ContributionReadException { + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + URL scriptSrcUrl = cl.getResource(scriptName); + if (scriptSrcUrl == null) { + throw new ContributionReadException("No script: " + scriptName); + } + + InputStream is; + try { + is = scriptSrcUrl.openStream(); + } catch (IOException e) { + throw new ContributionReadException(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 ContributionReadException(e); + } finally { + try { + is.close(); + } catch (IOException e) { + // ignore + } + } + } + +} diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptArtifactProcessor.java b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptArtifactProcessor.java new file mode 100644 index 0000000000..731ab2f5d0 --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptArtifactProcessor.java @@ -0,0 +1,95 @@ +/* + * 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.sca.implementation.script; + +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; + +import org.apache.tuscany.implementation.spi.AbstractStAXArtifactProcessor; +import org.apache.tuscany.implementation.spi.ResourceHelper; +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.xml.Constants; +import org.apache.tuscany.sca.contribution.service.ContributionReadException; + +/** + * ArtifactProcessor to read the SCDL XML for script implementations + * + * <code><implementation.script script="pathToScriptFile" [language="scriptLanguage"] /></code> + */ +public class ScriptArtifactProcessor extends AbstractStAXArtifactProcessor<ScriptImplementation> { + + private static final QName IMPLEMENTATION_SCRIPT_QNAME = new QName(Constants.SCA10_NS, "implementation.script"); + + public ScriptArtifactProcessor(AssemblyFactory assemblyFactory) { + super(assemblyFactory); + } + + public QName getArtifactType() { + return IMPLEMENTATION_SCRIPT_QNAME; + } + + public Class<ScriptImplementation> getModelType() { + return ScriptImplementation.class; + } + + public ScriptImplementation read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException { + String scriptName = reader.getAttributeValue(null, "script"); + + String scriptLanguage = reader.getAttributeValue(null, "language"); + if (scriptLanguage == null || scriptLanguage.length() < 1) { + int i = scriptName.lastIndexOf('.'); + scriptLanguage = scriptName.substring(i+1); + } + + while (reader.hasNext()) { + if (reader.next() == END_ELEMENT && IMPLEMENTATION_SCRIPT_QNAME.equals(reader.getName())) { + break; + } + } + + String scriptSrc = ResourceHelper.readResource(scriptName); + ScriptImplementation scriptImpl = new ScriptImplementation(scriptName, scriptLanguage, scriptSrc); + + // TODO: How to get the script URI? Should use the contrabution service + // the uri is used in the resolve method (perhaps incorrectly?) to get the .componentType sidefile + scriptImpl.setURI(Thread.currentThread().getContextClassLoader().getResource(scriptName).toString()); + + return scriptImpl; + } + + public void write(ScriptImplementation scriptImplementation, XMLStreamWriter writer) throws XMLStreamException { + + writer.writeStartElement(Constants.SCA10_NS, "implementation.script"); + + if (scriptImplementation.getScriptName() != null) { + writer.writeAttribute("script", scriptImplementation.getScriptName()); + } + + if (scriptImplementation.getScriptLanguage() != null) { + writer.writeAttribute("language", scriptImplementation.getScriptLanguage()); + } + + writer.writeEndElement(); + } +} diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementation.java b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementation.java new file mode 100644 index 0000000000..3b127e2d41 --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementation.java @@ -0,0 +1,55 @@ +/* + * 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.sca.implementation.script; + +import org.apache.tuscany.implementation.spi.AbstractImplementation; +import org.apache.tuscany.sca.assembly.Implementation; + +/** + * Represents a Script implementation. + */ +public class ScriptImplementation extends AbstractImplementation implements Implementation { + + protected String scriptName; + protected String scriptSrc; + protected String scriptLanguage; + + public ScriptImplementation(String scriptName, String scriptLanguage, String scriptSrc) { + this.scriptName = scriptName; + this.scriptLanguage = scriptLanguage; + this.scriptSrc = scriptSrc; + } + + public String getScriptName() { + return scriptName; + } + + public String getScriptLanguage() { + return scriptLanguage; + } + + public String getScriptSrc() { + return scriptSrc; + } + + public void setScriptSrc(String scriptSrc) { + this.scriptSrc = scriptSrc; + } + +} diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementationProvider.java b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementationProvider.java new file mode 100644 index 0000000000..b15247033b --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementationProvider.java @@ -0,0 +1,119 @@ +/* + * 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.sca.implementation.script; + +import java.io.StringReader; + +import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +import org.apache.tuscany.implementation.spi.PropertyValueObjectFactory; +import org.apache.tuscany.sca.assembly.ComponentReference; +import org.apache.tuscany.sca.assembly.Property; +import org.apache.tuscany.sca.assembly.Reference; +import org.apache.tuscany.sca.factory.ObjectCreationException; +import org.apache.tuscany.sca.factory.ObjectFactory; +import org.apache.tuscany.sca.implementation.script.engines.TuscanyJRubyScriptEngine; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.java.JavaInterface; +import org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.provider.ImplementationProvider; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentService; + +/** + * Represents a Script implementation. + */ +public class ScriptImplementationProvider implements ImplementationProvider { + + protected RuntimeComponent component; + protected ScriptImplementation implementation; + protected ScriptEngine scriptEngine; + protected PropertyValueObjectFactory propertyFactory; + + public ScriptImplementationProvider(RuntimeComponent component, ScriptImplementation implementation, PropertyValueObjectFactory propertyFactory) { + this.component = component; + this.implementation = implementation; + this.propertyFactory = propertyFactory; + } + + public Invoker createInvoker(RuntimeComponentService service, Operation operation) { + return new ScriptInvoker(this, operation.getName()); + } + + public Invoker createCallbackInvoker(Operation operation) { + return new ScriptInvoker(this, operation.getName()); + } + + public void start() { + try { + scriptEngine = getScriptEngineByExtension(implementation.getScriptLanguage()); + if (scriptEngine == null) { + throw new ObjectCreationException("no script engine found for language: " + implementation.getScriptLanguage()); + } + if (!(scriptEngine instanceof Invocable)) { + throw new ObjectCreationException("script engine does not support Invocable: " + scriptEngine); + } + + for (Reference reference : implementation.getReferences()) { + scriptEngine.put(reference.getName(), createReferenceProxy(reference.getName(), component)); + } + + for (Property property : implementation.getProperties()) { + ObjectFactory<?> propertyValueFactory = propertyFactory.createValueFactory(property); + if ( propertyValueFactory != null) { + scriptEngine.put(property.getName(), propertyValueFactory.getInstance()); + } + } + + scriptEngine.eval(new StringReader(implementation.getScriptSrc())); + + } catch (ScriptException e) { + throw new ObjectCreationException(e); + } + } + + public void stop() { + } + + @SuppressWarnings("unchecked") + protected Object createReferenceProxy(String name, RuntimeComponent component) { + for (ComponentReference reference : component.getReferences()) { + if (reference.getName().equals(name)) { + Class iface = ((JavaInterface)reference.getInterfaceContract().getInterface()).getJavaClass(); + return component.getService(iface, name); + } + } + throw new IllegalArgumentException("reference " + name + " not found on component: " + component); + } + + /** + * Hack for now to work around a problem with the JRuby script engine + */ + private ScriptEngine getScriptEngineByExtension(String scriptExtn) { + ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); + if ("rb".equals(scriptExtn)) { + return new TuscanyJRubyScriptEngine(); + } else { + return scriptEngineManager.getEngineByExtension(scriptExtn); + } + } +} diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementationProviderFactory.java b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementationProviderFactory.java new file mode 100644 index 0000000000..a41f8ce3e2 --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementationProviderFactory.java @@ -0,0 +1,44 @@ +/* + * 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.sca.implementation.script; + +import org.apache.tuscany.implementation.spi.PropertyValueObjectFactory; +import org.apache.tuscany.sca.provider.ImplementationProvider; +import org.apache.tuscany.sca.provider.ImplementationProviderFactory; +import org.apache.tuscany.sca.runtime.RuntimeComponent; + +/** + * Represents a Script implementation. + */ +public class ScriptImplementationProviderFactory implements ImplementationProviderFactory<ScriptImplementation> { + + private PropertyValueObjectFactory propertyFactory; + + public ScriptImplementationProviderFactory(PropertyValueObjectFactory propertyFactory) { + this.propertyFactory = propertyFactory; + } + + public ImplementationProvider createImplementationProvider(RuntimeComponent component, ScriptImplementation implementation) { + return new ScriptImplementationProvider(component, implementation, propertyFactory); + } + + public Class<ScriptImplementation> getModelType() { + return ScriptImplementation.class; + } +} diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptInvoker.java b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptInvoker.java new file mode 100644 index 0000000000..4b75cf3a92 --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptInvoker.java @@ -0,0 +1,67 @@ +/* + * 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.sca.implementation.script; + +import java.lang.reflect.InvocationTargetException; + +import javax.script.Invocable; +import javax.script.ScriptException; + +import org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.invocation.Message; + +/** + * Perform the actual script invocation + */ +public class ScriptInvoker implements Invoker { + + protected ScriptImplementationProvider provider; + protected String operationName; + + /** + * TODO: passing in the impl is a bit of a hack to get at scriptEngine as thats all this uses + * but its not created till the start method which is called after the invokers are created + */ + public ScriptInvoker(ScriptImplementationProvider provider, String operationName) { + this.provider = provider; + this.operationName = operationName; + } + + private Object doInvoke(Object[] objects) throws InvocationTargetException { + try { + + return ((Invocable)provider.scriptEngine).invokeFunction(operationName, objects); + + } catch (ScriptException e) { + throw new InvocationTargetException(e); + } + } + + public Message invoke(Message msg) { + try { + Object resp = doInvoke((Object[])msg.getBody()); + msg.setBody(resp); + } catch (InvocationTargetException e) { + msg.setFaultBody(e.getCause()); + } + return msg; + } + +} diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptModuleActivator.java b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptModuleActivator.java new file mode 100644 index 0000000000..9a928a9065 --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptModuleActivator.java @@ -0,0 +1,62 @@ +/* + * 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.sca.implementation.script; + +import org.apache.tuscany.implementation.spi.PropertyValueObjectFactory; +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.core.ModelFactoryExtensionPoint; +import org.apache.tuscany.sca.core.ModuleActivator; +import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint; +import org.apache.tuscany.sca.databinding.TransformerExtensionPoint; +import org.apache.tuscany.sca.databinding.impl.MediatorImpl; +import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint; + +public class ScriptModuleActivator implements ModuleActivator { + + public void start(ExtensionPointRegistry registry) { + + ModelFactoryExtensionPoint factories = registry.getExtensionPoint(ModelFactoryExtensionPoint.class); + AssemblyFactory assemblyFactory = factories.getFactory(AssemblyFactory.class); + + StAXArtifactProcessorExtensionPoint staxProcessors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class); + StAXArtifactProcessor scriptArtifactProcessor = new ScriptArtifactProcessor(assemblyFactory); + staxProcessors.addArtifactProcessor(scriptArtifactProcessor); + + // TODO: could the runtime have a default PropertyValueObjectFactory in the registry + DataBindingExtensionPoint dataBindings = registry.getExtensionPoint(DataBindingExtensionPoint.class); + TransformerExtensionPoint transformers = registry.getExtensionPoint(TransformerExtensionPoint.class); + MediatorImpl mediator = new MediatorImpl(dataBindings, transformers); + PropertyValueObjectFactory propertyFactory = new PropertyValueObjectFactory(mediator); + + ProviderFactoryExtensionPoint providerFactories = registry.getExtensionPoint(ProviderFactoryExtensionPoint.class); + providerFactories.addProviderFactory(new ScriptImplementationProviderFactory(propertyFactory)); + } + + public void stop(ExtensionPointRegistry registry) { + } + + public Object[] getExtensionPoints() { + return null; + } + +} diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/engines/TuscanyJRubyScriptEngine.java b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/engines/TuscanyJRubyScriptEngine.java new file mode 100644 index 0000000000..b1a1b05052 --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/engines/TuscanyJRubyScriptEngine.java @@ -0,0 +1,445 @@ +/*
+* Copyright (c) 2006, Sun Microsystems, Inc.
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistributions of source code must retain the above copyright notice, this
+* list of conditions and the following disclaimer.
+*
+* - Redistributions in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materials provided with the distribution.
+*
+* - Neither the name of the Sun Microsystems, Inc. nor the names of
+* contributors may be used to endorse or promote products derived from this
+* software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+* DAMAGE.
+*/
+package org.apache.tuscany.sca.implementation.script.engines;
+
+import java.io.File;
+import java.io.Reader;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.script.AbstractScriptEngine;
+import javax.script.Bindings;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.Invocable;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineFactory;
+import javax.script.ScriptException;
+import javax.script.SimpleBindings;
+
+import org.jruby.Ruby;
+import org.jruby.ast.Node;
+import org.jruby.internal.runtime.GlobalVariable;
+import org.jruby.internal.runtime.GlobalVariables;
+import org.jruby.internal.runtime.ReadonlyAccessor;
+import org.jruby.javasupport.Java;
+import org.jruby.javasupport.JavaObject;
+import org.jruby.javasupport.JavaUtil;
+import org.jruby.runtime.Block;
+import org.jruby.runtime.IAccessor;
+import org.jruby.runtime.builtin.IRubyObject;
+
+import com.sun.script.jruby.JRubyScriptEngineFactory;
+
+/*
+ * This class is a copy of the class com.sun.script.ruby.JRubyScriptEngine with some minor modifications
+ * to work around problems with Tuscany setting SCA properties and references as global variable in JRuby
+ * Should only need it temporarily till a new BSF release fixes it.
+ */
+@SuppressWarnings("unchecked")
+public class TuscanyJRubyScriptEngine extends AbstractScriptEngine
+ implements Compilable, Invocable {
+
+ // my factory, may be null
+ private ScriptEngineFactory factory;
+ private Ruby runtime;
+
+ public TuscanyJRubyScriptEngine() {
+ init(System.getProperty("com.sun.script.jruby.loadpath"));
+ }
+
+ public TuscanyJRubyScriptEngine(String loadPath) {
+ init(loadPath);
+ }
+
+ // my implementation for CompiledScript
+ private class JRubyCompiledScript extends CompiledScript {
+ // my compiled code
+ private Node node;
+
+ JRubyCompiledScript (Node node) {
+ this.node = node;
+ }
+
+ public ScriptEngine getEngine() {
+ return TuscanyJRubyScriptEngine.this;
+ }
+
+ public Object eval(ScriptContext ctx) throws ScriptException {
+ return evalNode(node, ctx);
+ }
+ }
+
+ // Compilable methods
+ public CompiledScript compile(String script)
+ throws ScriptException {
+ Node node = compileScript(script, context);
+ return new JRubyCompiledScript(node);
+ }
+
+ public CompiledScript compile (Reader reader)
+ throws ScriptException {
+ Node node = compileScript(reader, context);
+ return new JRubyCompiledScript(node);
+ }
+
+ // Invocable methods
+ public Object invokeFunction(String name, Object[] args)
+ throws ScriptException {
+ return invokeImpl(null, name, args, Object.class);
+ }
+
+ public Object invokeMethod(Object obj, String name, Object[] args)
+ throws ScriptException {
+ if (obj == null) {
+ throw new IllegalArgumentException("script object is null");
+ }
+ return invokeImpl(obj, name, args, Object.class);
+ }
+
+ public Object getInterface(Object obj, Class clazz) {
+ if (obj == null) {
+ throw new IllegalArgumentException("script object is null");
+ }
+ return makeInterface(obj, clazz);
+ }
+
+ public Object getInterface(Class clazz) {
+ return makeInterface(null, clazz);
+ }
+
+ private <T> T makeInterface(Object obj, Class<T> clazz) {
+ if (clazz == null || !clazz.isInterface()) {
+ throw new IllegalArgumentException("interface Class expected");
+ }
+ final Object thiz = obj;
+ return (T) Proxy.newProxyInstance(
+ clazz.getClassLoader(),
+ new Class[] { clazz },
+ new InvocationHandler() {
+ public Object invoke(Object proxy, Method m, Object[] args)
+ throws Throwable {
+ return invokeImpl(thiz, m.getName(),
+ args, m.getReturnType());
+ }
+ });
+ }
+
+ // ScriptEngine methods
+ public synchronized Object eval(String str, ScriptContext ctx)
+ throws ScriptException {
+ Node node = compileScript(str, ctx);
+ return evalNode(node, ctx);
+ }
+
+ public synchronized Object eval(Reader reader, ScriptContext ctx)
+ throws ScriptException {
+ Node node = compileScript(reader, ctx);
+ return evalNode(node, ctx);
+ }
+
+ public ScriptEngineFactory getFactory() {
+ synchronized (this) {
+ if (factory == null) {
+ factory = new JRubyScriptEngineFactory();
+ }
+ }
+ return factory;
+ }
+
+ public Bindings createBindings() {
+ return new SimpleBindings();
+ }
+
+ // package-private methods
+ void setFactory(ScriptEngineFactory factory) {
+ this.factory = factory;
+ }
+
+ // internals only below this point
+
+ private Object rubyToJava(IRubyObject value) {
+ return rubyToJava(value, Object.class);
+ }
+
+ private Object rubyToJava(IRubyObject value, Class type) {
+ return JavaUtil.convertArgument(
+ Java.ruby_to_java(value, value, Block.NULL_BLOCK),
+ type);
+ }
+
+ private IRubyObject javaToRuby(Object value) {
+ if (value instanceof IRubyObject) {
+ return (IRubyObject) value;
+ }
+ IRubyObject result = JavaUtil.convertJavaToRuby(runtime, value);
+ if (result instanceof JavaObject) {
+ return runtime.getModule("JavaUtilities").callMethod(runtime.getCurrentContext(), "wrap", result);
+ }
+ return result;
+ }
+
+ private synchronized Node compileScript(String script, ScriptContext ctx)
+ throws ScriptException {
+ GlobalVariables oldGlobals = runtime.getGlobalVariables();
+ try {
+ setGlobalVariables(ctx);
+ String filename = (String) ctx.getAttribute(ScriptEngine.FILENAME);
+ if (filename == null) {
+ filename = "<unknown>";
+ }
+ return runtime.parse(script, filename, null);
+ } catch (Exception exp) {
+ throw new ScriptException(exp);
+ } finally {
+ if (oldGlobals != null) {
+ //setGlobalVariables(oldGlobals);
+ }
+ }
+ }
+
+ private synchronized Node compileScript(Reader reader, ScriptContext ctx)
+ throws ScriptException {
+ GlobalVariables oldGlobals = runtime.getGlobalVariables();
+ try {
+ setGlobalVariables(ctx);
+ String filename = (String) ctx.getAttribute(ScriptEngine.FILENAME);
+ if (filename == null) {
+ filename = "<unknown>";
+ }
+ return runtime.parse(reader, filename, null);
+ } catch (Exception exp) {
+ throw new ScriptException(exp);
+ } finally {
+ if (oldGlobals != null) {
+ //setGlobalVariables(oldGlobals);
+ }
+ }
+ }
+
+ private void setGlobalVariables(final ScriptContext ctx) {
+ ctx.setAttribute("context", ctx, ScriptContext.ENGINE_SCOPE);
+ setGlobalVariables(new GlobalVariables(runtime) {
+ GlobalVariables parent = runtime.getGlobalVariables();
+
+ public void define(String name, IAccessor accessor) {
+ assert name != null;
+ assert accessor != null;
+ assert name.startsWith("$");
+ synchronized (ctx) {
+ Bindings engineScope = ctx.getBindings(ScriptContext.ENGINE_SCOPE);
+ engineScope.put(name, new GlobalVariable(accessor));
+ }
+ }
+
+
+ public void defineReadonly(String name, IAccessor accessor) {
+ assert name != null;
+ assert accessor != null;
+ assert name.startsWith("$");
+ synchronized (ctx) {
+ Bindings engineScope = ctx.getBindings(ScriptContext.ENGINE_SCOPE);
+ engineScope.put(name, new GlobalVariable(new
+ ReadonlyAccessor(name, accessor)));
+ }
+ }
+
+ public boolean isDefined(String name) {
+ assert name != null;
+ assert name.startsWith("$");
+ synchronized (ctx) {
+ String modifiedName = name.substring(1);
+ boolean defined = ctx.getAttributesScope(modifiedName) != -1;
+ return defined ? true : parent.isDefined(name);
+ }
+ }
+
+ public void alias(String name, String oldName) {
+ assert name != null;
+ assert oldName != null;
+ assert name.startsWith("$");
+ assert oldName.startsWith("$");
+
+ if (runtime.getSafeLevel() >= 4) {
+ throw runtime.newSecurityError("Insecure: can't alias global variable");
+ }
+
+ synchronized (ctx) {
+ int scope = ctx.getAttributesScope(name);
+ if (scope == -1) {
+ scope = ScriptContext.ENGINE_SCOPE;
+ }
+
+ IRubyObject value = get(oldName);
+ ctx.setAttribute(name, rubyToJava(value), scope);
+ }
+ }
+
+ public IRubyObject get(String name) {
+ assert name != null;
+ assert name.startsWith("$");
+
+ synchronized (ctx) {
+ // skip '$' and try
+ String modifiedName = name.substring(1);
+ int scope = ctx.getAttributesScope(modifiedName);
+ if (scope == -1) {
+ return parent.get(name);
+ }
+
+ Object obj = ctx.getAttribute(modifiedName, scope);
+ if (obj instanceof IAccessor) {
+ return ((IAccessor)obj).getValue();
+ } else {
+ return javaToRuby(obj);
+ }
+ }
+ }
+
+ public IRubyObject set(String name, IRubyObject value) {
+ assert name != null;
+ assert name.startsWith("$");
+
+ if (runtime.getSafeLevel() >= 4) {
+ throw runtime.newSecurityError("Insecure: can't change global variable value");
+ }
+
+ synchronized (ctx) {
+ // skip '$' and try
+ String modifiedName = name.substring(1);
+ int scope = ctx.getAttributesScope(modifiedName);
+ if (scope == -1) {
+ scope = ScriptContext.ENGINE_SCOPE;
+ }
+ IRubyObject oldValue = get(name);
+ Object obj = ctx.getAttribute(modifiedName, scope);
+ if (obj instanceof IAccessor) {
+ ((IAccessor)obj).setValue(value);
+ } else {
+ ctx.setAttribute(modifiedName, rubyToJava(value), scope);
+ }
+ return oldValue;
+ }
+ }
+
+ public Iterator getNames() {
+ List list = new ArrayList();
+ synchronized (ctx) {
+ Iterator<Integer> iterator = ctx.getScopes().iterator();
+ int scope;
+ while (iterator.hasNext()) {
+ scope = iterator.next().intValue();
+ Bindings b = ctx.getBindings(scope);
+ if (b != null) {
+ Iterator<String> bIterator = b.keySet().iterator();
+ while (bIterator.hasNext()) {
+ list.add(bIterator.next());
+ }
+ }
+ }
+ }
+ for (Iterator names = parent.getNames(); names.hasNext();) {
+ list.add(names.next());
+ }
+ return Collections.unmodifiableList(list).iterator();
+ }
+ });
+ }
+
+ private void setGlobalVariables(GlobalVariables globals) {
+ runtime.setGlobalVariables(globals);
+ }
+
+ private synchronized Object evalNode(Node node, ScriptContext ctx)
+ throws ScriptException {
+ GlobalVariables oldGlobals = runtime.getGlobalVariables();
+ try {
+ setGlobalVariables(ctx);
+ return rubyToJava(runtime.eval(node));
+ } catch (Exception exp) {
+ throw new ScriptException(exp);
+ } finally {
+ if (oldGlobals != null) {
+ //setGlobalVariables(oldGlobals);
+ }
+ }
+ }
+
+ private void init(String loadPath) {
+ runtime = Ruby.getDefaultInstance();
+ if (loadPath == null) {
+ loadPath = System.getProperty("java.class.path");
+ }
+ List list = Arrays.asList(loadPath.split(File.pathSeparator));
+ runtime.getLoadService().init(list);
+ runtime.getLoadService().require("java");
+ }
+
+ private Object invokeImpl(final Object obj, String method,
+ Object[] args, Class returnType)
+ throws ScriptException {
+ if (method == null) {
+ throw new NullPointerException("method name is null");
+ }
+
+ try {
+ IRubyObject rubyRecv = obj != null ?
+ JavaUtil.convertJavaToRuby(runtime, obj) : runtime.getTopSelf();
+
+ IRubyObject[] rubyArgs = JavaUtil.convertJavaArrayToRuby(runtime, args);
+
+ // Create Ruby proxies for any input arguments that are not primitives.
+ IRubyObject javaUtilities = runtime.getObject().getConstant("JavaUtilities");
+ for (int i = 0; i < rubyArgs.length; i++) {
+ IRubyObject tmp = rubyArgs[i];
+ if (tmp instanceof JavaObject) {
+ rubyArgs[i] = javaUtilities.callMethod(runtime.getCurrentContext(), "wrap", tmp);
+ }
+ }
+
+ IRubyObject result = rubyRecv.callMethod(runtime.getCurrentContext(), method, rubyArgs);
+ return rubyToJava(result, returnType);
+ } catch (Exception exp) {
+ throw new ScriptException(exp);
+ }
+ }
+}
\ No newline at end of file diff --git a/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.ModuleActivator b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.ModuleActivator new file mode 100644 index 0000000000..21c8ad9c32 --- /dev/null +++ b/tags/java/sca/0.90-incubating/modules/implementation-script/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.ModuleActivator @@ -0,0 +1,18 @@ +# 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.
+# Implementation class for the ExtensionActivator
+org.apache.tuscany.sca.implementation.script.ScriptModuleActivator
|