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