Oops. Good catch - will do!

-Adrian

On 3/14/2012 2:09 AM, Scott Gray wrote:
Hi Adrian,

Your test references an application entity, could you switch it to using one of 
the example entities?

Thanks
Scott

On 13/03/2012, at 12:20 PM, adri...@apache.org wrote:

Author: adrianc
Date: Mon Mar 12 23:20:55 2012
New Revision: 1299924

URL: http://svn.apache.org/viewvc?rev=1299924&view=rev
Log:
More JSR-223 work - added a ScriptHelper object to the bindings. Also added a 
demonstration to the JavaScript test service.

Added:
    ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java   
(with props)
    ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java 
  (with props)
    
ofbiz/trunk/framework/common/src/META-INF/services/org.ofbiz.base.util.ScriptHelperFactory
    ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/
    
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java  
 (with props)
    
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java
   (with props)
    
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java
   (with props)
Modified:
    
ofbiz/trunk/framework/base/src/META-INF/services/javax.script.ScriptEngineFactory
    ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java
    ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js
    ofbiz/trunk/framework/common/servicedef/services_test.xml

Modified: 
ofbiz/trunk/framework/base/src/META-INF/services/javax.script.ScriptEngineFactory
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/META-INF/services/javax.script.ScriptEngineFactory?rev=1299924&r1=1299923&r2=1299924&view=diff
==============================================================================
--- 
ofbiz/trunk/framework/base/src/META-INF/services/javax.script.ScriptEngineFactory
 (original)
+++ 
ofbiz/trunk/framework/base/src/META-INF/services/javax.script.ScriptEngineFactory
 Mon Mar 12 23:20:55 2012
@@ -1 +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.
+
bsh.engine.BshScriptEngineFactory

Added: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java?rev=1299924&view=auto
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java (added)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java Mon 
Mar 12 23:20:55 2012
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * 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.ofbiz.base.util;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.script.ScriptException;
+
+/**
+ * A script helper object. The OFBiz scripting framework will include an 
instance of this class in the script's bindings.
+ *<p>The scripting language will determine how the helper is used. Most languages 
will access it as a variable:<br />
+ *<code>partyValue = ofbiz.findOne("Party");</code><br />
+ * while other languages might access it as a native method or function:<br />
+ *<code>partyValue = findOne("Party");</code></p>
+ */
+public interface ScriptHelper {
+
+    /**
+     * Extracts service IN parameters from<code>inputMap</code>  and returns them in a 
new<code>Map</code>.
+     *
+     * @param serviceName
+     * @param inputMap
+     * @return The matching service parameters
+     * @throws ScriptException
+     */
+    Map<String, ? extends Object>  createServiceMap(String serviceName, 
Map<String, ? extends Object>  inputMap) throws ScriptException;
+
+    /**
+     * Sets the event/service status to error status.
+     *
+     * @param message
+     */
+    void error(String message);
+
+    /**
+     * Evaluates a<code>String</code>  and returns the result.
+     *
+     * @param original
+     * @return
+     */
+    String evalString(String original);
+
+    /**
+     * Sets the event/service status to failure status.
+     *
+     * @param message
+     */
+    void failure(String message);
+
+    /**
+     * Returns a<code>List</code>  of<code>GenericValue</code>s.
+     * @param entityName
+     * @param fields
+     * @return
+     * @throws ScriptException
+     */
+    List<Map<String, Object>>  findList(String entityName, Map<String, ? extends 
Object>  fields) throws ScriptException;
+
+    /**
+     * Finds a<code>GenericValue</code>  by primary key. The helper will 
construct a primary key from existing variables.
+     * @param entityName
+     * @return
+     * @throws ScriptException
+     */
+    Map<String, Object>  findOne(String entityName) throws ScriptException;
+
+    /**
+     * Finds a<code>GenericValue</code>  by primary key. The helper will 
construct a primary key from existing variables
+     * and/or<code>fields</code>.
+     * @param entityName
+     * @param fields
+     * @param args
+     * @return
+     * @throws ScriptException
+     */
+    Map<String, Object>  findOne(String entityName, Map<String, ? extends Object>  
fields, Map<String, ? extends Object>  args) throws ScriptException;
+
+    /**
+     * Logs an error message.
+     *
+     * @param message
+     */
+    void logError(String message);
+
+    /**
+     * Logs an info message.
+     *
+     * @param message
+     */
+    void logInfo(String message);
+
+    /**
+     * Logs a warning message.
+     *
+     * @param message
+     */
+    void logWarning(String message);
+
+    /**
+     * Creates a new, empty<code>GenericValue</code>.
+     * @param entityName
+     * @return
+     * @throws ScriptException
+     */
+    Map<String, Object>  makeValue(String entityName) throws ScriptException;
+
+    /**
+     * Creates a new, empty<code>GenericValue</code>.
+     *
+     * @param entityName
+     * @param fields
+     * @return
+     * @throws ScriptException
+     */
+    Map<String, Object>  makeValue(String entityName, Map<String, Object>  
fields) throws ScriptException;
+
+    /**
+     * Runs a service synchronously.
+     *
+     * @param serviceName
+     * @param inputMap
+     * @return
+     * @throws ScriptException
+     */
+    Map<String, ? extends Object>  runService(String serviceName, Map<String, ? 
extends Object>  inputMap) throws ScriptException;
+
+    /**
+     * Runs a service synchronously.
+     *
+     * @param serviceName
+     * @param inputMap
+     * @param args
+     * @return
+     * @throws ScriptException
+     */
+    Map<String, ? extends Object>  runService(String serviceName, Map<String, ? extends 
Object>  inputMap, Map<String, ? extends Object>  args) throws ScriptException;
+
+    /**
+     * Sets the event/service status to success status.
+     */
+    void success();
+
+    /**
+     * Sets the event/service status to success status.
+     *
+     * @param message
+     */
+    void success(String message);
+}

Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Rev URL

