blob: 647a74352056c87ac99810cc578163473e57f6a7 [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.struts2.util;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ObjectFactory;
import com.opensymphony.xwork2.inject.Container;
import com.opensymphony.xwork2.util.ClassLoaderUtil;
import com.opensymphony.xwork2.util.TextParseUtil;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.struts2.views.jsp.ui.OgnlTool;
import org.apache.struts2.views.util.UrlHelper;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.*;
/**
* Struts base utility class, for use in Velocity and Freemarker templates
*/
public class StrutsUtil {
protected static final Logger LOG = LogManager.getLogger(StrutsUtil.class);
protected HttpServletRequest request;
protected HttpServletResponse response;
protected Map<String, Class> classes = new Hashtable<>();
protected OgnlTool ognl;
protected ValueStack stack;
private UrlHelper urlHelper;
private ObjectFactory objectFactory;
public StrutsUtil(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
this.stack = stack;
this.request = request;
this.response = response;
this.ognl = ((Container)stack.getContext().get(ActionContext.CONTAINER)).getInstance(OgnlTool.class);
this.urlHelper = ((Container)stack.getContext().get(ActionContext.CONTAINER)).getInstance(UrlHelper.class);
this.objectFactory = ((Container)stack.getContext().get(ActionContext.CONTAINER)).getInstance(ObjectFactory.class);
}
public Object bean(Object aName) throws Exception {
String name = aName.toString();
Class c = classes.get(name);
if (c == null) {
c = ClassLoaderUtil.loadClass(name, StrutsUtil.class);
classes.put(name, c);
}
return objectFactory.buildBean(c, stack.getContext());
}
public boolean isTrue(String expression) {
Boolean retVal = (Boolean) stack.findValue(expression, Boolean.class);
return retVal != null && retVal;
}
public Object findString(String name) {
return stack.findValue(name, String.class);
}
public String include(Object aName) throws Exception {
try {
RequestDispatcher dispatcher = request.getRequestDispatcher(aName.toString());
if (dispatcher == null) {
throw new IllegalArgumentException("Cannot find included file " + aName);
}
ResponseWrapper responseWrapper = new ResponseWrapper(response);
dispatcher.include(request, responseWrapper);
return responseWrapper.getData();
}
catch (Exception e) {
LOG.debug("Cannot include {}", aName.toString(), e);
throw e;
}
}
public String urlEncode(String s) {
try {
return URLEncoder.encode(s, "UTF-8");
} catch (UnsupportedEncodingException e) {
LOG.debug("Cannot encode URL [{}]", s, e);
return s;
}
}
public String buildUrl(String url) {
return urlHelper.buildUrl(url, request, response, null);
}
public Object findValue(String expression, String className) throws ClassNotFoundException {
return stack.findValue(expression, Class.forName(className));
}
public String getText(String text) {
return (String) stack.findValue("getText('" + text + "')");
}
/*
* @return the url ContextPath. An empty string if one does not exist.
*/
public String getContext() {
return (request == null)? "" : request.getContextPath();
}
public String translateVariables(String expression) {
return TextParseUtil.translateVariables(expression, stack);
}
/**
* the selectedList objects are matched to the list.listValue
* <p>
* listKey and listValue are optional, and if not provided, the list item is used
* </p>
*
* @param selectedList the name of the action property
* that contains the list of selected items
* or single item if its not an array or list
* @param list the name of the action property
* that contains the list of selectable items
* @param listKey an ognl expression that is exaluated relative to the list item
* to use as the key of the ListEntry
* @param listValue an ognl expression that is exaluated relative to the list item
* to use as the value of the ListEntry
* @return a List of ListEntry
*/
public List makeSelectList(String selectedList, String list, String listKey, String listValue) {
List selectList = new ArrayList();
Collection selectedItems = null;
Object i = stack.findValue(selectedList);
if (i != null) {
if (i.getClass().isArray()) {
selectedItems = Arrays.asList((Object[]) i);
} else if (i instanceof Collection) {
selectedItems = (Collection) i;
} else {
// treat it is a single item
selectedItems = new ArrayList();
selectedItems.add(i);
}
}
Collection items = (Collection) stack.findValue(list);
if (items != null) {
for (Object element : items) {
Object key;
if ((listKey == null) || (listKey.length() == 0)) {
key = element;
} else {
key = ognl.findValue(listKey, element);
}
Object value = null;
if ((listValue == null) || (listValue.length() == 0)) {
value = element;
} else {
value = ognl.findValue(listValue, element);
}
boolean isSelected = false;
if ((value != null) && (selectedItems != null) && selectedItems.contains(value)) {
isSelected = true;
}
selectList.add(new ListEntry(key, value, isSelected));
}
}
return selectList;
}
public int toInt(long aLong) {
return (int) aLong;
}
public long toLong(int anInt) {
return (long) anInt;
}
public long toLong(String aLong) {
if (aLong == null) {
return 0;
}
return Long.parseLong(aLong);
}
public String toString(long aLong) {
return Long.toString(aLong);
}
public String toString(int anInt) {
return Integer.toString(anInt);
}
public String toStringSafe(Object obj) {
try {
if (obj != null) {
return String.valueOf(obj);
}
return "";
} catch (Exception e) {
return "Exception thrown: " + e;
}
}
static class ResponseWrapper extends HttpServletResponseWrapper {
StringWriter strout;
PrintWriter writer;
ServletOutputStream sout;
ResponseWrapper(HttpServletResponse aResponse) {
super(aResponse);
strout = new StringWriter();
sout = new ServletOutputStreamWrapper(strout);
writer = new PrintWriter(strout);
}
public String getData() {
writer.flush();
return strout.toString();
}
public ServletOutputStream getOutputStream() {
return sout;
}
public PrintWriter getWriter() throws IOException {
return writer;
}
}
static class ServletOutputStreamWrapper extends ServletOutputStream {
StringWriter writer;
ServletOutputStreamWrapper(StringWriter aWriter) {
writer = aWriter;
}
public void write(int aByte) {
writer.write(aByte);
}
}
}