You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2012/03/13 00:20:56 UTC
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/
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
>>
>>
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>.
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
>
>