summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-1.0/modules/implementation-script/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'branches/sca-java-1.0/modules/implementation-script/src/main/java')
-rw-r--r--branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementation.java69
-rw-r--r--branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementationActivator.java45
-rw-r--r--branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptInvoker.java82
-rw-r--r--branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptInvokerFactory.java147
-rw-r--r--branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/engines/TuscanyJRubyScriptEngine.java454
5 files changed, 0 insertions, 797 deletions
diff --git a/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementation.java b/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementation.java
deleted file mode 100644
index ef2fce70ce..0000000000
--- a/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementation.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.sca.extension.helper.utils.ResourceHelper;
-
-/**
- * Represents a Script implementation.
- */
-public class ScriptImplementation {
-
- protected String scriptName;
- protected String scriptSrc;
- protected String scriptLanguage;
-
- public String getScript() {
- return scriptName;
- }
-
- public void setScript(String scriptName) {
- this.scriptName = scriptName;
- }
-
- public void setLanguage(String language) {
- this.scriptLanguage = language;
- }
-
- public void setElementText(String elementText) {
- scriptSrc = elementText;
- }
-
- public String getScriptLanguage() {
- if (scriptLanguage == null || scriptLanguage.length() < 1) {
- int i = scriptName.lastIndexOf('.');
- if (i > 0) {
- scriptLanguage = scriptName.substring(i + 1);
- }
- }
- return scriptLanguage;
- }
-
- public String getScriptSrc() {
- if (scriptSrc == null) {
- if (scriptName == null) {
- throw new IllegalArgumentException("script name is null and no inline source used");
- }
-
- // TODO: how should resources be read? Soould this use the contrabution sevrice?
- scriptSrc = ResourceHelper.readResource(scriptName);
- }
- return scriptSrc;
- }
-}
diff --git a/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementationActivator.java b/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementationActivator.java
deleted file mode 100644
index 4ceb847a7a..0000000000
--- a/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptImplementationActivator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.sca.assembly.ComponentType;
-import org.apache.tuscany.sca.extension.helper.ImplementationActivator;
-import org.apache.tuscany.sca.extension.helper.InvokerFactory;
-import org.apache.tuscany.sca.extension.helper.utils.PropertyValueObjectFactory;
-import org.apache.tuscany.sca.runtime.RuntimeComponent;
-
-public class ScriptImplementationActivator implements ImplementationActivator<ScriptImplementation> {
-
- // TODO: seems wrong to need PropertyValueObjectFactory, could it be on Property somehow?
- protected PropertyValueObjectFactory propertyFactory;
-
- public ScriptImplementationActivator(PropertyValueObjectFactory propertyFactory) {
- this.propertyFactory = propertyFactory;
- }
-
- public Class<ScriptImplementation> getImplementationClass() {
- return ScriptImplementation.class;
- }
-
- public InvokerFactory createInvokerFactory(RuntimeComponent rc, ComponentType ct, ScriptImplementation implementation) {
- return new ScriptInvokerFactory(rc, ct, implementation, propertyFactory);
- }
-
-}
diff --git a/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptInvoker.java b/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptInvoker.java
deleted file mode 100644
index 55b215fedf..0000000000
--- a/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptInvoker.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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 javax.script.Invocable;
-import javax.script.ScriptEngine;
-import javax.script.ScriptException;
-
-import org.apache.axiom.om.OMElement;
-import org.apache.bsf.xml.XMLHelper;
-import org.apache.tuscany.sca.interfacedef.Operation;
-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 ScriptEngine scriptEngine;
- protected XMLHelper xmlHelper;
- protected Operation operation;
-
- public ScriptInvoker(ScriptEngine scriptEngine, XMLHelper xmlHelper, Operation operation) {
- this.scriptEngine = scriptEngine;
- this.xmlHelper = xmlHelper;
- this.operation = operation;
- }
-
- protected Object doInvoke(Object[] objects, Operation op) throws ScriptException {
- if (xmlHelper != null) {
- objects[0] = xmlHelper.toScriptXML((OMElement)objects[0]);
- }
-
- Operation oper = operation; // static setting
- if (oper.getName() == null) { // if no static setting
- oper = op; // use dynamic setting
- }
- Object response;
- try {
- response = ((Invocable)scriptEngine).invokeFunction(oper.getName(), objects);
- } catch (ScriptException e) {
- throw e;
- } catch (Exception e) {
- throw new ScriptException(e);
- }
-
- if (xmlHelper != null) {
- response = xmlHelper.toOMElement(response);
- }
-
- return response;
- }
-
- public Message invoke(Message msg) {
- try {
- Object resp = doInvoke((Object[])msg.getBody(), msg.getOperation());
- msg.setBody(resp);
- } catch (ScriptException e) {
- msg.setFaultBody(e.getCause());
- }
- return msg;
- }
-
-}
diff --git a/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptInvokerFactory.java b/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptInvokerFactory.java
deleted file mode 100644
index 08d17e07b2..0000000000
--- a/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/ScriptInvokerFactory.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * 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.axiom.om.OMElement;
-import org.apache.bsf.xml.XMLHelper;
-import org.apache.tuscany.sca.assembly.ComponentReference;
-import org.apache.tuscany.sca.assembly.ComponentType;
-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.core.factory.ObjectCreationException;
-import org.apache.tuscany.sca.core.factory.ObjectFactory;
-import org.apache.tuscany.sca.extension.helper.InvokerFactory;
-import org.apache.tuscany.sca.extension.helper.utils.PropertyValueObjectFactory;
-import org.apache.tuscany.sca.implementation.script.engines.TuscanyJRubyScriptEngine;
-import org.apache.tuscany.sca.interfacedef.InterfaceContract;
-import org.apache.tuscany.sca.interfacedef.Operation;
-import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
-import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract;
-import org.apache.tuscany.sca.invocation.Invoker;
-import org.apache.tuscany.sca.runtime.RuntimeComponent;
-
-public class ScriptInvokerFactory implements InvokerFactory {
-
- protected ScriptEngine scriptEngine;
- protected XMLHelper xmlHelper;
-
- protected RuntimeComponent rc;
- protected ComponentType ct;
- protected ScriptImplementation implementation;
- protected PropertyValueObjectFactory propertyFactory;
-
-
- /**
- * @param rc
- * @param ct
- * @param implementation
- * @param propertyFactory
- */
- public ScriptInvokerFactory(RuntimeComponent rc,
- ComponentType ct,
- ScriptImplementation implementation,
- PropertyValueObjectFactory propertyFactory) {
- super();
- this.rc = rc;
- this.ct = ct;
- this.implementation = implementation;
- this.propertyFactory = propertyFactory;
- }
-
- public Invoker createInvoker(Operation operation) {
- init(rc, ct, implementation, propertyFactory);
- return new ScriptInvoker(scriptEngine, xmlHelper, operation);
- }
-
- protected synchronized void init(RuntimeComponent rc, ComponentType ct, ScriptImplementation implementation, PropertyValueObjectFactory propertyFactory) {
- if(scriptEngine!=null) {
- return;
- }
- 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 : ct.getReferences()) {
- scriptEngine.put(reference.getName(), createReferenceProxy(reference.getName(), rc));
- }
-
- for (Property property : ct.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);
- }
-
- // set the databinding and xmlhelper for wsdl interfaces
- for (Service service : rc.getServices()) {
- InterfaceContract ic = service.getInterfaceContract();
- if (ic instanceof WSDLInterfaceContract) {
- // Set to use the Axiom data binding
- ic.getInterface().setDefaultDataBinding(OMElement.class.getName());
- xmlHelper = XMLHelper.getArgHelper(scriptEngine);
- }
- }
- }
-
- /**
- * TODO: RuntimeComponent should provide a method like this
- */
- @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.getComponentContext().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
- */
- protected ScriptEngine getScriptEngineByExtension(String scriptExtn) {
- ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
- if ("rb".equals(scriptExtn)) {
- return new TuscanyJRubyScriptEngine();
- } else {
- return scriptEngineManager.getEngineByExtension(scriptExtn);
- }
- }
-}
diff --git a/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/engines/TuscanyJRubyScriptEngine.java b/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/engines/TuscanyJRubyScriptEngine.java
deleted file mode 100644
index 4006728f72..0000000000
--- a/branches/sca-java-1.0/modules/implementation-script/src/main/java/org/apache/tuscany/sca/implementation/script/engines/TuscanyJRubyScriptEngine.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
-* 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;
- }
-
- @Override
- public ScriptEngine getEngine() {
- return TuscanyJRubyScriptEngine.this;
- }
-
- @Override
- 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, 0);
- } 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, 0);
- } 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();
-
- @Override
- 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));
- }
- }
-
-
- @Override
- 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)));
- }
- }
-
- @Override
- 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);
- }
- }
-
- @Override
- 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);
- }
- }
-
- @Override
- 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);
- }
- }
- }
-
- @Override
- 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;
- }
- }
-
- @Override
- 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