Author: vanto
Date: Tue Oct 21 15:01:58 2008
New Revision: 706794

URL: http://svn.apache.org/viewvc?rev=706794&view=rev
Log:
E4X extension updated.

Added:
    
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/TopLevelFunctions.java
    
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/VariableDelegator.java
    ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/
    
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/TestE4XDirect.bpel
    
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/TestE4XDirect.wsdl
    ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/deploy.xml
    
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/test.properties
    ode/trunk/extensions/e4x/src/test/resources/test.js
Removed:
    
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/ExtensionContextWrapper.java
Modified:
    ode/trunk/Rakefile
    
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/JSExtensionOperation.java
    
ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSBPELTest.java
    
ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSOperationTest.java
    ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4X/TestE4X.bpel

Modified: ode/trunk/Rakefile
URL: 
http://svn.apache.org/viewvc/ode/trunk/Rakefile?rev=706794&r1=706793&r2=706794&view=diff
==============================================================================
--- ode/trunk/Rakefile (original)
+++ ode/trunk/Rakefile Tue Oct 21 15:01:58 2008
@@ -545,9 +545,9 @@
 
   desc "E4X Extension"
   define "e4x", :version=>"1.0-beta" do
-    compile.with "rhino:js:jar:1.6R7", projects("ode:bpel-api", 
"ode:runtimes", "ode:engine", 
+    compile.with "rhino:js:jar:1.7R1", COMMONS.logging, 
projects("ode:bpel-api", "ode:runtimes", "ode:engine", 
                  "ode:bpel-compiler", "ode:utils")
-    test.with "rhino:js:jar:1.6R7", projects("ode:bpel-api", "ode:runtimes", 
"ode:jacob", "ode:bpel-schemas",
+    test.with "rhino:js:jar:1.7R1", projects("ode:bpel-api", "ode:runtimes", 
"ode:jacob", "ode:bpel-schemas",
               "ode:bpel-scripts", "ode:scheduler-simple", "ode:bpel-test", 
"ode:utils", "ode:bpel-compiler",
               "ode:bpel-dao", "ode:engine", "ode:bpel-store", "ode:il-common", 
"ode:dao-jpa"),
               COMMONS.collections, COMMONS.lang, COMMONS.logging, DERBY, 
JAVAX.connector,

Modified: 
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/JSExtensionOperation.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/JSExtensionOperation.java?rev=706794&r1=706793&r2=706794&view=diff
==============================================================================
--- 
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/JSExtensionOperation.java
 (original)
+++ 
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/JSExtensionOperation.java
 Tue Oct 21 15:01:58 2008
@@ -20,13 +20,14 @@
 
 import javax.xml.namespace.QName;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.ode.bpel.common.FaultException;
 import 
org.apache.ode.bpel.rtrep.common.extension.AbstractSyncExtensionOperation;
 import org.apache.ode.bpel.rtrep.common.extension.ExtensionContext;
 import org.mozilla.javascript.Context;
 import org.mozilla.javascript.ContextFactory;
 import org.mozilla.javascript.Scriptable;
-import org.mozilla.javascript.ScriptableObject;
 import org.mozilla.javascript.xml.XMLLib;
 import org.mozilla.javascript.xml.XMLLib.Factory;
 import org.w3c.dom.Element;
@@ -37,19 +38,27 @@
  * @author Tammo van Lessen (University of Stuttgart)
  */
 public class JSExtensionOperation extends AbstractSyncExtensionOperation {
+       private static final Log __logger = 
LogFactory.getLog(JSExtensionOperation.class);
        
        public void runSync(ExtensionContext context, Element element) throws 
FaultException {
-
                CustomContextFactory.init();
-               Context ctx = Context.enter();
+        Context ctx = ContextFactory.getGlobal().enterContext();
+        ctx.setOptimizationLevel(-1);
+        ctx.setGeneratingDebug(false);
+        ctx.setGeneratingSource(false);
+        ctx.setDebugger(null, null);
+        
                try {
-                       Scriptable scope = ctx.initStandardObjects();
-                       ScriptableObject.defineClass(scope, 
ExtensionContextWrapper.class);
-                       Scriptable wrappedContext = ctx.newObject(scope, 
"ExtensionContext", new Object[] {context, ctx});
-                       ScriptableObject.putProperty(scope, "context", 
wrappedContext);
+                       Scriptable scope = new TopLevelFunctions(context, ctx, 
context.getDUDir());
                        String source = element.getTextContent();
-                       ctx.evaluateString(scope, source, 
context.getActivityName(), 1, null);
+                       VariableDelegator delegator = new 
VariableDelegator(scope, context, ctx);
+                       ctx.evaluateString(delegator, source, 
context.getActivityName(), 1, null);
+                       delegator.writeVariables();
+               } catch (FaultException e) {
+                       __logger.error("Fault during JS execution.", e);
+                       throw e;
                } catch (Exception e) {
+                       __logger.error("Error during JS execution.", e);
                        throw new FaultException(new 
QName("ExtensionEvaluationFault", JSExtensionBundle.NS), e.getMessage());
                } finally {
                        Context.exit();
@@ -67,6 +76,5 @@
                                ContextFactory.initGlobal(new 
CustomContextFactory());
                        }
                }
-               
        }
 }

Added: 
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/TopLevelFunctions.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/TopLevelFunctions.java?rev=706794&view=auto
==============================================================================
--- 
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/TopLevelFunctions.java
 (added)
+++ 
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/TopLevelFunctions.java
 Tue Oct 21 15:01:58 2008
@@ -0,0 +1,177 @@
+/*
+ * 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.ode.extension.e4x;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.net.MalformedURLException;
+import java.net.URI;
+
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.ode.bpel.rtrep.common.extension.ExtensionContext;
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.ImporterTopLevel;
+import org.mozilla.javascript.NativeJavaObject;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+import org.mozilla.javascript.xml.XMLObject;
+import org.mozilla.javascript.xmlimpl.XMLLibImpl;
+import org.w3c.dom.Node;
+
+/**
+ * Provides (global) top-level functions like "print" and
+ * "load" to our JS/E4X environment.
+ * 
+ * @author Tammo van Lessen (University of Stuttgart)
+ */
+public class TopLevelFunctions extends ImporterTopLevel {
+       private static final long serialVersionUID = 1L;
+       private static final String[] METHODS = { "load", "print", "pid", 
"js2dom", "dom2js" };
+       private URI _duDir;
+       private ExtensionContext _ectx;
+       
+       public TopLevelFunctions(ExtensionContext ectx, Context cx, URI duDir) 
throws Exception {
+               super(cx);
+               this._duDir = duDir;
+               this._ectx = ectx;
+               
+               // define toplevel functions
+               defineFunctionProperties(METHODS, TopLevelFunctions.class,
+                               ScriptableObject.DONTENUM);
+               
+               // register _context object
+               ScriptableObject.putProperty(this, "_context", _ectx);
+       }
+
+       /**
+        * Allows printing debug output to the console. Output will be 
redirected
+        * to the logger associated with 
<code>org.apache.ode.extension.e4x.JavaScriptConsole</code>.
+        * The target log level is INFO.
+        */
+       public static void print(Context cx, Scriptable thisObj, Object[] args,
+                       Function funObj) {
+               StringBuilder sb = new StringBuilder();
+               for (int i = 0; i < args.length; i++) {
+                       if (i > 0) {
+                               sb.append(' ');
+                       }
+                       sb.append(Context.toString(args[i]));
+               }
+               
+               TopLevelFunctions thiz = (TopLevelFunctions) 
getTopLevelScope(thisObj);
+               thiz._ectx.printToConsole(sb.toString());
+       }
+
+       /**
+        * This methods is exposed to the JS environment and supports loading
+        * JavaScript libraries from the deployment unit directory. 
+        */
+       public static void load(Context cx, Scriptable thisObj, Object[] args,
+                       Function funObj) {
+               TopLevelFunctions thiz = (TopLevelFunctions) 
getTopLevelScope(thisObj);
+        for (int i = 0; i < args.length; i++) {
+            // Assumes resource's path is given relative to the service archive
+               URI uri = thiz._duDir.resolve(Context.toString(args[i]));
+               try {
+                               InputStream is = uri.toURL().openStream();
+                               cx.evaluateReader(thiz, new 
InputStreamReader(is), "<importJS>", 1, null);
+                       } catch (MalformedURLException e) {
+                               throw Context.throwAsScriptRuntimeEx(e);
+                       } catch (IOException e) {
+                               throw Context.throwAsScriptRuntimeEx(e);
+                       }
+        }
+       }
+       
+       /**
+        * This method is exposed to the JS environment and returns the process
+        * instance ID of the running PI.
+        */
+       public static long pid(Context cx, Scriptable thisObj, Object[] args,
+                       Function funObj) {
+               TopLevelFunctions thiz = (TopLevelFunctions) 
getTopLevelScope(thisObj);
+               return thiz._ectx.getProcessId();
+       }
+
+       /**
+        * This method is exposed to the JS environment and returns the 
activity 
+        * name of the running PI.
+        */
+       public static String activityName(Context cx, Scriptable thisObj, 
Object[] args,
+                       Function funObj) {
+               TopLevelFunctions thiz = (TopLevelFunctions) 
getTopLevelScope(thisObj);
+               return thiz._ectx.getActivityName();
+       }
+
+       /**
+        * This method is exposed to the JS environment and allows converting 
from
+        * JavaScript E4X objects to W3C DOM nodes.
+        */
+       public static Node js2dom(Context cx, Scriptable thisObj, Object[] args,
+                       Function funObj) {
+               if (args.length != 1) {
+                       Context.reportError("js2dom expects one E4X XML 
parameter");
+               }
+               return XMLLibImpl.toDomNode(args[0]); 
+       }
+       
+       /**
+        * This method is exposed to the JS environment and allows converting 
from
+        * W3C DOM nodes to JavaScript E4X objects.
+        */
+       public static XMLObject dom2js(Context cx, Scriptable thisObj, Object[] 
args,
+                       Function funObj) {
+               if (args.length != 1) {
+                       Context.reportError("dom2js expects one 
org.w3c.dom.Node parameter");
+               }
+               TopLevelFunctions thiz = (TopLevelFunctions) 
getTopLevelScope(thisObj);
+               try {
+                       Object n = args[0];
+                       if (n instanceof NativeJavaObject && 
((NativeJavaObject)n).unwrap() instanceof Node) {
+                               n = ((NativeJavaObject)args[0]).unwrap();
+                       }
+                       String xml = domToString((Node)n);
+                       return (XMLObject)cx.newObject(thiz, "XML", new 
Object[] {Context.javaToJS(xml, thiz)});
+               } catch (TransformerException e) {
+                       throw Context.throwAsScriptRuntimeEx(e);
+               }
+       }
+       
+       public static String domToString(Node n) throws TransformerException {
+               TransformerFactory xformFactory = 
TransformerFactory.newInstance();
+               Transformer idTransform = xformFactory.newTransformer();
+               idTransform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, 
"yes");
+               Source input = new DOMSource(n);
+               StringWriter sw = new StringWriter();
+               Result output = new StreamResult(sw);
+               idTransform.transform(input, output);
+               return sw.toString();
+       }
+}

Added: 
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/VariableDelegator.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/VariableDelegator.java?rev=706794&view=auto
==============================================================================
--- 
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/VariableDelegator.java
 (added)
+++ 
ode/trunk/extensions/e4x/src/main/java/org/apache/ode/extension/e4x/VariableDelegator.java
 Tue Oct 21 15:01:58 2008
@@ -0,0 +1,130 @@
+/*
+ * 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.ode.extension.e4x;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ode.bpel.common.FaultException;
+import org.apache.ode.bpel.evar.ExternalVariableModuleException;
+import org.apache.ode.bpel.rtrep.common.extension.ExtensionContext;
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Delegator;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+import org.mozilla.javascript.xml.XMLObject;
+import org.mozilla.javascript.xmlimpl.XMLLibImpl;
+import org.w3c.dom.Node;
+
+/**
+ * <code>VariableDelegator</code> is in charge of inserting BPEL variables
+ * into the JS/E4X context.
+ * 
+ * @author Tammo van Lessen (University of Stuttgart)
+ */
+public class VariableDelegator extends Delegator {
+       private static final Log __logger = 
LogFactory.getLog(VariableDelegator.class);
+       
+       private ExtensionContext _ectx;
+       private Context _sctx;
+       private Map<String, Object> _env = new HashMap<String, Object>();
+       private Set<String> _variables = new HashSet<String>();
+
+       public VariableDelegator(Scriptable obj, ExtensionContext ectx, Context 
sctx) {
+               super(obj);
+               _ectx = ectx;
+               _sctx = sctx;
+       }
+       
+       public Object get(String name, Scriptable start) {
+        // do not override variables defined in JS
+               if (super.has(name, start)) {
+               return super.get(name, start);
+        }
+        
+               if (_env.get(name) != null) {
+               if (__logger.isDebugEnabled()) {
+                       __logger.debug("Reading JS variable '" + name + "'.");
+               }
+
+                       return _env.get(name);
+               }
+               
+               try {
+               if (!_ectx.isVariableVisible(name)) { 
+                       return ScriptableObject.NOT_FOUND;
+               }
+               if (__logger.isDebugEnabled()) {
+                       __logger.debug("Reading BPEL variable '" + name + "'.");
+               }
+                       Node n = _ectx.readVariable(name);
+                       XMLObject xmlObj = (XMLObject)_sctx.newObject(start, 
"XML", new Object[] {Context.javaToJS(TopLevelFunctions.domToString(n), 
start)});
+                       _env.put(name, xmlObj);
+                       if (_variables.contains(name)) {
+                               _variables.add(name);
+                       }
+                       return xmlObj;
+               } catch (Exception e) {
+                       throw new RuntimeException("Error accessing variable " 
+ name + ".", e);
+               }
+       }
+
+       public boolean has(String name, Scriptable start) {
+               if (super.has(name, start) || _env.containsKey(name)) {
+               return true;
+        }
+        
+               return (_ectx.isVariableVisible(name));
+       }
+
+       public void put(String name, Scriptable start, Object value) {
+        if (__logger.isDebugEnabled()) {
+               __logger.debug("Setting JS variable '" + name + "' to '" + 
value + "'.");
+        }
+
+               _env.put(name, value);
+               if (_ectx.isVariableVisible(name) && 
!_variables.contains(name)) {
+                       _variables.add(name);
+               }
+       }
+
+       /*
+        * This is needed because we're actually building a nested scope and 
not 
+        * purely delegating. Not sure if there's a better solution.
+        */
+       public Scriptable getParentScope() {
+               return obj;
+       }
+
+       public void writeVariables() throws FaultException, 
ExternalVariableModuleException {
+               for (String varName : _variables) {
+               if (__logger.isDebugEnabled()) {
+                       __logger.debug("Writing BPEL variable '" + varName + "' 
to '" + _env.get(varName) + "'.");
+               }
+               //TODO: only changed variables should be written. Its currently 
not that easy
+               //      to detect whether the content has changed without 
recursively injecting
+               //      emcaPut implementations.
+                       _ectx.writeVariable(varName, 
XMLLibImpl.toDomNode(_env.get(varName)));
+               }
+       }
+}

Modified: 
ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSBPELTest.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSBPELTest.java?rev=706794&r1=706793&r2=706794&view=diff
==============================================================================
--- 
ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSBPELTest.java
 (original)
+++ 
ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSBPELTest.java
 Tue Oct 21 15:01:58 2008
@@ -18,6 +18,7 @@
  */
 package org.apache.ode.extension.e4x;
 
+import org.apache.log4j.BasicConfigurator;
 import org.apache.ode.test.BPELTestAbstract;
 import org.junit.Test;
 
@@ -32,4 +33,11 @@
         go("/bpel/TestE4X");
     }
 
+       @Test public void testE4XAssignDirect() throws Throwable {
+        // Test E4X
+               BasicConfigurator.configure();
+               registerExtensionBundle(new JSExtensionBundle());
+        go("/bpel/TestE4XDirect");
+    }
+
 }

Modified: 
ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSOperationTest.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSOperationTest.java?rev=706794&r1=706793&r2=706794&view=diff
==============================================================================
--- 
ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSOperationTest.java
 (original)
+++ 
ode/trunk/extensions/e4x/src/test/java/org/apache/ode/extension/e4x/JSOperationTest.java
 Tue Oct 21 15:01:58 2008
@@ -19,9 +19,11 @@
 package org.apache.ode.extension.e4x;
 
 
+import org.apache.log4j.BasicConfigurator;
 import org.apache.ode.test.MockExtensionContext;
 import org.apache.ode.utils.DOMUtils;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.Element;
 
@@ -29,12 +31,16 @@
  * @author Tammo van Lessen (University of Stuttgart)
  */
 public class JSOperationTest {
+       
+       @Before public void setup() {
+               BasicConfigurator.configure();
+       }
 
        @Test public void testHelloWorld() throws Exception {
                StringBuffer s = new StringBuffer();
-               s.append("var request = context.readVariable('request');\n");
+               s.append("var request = 
dom2js(_context.readVariable('request'));\n");
                s.append("request.TestPart += ' World';\n");
-               s.append("context.writeVariable('request', request);\n");
+               s.append("_context.writeVariable('request', 
js2dom(request));\n");
 
                MockExtensionContext c = new MockExtensionContext();
                c.getVariables().put("request", 
DOMUtils.stringToDOM("<message><TestPart>Hello</TestPart></message>"));
@@ -42,18 +48,33 @@
                Element e = DOMUtils.stringToDOM("<js:script 
xmlns:js=\"js\"><![CDATA[" + s + "]]></js:script>");
                jso.run(c, e);
                String res = 
DOMUtils.domToString(c.getVariables().get("request"));
-               Assert.assertEquals("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?>\n<message><TestPart>Hello World</TestPart></message>", 
res);
                Assert.assertTrue(c.completed);
                Assert.assertFalse(c.faulted);
+               Assert.assertEquals("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?>\n<message><TestPart>Hello World</TestPart></message>", 
res);
        }
        
+       @Test public void testHelloWorldDirect() throws Exception {
+               StringBuffer s = new StringBuffer();
+               s.append("request.TestPart += ' World';\n");
+
+               MockExtensionContext c = new MockExtensionContext();
+               c.getVariables().put("request", 
DOMUtils.stringToDOM("<message><TestPart>Hello</TestPart></message>"));
+               JSExtensionOperation jso = new JSExtensionOperation();
+               Element e = DOMUtils.stringToDOM("<js:script 
xmlns:js=\"js\"><![CDATA[" + s + "]]></js:script>");
+               jso.run(c, e);
+               String res = 
DOMUtils.domToString(c.getVariables().get("request"));
+               Assert.assertTrue(c.completed);
+               Assert.assertFalse(c.faulted);
+               Assert.assertEquals("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?>\n<message><TestPart>Hello World</TestPart></message>", 
res);
+       }
+
        @Test public void testArrayCopy() throws Exception {
                StringBuffer s = new StringBuffer();
-               s.append("var item = context.readVariable('item');\n");
-               s.append("var items = context.readVariable('items');\n");
+               s.append("var item = dom2js(_context.readVariable('item'));\n");
+               s.append("var items = 
dom2js(_context.readVariable('items'));\n");
                s.append("items.TestPart.items.item += item.TestPart.item;\n");
                s.append("items.TestPart.items.item.(@hyped=='true').price *= 
2;");
-               s.append("context.writeVariable('items', items);\n");
+               s.append("_context.writeVariable('items', js2dom(items));\n");
 
                MockExtensionContext c = new MockExtensionContext();
                c.getVariables().put("item", 
DOMUtils.stringToDOM("<message><TestPart><item hyped=\"true\"><name>BPEL 
consulting</name><price>3000</price></item></TestPart></message>"));
@@ -62,9 +83,84 @@
                Element e = DOMUtils.stringToDOM("<js:script 
xmlns:js=\"js\"><![CDATA[" + s + "]]></js:script>");
                jso.run(c, e);
                String res = 
DOMUtils.domToString(c.getVariables().get("items"));
+               Assert.assertTrue(c.completed);
+               Assert.assertFalse(c.faulted);
+               Assert.assertEquals("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?>\n<message><TestPart><items><item><name>WSDL 
consulting</name><price>2500</price></item><item hyped=\"true\"><name>BPEL 
consulting</name><price>6000</price></item></items></TestPart></message>", res);
+       }
+
+       @Test public void testArrayCopyDirect() throws Exception {
+               StringBuffer s = new StringBuffer();
+               s.append("items.TestPart.items.item += item.TestPart.item;\n");
+               s.append("items.TestPart.items.item.(@hyped=='true').price *= 
2;");
+
+               MockExtensionContext c = new MockExtensionContext();
+               c.getVariables().put("item", 
DOMUtils.stringToDOM("<message><TestPart><item hyped=\"true\"><name>BPEL 
consulting</name><price>3000</price></item></TestPart></message>"));
+               c.getVariables().put("items", 
DOMUtils.stringToDOM("<message><TestPart><items><item><name>WSDL 
consulting</name><price>2500</price></item></items></TestPart></message>"));
+               JSExtensionOperation jso = new JSExtensionOperation();
+               Element e = DOMUtils.stringToDOM("<js:script 
xmlns:js=\"js\"><![CDATA[" + s + "]]></js:script>");
+               jso.run(c, e);
+               String res = 
DOMUtils.domToString(c.getVariables().get("items"));
+               Assert.assertTrue(c.completed);
+               Assert.assertFalse(c.faulted);
                Assert.assertEquals("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?>\n<message><TestPart><items><item><name>WSDL 
consulting</name><price>2500</price></item><item hyped=\"true\"><name>BPEL 
consulting</name><price>6000</price></item></items></TestPart></message>", res);
+       }
+
+       @Test public void testVariableNotFoundDirect() throws Exception {
+               StringBuffer s = new StringBuffer();
+               s.append("items1 = item;\n");
+
+               MockExtensionContext c = new MockExtensionContext();
+               JSExtensionOperation jso = new JSExtensionOperation();
+               Element e = DOMUtils.stringToDOM("<js:script 
xmlns:js=\"js\"><![CDATA[" + s + "]]></js:script>");
+               jso.run(c, e);
+               Assert.assertTrue(c.completed);
+               Assert.assertTrue(c.faulted);
+       }
+       
+       @Test public void testPrint() throws Exception {
+               StringBuffer s = new StringBuffer();
+               s.append("print('Hello World!');\n");
+
+               MockExtensionContext c = new MockExtensionContext();
+               JSExtensionOperation jso = new JSExtensionOperation();
+               Element e = DOMUtils.stringToDOM("<js:script 
xmlns:js=\"js\"><![CDATA[" + s + "]]></js:script>");
+               jso.run(c, e);
+               Assert.assertTrue(c.completed);
+               Assert.assertFalse(c.faulted);
+               Assert.assertEquals(1, c.msgs.size());
+               Assert.assertEquals("Hello World!", c.msgs.get(0));
+       }
+
+       @Test public void testLoad() throws Exception {
+               StringBuffer s = new StringBuffer();
+               s.append("load('../resources/test.js');\n");
+               s.append("print(myvar);\n");
+
+               MockExtensionContext c = new MockExtensionContext();
+               c.duDir = this.getClass().getResource("/").toURI();
+               JSExtensionOperation jso = new JSExtensionOperation();
+               Element e = DOMUtils.stringToDOM("<js:script 
xmlns:js=\"js\"><![CDATA[" + s + "]]></js:script>");
+               jso.run(c, e);
+               Assert.assertTrue(c.completed);
+               Assert.assertFalse(c.faulted);
+               Assert.assertEquals(1, c.msgs.size());
+               Assert.assertEquals("Hello Lib!", c.msgs.get(0));
+       }
+
+       @Test public void testPid() throws Exception {
+               StringBuffer s = new StringBuffer();
+               s.append("myvar = pid();\n");
+               s.append("print(myvar);\n");
+
+               MockExtensionContext c = new MockExtensionContext();
+               c.duDir = this.getClass().getResource("/").toURI();
+               JSExtensionOperation jso = new JSExtensionOperation();
+               Element e = DOMUtils.stringToDOM("<js:script 
xmlns:js=\"js\"><![CDATA[" + s + "]]></js:script>");
+               jso.run(c, e);
                Assert.assertTrue(c.completed);
                Assert.assertFalse(c.faulted);
+               Assert.assertEquals(1, c.msgs.size());
+               Assert.assertEquals("4711", c.msgs.get(0));
        }
 
 }

Modified: ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4X/TestE4X.bpel
URL: 
http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4X/TestE4X.bpel?rev=706794&r1=706793&r2=706794&view=diff
==============================================================================
--- ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4X/TestE4X.bpel 
(original)
+++ ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4X/TestE4X.bpel Tue 
Oct 21 15:01:58 2008
@@ -53,13 +53,12 @@
     <sequence>
         <receive name="start" partnerLink="TestAssignPartnerLink" 
portType="test:TestAssignPortType"
                  operation="testAssign" variable="myVar" createInstance="yes"/>
-
         <assign name="assign1">
                        <extensionAssignOperation>
                                <js:snippet>
-                               var request = context.readVariable('myVar');
+                               var request = 
dom2js(_context.readVariable('myVar'));
                                request.TestPart += ' World';
-                               context.writeVariable('otherMsgVar', request);
+                               _context.writeVariable('otherMsgVar', 
js2dom(request));
                                </js:snippet>
                        </extensionAssignOperation>
         </assign>

Added: 
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/TestE4XDirect.bpel
URL: 
http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/TestE4XDirect.bpel?rev=706794&view=auto
==============================================================================
--- 
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/TestE4XDirect.bpel
 (added)
+++ 
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/TestE4XDirect.bpel
 Tue Oct 21 15:01:58 2008
@@ -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.
+  -->
+
+<process name="TestE4X"
+         targetNamespace="http://ode/bpel/unit-testAssign1";
+         xmlns:ode="http://www.apache.org/ode/type/extension";
+         xmlns:bpws="http://docs.oasis-open.org/wsbpel/2.0/process/executable";
+         xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable";
+         xmlns:tns="http://ode/bpel/unit-testAssign1";
+         xmlns:xsd="http://www.w3.org/2001/XMLSchema";
+         xmlns:test="http://ode/bpel/unit-testAssign1.wsdl";
+         queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"
+         expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"
+         xmlns:js="http://ode.apache.org/extensions/e4x";>
+
+    <import location="TestE4XDirect.wsdl"
+            namespace="http://ode/bpel/unit-testAssign1.wsdl";
+            importType="http://schemas.xmlsoap.org/wsdl/"; />
+
+    <partnerLinks>
+        <partnerLink name="TestAssignPartnerLink" 
partnerLinkType="test:TestAssignPartnerLinkType" myRole="me" />
+    </partnerLinks>
+
+       <extensions>
+               <extension namespace="http://ode.apache.org/extensions/e4x"; 
mustUnderstand="yes"/>
+       </extensions>
+       
+    <variables>
+        <variable name="myVar" messageType="test:TestAssignMessage"/>
+        <variable name="otherMsgVar" messageType="test:TestAssignMessage"/>
+        <variable name="strVar" type="xsd:string"/>
+        <variable name="intVar" type="xsd:int"/>
+        <variable name="intVar2" type="xsd:int"/>
+        <variable name="boolVar" type="xsd:boolean"/>
+    </variables>
+
+    <sequence>
+        <receive name="start" partnerLink="TestAssignPartnerLink" 
portType="test:TestAssignPortType"
+                 operation="testAssign" variable="myVar" createInstance="yes"/>
+        <assign name="assign1">
+                       <extensionAssignOperation>
+                               <js:snippet>
+                               myVar.TestPart += ' World';
+                               otherMsgVar = myVar;
+                               </js:snippet>
+                       </extensionAssignOperation>
+        </assign>
+        <reply name="end" partnerLink="TestAssignPartnerLink" 
portType="test:TestAssignPortType"
+               operation="testAssign" variable="otherMsgVar"/>
+    </sequence>
+</process>

Added: 
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/TestE4XDirect.wsdl
URL: 
http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/TestE4XDirect.wsdl?rev=706794&view=auto
==============================================================================
--- 
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/TestE4XDirect.wsdl
 (added)
+++ 
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/TestE4XDirect.wsdl
 Tue Oct 21 15:01:58 2008
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<!--
+  ~ 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.
+  -->
+
+<wsdl:definitions
+    targetNamespace="http://ode/bpel/unit-testAssign1.wsdl";
+    xmlns="http://schemas.xmlsoap.org/wsdl/";
+    xmlns:tns="http://ode/bpel/unit-testAssign1.wsdl";
+    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema";
+    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/";
+    xmlns:bpws="http://docs.oasis-open.org/wsbpel/2.0/process/executable";
+    xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype";>
+
+    <wsdl:message name="TestAssignMessage">
+        <wsdl:part name="TestPart" type="xsd:string"/>
+    </wsdl:message>
+
+    <wsdl:portType name="TestAssignPortType">
+        <wsdl:operation name="testAssign">
+            <wsdl:input message="tns:TestAssignMessage" name="TestIn"/>
+            <wsdl:output message="tns:TestAssignMessage" name="TestOut"/>
+        </wsdl:operation>
+    </wsdl:portType>
+
+     <wsdl:binding name="TestAssignSoapBinding" type="tns:TestAssignPortType">
+        <soap:binding style="rpc" 
transport="http://schemas.xmlsoap.org/soap/http"/>
+        <wsdl:operation name="testAssign">
+            <soap:operation soapAction="" style="rpc"/>
+            <wsdl:input>
+                <soap:body namespace="http://ode/bpel/unit-test.wsdl"; 
use="literal"/>
+            </wsdl:input>
+            <wsdl:output>
+                <soap:body namespace="http://ode/bpel/unit-test.wsdl"; 
use="literal"/>
+            </wsdl:output>
+        </wsdl:operation>
+    </wsdl:binding>
+    <wsdl:service name="TestAssignService">
+               <wsdl:port name="TestAssignPort" 
binding="tns:TestAssignSoapBinding">
+               <soap:address 
location="http://localhost:8080/ode/processes/TestAssign"/>
+               </wsdl:port>
+    </wsdl:service>
+
+   <plnk:partnerLinkType name="TestAssignPartnerLinkType">
+       <plnk:role name="me" portType="tns:TestAssignPortType"/>
+       <plnk:role name="you" portType="tns:TestAssignPortType"/>
+   </plnk:partnerLinkType>
+</wsdl:definitions>
+

Added: ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/deploy.xml
URL: 
http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/deploy.xml?rev=706794&view=auto
==============================================================================
--- ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/deploy.xml 
(added)
+++ ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/deploy.xml 
Tue Oct 21 15:01:58 2008
@@ -0,0 +1,32 @@
+<!--
+  ~ 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.
+  -->
+
+<deploy xmlns="http://www.apache.org/ode/schemas/dd/2007/03";
+  xmlns:pns="http://ode/bpel/unit-testAssign1";
+  xmlns:wns="http://ode/bpel/unit-testAssign1.wsdl";>
+
+
+       <process name="pns:TestE4X">
+               <active>true</active>
+               <provide partnerLink="TestAssignPartnerLink">
+                       <service name="wns:TestAssignService" 
port="TestAssignPort"/>
+                       <service name="wns:TestAssignService" 
port="TestAssignPort"/>
+               </provide>
+       </process>
+</deploy>

Added: 
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/test.properties
URL: 
http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/test.properties?rev=706794&view=auto
==============================================================================
--- 
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/test.properties 
(added)
+++ 
ode/trunk/extensions/e4x/src/test/resources/bpel/TestE4XDirect/test.properties 
Tue Oct 21 15:01:58 2008
@@ -0,0 +1,22 @@
+#
+#    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.
+#
+
+namespace=http://ode/bpel/unit-testAssign1.wsdl
+service=TestAssignService
+operation=testAssign
+request1=<message><TestPart>Hello</TestPart></message>
+response1=.*Hello World.*
\ No newline at end of file

Added: ode/trunk/extensions/e4x/src/test/resources/test.js
URL: 
http://svn.apache.org/viewvc/ode/trunk/extensions/e4x/src/test/resources/test.js?rev=706794&view=auto
==============================================================================
--- ode/trunk/extensions/e4x/src/test/resources/test.js (added)
+++ ode/trunk/extensions/e4x/src/test/resources/test.js Tue Oct 21 15:01:58 2008
@@ -0,0 +1,5 @@
+myvar = test()
+
+function test() {
+       return "Hello Lib!";
+}
\ No newline at end of file


Reply via email to