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, adri...@apache.org wrote: >> >>> Author: adrianc >>> Date: Mon Mar 12 23:20:55 2012 >>> New Revision: 1299924 >>> >>> URL: http://svn.apache.org/viewvc?rev=1299924&view=rev >>> Log: >>> More JSR-223 work - added a ScriptHelper object to the bindings. Also added >>> a demonstration to the JavaScript test service. >>> >>> Added: >>> ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java >>> (with props) >>> >>> ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java >>> (with props) >>> >>> ofbiz/trunk/framework/common/src/META-INF/services/org.ofbiz.base.util.ScriptHelperFactory >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ >>> >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java >>> (with props) >>> >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java >>> (with props) >>> >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java >>> (with props) >>> Modified: >>> >>> ofbiz/trunk/framework/base/src/META-INF/services/javax.script.ScriptEngineFactory >>> ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java >>> ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js >>> ofbiz/trunk/framework/common/servicedef/services_test.xml >>> >>> Modified: >>> ofbiz/trunk/framework/base/src/META-INF/services/javax.script.ScriptEngineFactory >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/META-INF/services/javax.script.ScriptEngineFactory?rev=1299924&r1=1299923&r2=1299924&view=diff >>> ============================================================================== >>> --- >>> ofbiz/trunk/framework/base/src/META-INF/services/javax.script.ScriptEngineFactory >>> (original) >>> +++ >>> ofbiz/trunk/framework/base/src/META-INF/services/javax.script.ScriptEngineFactory >>> Mon Mar 12 23:20:55 2012 >>> @@ -1 +1,18 @@ >>> +# Licensed to the Apache Software Foundation (ASF) under one >>> +# or more contributor license agreements. See the NOTICE file >>> +# distributed with this work for additional information >>> +# regarding copyright ownership. The ASF licenses this file >>> +# to you under the Apache License, Version 2.0 (the >>> +# "License"); you may not use this file except in compliance >>> +# with the License. You may obtain a copy of the License at >>> +# >>> +# http://www.apache.org/licenses/LICENSE-2.0 >>> +# >>> +# Unless required by applicable law or agreed to in writing, >>> +# software distributed under the License is distributed on an >>> +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >>> +# KIND, either express or implied. See the License for the >>> +# specific language governing permissions and limitations >>> +# under the License. >>> + >>> bsh.engine.BshScriptEngineFactory >>> >>> Added: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java?rev=1299924&view=auto >>> ============================================================================== >>> --- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java >>> (added) >>> +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java >>> Mon Mar 12 23:20:55 2012 >>> @@ -0,0 +1,166 @@ >>> +/******************************************************************************* >>> + * Licensed to the Apache Software Foundation (ASF) under one >>> + * or more contributor license agreements. See the NOTICE file >>> + * distributed with this work for additional information >>> + * regarding copyright ownership. The ASF licenses this file >>> + * to you under the Apache License, Version 2.0 (the >>> + * "License"); you may not use this file except in compliance >>> + * with the License. You may obtain a copy of the License at >>> + * >>> + * http://www.apache.org/licenses/LICENSE-2.0 >>> + * >>> + * Unless required by applicable law or agreed to in writing, >>> + * software distributed under the License is distributed on an >>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >>> + * KIND, either express or implied. See the License for the >>> + * specific language governing permissions and limitations >>> + * under the License. >>> + >>> *******************************************************************************/ >>> +package org.ofbiz.base.util; >>> + >>> +import java.util.List; >>> +import java.util.Map; >>> + >>> +import javax.script.ScriptException; >>> + >>> +/** >>> + * A script helper object. The OFBiz scripting framework will include an >>> instance of this class in the script's bindings. >>> + *<p>The scripting language will determine how the helper is used. Most >>> languages will access it as a variable:<br /> >>> + *<code>partyValue = ofbiz.findOne("Party");</code><br /> >>> + * while other languages might access it as a native method or >>> function:<br /> >>> + *<code>partyValue = findOne("Party");</code></p> >>> + */ >>> +public interface ScriptHelper { >>> + >>> + /** >>> + * Extracts service IN parameters from<code>inputMap</code> and >>> returns them in a new<code>Map</code>. >>> + * >>> + * @param serviceName >>> + * @param inputMap >>> + * @return The matching service parameters >>> + * @throws ScriptException >>> + */ >>> + Map<String, ? extends Object> createServiceMap(String serviceName, >>> Map<String, ? extends Object> inputMap) throws ScriptException; >>> + >>> + /** >>> + * Sets the event/service status to error status. >>> + * >>> + * @param message >>> + */ >>> + void error(String message); >>> + >>> + /** >>> + * Evaluates a<code>String</code> and returns the result. >>> + * >>> + * @param original >>> + * @return >>> + */ >>> + String evalString(String original); >>> + >>> + /** >>> + * Sets the event/service status to failure status. >>> + * >>> + * @param message >>> + */ >>> + void failure(String message); >>> + >>> + /** >>> + * Returns a<code>List</code> of<code>GenericValue</code>s. >>> + * @param entityName >>> + * @param fields >>> + * @return >>> + * @throws ScriptException >>> + */ >>> + List<Map<String, Object>> findList(String entityName, Map<String, ? >>> extends Object> fields) throws ScriptException; >>> + >>> + /** >>> + * Finds a<code>GenericValue</code> by primary key. The helper will >>> construct a primary key from existing variables. >>> + * @param entityName >>> + * @return >>> + * @throws ScriptException >>> + */ >>> + Map<String, Object> findOne(String entityName) throws ScriptException; >>> + >>> + /** >>> + * Finds a<code>GenericValue</code> by primary key. The helper will >>> construct a primary key from existing variables >>> + * and/or<code>fields</code>. >>> + * @param entityName >>> + * @param fields >>> + * @param args >>> + * @return >>> + * @throws ScriptException >>> + */ >>> + Map<String, Object> findOne(String entityName, Map<String, ? extends >>> Object> fields, Map<String, ? extends Object> args) throws >>> ScriptException; >>> + >>> + /** >>> + * Logs an error message. >>> + * >>> + * @param message >>> + */ >>> + void logError(String message); >>> + >>> + /** >>> + * Logs an info message. >>> + * >>> + * @param message >>> + */ >>> + void logInfo(String message); >>> + >>> + /** >>> + * Logs a warning message. >>> + * >>> + * @param message >>> + */ >>> + void logWarning(String message); >>> + >>> + /** >>> + * Creates a new, empty<code>GenericValue</code>. >>> + * @param entityName >>> + * @return >>> + * @throws ScriptException >>> + */ >>> + Map<String, Object> makeValue(String entityName) throws >>> ScriptException; >>> + >>> + /** >>> + * Creates a new, empty<code>GenericValue</code>. >>> + * >>> + * @param entityName >>> + * @param fields >>> + * @return >>> + * @throws ScriptException >>> + */ >>> + Map<String, Object> makeValue(String entityName, Map<String, Object> >>> fields) throws ScriptException; >>> + >>> + /** >>> + * Runs a service synchronously. >>> + * >>> + * @param serviceName >>> + * @param inputMap >>> + * @return >>> + * @throws ScriptException >>> + */ >>> + Map<String, ? extends Object> runService(String serviceName, >>> Map<String, ? extends Object> inputMap) throws ScriptException; >>> + >>> + /** >>> + * Runs a service synchronously. >>> + * >>> + * @param serviceName >>> + * @param inputMap >>> + * @param args >>> + * @return >>> + * @throws ScriptException >>> + */ >>> + Map<String, ? extends Object> runService(String serviceName, >>> Map<String, ? extends Object> inputMap, Map<String, ? extends Object> >>> args) throws ScriptException; >>> + >>> + /** >>> + * Sets the event/service status to success status. >>> + */ >>> + void success(); >>> + >>> + /** >>> + * Sets the event/service status to success status. >>> + * >>> + * @param message >>> + */ >>> + void success(String message); >>> +} >>> >>> Propchange: >>> ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java >>> ------------------------------------------------------------------------------ >>> svn:eol-style = native >>> >>> Propchange: >>> ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelper.java >>> ------------------------------------------------------------------------------ >>> svn:keywords = Author Date Id Rev URL >>> >>> Added: >>> ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java?rev=1299924&view=auto >>> ============================================================================== >>> --- >>> ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java >>> (added) >>> +++ >>> ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java >>> Mon Mar 12 23:20:55 2012 >>> @@ -0,0 +1,31 @@ >>> +/******************************************************************************* >>> + * Licensed to the Apache Software Foundation (ASF) under one >>> + * or more contributor license agreements. See the NOTICE file >>> + * distributed with this work for additional information >>> + * regarding copyright ownership. The ASF licenses this file >>> + * to you under the Apache License, Version 2.0 (the >>> + * "License"); you may not use this file except in compliance >>> + * with the License. You may obtain a copy of the License at >>> + * >>> + * http://www.apache.org/licenses/LICENSE-2.0 >>> + * >>> + * Unless required by applicable law or agreed to in writing, >>> + * software distributed under the License is distributed on an >>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >>> + * KIND, either express or implied. See the License for the >>> + * specific language governing permissions and limitations >>> + * under the License. >>> + >>> *******************************************************************************/ >>> +package org.ofbiz.base.util; >>> + >>> +import javax.script.ScriptContext; >>> + >>> +import org.ofbiz.base.lang.Factory; >>> + >>> +/** >>> + * A<code>ScriptHelper</code> factory. >>> + */ >>> +public interface ScriptHelperFactory extends Factory<ScriptHelper, >>> ScriptContext> { >>> + >>> + ScriptHelper getInstance(ScriptContext context); >>> +} >>> >>> Propchange: >>> ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java >>> ------------------------------------------------------------------------------ >>> svn:eol-style = native >>> >>> Propchange: >>> ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptHelperFactory.java >>> ------------------------------------------------------------------------------ >>> svn:keywords = Author Date Id Rev URL >>> >>> Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java?rev=1299924&r1=1299923&r2=1299924&view=diff >>> ============================================================================== >>> --- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java >>> (original) >>> +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ScriptUtil.java Mon >>> Mar 12 23:20:55 2012 >>> @@ -25,8 +25,10 @@ import java.net.MalformedURLException; >>> import java.net.URL; >>> import java.util.Collection; >>> import java.util.Collections; >>> +import java.util.Iterator; >>> import java.util.List; >>> import java.util.Map; >>> +import java.util.ServiceLoader; >>> import java.util.Set; >>> >>> import javax.script.Bindings; >>> @@ -62,8 +64,11 @@ public final class ScriptUtil { >>> public static final String PARAMETERS_KEY = "parameters"; >>> /** The result map bindings key. */ >>> public static final String RESULT_KEY = "result"; >>> + /** The<code>ScriptHelper</code> key. */ >>> + public static final String SCRIPT_HELPER_KEY = "ofbiz"; >>> private static final UtilCache<String, CompiledScript> parsedScripts = >>> UtilCache.createUtilCache("script.ParsedScripts", 0, 0, false); >>> private static final Object[] EMPTY_ARGS = {}; >>> + private static ScriptHelperFactory helperFactory = null; >>> >>> static { >>> if (Debug.infoOn()) { >>> @@ -94,6 +99,15 @@ public final class ScriptUtil { >>> } >>> } >>> } >>> + Iterator<ScriptHelperFactory> iter = >>> ServiceLoader.load(ScriptHelperFactory.class).iterator(); >>> + if (iter.hasNext()) { >>> + helperFactory = iter.next(); >>> + if (Debug.verboseOn()) { >>> + Debug.logVerbose("ScriptHelper factory set to " + >>> helperFactory.getClass().getName(), module); >>> + } >>> + } else { >>> + Debug.logWarning("ScriptHelper factory not found", module); >>> + } >>> } >>> >>> /** >>> @@ -186,6 +200,10 @@ public final class ScriptUtil { >>> context.put(WIDGET_CONTEXT_KEY, context); >>> context.put("context", context); >>> ScriptContext scriptContext = new SimpleScriptContext(); >>> + ScriptHelper helper = createScriptHelper(scriptContext); >>> + if (helper != null) { >>> + context.put(SCRIPT_HELPER_KEY, helper); >>> + } >>> Bindings bindings = new SimpleBindings(context); >>> scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE); >>> return scriptContext; >>> @@ -206,12 +224,23 @@ public final class ScriptUtil { >>> context.put(WIDGET_CONTEXT_KEY, context); >>> context.put("context", context); >>> ScriptContext scriptContext = new SimpleScriptContext(); >>> + ScriptHelper helper = createScriptHelper(scriptContext); >>> + if (helper != null) { >>> + context.put(SCRIPT_HELPER_KEY, helper); >>> + } >>> Bindings bindings = new ProtectedBindings(context, >>> Collections.unmodifiableSet(protectedKeys)); >>> scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE); >>> return scriptContext; >>> } >>> >>> - /** >>> + public static ScriptHelper createScriptHelper(ScriptContext context) { >>> + if (helperFactory != null) { >>> + return helperFactory.getInstance(context); >>> + } >>> + return null; >>> + } >>> + >>> + /** >>> * Executes a script<code>String</code> and returns the result. >>> * >>> * @param language >>> >>> Modified: >>> ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js?rev=1299924&r1=1299923&r2=1299924&view=diff >>> ============================================================================== >>> --- ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js >>> (original) >>> +++ ofbiz/trunk/framework/common/script/org/ofbiz/common/JavaScriptTest.js >>> Mon Mar 12 23:20:55 2012 >>> @@ -25,6 +25,17 @@ if (message) { >>> var result = "[no message received]"; >>> } >>> >>> +if (ofbiz) { >>> + var partyValue = ofbiz.findOne("PartyNameView"); >>> + if (partyValue) { >>> + var foundMessage = ofbiz.evalString(" Found Party >>> ${partyValue.groupName}${partyValue.firstName} ${partyValue.lastName}"); >>> + successMessage = successMessage + foundMessage; >>> + ofbiz.logInfo(successMessage); >>> + } else { >>> + ofbiz.logInfo("Party not found with partyId >>> ${parameters.partyId}"); >>> + } >>> +} >>> + >>> function testFunction(context) { >>> if (message) { >>> var successMessage = "Got message [" + message + "] and finished >>> fine"; >>> >>> Modified: ofbiz/trunk/framework/common/servicedef/services_test.xml >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/servicedef/services_test.xml?rev=1299924&r1=1299923&r2=1299924&view=diff >>> ============================================================================== >>> --- ofbiz/trunk/framework/common/servicedef/services_test.xml (original) >>> +++ ofbiz/trunk/framework/common/servicedef/services_test.xml Mon Mar 12 >>> 23:20:55 2012 >>> @@ -199,6 +199,7 @@ under the License. >>> <service name="testScriptEngineJavaScript" engine="script" >>> location="component://common/script/org/ofbiz/common/JavaScriptTest.js" >>> invoke=""> >>> <description>Test Script Engine With JavaScript</description> >>> <attribute name="message" type="String" mode="IN" optional="true"/> >>> +<attribute name="partyId" type="String" mode="IN" optional="true"/> >>> <attribute name="result" type="String" mode="OUT"/> >>> </service> >>> >>> >>> Added: >>> ofbiz/trunk/framework/common/src/META-INF/services/org.ofbiz.base.util.ScriptHelperFactory >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/META-INF/services/org.ofbiz.base.util.ScriptHelperFactory?rev=1299924&view=auto >>> ============================================================================== >>> --- >>> ofbiz/trunk/framework/common/src/META-INF/services/org.ofbiz.base.util.ScriptHelperFactory >>> (added) >>> +++ >>> ofbiz/trunk/framework/common/src/META-INF/services/org.ofbiz.base.util.ScriptHelperFactory >>> Mon Mar 12 23:20:55 2012 >>> @@ -0,0 +1,18 @@ >>> +# Licensed to the Apache Software Foundation (ASF) under one >>> +# or more contributor license agreements. See the NOTICE file >>> +# distributed with this work for additional information >>> +# regarding copyright ownership. The ASF licenses this file >>> +# to you under the Apache License, Version 2.0 (the >>> +# "License"); you may not use this file except in compliance >>> +# with the License. You may obtain a copy of the License at >>> +# >>> +# http://www.apache.org/licenses/LICENSE-2.0 >>> +# >>> +# Unless required by applicable law or agreed to in writing, >>> +# software distributed under the License is distributed on an >>> +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >>> +# KIND, either express or implied. See the License for the >>> +# specific language governing permissions and limitations >>> +# under the License. >>> + >>> +org.ofbiz.common.scripting.ScriptHelperFactoryImpl >>> >>> Added: >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java?rev=1299924&view=auto >>> ============================================================================== >>> --- >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java >>> (added) >>> +++ >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java >>> Mon Mar 12 23:20:55 2012 >>> @@ -0,0 +1,268 @@ >>> +/******************************************************************************* >>> + * Licensed to the Apache Software Foundation (ASF) under one >>> + * or more contributor license agreements. See the NOTICE file >>> + * distributed with this work for additional information >>> + * regarding copyright ownership. The ASF licenses this file >>> + * to you under the Apache License, Version 2.0 (the >>> + * "License"); you may not use this file except in compliance >>> + * with the License. You may obtain a copy of the License at >>> + * >>> + * http://www.apache.org/licenses/LICENSE-2.0 >>> + * >>> + * Unless required by applicable law or agreed to in writing, >>> + * software distributed under the License is distributed on an >>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >>> + * KIND, either express or implied. See the License for the >>> + * specific language governing permissions and limitations >>> + * under the License. >>> + >>> *******************************************************************************/ >>> +package org.ofbiz.common.scripting; >>> + >>> +import java.util.HashMap; >>> +import java.util.Iterator; >>> +import java.util.Locale; >>> +import java.util.Map; >>> +import java.util.TimeZone; >>> + >>> +import javax.script.ScriptContext; >>> +import javax.script.ScriptEngine; >>> +import javax.servlet.http.HttpServletRequest; >>> +import javax.servlet.http.HttpServletResponse; >>> + >>> +import org.ofbiz.base.util.Assert; >>> +import org.ofbiz.base.util.ScriptUtil; >>> +import org.ofbiz.base.util.collections.FlexibleMapAccessor; >>> +import org.ofbiz.base.util.string.FlexibleStringExpander; >>> +import org.ofbiz.entity.Delegator; >>> +import org.ofbiz.entity.GenericValue; >>> +import org.ofbiz.security.Security; >>> +import org.ofbiz.security.authz.Authorization; >>> +import org.ofbiz.service.LocalDispatcher; >>> + >>> +/** >>> + * A set of<code>ScriptContext</code> convenience methods for scripting >>> engines. >>> + */ >>> +public final class ContextHelper { >>> + >>> + public static final String module = ContextHelper.class.getName(); >>> + private static final int EVENT = 1; >>> + private static final int SERVICE = 2; >>> + private static final int UNKNOWN = 3; >>> + >>> + private final ScriptContext context; >>> + private final int scriptType; >>> + >>> + public ContextHelper(ScriptContext context) { >>> + Assert.notNull("context", context); >>> + this.context = context; >>> + if (context.getAttribute("request") != null) { >>> + this.scriptType = EVENT; >>> + } else if (context.getAttribute("dctx") != null) { >>> + this.scriptType = SERVICE; >>> + } else { >>> + this.scriptType = UNKNOWN; >>> + } >>> + } >>> + >>> + public Object addBinding(String key, Object value) { >>> + return getBindings().put(key, value); >>> + } >>> + >>> + /** Expands environment variables delimited with ${} */ >>> + public String expandString(String original) { >>> + return FlexibleStringExpander.expandString(original, >>> getBindings()); >>> + } >>> + >>> + public Authorization getAuthz() { >>> + return (Authorization) this.context.getAttribute("authz"); >>> + } >>> + >>> + public Map<String, Object> getBindings() { >>> + return this.context.getBindings(ScriptContext.ENGINE_SCOPE); >>> + } >>> + >>> + public Delegator getDelegator() { >>> + return (Delegator) this.context.getAttribute("delegator"); >>> + } >>> + >>> + public LocalDispatcher getDispatcher() { >>> + return (LocalDispatcher) this.context.getAttribute("dispatcher"); >>> + } >>> + >>> + public<T> T getEnv(FlexibleMapAccessor<T> fma) { >>> + return fma.get(getBindings()); >>> + } >>> + >>> + /** >>> + * Gets the named value from the environment. Supports the "." (dot) >>> syntax to access >>> + * Map members and the "[]" (bracket) syntax to access List entries. >>> This value is >>> + * expanded, supporting the insertion of other environment values >>> using the "${}" >>> + * notation. >>> + * >>> + * @param key >>> + * The name of the environment value to get. Can contain >>> "." and "[]" >>> + * syntax elements as described above. >>> + * @return The environment value if found, otherwise null. >>> + */ >>> + public<T> T getEnv(String key) { >>> + String ekey = this.expandString(key); >>> + FlexibleMapAccessor<T> fma = >>> FlexibleMapAccessor.getInstance(ekey); >>> + return getEnv(fma); >>> + } >>> + >>> + public Iterator<Map.Entry<String, Object>> getEnvEntryIterator() { >>> + return getBindings().entrySet().iterator(); >>> + } >>> + >>> + public Locale getLocale() { >>> + return (Locale) this.context.getAttribute("locale"); >>> + } >>> + >>> + @SuppressWarnings("unchecked") >>> + public Object getParameter(String key) { >>> + Map<?, ?> parameters = (Map) >>> this.context.getAttribute(ScriptUtil.PARAMETERS_KEY); >>> + return parameters != null ? parameters.get(key) : null; >>> + } >>> + >>> + @SuppressWarnings("unchecked") >>> + public Map<String, Object> getParameters() { >>> + return (Map<String, Object>) >>> this.context.getAttribute(ScriptUtil.PARAMETERS_KEY); >>> + } >>> + >>> + public HttpServletRequest getRequest() { >>> + return (HttpServletRequest) this.context.getAttribute("request"); >>> + } >>> + >>> + public HttpServletResponse getResponse() { >>> + return (HttpServletResponse) this.context.getAttribute("response"); >>> + } >>> + >>> + @SuppressWarnings("unchecked") >>> + public Object getResult(String key) { >>> + Map<?, ?> results = (Map) >>> this.context.getAttribute(ScriptUtil.RESULT_KEY); >>> + return results != null ? results.get(key) : null; >>> + } >>> + >>> + @SuppressWarnings("unchecked") >>> + public Map<String, Object> getResults() { >>> + return (Map<String, Object>) >>> this.context.getAttribute(ScriptUtil.RESULT_KEY); >>> + } >>> + >>> + public String getScriptName() { >>> + String scriptName = (String) >>> this.context.getAttribute(ScriptEngine.FILENAME); >>> + return scriptName != null ? scriptName : "Unknown"; >>> + } >>> + >>> + public Security getSecurity() { >>> + return (Security) this.context.getAttribute("security"); >>> + } >>> + >>> + public TimeZone getTimeZone() { >>> + return (TimeZone) this.context.getAttribute("timeZone"); >>> + } >>> + >>> + public GenericValue getUserLogin() { >>> + return (GenericValue) this.context.getAttribute("userLogin"); >>> + } >>> + >>> + public boolean isEvent() { >>> + return this.scriptType == EVENT; >>> + } >>> + >>> + public boolean isService() { >>> + return this.scriptType == SERVICE; >>> + } >>> + >>> + /** >>> + * Calls putEnv for each entry in the Map, thus allowing for the >>> additional >>> + * flexibility in naming supported in that method. >>> + */ >>> + public void putAllEnv(Map<String, ? extends Object> values) { >>> + for (Map.Entry<String, ? extends Object> entry : >>> values.entrySet()) { >>> + this.putEnv(entry.getKey(), entry.getValue()); >>> + } >>> + } >>> + >>> + public<T> void putEnv(FlexibleMapAccessor<T> fma, T value) { >>> + fma.put(getBindings(), value); >>> + } >>> + >>> + /** >>> + * Puts the named value in the environment. Supports the "." (dot) >>> syntax to access >>> + * Map members and the "[]" (bracket) syntax to access List entries. >>> If the brackets >>> + * for a list are empty the value will be appended to end of the list, >>> otherwise the >>> + * value will be set in the position of the number in the brackets. If >>> a "+" (plus >>> + * sign) is included inside the square brackets before the index >>> number the value will >>> + * inserted/added at that index instead of set at that index. This >>> value is expanded, >>> + * supporting the insertion of other environment values using the >>> "${}" notation. >>> + * >>> + * @param key >>> + * The name of the environment value to get. Can contain >>> "." syntax >>> + * elements as described above. >>> + * @param value >>> + * The value to set in the named environment location. >>> + */ >>> + public<T> void putEnv(String key, T value) { >>> + String ekey = this.expandString(key); >>> + FlexibleMapAccessor<T> fma = >>> FlexibleMapAccessor.getInstance(ekey); >>> + this.putEnv(fma, value); >>> + } >>> + >>> + @SuppressWarnings("unchecked") >>> + public void putParameter(String key, Object value) { >>> + Map<String, Object> parameters = (Map) >>> this.context.getAttribute(ScriptUtil.PARAMETERS_KEY); >>> + if (parameters == null) { >>> + parameters = new HashMap<String, Object>(); >>> + this.context.setAttribute(ScriptUtil.PARAMETERS_KEY, >>> parameters, ScriptContext.ENGINE_SCOPE); >>> + } >>> + parameters.put(key, value); >>> + } >>> + >>> + @SuppressWarnings("unchecked") >>> + public void putResult(String key, Object value) { >>> + Map<String, Object> results = (Map) >>> this.context.getAttribute(ScriptUtil.RESULT_KEY); >>> + if (results == null) { >>> + results = new HashMap<String, Object>(); >>> + this.context.setAttribute(ScriptUtil.RESULT_KEY, results, >>> ScriptContext.ENGINE_SCOPE); >>> + } >>> + results.put(key, value); >>> + } >>> + >>> + @SuppressWarnings("unchecked") >>> + public void putResults(Map<String, Object> results) { >>> + Map<String, Object> existingResults = (Map) >>> this.context.getAttribute(ScriptUtil.RESULT_KEY); >>> + if (existingResults == null) { >>> + existingResults = new HashMap<String, Object>(); >>> + this.context.setAttribute(ScriptUtil.RESULT_KEY, results, >>> ScriptContext.ENGINE_SCOPE); >>> + } >>> + existingResults.putAll(results); >>> + } >>> + >>> + public Object removeBinding(String key) { >>> + return getBindings().remove(key); >>> + } >>> + >>> + public<T> T removeEnv(FlexibleMapAccessor<T> fma) { >>> + return fma.remove(getBindings()); >>> + } >>> + >>> + /** >>> + * Removes the named value from the environment. Supports the "." >>> (dot) syntax to >>> + * access Map members and the "[]" (bracket) syntax to access List >>> entries. This value >>> + * is expanded, supporting the insertion of other environment values >>> using the "${}" >>> + * notation. >>> + * >>> + * @param key >>> + * The name of the environment value to get. Can contain >>> "." syntax >>> + * elements as described above. >>> + */ >>> + public<T> T removeEnv(String key) { >>> + String ekey = this.expandString(key); >>> + FlexibleMapAccessor<T> fma = >>> FlexibleMapAccessor.getInstance(ekey); >>> + return removeEnv(fma); >>> + } >>> + >>> + public void setUserLogin(GenericValue userLogin, String >>> userLoginEnvName) { >>> + putEnv(userLoginEnvName, userLogin); >>> + } >>> +} >>> >>> Propchange: >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java >>> ------------------------------------------------------------------------------ >>> svn:eol-style = native >>> >>> Propchange: >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ContextHelper.java >>> ------------------------------------------------------------------------------ >>> svn:keywords = Author Date Id Rev URL >>> >>> Added: >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java?rev=1299924&view=auto >>> ============================================================================== >>> --- >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java >>> (added) >>> +++ >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java >>> Mon Mar 12 23:20:55 2012 >>> @@ -0,0 +1,35 @@ >>> +/******************************************************************************* >>> + * Licensed to the Apache Software Foundation (ASF) under one >>> + * or more contributor license agreements. See the NOTICE file >>> + * distributed with this work for additional information >>> + * regarding copyright ownership. The ASF licenses this file >>> + * to you under the Apache License, Version 2.0 (the >>> + * "License"); you may not use this file except in compliance >>> + * with the License. You may obtain a copy of the License at >>> + * >>> + * http://www.apache.org/licenses/LICENSE-2.0 >>> + * >>> + * Unless required by applicable law or agreed to in writing, >>> + * software distributed under the License is distributed on an >>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >>> + * KIND, either express or implied. See the License for the >>> + * specific language governing permissions and limitations >>> + * under the License. >>> + >>> *******************************************************************************/ >>> +package org.ofbiz.common.scripting; >>> + >>> +import javax.script.ScriptContext; >>> + >>> +import org.ofbiz.base.util.ScriptHelper; >>> +import org.ofbiz.base.util.ScriptHelperFactory; >>> + >>> +/** >>> + * An implementation of the<code>ScriptHelperFactory</code> interface. >>> + */ >>> +public final class ScriptHelperFactoryImpl implements ScriptHelperFactory { >>> + >>> + @Override >>> + public ScriptHelper getInstance(ScriptContext context) { >>> + return new ScriptHelperImpl(context); >>> + } >>> +} >>> >>> Propchange: >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java >>> ------------------------------------------------------------------------------ >>> svn:eol-style = native >>> >>> Propchange: >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperFactoryImpl.java >>> ------------------------------------------------------------------------------ >>> svn:keywords = Author Date Id Rev URL >>> >>> Added: >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java >>> URL: >>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java?rev=1299924&view=auto >>> ============================================================================== >>> --- >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java >>> (added) >>> +++ >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java >>> Mon Mar 12 23:20:55 2012 >>> @@ -0,0 +1,283 @@ >>> +/******************************************************************************* >>> + * Licensed to the Apache Software Foundation (ASF) under one >>> + * or more contributor license agreements. See the NOTICE file >>> + * distributed with this work for additional information >>> + * regarding copyright ownership. The ASF licenses this file >>> + * to you under the Apache License, Version 2.0 (the >>> + * "License"); you may not use this file except in compliance >>> + * with the License. You may obtain a copy of the License at >>> + * >>> + * http://www.apache.org/licenses/LICENSE-2.0 >>> + * >>> + * Unless required by applicable law or agreed to in writing, >>> + * software distributed under the License is distributed on an >>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY >>> + * KIND, either express or implied. See the License for the >>> + * specific language governing permissions and limitations >>> + * under the License. >>> + >>> *******************************************************************************/ >>> +package org.ofbiz.common.scripting; >>> + >>> +import java.util.Collections; >>> +import java.util.HashMap; >>> +import java.util.HashSet; >>> +import java.util.List; >>> +import java.util.Map; >>> +import java.util.Set; >>> + >>> +import javax.script.ScriptContext; >>> +import javax.script.ScriptException; >>> + >>> +import org.ofbiz.base.util.Assert; >>> +import org.ofbiz.base.util.Debug; >>> +import org.ofbiz.base.util.ScriptHelper; >>> +import org.ofbiz.base.util.UtilGenerics; >>> +import org.ofbiz.base.util.UtilValidate; >>> +import org.ofbiz.entity.Delegator; >>> +import org.ofbiz.entity.GenericEntityException; >>> +import org.ofbiz.entity.GenericPK; >>> +import org.ofbiz.entity.GenericValue; >>> +import org.ofbiz.entity.model.ModelEntity; >>> +import org.ofbiz.service.GenericServiceException; >>> +import org.ofbiz.service.ModelService; >>> +import org.ofbiz.service.ServiceUtil; >>> + >>> +/** >>> + * An implementation of the<code>ScriptHelper</code> interface. >>> + */ >>> +public final class ScriptHelperImpl implements ScriptHelper { >>> + >>> + public static final String module = ScriptHelperImpl.class.getName(); >>> + private static final Map<String, ? extends Object> EMPTY_ARGS = >>> Collections.unmodifiableMap(new HashMap<String, Object>()); >>> + >>> + private static GenericValue runFindByPrimaryKey(ModelEntity >>> modelEntity, ContextHelper ctxHelper, boolean useCache, boolean >>> autoFieldMap, >>> + Map<String, ? extends Object> fieldMap, List<String> >>> selectFieldList) throws ScriptException { >>> + Map<String, Object> entityContext = new HashMap<String, Object>(); >>> + Delegator delegator = ctxHelper.getDelegator(); >>> + Map<String, Object> context = ctxHelper.getBindings(); >>> + if (autoFieldMap) { >>> + GenericValue tempVal = >>> delegator.makeValue(modelEntity.getEntityName()); >>> + Object parametersObj = context.get("parameters"); >>> + if (parametersObj != null&& parametersObj instanceof Map<?, >>> ?>) { >>> + tempVal.setAllFields(UtilGenerics.checkMap(parametersObj), >>> true, null, Boolean.TRUE); >>> + } >>> + tempVal.setAllFields(context, true, null, Boolean.TRUE); >>> + entityContext.putAll(tempVal); >>> + } >>> + if (fieldMap != null) { >>> + entityContext.putAll(fieldMap); >>> + } >>> + entityContext.put("locale", context.get("locale")); >>> + entityContext.put("timeZone", context.get("timeZone")); >>> + modelEntity.convertFieldMapInPlace(entityContext, delegator); >>> + entityContext.remove("locale"); >>> + entityContext.remove("timeZone"); >>> + Set<String> fieldsToSelect = null; >>> + if (selectFieldList != null) { >>> + fieldsToSelect = new HashSet<String>(selectFieldList); >>> + } >>> + if (fieldsToSelect != null&& useCache) { >>> + String errMsg = "Error running script " + >>> ctxHelper.getScriptName() + ": Problem invoking the findOne method: Cannot >>> specify selectFieldList argument when useCache is set to true "; >>> + Debug.logWarning(errMsg, module); >>> + throw new ScriptException(errMsg); >>> + } >>> + GenericValue valueOut = null; >>> + GenericPK entityPK = delegator.makePK(modelEntity.getEntityName(), >>> entityContext); >>> + if (entityPK.containsPrimaryKey(true)) { >>> + try { >>> + if (useCache) { >>> + valueOut = delegator.findOne(entityPK.getEntityName(), >>> entityPK, true); >>> + } else { >>> + if (fieldsToSelect != null) { >>> + valueOut = >>> delegator.findByPrimaryKeyPartial(entityPK, fieldsToSelect); >>> + } else { >>> + valueOut = >>> delegator.findOne(entityPK.getEntityName(), entityPK, false); >>> + } >>> + } >>> + } catch (GenericEntityException e) { >>> + String errMsg = "Error running script " + >>> ctxHelper.getScriptName() + ": Problem invoking the findOne method: " + >>> e.getMessage(); >>> + Debug.logWarning(e, errMsg, module); >>> + throw new ScriptException(errMsg); >>> + } >>> + } else { >>> + if (Debug.warningOn()) { >>> + Debug.logWarning("Error running script " + >>> ctxHelper.getScriptName() + ": Returning null because found incomplete >>> primary key in find: " + entityPK, module); >>> + } >>> + } >>> + return valueOut; >>> + } >>> + >>> + private final ContextHelper ctxHelper; >>> + >>> + public ScriptHelperImpl(ScriptContext context) { >>> + this.ctxHelper = new ContextHelper(context); >>> + } >>> + >>> + public Map<String, ? extends Object> createServiceMap(String >>> serviceName, Map<String, ? extends Object> inputMap) throws >>> ScriptException { >>> + Assert.notNull("serviceName", serviceName, "inputMap", inputMap); >>> + Map<String, Object> toMap = new HashMap<String, Object>(); >>> + ModelService modelService = null; >>> + try { >>> + modelService = >>> ctxHelper.getDispatcher().getDispatchContext().getModelService(serviceName); >>> + } catch (GenericServiceException e) { >>> + String errMsg = "Error running script " + >>> ctxHelper.getScriptName() + ": Problem invoking the createServiceMap >>> method: get service definition for service name [" + serviceName + "]: " + >>> e.getMessage(); >>> + Debug.logWarning(e, errMsg, module); >>> + throw new ScriptException(errMsg); >>> + } >>> + toMap.putAll(modelService.makeValid(inputMap, "IN", true, null, >>> ctxHelper.getTimeZone(), ctxHelper.getLocale())); >>> + return toMap; >>> + } >>> + >>> + @Override >>> + public void error(String message) { >>> + if (ctxHelper.isEvent()) { >>> + ctxHelper.putResult("_error_message_", >>> ctxHelper.expandString(message)); >>> + ctxHelper.putResult("_response_code_", "error"); >>> + } else if (ctxHelper.isService()) { >>> + >>> ctxHelper.putResults(ServiceUtil.returnError(ctxHelper.expandString(message))); >>> + } >>> + } >>> + >>> + @Override >>> + public String evalString(String original) { >>> + return ctxHelper.expandString(original); >>> + } >>> + >>> + @Override >>> + public void failure(String message) { >>> + if (ctxHelper.isEvent()) { >>> + ctxHelper.putResult("_error_message_", >>> ctxHelper.expandString(message)); >>> + ctxHelper.putResult("_response_code_", "fail"); >>> + } else if (ctxHelper.isService()) { >>> + >>> ctxHelper.putResults(ServiceUtil.returnFailure(ctxHelper.expandString(message))); >>> + } >>> + } >>> + >>> + public List<Map<String, Object>> findList(String entityName, >>> Map<String, ? extends Object> fields) throws ScriptException { >>> + try { >>> + return >>> UtilGenerics.checkList(ctxHelper.getDelegator().findByAnd(entityName, >>> fields)); >>> + } catch (GenericEntityException e) { >>> + String errMsg = "Error running script " + >>> ctxHelper.getScriptName() + ": Problem invoking the findList method: " + >>> e.getMessage(); >>> + Debug.logWarning(e, errMsg, module); >>> + throw new ScriptException(errMsg); >>> + } >>> + } >>> + >>> + public Map<String, Object> findOne(String entityName) throws >>> ScriptException { >>> + return findOne(entityName, null, EMPTY_ARGS); >>> + } >>> + >>> + public Map<String, Object> findOne(String entityName, Map<String, ? >>> extends Object> fields, Map<String, ? extends Object> args) throws >>> ScriptException { >>> + Assert.notNull("entityName", entityName); >>> + if (args == null) { >>> + args = EMPTY_ARGS; >>> + } >>> + boolean useCache = "true".equals(args.get("useCache")); >>> + boolean autoFieldMap = !"false".equals(args.get("autoFieldMap")); >>> + List<String> selectFieldList = >>> UtilGenerics.checkList(args.get("selectFieldList")); >>> + ModelEntity modelEntity = >>> ctxHelper.getDelegator().getModelEntity(entityName); >>> + if (modelEntity == null) { >>> + throw new ScriptException("Error running script " + >>> ctxHelper.getScriptName() + " - no entity definition found for entity name >>> [" + entityName + "]"); >>> + } >>> + return runFindByPrimaryKey(modelEntity, ctxHelper, useCache, >>> autoFieldMap, fields, selectFieldList); >>> + } >>> + >>> + public void logError(String message) { >>> + String expandedMessage = ctxHelper.expandString(message); >>> + Debug.logError("[".concat(ctxHelper.getScriptName()).concat("] >>> ").concat(expandedMessage), module); >>> + } >>> + >>> + public void logInfo(String message) { >>> + String expandedMessage = ctxHelper.expandString(message); >>> + Debug.logInfo("[".concat(ctxHelper.getScriptName()).concat("] >>> ").concat(expandedMessage), module); >>> + } >>> + >>> + public void logWarning(String message) { >>> + String expandedMessage = ctxHelper.expandString(message); >>> + Debug.logWarning("[".concat(ctxHelper.getScriptName()).concat("] >>> ").concat(expandedMessage), module); >>> + } >>> + >>> + public Map<String, Object> makeValue(String entityName) throws >>> ScriptException { >>> + return ctxHelper.getDelegator().makeValidValue(entityName); >>> + } >>> + >>> + public Map<String, Object> makeValue(String entityName, Map<String, >>> Object> fields) throws ScriptException { >>> + return ctxHelper.getDelegator().makeValidValue(entityName, fields); >>> + } >>> + >>> + public Map<String, ? extends Object> runService(String serviceName, >>> Map<String, ? extends Object> inputMap) throws ScriptException { >>> + return runService(serviceName, inputMap, EMPTY_ARGS); >>> + } >>> + >>> + public Map<String, ? extends Object> runService(String serviceName, >>> Map<String, ? extends Object> inputMap, Map<String, ? extends Object> >>> args) throws ScriptException { >>> + Assert.notNull("serviceName", serviceName, "args", args); >>> + boolean includeUserLogin = >>> !"false".equals(args.get("includeUserLoginStr")); >>> + String requireNewTransactionStr = (String) >>> args.get("requireNewTransaction"); >>> + int transactionTimeout = -1; >>> + if (UtilValidate.isNotEmpty(requireNewTransactionStr)) { >>> + String timeoutStr = (String) args.get("transactionTimout"); >>> + if (!UtilValidate.isEmpty(timeoutStr)) { >>> + try { >>> + transactionTimeout = Integer.parseInt(timeoutStr); >>> + } catch (NumberFormatException e) { >>> + Debug.logWarning(e, "Setting timeout to 0 (default)", >>> module); >>> + transactionTimeout = 0; >>> + } >>> + } >>> + } >>> + Map<String, Object> inMap = new HashMap<String, Object>(inputMap); >>> + if (includeUserLogin&& !inMap.containsKey("userLogin")) { >>> + GenericValue userLogin = ctxHelper.getUserLogin(); >>> + if (userLogin != null) { >>> + inMap.put("userLogin", userLogin); >>> + } >>> + } >>> + if (!inMap.containsKey("locale")&& ctxHelper.getLocale() != null) >>> { >>> + inMap.put("locale", ctxHelper.getLocale()); >>> + } >>> + if (!inMap.containsKey("timeZone")&& ctxHelper.getTimeZone() != >>> null) { >>> + inMap.put("timeZone", ctxHelper.getTimeZone()); >>> + } >>> + Map<String, Object> result = null; >>> + try { >>> + if (UtilValidate.isEmpty(requireNewTransactionStr)&& >>> transactionTimeout< 0) { >>> + result = ctxHelper.getDispatcher().runSync(serviceName, >>> inMap); >>> + } else { >>> + ModelService modelService = >>> ctxHelper.getDispatcher().getDispatchContext().getModelService(serviceName); >>> + boolean requireNewTransaction = >>> modelService.requireNewTransaction; >>> + int timeout = modelService.transactionTimeout; >>> + if (UtilValidate.isNotEmpty(requireNewTransactionStr)) { >>> + requireNewTransaction = >>> "true".equals(requireNewTransactionStr); >>> + } >>> + if (transactionTimeout>= 0) { >>> + timeout = transactionTimeout; >>> + } >>> + result = ctxHelper.getDispatcher().runSync(serviceName, >>> inMap, timeout, requireNewTransaction); >>> + } >>> + } catch (GenericServiceException e) { >>> + String errMsg = "Error running script " + >>> ctxHelper.getScriptName() + " [problem invoking the [" + serviceName + "] >>> service: " + e.getMessage(); >>> + Debug.logWarning(e, errMsg, module); >>> + throw new ScriptException(errMsg); >>> + } >>> + return result; >>> + } >>> + >>> + @Override >>> + public void success() { >>> + if (ctxHelper.isEvent()) { >>> + ctxHelper.putResult("_response_code_", "success"); >>> + } else if (ctxHelper.isService()) { >>> + ctxHelper.putResults(ServiceUtil.returnSuccess()); >>> + } >>> + } >>> + >>> + @Override >>> + public void success(String message) { >>> + if (ctxHelper.isEvent()) { >>> + ctxHelper.putResult("_event_message_", >>> ctxHelper.expandString(message)); >>> + ctxHelper.putResult("_response_code_", "success"); >>> + } else if (ctxHelper.isService()) { >>> + >>> ctxHelper.putResults(ServiceUtil.returnSuccess(ctxHelper.expandString(message))); >>> + } >>> + } >>> +} >>> >>> Propchange: >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java >>> ------------------------------------------------------------------------------ >>> svn:eol-style = native >>> >>> Propchange: >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/scripting/ScriptHelperImpl.java >>> ------------------------------------------------------------------------------ >>> svn:keywords = Author Date Id Rev URL >>> >>>