Added: 
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java?rev=1299924&view=auto
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java 
(added)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java 
Mon Mar 12 23:20:55 2012
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * 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.ofbiz.base.util;
+
+import javax.script.ScriptContext;
+
+import org.ofbiz.base.lang.Factory;
+
+/**
+ * A<code>ScriptHelper</code>  factory.
+ */
+public interface ScriptHelperFactory extends Factory<ScriptHelper, 
ScriptContext>  {
+
+    ScriptHelper getInstance(ScriptContext context);
+}

Propchange: 
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Rev URL

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java?rev=1299924&r1=1299923&r2=1299924&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java 
(original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java Mon Mar 
12 23:20:55 2012
@@ -25,8 +25,10 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collection;
import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.ServiceLoader;
import java.util.Set;

import javax.script.Bindings;
@@ -62,8 +64,11 @@ public final class ScriptUtil {
     public static final String PARAMETERS_KEY = "parameters";
     /** The result map bindings key. */
     public static final String RESULT_KEY = "result";
+    /** The<code>ScriptHelper</code>  key. */
+    public static final String SCRIPT_HELPER_KEY = "ofbiz";
     private static final UtilCache<String, CompiledScript>  parsedScripts = 
UtilCache.createUtilCache("script.ParsedScripts", 0, 0, false);
     private static final Object[] EMPTY_ARGS = {};
+    private static ScriptHelperFactory helperFactory = null;

     static {
         if (Debug.infoOn()) {
@@ -94,6 +99,15 @@ public final class ScriptUtil {
                 }
             }
         }
+        Iterator<ScriptHelperFactory>  iter = 
ServiceLoader.load(ScriptHelperFactory.class).iterator();
+        if (iter.hasNext()) {
+            helperFactory = iter.next();
+            if (Debug.verboseOn()) {
+                Debug.logVerbose("ScriptHelper factory set to " + 
helperFactory.getClass().getName(), module);
+            }
+        } else {
+            Debug.logWarning("ScriptHelper factory not found", module);
+        }
     }

     /**
@@ -186,6 +200,10 @@ public final class ScriptUtil {
         context.put(WIDGET_CONTEXT_KEY, context);
         context.put("context", context);
         ScriptContext scriptContext = new SimpleScriptContext();
+        ScriptHelper helper = createScriptHelper(scriptContext);
+        if (helper != null) {
+            context.put(SCRIPT_HELPER_KEY, helper);
+        }
         Bindings bindings = new SimpleBindings(context);
         scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
         return scriptContext;
@@ -206,12 +224,23 @@ public final class ScriptUtil {
         context.put(WIDGET_CONTEXT_KEY, context);
         context.put("context", context);
         ScriptContext scriptContext = new SimpleScriptContext();
+        ScriptHelper helper = createScriptHelper(scriptContext);
+        if (helper != null) {
+            context.put(SCRIPT_HELPER_KEY, helper);
+        }
         Bindings bindings = new ProtectedBindings(context, 
Collections.unmodifiableSet(protectedKeys));
         scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
         return scriptContext;
     }

-    /**
+    public static ScriptHelper createScriptHelper(ScriptContext context) {
+        if (helperFactory != null) {
+            return helperFactory.getInstance(context);
+        }
+        return null;
+    }
+
+     /**
      * Executes a script<code>String</code>  and returns the result.
      *
      * @param language

Modified: ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js?rev=1299924&r1=1299923&r2=1299924&view=diff
==============================================================================
--- ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js 
(original)
+++ ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js Mon 
Mar 12 23:20:55 2012
@@ -25,6 +25,17 @@ if (message) {
     var result = "[no message received]";
}

+if (ofbiz) {
+    var partyValue = ofbiz.findOne("PartyNameView");
+    if (partyValue) {
+        var foundMessage = ofbiz.evalString(" Found Party 
${partyValue.groupName}${partyValue.firstName} ${partyValue.lastName}");
+        successMessage = successMessage + foundMessage;
+        ofbiz.logInfo(successMessage);
+    } else {
+        ofbiz.logInfo("Party not found with partyId ${parameters.partyId}");
+    }
+}
+
function testFunction(context) {
     if (message) {
         var successMessage = "Got message [" + message + "] and finished fine";

Modified: ofbiz/trunk/framework/common/servicedef/services_test.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/servicedef/services_test.xml?rev=1299924&r1=1299923&r2=1299924&view=diff
==============================================================================
--- ofbiz/trunk/framework/common/servicedef/services_test.xml (original)
+++ ofbiz/trunk/framework/common/servicedef/services_test.xml Mon Mar 12 
23:20:55 2012
@@ -199,6 +199,7 @@ under the License.
     <service name="testScriptEngineJavaScript" engine="script" 
location="component://common/script/org/ofbiz/common/JavaScriptTest.js" invoke="">
         <description>Test Script Engine With JavaScript</description>
         <attribute name="message" type="String" mode="IN" optional="true"/>
+<attribute name="partyId" type="String" mode="IN" optional="true"/>
         <attribute name="result" type="String" mode="OUT"/>
     </service>


Added: 
ofbiz/trunk/framework/common/src/META-INF/services/org.ofbiz.base.util.ScriptHelperFactory
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/META-INF/services/org.ofbiz.base.util.ScriptHelperFactory?rev=1299924&view=auto
==============================================================================
--- 
ofbiz/trunk/framework/common/src/META-INF/services/org.ofbiz.base.util.ScriptHelperFactory
 (added)
+++ 
ofbiz/trunk/framework/common/src/META-INF/services/org.ofbiz.base.util.ScriptHelperFactory
 Mon Mar 12 23:20:55 2012
@@ -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.
+
+org.ofbiz.common.scripting.ScriptHelperFactoryImpl

Added: 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java?rev=1299924&view=auto
==============================================================================
--- 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java 
(added)
+++ 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java 
Mon Mar 12 23:20:55 2012
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * 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.ofbiz.common.scripting;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.ofbiz.base.util.Assert;
+import org.ofbiz.base.util.ScriptUtil;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
+import org.ofbiz.base.util.string.FlexibleStringExpander;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.security.Security;
+import org.ofbiz.security.authz.Authorization;
+import org.ofbiz.service.LocalDispatcher;
+
+/**
+ * A set of<code>ScriptContext</code>  convenience methods for scripting 
engines.
+ */
+public final class ContextHelper {
+
+    public static final String module = ContextHelper.class.getName();
+    private static final int EVENT = 1;
+    private static final int SERVICE = 2;
+    private static final int UNKNOWN = 3;
+
+    private final ScriptContext context;
+    private final int scriptType;
+
+    public ContextHelper(ScriptContext context) {
+        Assert.notNull("context", context);
+        this.context = context;
+        if (context.getAttribute("request") != null) {
+            this.scriptType = EVENT;
+        } else if (context.getAttribute("dctx") != null) {
+            this.scriptType = SERVICE;
+        } else {
+            this.scriptType = UNKNOWN;
+        }
+    }
+
+    public Object addBinding(String key, Object value) {
+        return getBindings().put(key, value);
+    }
+
+    /** Expands environment variables delimited with ${} */
+    public String expandString(String original) {
+        return FlexibleStringExpander.expandString(original, getBindings());
+    }
+
+    public Authorization getAuthz() {
+        return (Authorization) this.context.getAttribute("authz");
+    }
+
+    public Map<String, Object>  getBindings() {
+        return this.context.getBindings(ScriptContext.ENGINE_SCOPE);
+    }
+
+    public Delegator getDelegator() {
+        return (Delegator) this.context.getAttribute("delegator");
+    }
+
+    public LocalDispatcher getDispatcher() {
+        return (LocalDispatcher) this.context.getAttribute("dispatcher");
+    }
+
+    public<T>  T getEnv(FlexibleMapAccessor<T>  fma) {
+        return fma.get(getBindings());
+    }
+
+    /**
+     * Gets the named value from the environment. Supports the "." (dot) 
syntax to access
+     * Map members and the "[]" (bracket) syntax to access List entries. This 
value is
+     * expanded, supporting the insertion of other environment values using the 
"${}"
+     * notation.
+     *
+     * @param key
+     *            The name of the environment value to get. Can contain "." and 
"[]"
+     *            syntax elements as described above.
+     * @return The environment value if found, otherwise null.
+     */
+    public<T>  T getEnv(String key) {
+        String ekey = this.expandString(key);
+        FlexibleMapAccessor<T>  fma = FlexibleMapAccessor.getInstance(ekey);
+        return getEnv(fma);
+    }
+
+    public Iterator<Map.Entry<String, Object>>  getEnvEntryIterator() {
+        return getBindings().entrySet().iterator();
+    }
+
+    public Locale getLocale() {
+        return (Locale) this.context.getAttribute("locale");
+    }
+
+    @SuppressWarnings("unchecked")
+    public Object getParameter(String key) {
+        Map<?, ?>  parameters = (Map) 
this.context.getAttribute(ScriptUtil.PARAMETERS_KEY);
+        return parameters != null ? parameters.get(key) : null;
+    }
+
+    @SuppressWarnings("unchecked")
+    public Map<String, Object>  getParameters() {
+        return (Map<String, Object>) 
this.context.getAttribute(ScriptUtil.PARAMETERS_KEY);
+    }
+
+    public HttpServletRequest getRequest() {
+        return (HttpServletRequest) this.context.getAttribute("request");
+    }
+
+    public HttpServletResponse getResponse() {
+        return (HttpServletResponse) this.context.getAttribute("response");
+    }
+
+    @SuppressWarnings("unchecked")
+    public Object getResult(String key) {
+        Map<?, ?>  results = (Map) 
this.context.getAttribute(ScriptUtil.RESULT_KEY);
+        return results != null ? results.get(key) : null;
+    }
+
+    @SuppressWarnings("unchecked")
+    public Map<String, Object>  getResults() {
+        return (Map<String, Object>) 
this.context.getAttribute(ScriptUtil.RESULT_KEY);
+    }
+
+    public String getScriptName() {
+        String scriptName = (String) 
this.context.getAttribute(ScriptEngine.FILENAME);
+        return scriptName != null ? scriptName : "Unknown";
+    }
+
+    public Security getSecurity() {
+        return (Security) this.context.getAttribute("security");
+    }
+
+    public TimeZone getTimeZone() {
+        return (TimeZone) this.context.getAttribute("timeZone");
+    }
+
+    public GenericValue getUserLogin() {
+        return (GenericValue) this.context.getAttribute("userLogin");
+    }
+
+    public boolean isEvent() {
+        return this.scriptType == EVENT;
+    }
+
+    public boolean isService() {
+        return this.scriptType == SERVICE;
+    }
+
+    /**
+     * Calls putEnv for each entry in the Map, thus allowing for the additional
+     * flexibility in naming supported in that method.
+     */
+    public void putAllEnv(Map<String, ? extends Object>  values) {
+        for (Map.Entry<String, ? extends Object>  entry : values.entrySet()) {
+            this.putEnv(entry.getKey(), entry.getValue());
+        }
+    }
+
+    public<T>  void putEnv(FlexibleMapAccessor<T>  fma, T value) {
+        fma.put(getBindings(), value);
+    }
+
+    /**
+     * Puts the named value in the environment. Supports the "." (dot) syntax 
to access
+     * Map members and the "[]" (bracket) syntax to access List entries. If 
the brackets
+     * for a list are empty the value will be appended to end of the list, 
otherwise the
+     * value will be set in the position of the number in the brackets. If a 
"+" (plus
+     * sign) is included inside the square brackets before the index number 
the value will
+     * inserted/added at that index instead of set at that index. This value 
is expanded,
+     * supporting the insertion of other environment values using the "${}" 
notation.
+     *
+     * @param key
+     *            The name of the environment value to get. Can contain "." 
syntax
+     *            elements as described above.
+     * @param value
+     *            The value to set in the named environment location.
+     */
+    public<T>  void putEnv(String key, T value) {
+        String ekey = this.expandString(key);
+        FlexibleMapAccessor<T>  fma = FlexibleMapAccessor.getInstance(ekey);
+        this.putEnv(fma, value);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void putParameter(String key, Object value) {
+        Map<String, Object>  parameters = (Map) 
this.context.getAttribute(ScriptUtil.PARAMETERS_KEY);
+        if (parameters == null) {
+            parameters = new HashMap<String, Object>();
+            this.context.setAttribute(ScriptUtil.PARAMETERS_KEY, parameters, 
ScriptContext.ENGINE_SCOPE);
+        }
+        parameters.put(key, value);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void putResult(String key, Object value) {
+        Map<String, Object>  results = (Map) 
this.context.getAttribute(ScriptUtil.RESULT_KEY);
+        if (results == null) {
+            results = new HashMap<String, Object>();
+            this.context.setAttribute(ScriptUtil.RESULT_KEY, results, 
ScriptContext.ENGINE_SCOPE);
+        }
+        results.put(key, value);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void putResults(Map<String, Object>  results) {
+        Map<String, Object>  existingResults = (Map) 
this.context.getAttribute(ScriptUtil.RESULT_KEY);
+        if (existingResults == null) {
+            existingResults = new HashMap<String, Object>();
+            this.context.setAttribute(ScriptUtil.RESULT_KEY, results, 
ScriptContext.ENGINE_SCOPE);
+        }
+        existingResults.putAll(results);
+    }
+
+    public Object removeBinding(String key) {
+        return getBindings().remove(key);
+    }
+
+    public<T>  T removeEnv(FlexibleMapAccessor<T>  fma) {
+        return fma.remove(getBindings());
+    }
+
+    /**
+     * Removes the named value from the environment. Supports the "." (dot) 
syntax to
+     * access Map members and the "[]" (bracket) syntax to access List 
entries. This value
+     * is expanded, supporting the insertion of other environment values using the 
"${}"
+     * notation.
+     *
+     * @param key
+     *            The name of the environment value to get. Can contain "." 
syntax
+     *            elements as described above.
+     */
+    public<T>  T removeEnv(String key) {
+        String ekey = this.expandString(key);
+        FlexibleMapAccessor<T>  fma = FlexibleMapAccessor.getInstance(ekey);
+        return removeEnv(fma);
+    }
+
+    public void setUserLogin(GenericValue userLogin, String userLoginEnvName) {
+        putEnv(userLoginEnvName, userLogin);
+    }
+}

Propchange: 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Rev URL

Added: 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java?rev=1299924&view=auto
==============================================================================
--- 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java
 (added)
+++ 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java
 Mon Mar 12 23:20:55 2012
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * 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.ofbiz.common.scripting;
+
+import javax.script.ScriptContext;
+
+import org.ofbiz.base.util.ScriptHelper;
+import org.ofbiz.base.util.ScriptHelperFactory;
+
+/**
+ * An implementation of the<code>ScriptHelperFactory</code>  interface.
+ */
+public final class ScriptHelperFactoryImpl implements ScriptHelperFactory {
+
+    @Override
+    public ScriptHelper getInstance(ScriptContext context) {
+        return new ScriptHelperImpl(context);
+    }
+}

Propchange: 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Rev URL

Added: 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java?rev=1299924&view=auto
==============================================================================
--- 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java
 (added)
+++ 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java
 Mon Mar 12 23:20:55 2012
@@ -0,0 +1,283 @@
+/*******************************************************************************
+ * 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.ofbiz.common.scripting;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.script.ScriptContext;
+import javax.script.ScriptException;
+
+import org.ofbiz.base.util.Assert;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.ScriptHelper;
+import org.ofbiz.base.util.UtilGenerics;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.GenericPK;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.model.ModelEntity;
+import org.ofbiz.service.GenericServiceException;
+import org.ofbiz.service.ModelService;
+import org.ofbiz.service.ServiceUtil;
+
+/**
+ * An implementation of the<code>ScriptHelper</code>  interface.
+ */
+public final class ScriptHelperImpl implements ScriptHelper {
+
+    public static final String module = ScriptHelperImpl.class.getName();
+    private static final Map<String, ? extends Object>  EMPTY_ARGS = 
Collections.unmodifiableMap(new HashMap<String, Object>());
+
+    private static GenericValue runFindByPrimaryKey(ModelEntity modelEntity, 
ContextHelper ctxHelper, boolean useCache, boolean autoFieldMap,
+            Map<String, ? extends Object>  fieldMap, List<String>  
selectFieldList) throws ScriptException {
+        Map<String, Object>  entityContext = new HashMap<String, Object>();
+        Delegator delegator = ctxHelper.getDelegator();
+        Map<String, Object>  context = ctxHelper.getBindings();
+        if (autoFieldMap) {
+            GenericValue tempVal = 
delegator.makeValue(modelEntity.getEntityName());
+            Object parametersObj = context.get("parameters");
+            if (parametersObj != null&&  parametersObj instanceof Map<?, ?>) {
+                tempVal.setAllFields(UtilGenerics.checkMap(parametersObj), 
true, null, Boolean.TRUE);
+            }
+            tempVal.setAllFields(context, true, null, Boolean.TRUE);
+            entityContext.putAll(tempVal);
+        }
+        if (fieldMap != null) {
+            entityContext.putAll(fieldMap);
+        }
+        entityContext.put("locale", context.get("locale"));
+        entityContext.put("timeZone", context.get("timeZone"));
+        modelEntity.convertFieldMapInPlace(entityContext, delegator);
+        entityContext.remove("locale");
+        entityContext.remove("timeZone");
+        Set<String>  fieldsToSelect = null;
+        if (selectFieldList != null) {
+            fieldsToSelect = new HashSet<String>(selectFieldList);
+        }
+        if (fieldsToSelect != null&&  useCache) {
+            String errMsg = "Error running script " + ctxHelper.getScriptName() + 
": Problem invoking the findOne method: Cannot specify selectFieldList argument when useCache 
is set to true ";
+            Debug.logWarning(errMsg, module);
+            throw new ScriptException(errMsg);
+        }
+        GenericValue valueOut = null;
+        GenericPK entityPK = delegator.makePK(modelEntity.getEntityName(), 
entityContext);
+        if (entityPK.containsPrimaryKey(true)) {
+            try {
+                if (useCache) {
+                    valueOut = delegator.findOne(entityPK.getEntityName(), 
entityPK, true);
+                } else {
+                    if (fieldsToSelect != null) {
+                        valueOut = delegator.findByPrimaryKeyPartial(entityPK, 
fieldsToSelect);
+                    } else {
+                        valueOut = delegator.findOne(entityPK.getEntityName(), 
entityPK, false);
+                    }
+                }
+            } catch (GenericEntityException e) {
+                String errMsg = "Error running script " + ctxHelper.getScriptName() + 
": Problem invoking the findOne method: " + e.getMessage();
+                Debug.logWarning(e, errMsg, module);
+                throw new ScriptException(errMsg);
+            }
+        } else {
+            if (Debug.warningOn()) {
+                Debug.logWarning("Error running script " + ctxHelper.getScriptName() + 
": Returning null because found incomplete primary key in find: " + entityPK, module);
+            }
+        }
+        return valueOut;
+    }
+
+    private final ContextHelper ctxHelper;
+
+    public ScriptHelperImpl(ScriptContext context) {
+        this.ctxHelper = new ContextHelper(context);
+    }
+
+    public Map<String, ? extends Object>  createServiceMap(String serviceName, 
Map<String, ? extends Object>  inputMap) throws ScriptException {
+        Assert.notNull("serviceName", serviceName, "inputMap", inputMap);
+        Map<String, Object>  toMap = new HashMap<String, Object>();
+        ModelService modelService = null;
+        try {
+            modelService = 
ctxHelper.getDispatcher().getDispatchContext().getModelService(serviceName);
+        } catch (GenericServiceException e) {
+            String errMsg = "Error running script " + ctxHelper.getScriptName() + ": Problem 
invoking the createServiceMap method: get service definition for service name [" + serviceName + 
"]: " + e.getMessage();
+            Debug.logWarning(e, errMsg, module);
+            throw new ScriptException(errMsg);
+        }
+        toMap.putAll(modelService.makeValid(inputMap, "IN", true, null, 
ctxHelper.getTimeZone(), ctxHelper.getLocale()));
+        return toMap;
+    }
+
+    @Override
+    public void error(String message) {
+        if (ctxHelper.isEvent()) {
+            ctxHelper.putResult("_error_message_", 
ctxHelper.expandString(message));
+            ctxHelper.putResult("_response_code_", "error");
+        } else if (ctxHelper.isService()) {
+            
ctxHelper.putResults(ServiceUtil.returnError(ctxHelper.expandString(message)));
+        }
+    }
+
+    @Override
+    public String evalString(String original) {
+        return ctxHelper.expandString(original);
+    }
+
+    @Override
+    public void failure(String message) {
+        if (ctxHelper.isEvent()) {
+            ctxHelper.putResult("_error_message_", 
ctxHelper.expandString(message));
+            ctxHelper.putResult("_response_code_", "fail");
+        } else if (ctxHelper.isService()) {
+            
ctxHelper.putResults(ServiceUtil.returnFailure(ctxHelper.expandString(message)));
+        }
+    }
+
+    public List<Map<String, Object>>  findList(String entityName, Map<String, ? 
extends Object>  fields) throws ScriptException {
+        try {
+            return 
UtilGenerics.checkList(ctxHelper.getDelegator().findByAnd(entityName, fields));
+        } catch (GenericEntityException e) {
+            String errMsg = "Error running script " + ctxHelper.getScriptName() + 
": Problem invoking the findList method: " + e.getMessage();
+            Debug.logWarning(e, errMsg, module);
+            throw new ScriptException(errMsg);
+        }
+    }
+
+    public Map<String, Object>  findOne(String entityName) throws 
ScriptException {
+        return findOne(entityName, null, EMPTY_ARGS);
+    }
+
+    public Map<String, Object>  findOne(String entityName, Map<String, ? extends 
Object>  fields, Map<String, ? extends Object>  args) throws ScriptException {
+        Assert.notNull("entityName", entityName);
+        if (args == null) {
+            args = EMPTY_ARGS;
+        }
+        boolean useCache = "true".equals(args.get("useCache"));
+        boolean autoFieldMap = !"false".equals(args.get("autoFieldMap"));
+        List<String>  selectFieldList = 
UtilGenerics.checkList(args.get("selectFieldList"));
+        ModelEntity modelEntity = 
ctxHelper.getDelegator().getModelEntity(entityName);
+        if (modelEntity == null) {
+            throw new ScriptException("Error running script " + ctxHelper.getScriptName() + " 
- no entity definition found for entity name [" + entityName + "]");
+        }
+        return runFindByPrimaryKey(modelEntity, ctxHelper, useCache, 
autoFieldMap, fields, selectFieldList);
+    }
+
+    public void logError(String message) {
+        String expandedMessage = ctxHelper.expandString(message);
+        Debug.logError("[".concat(ctxHelper.getScriptName()).concat("] 
").concat(expandedMessage), module);
+    }
+
+    public void logInfo(String message) {
+        String expandedMessage = ctxHelper.expandString(message);
+        Debug.logInfo("[".concat(ctxHelper.getScriptName()).concat("] 
").concat(expandedMessage), module);
+    }
+
+    public void logWarning(String message) {
+        String expandedMessage = ctxHelper.expandString(message);
+        Debug.logWarning("[".concat(ctxHelper.getScriptName()).concat("] 
").concat(expandedMessage), module);
+    }
+
+    public Map<String, Object>  makeValue(String entityName) throws 
ScriptException {
+        return ctxHelper.getDelegator().makeValidValue(entityName);
+    }
+
+    public Map<String, Object>  makeValue(String entityName, Map<String, 
Object>  fields) throws ScriptException {
+        return ctxHelper.getDelegator().makeValidValue(entityName, fields);
+    }
+
+    public Map<String, ? extends Object>  runService(String serviceName, 
Map<String, ? extends Object>  inputMap) throws ScriptException {
+        return runService(serviceName, inputMap, EMPTY_ARGS);
+    }
+
+    public Map<String, ? extends Object>  runService(String serviceName, Map<String, ? 
extends Object>  inputMap, Map<String, ? extends Object>  args) throws ScriptException {
+        Assert.notNull("serviceName", serviceName, "args", args);
+        boolean includeUserLogin = 
!"false".equals(args.get("includeUserLoginStr"));
+        String requireNewTransactionStr = (String) 
args.get("requireNewTransaction");
+        int transactionTimeout = -1;
+        if (UtilValidate.isNotEmpty(requireNewTransactionStr)) {
+            String timeoutStr = (String) args.get("transactionTimout");
+            if (!UtilValidate.isEmpty(timeoutStr)) {
+                try {
+                    transactionTimeout = Integer.parseInt(timeoutStr);
+                } catch (NumberFormatException e) {
+                    Debug.logWarning(e, "Setting timeout to 0 (default)", 
module);
+                    transactionTimeout = 0;
+                }
+            }
+        }
+        Map<String, Object>  inMap = new HashMap<String, Object>(inputMap);
+        if (includeUserLogin&&  !inMap.containsKey("userLogin")) {
+            GenericValue userLogin = ctxHelper.getUserLogin();
+            if (userLogin != null) {
+                inMap.put("userLogin", userLogin);
+            }
+        }
+        if (!inMap.containsKey("locale")&&  ctxHelper.getLocale() != null) {
+            inMap.put("locale", ctxHelper.getLocale());
+        }
+        if (!inMap.containsKey("timeZone")&&  ctxHelper.getTimeZone() != null) 
{
+            inMap.put("timeZone", ctxHelper.getTimeZone());
+        }
+        Map<String, Object>  result = null;
+        try {
+            if (UtilValidate.isEmpty(requireNewTransactionStr)&&  
transactionTimeout<  0) {
+                result = ctxHelper.getDispatcher().runSync(serviceName, inMap);
+            } else {
+                ModelService modelService = 
ctxHelper.getDispatcher().getDispatchContext().getModelService(serviceName);
+                boolean requireNewTransaction = 
modelService.requireNewTransaction;
+                int timeout = modelService.transactionTimeout;
+                if (UtilValidate.isNotEmpty(requireNewTransactionStr)) {
+                    requireNewTransaction = 
"true".equals(requireNewTransactionStr);
+                }
+                if (transactionTimeout>= 0) {
+                    timeout = transactionTimeout;
+                }
+                result = ctxHelper.getDispatcher().runSync(serviceName, inMap, 
timeout, requireNewTransaction);
+            }
+        } catch (GenericServiceException e) {
+            String errMsg = "Error running script " + ctxHelper.getScriptName() + " [problem 
invoking the [" + serviceName + "] service: " + e.getMessage();
+            Debug.logWarning(e, errMsg, module);
+            throw new ScriptException(errMsg);
+        }
+        return result;
+    }
+
+    @Override
+    public void success() {
+        if (ctxHelper.isEvent()) {
+            ctxHelper.putResult("_response_code_", "success");
+        } else if (ctxHelper.isService()) {
+            ctxHelper.putResults(ServiceUtil.returnSuccess());
+        }
+    }
+
+    @Override
+    public void success(String message) {
+        if (ctxHelper.isEvent()) {
+            ctxHelper.putResult("_event_message_", 
ctxHelper.expandString(message));
+            ctxHelper.putResult("_response_code_", "success");
+        } else if (ctxHelper.isService()) {
+            
ctxHelper.putResults(ServiceUtil.returnSuccess(ctxHelper.expandString(message)));
+        }
+    }
+}

Propchange: 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Rev URL


Reply via email to