blob: 2a78e1e58b948b7097ce0cedec6306976099af51 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}