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, [hidden email] 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 > > |
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, [hidden email] 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 >> >> |
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, [hidden email] 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 >>> >>> |
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, [hidden email] 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 >>>> >>>> > |
Free forum by Nabble | Edit this page |