| /******************************************************************************* |
| * 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.apache.ofbiz.common.scripting; |
| |
| import java.util.Iterator; |
| import java.util.LinkedHashMap; |
| import java.util.LinkedList; |
| import java.util.Locale; |
| import java.util.List; |
| 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.apache.ofbiz.base.util.Assert; |
| import org.apache.ofbiz.base.util.ScriptUtil; |
| import org.apache.ofbiz.base.util.UtilGenerics; |
| import org.apache.ofbiz.base.util.collections.FlexibleMapAccessor; |
| import org.apache.ofbiz.base.util.string.FlexibleStringExpander; |
| import org.apache.ofbiz.entity.Delegator; |
| import org.apache.ofbiz.entity.GenericValue; |
| import org.apache.ofbiz.security.Security; |
| import org.apache.ofbiz.service.LocalDispatcher; |
| import org.apache.ofbiz.service.ModelService; |
| |
| /** |
| * 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 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 List<String> getErrorMessages() { |
| List<String> errorMessages = null; |
| if (isService()) { |
| errorMessages = UtilGenerics.checkList(getResults().get(ModelService.ERROR_MESSAGE_LIST)); |
| if (errorMessages == null) { |
| errorMessages = new LinkedList<String>(); |
| getResults().put(ModelService.ERROR_MESSAGE_LIST, errorMessages); |
| } |
| } else { |
| errorMessages = UtilGenerics.checkList(getResults().get("_error_message_list_")); |
| if (errorMessages == null) { |
| errorMessages = new LinkedList<String>(); |
| getResults().put("_error_message_list_", errorMessages); |
| } |
| } |
| return errorMessages; |
| } |
| |
| public Iterator<Map.Entry<String, Object>> getEnvEntryIterator() { |
| return getBindings().entrySet().iterator(); |
| } |
| |
| public Locale getLocale() { |
| return (Locale) this.context.getAttribute("locale"); |
| } |
| |
| public Object getParameter(String key) { |
| return getParameters().get(key); |
| } |
| |
| public Map<String, Object> getParameters() { |
| Map<String, Object> parameters = UtilGenerics.checkMap(this.context.getAttribute(ScriptUtil.PARAMETERS_KEY)); |
| if (parameters == null) { |
| parameters = new LinkedHashMap<String, Object>(); |
| this.context.setAttribute(ScriptUtil.PARAMETERS_KEY, parameters, ScriptContext.ENGINE_SCOPE); |
| } |
| return parameters; |
| } |
| |
| public HttpServletRequest getRequest() { |
| return (HttpServletRequest) this.context.getAttribute("request"); |
| } |
| |
| public HttpServletResponse getResponse() { |
| return (HttpServletResponse) this.context.getAttribute("response"); |
| } |
| |
| public Object getResult(String key) { |
| return getResults().get(key); |
| } |
| |
| public Map<String, Object> getResults() { |
| Map<String, Object> results = UtilGenerics.checkMap(this.context.getAttribute(ScriptUtil.RESULT_KEY)); |
| if (results == null) { |
| results = new LinkedHashMap<String, Object>(); |
| this.context.setAttribute(ScriptUtil.RESULT_KEY, results, ScriptContext.ENGINE_SCOPE); |
| } |
| return results; |
| } |
| |
| 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); |
| } |
| |
| public void putParameter(String key, Object value) { |
| getParameters().put(key, value); |
| } |
| |
| public void putResult(String key, Object value) { |
| getResults().put(key, value); |
| } |
| |
| public void putResults(Map<String, Object> results) { |
| getResults().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); |
| } |
| } |