You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Scott Gray <sc...@hotwaxmedia.com> on 2012/03/14 03:09:37 UTC

Re: svn commit: r1299924 - in /ofbiz/trunk/framework: base/src/META-INF/services/ base/src/org/ofbiz/base/util/ common/script/org/ofbiz/common/ common/servicedef/ common/src/META-INF/services/ common/src/org/ofbiz/common/scripting/

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, adrianc@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
> 
> 


Re: svn commit: r1299924 - in /ofbiz/trunk/framework: base/src/META-INF/services/ base/src/org/ofbiz/base/util/ common/script/org/ofbiz/common/ common/servicedef/ common/src/META-INF/services/ common/src/org/ofbiz/common/scripting/

Posted by Jacopo Cappellato <ja...@hotwaxmedia.com>.
This is actually minor: shouldn't the JavaScriptTest.js and GroovyServiceTest.groovy files go into the org/ofbiz/common/test folder?

Jacopo


On Mar 14, 2012, at 5:38 AM, Scott Gray wrote:

> Thanks Adrian!
> 
> Regards
> Scott
> 
> On 14/03/2012, at 5:21 PM, Adrian Crum wrote:
> 
>> 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, adrianc@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
>>>> 
>>>> 
> 


Re: svn commit: r1299924 - in /ofbiz/trunk/framework: base/src/META-INF/services/ base/src/org/ofbiz/base/util/ common/script/org/ofbiz/common/ common/servicedef/ common/src/META-INF/services/ common/src/org/ofbiz/common/scripting/

Posted by Scott Gray <sc...@hotwaxmedia.com>.
Thanks Adrian!

Regards
Scott

On 14/03/2012, at 5:21 PM, Adrian Crum wrote:

> 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, adrianc@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
>>> 
>>> 


Re: svn commit: r1299924 - in /ofbiz/trunk/framework: base/src/META-INF/services/ base/src/org/ofbiz/base/util/ common/script/org/ofbiz/common/ common/servicedef/ common/src/META-INF/services/ common/src/org/ofbiz/common/scripting/

Posted by Adrian Crum <ad...@sandglass-software.com>.
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, adrianc@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
>>
>>