
org.xmlactions.web.conceal.HttpPager Maven / Gradle / Ivy
package org.xmlactions.web.conceal;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;
import javax.servlet.FilterConfig;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.text.StrSubstitutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.xmlactions.action.Action;
import org.xmlactions.action.ActionConst;
import org.xmlactions.action.NestedActionException;
import org.xmlactions.action.config.IExecContext;
import org.xmlactions.common.xml.BadXMLException;
import org.xmlactions.pager.actions.props.PropsAction;
import org.xmlactions.pager.context.SessionExecContext;
import org.xmlactions.web.HttpParam;
import org.xmlactions.web.PagerWebConst;
import org.xmlactions.web.RequestExecContext;
import org.xmlactions.web.http.HttpSessionInfo;
/**
* Servlet implementation class PagerServlet
*
* This class is used to manage http page requests.
*
*
* It uses an IExeContext that must be defined in the Spring ApplicationContext with id "pager.execContext". This IExecContext is then extended with
* additional information such as
*
* - execContext.put(ActionConst.WEB_REAL_PATH_BEAN_REF, realPath);
* - execContext.put(ActionConst.PAGE_NAMESPACE_BEAN_REF, nameSpace);
* - execContext.setSession(request.getSession(true));
* - execContext.loadFromPersistence();
* - execContext.addNamedMap(IExecContext.PERSISTENCE_MAP, execContext.getPersistenceMap());
* - execContext.addNamedMap(PagerWebConst.REQUEST, params);
* - execContext.put(PagerWebConst.REQUEST_LIST, paramList);
* - execContext.put(PagerWebConst.PAGE_NAME, (pageName.length() > 1 ? pageName.substring(1) : pageName));
* - execContext.put(PagerWebConst.PAGE_URI, request.getRequestURI());
* - execContext.put(PagerWebConst.PAGE_URL, request.getRequestURL() .toString());
* - execContext.put(PagerWebConst.PAGE_SERVER_NAME, request.getServerName());
* - execContext.put(PagerWebConst.PAGE_APP_NAME, appName);
* - execContext.put(ActionConst.WEB_ROOT_BEAN_REF, "");
* - execContext.put(ActionConst.WEB_ROOT_BEAN_REF, "/" + appName);
* - execContext.put(PagerWebConst.HTTP_REQUEST, request);
* - execContext.put(PagerWebConst.HTTP_RESPONSE, response);
* - execContext.put(PagerWebConst.HTTP_SESSION, request.getSession(true));
* - execContext.put(PagerWebConst.EXEC_CONTEXT, execContext);
*
* See PagerWebConst and org.xmlactions.action.ActionConst and org.xmlactions.action.config.IExecContext.
*
* The IExecContext is available from the code by calling org.xmlactions.web.RequestExecContext.get().
*
*/
public class HttpPager {
private static final Logger log = LoggerFactory.getLogger(HttpPager.class);
private static final String access_licence_file = "/config/pager/access.scr";
private static final int[] p = new int[] { 2213, 1406, 2151, 375, 7445,
1666, 613, 2272, 3278, 743, 2619, 480, 967, 3853, 1403, 2270 };
// private static ApplicationContext applicationContext;
// web site location on disk
private static String realPath;
private static String nameSpace;
private static String wrapperPage;
private static String prePage;
private static String postPage;
private static String axelProps; // if this is set we load props from this file into the execContext
/**
* @see HttpServlet#HttpServlet()
*/
public HttpPager() {
super();
}
public static ApplicationContext getApplicationContext(
ServletContext servletContext) {
ApplicationContext applicationContext;
applicationContext = WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);
return applicationContext;
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
String value;
value = config.getServletContext().getRealPath("");
if (StringUtils.isNotEmpty(value)) {
realPath = value;
}
value = config.getInitParameter("pager.realPath");
if (StringUtils.isNotEmpty(value)) {
realPath = value;
}
log.debug("realPath:[{}] getRealPath:[{}] pager.realPath:[{}]", realPath, config.getServletContext().getRealPath(""), config.getInitParameter("pager.realPath"));
value = config.getInitParameter("pager.namespace");
if (StringUtils.isNotEmpty(value)) {
nameSpace = value;
}
value = config.getInitParameter("pager.wrapperPage");
if (StringUtils.isNotEmpty(value)) {
wrapperPage = value;
}
value = config.getInitParameter("pager.pre.page");
if (StringUtils.isNotEmpty(value)) {
prePage = value;
}
value = config.getInitParameter("pager.post.page");
if (StringUtils.isNotEmpty(value)) {
postPage = value;
}
// applicationContext =
// WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext());
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(FilterConfig filterConfig) {
String value;
if (realPath == null) {
value = filterConfig.getInitParameter("pager.realPath");
if (StringUtils.isEmpty(value)) {
value = filterConfig.getServletContext().getRealPath("");
}
if (StringUtils.isNotEmpty(value)) {
realPath = value;
}
}
value = filterConfig.getInitParameter("pager.namespace");
if (StringUtils.isNotEmpty(value)) {
nameSpace = value;
}
value = filterConfig.getInitParameter("pager.wrapperPage");
if (StringUtils.isNotEmpty(value)) {
wrapperPage = value;
}
value = filterConfig.getInitParameter("pager.pre.page");
if (StringUtils.isNotEmpty(value)) {
prePage = value;
}
value = filterConfig.getInitParameter("pager.post.page");
if (StringUtils.isNotEmpty(value)) {
postPage = value;
}
}
public SessionExecContext setupExecContext(HttpServletRequest request,
HttpServletResponse response) throws IOException,
FileUploadException {
ApplicationContext applicationContext = getApplicationContext(request
.getSession(true).getServletContext());
SessionExecContext execContext = (SessionExecContext) applicationContext
.getBean(ActionConst.EXEC_CONTEXT_BEAN_REF);
new CreateHandyParams(execContext);
// Make it available for the scope of this request.
RequestExecContext.set(execContext);
execContext.setApplicationContext(applicationContext);
execContext.put(ActionConst.WEB_REAL_PATH_BEAN_REF, realPath);
execContext.put(ActionConst.PAGE_NAMESPACE_BEAN_REF, nameSpace);
execContext.setSession(request.getSession(true));
execContext.loadFromPersistence();
execContext.addNamedMap(IExecContext.PERSISTENCE_MAP,
execContext.getPersistenceMap());
new CreateUserParams(execContext);
// FIXME - will want to remove the addNamedMap("request")
Map params = new HtmlRequestMapper(-1)
.getRequestParamsAsMap(request);
if (params != null) {
execContext.addNamedMap(PagerWebConst.REQUEST, params);
}
List paramList = new HtmlRequestMapper(-1)
.getRequestParamsAsVector(request);
if (paramList != null) {
execContext.put(PagerWebConst.REQUEST_LIST, paramList);
}
String pageName = request.getServletPath();
// remove the leading slash/
execContext.put(PagerWebConst.PAGE_NAME,
(pageName.length() > 1 ? pageName.substring(1) : pageName));
execContext.put(PagerWebConst.PAGE_URI, request.getRequestURI());
execContext.put(PagerWebConst.PAGE_URL, request.getRequestURL()
.toString());
execContext
.put(PagerWebConst.PAGE_SERVER_NAME, request.getServerName());
String appName = getAppName(request.getRequestURI());
execContext.put(PagerWebConst.PAGE_APP_NAME, appName);
if (StringUtils.isEmpty(appName)) {
execContext.put(ActionConst.WEB_ROOT_BEAN_REF, "");
} else {
execContext.put(ActionConst.WEB_ROOT_BEAN_REF, "/" + appName);
}
execContext.put(PagerWebConst.HTTP_REQUEST, request);
execContext.put(PagerWebConst.HTTP_RESPONSE, response);
execContext.put(PagerWebConst.HTTP_SESSION, request.getSession(true));
execContext.put(PagerWebConst.EXEC_CONTEXT, execContext);
// log.debug(((PropertyContainer)
// webApplicationContext.getBean("readOnlyProperties")).get("user.home"));
log.debug("nameSpace:" + nameSpace);
log.debug("Real Path:" + realPath);
log.debug("bean count:"
+ execContext.getApplicationContext().getBeanDefinitionCount());
for (String beanName : applicationContext.getBeanDefinitionNames()) {
log.debug("bean:" + beanName);
execContext.put(beanName, applicationContext.getBean(beanName));
}
execContext.addNamedMap(PagerWebConst.REQUEST_HEADERS, HttpSessionInfo.getRequestHeaders(request));
if (axelProps != null) {
PropsAction pa = new PropsAction();
pa.setFile(execContext.replace(axelProps));
pa.execute(execContext);
}
if (log.isInfoEnabled()) {
log.info("axelProps:" + axelProps);
log.info("ExecContext size:" + execContext.size());
}
return execContext;
}
public static SessionExecContext setupExecContext(
ServletContext servletContext) throws IOException,
FileUploadException {
ApplicationContext applicationContext = getApplicationContext(servletContext);
SessionExecContext execContext = (SessionExecContext) applicationContext
.getBean(ActionConst.EXEC_CONTEXT_BEAN_REF);
new CreateHandyParams(execContext);
new CreateUserParams(execContext);
// execContext.reset();
RequestExecContext.set(execContext);
// Make it available for the scope of this request.
execContext.setApplicationContext(applicationContext);
execContext.put(ActionConst.WEB_REAL_PATH_BEAN_REF, realPath);
execContext.put(ActionConst.PAGE_NAMESPACE_BEAN_REF, nameSpace);
// remove the leading slash/
execContext.put(PagerWebConst.EXEC_CONTEXT, execContext);
log.debug("nameSpace:" + nameSpace);
log.debug("Real Path:" + realPath);
log.debug("bean count:"
+ execContext.getApplicationContext().getBeanDefinitionCount());
for (String beanName : applicationContext.getBeanDefinitionNames()) {
log.debug("bean:" + beanName);
execContext.put(beanName, applicationContext.getBean(beanName));
}
if (axelProps != null) {
PropsAction pa = new PropsAction();
pa.setFile(execContext.replace(axelProps));
pa.execute(execContext);
}
if (log.isInfoEnabled()) {
log.info("axelProps:" + axelProps);
log.info("ExecContext size:" + execContext.size());
}
return execContext;
}
public void processPage(ServletRequest request, ServletResponse response, String page) throws ServletException, IOException {
IExecContext execContext = null;
if (response instanceof HttpServletResponse && request instanceof HttpServletRequest) {
try {
String defaultContextType = "text/html;charset=UTF-8";
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
execContext = setupExecContext(httpServletRequest, httpServletResponse);
String pageName = httpServletRequest.getServletPath();
if (log.isDebugEnabled()) {
log.debug("contextPath:" + httpServletRequest.getContextPath());
log.debug("URI:" + httpServletRequest.getRequestURI());
log.debug("root:" + realPath + " page:" + pageName + " wrapperPage:" + wrapperPage);
log.debug(HttpSessionInfo.sysInfo(httpServletRequest));
}
if (pageName.indexOf("axelconfig") > 0) {
PrintWriter out = response.getWriter();
out.print(buildInfo(httpServletRequest, httpServletResponse));
if (log.isDebugEnabled()) {
log.debug("pageName:{}",pageName);
log.debug(buildInfo(httpServletRequest, httpServletResponse));
}
out.close();
return;
}
if (! pageName.endsWith(".ajax")) {
String alternatePage = processPrePages(execContext, httpServletRequest, httpServletResponse);
if ("stop".equals(execContext.getString("pre.page.stop"))) {
execContext.put("pre.page.stop", "");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print(alternatePage);
out.close();
}
}
Action action;
if (pageName.endsWith(".ajax")) {
page = processAjaxCall(
httpServletRequest,
httpServletResponse,
pageName.substring(1, pageName.length() - ".ajax".length()),
execContext);
page = StrSubstitutor.replace(page, execContext);
} else if (pageName.endsWith(".bin") || pageName.endsWith(".pdfbin")) {
String pn = null;
if (pageName.endsWith(".pdfbin")) {
pn = pageName.substring(1, pageName.length() - ".pdfbin".length());
} else {
pn = pageName.substring(1, pageName.length() - ".bin".length());
}
page = processAjaxCall(httpServletRequest, httpServletResponse, pn, execContext);
if (page.startsWith("EX:")) {
PrintWriter out = response.getWriter();
out.print(page);
out.close();
} else {
byte[] image = (byte[]) execContext.get("image");
if (pageName.endsWith(".pdfbin")) {
String outputPdfFileName = execContext.getString("outputFileName");
String ex = serviceJasperPdfRequest(httpServletResponse, image, outputPdfFileName);
if (ex != null) {
PrintWriter out = response.getWriter();
out.print(page);
out.close();
}
return;
} else {
String responseType = execContext.getString("response_type");
if (StringUtils.isEmpty(responseType)) {
responseType = "image/png";
}
response.setContentType(responseType);
processPostPages(execContext, httpServletRequest,
httpServletResponse);
InputStream in = new ByteArrayInputStream(image);
OutputStream out = response.getOutputStream();
// Copy the contents of the file to the output
// stream
byte[] buf = new byte[1024];
int count = 0;
while ((count = in.read(buf)) >= 0) {
out.write(buf, 0, count);
}
in.close();
out.close();
}
return;
}
} else {
if (pageName.startsWith("/:")) {
String wrapperPageName = null;
int secondColon = pageName.indexOf(':', 2);
if (secondColon >= 0) {
wrapperPageName = pageName
.substring(2, secondColon);
execContext.put("inner_page",
"/" + pageName.substring(secondColon + 1));
} else {
if (StringUtils.isEmpty(wrapperPage)) {
throw new ServletException(
"No wrapper page set, why use :");
}
wrapperPageName = wrapperPage;
execContext.put("inner_page",
"/" + pageName.substring(2));
}
// insert the requested page into the wrapper page
action = new Action(realPath, wrapperPageName,
nameSpace);
} else {
if (StringUtils.isNotEmpty(wrapperPage)) {
// we have a base wrapper page defined
execContext.put("inner_page", "/" + pageName);
action = new Action(realPath, wrapperPage, nameSpace);
} else {
if (pageName.indexOf("show_axel_config")>=0) {
page = AxelConfig.getAxelConfig(execContext);
log.info(page);
page="Config Copied to Log";
action=null;
} else {
// if we don't have a wrapper page we show the requested page
action = new Action(realPath, pageName, nameSpace);
}
}
}
if (action != null) {
if (StringUtils.isNotEmpty(page)) {
page = action.processPage(execContext, page);
} else {
page = action.processPage(execContext);
}
}
}
log.debug("URI:" + httpServletRequest.getRequestURI());
// log.debug("page:" + page);
Object object = execContext.get(ActionConst.NO_STR_SUBST);
// log.debug(ActionConst.NO_STR_SUBST + ":[" + object + "]");
execContext.put(ActionConst.NO_STR_SUBST, null);
if (pageName.toLowerCase().endsWith("soap")) {
response.setContentType(IExecContext.CONTENT_TYPE_XML);
} else if (pageName.toLowerCase().endsWith("json")) {
response.setContentType(IExecContext.CONTENT_TYPE_JSON);
} else if (pageName.toLowerCase().endsWith(".js")) {
response.setContentType(IExecContext.CONTENT_TYPE_JS);
} else if (pageName.toLowerCase().endsWith(".css")) {
response.setContentType(IExecContext.CONTENT_TYPE_CSS);
} else {
response.setContentType(IExecContext.CONTENT_TYPE_HTML);
}
processPostPages(execContext, httpServletRequest,
httpServletResponse);
// = = =
// check if there is a contentType value stored in the execContext. This could have been set by one of the actions such as an action that wants to return a JSON data.
// = = =
String contentType = execContext.getString(IExecContext.CONTENT_TYPE_KEY);
if (StringUtils.isNotBlank(contentType)) {
response.setContentType(contentType);
// if (contentType.equals(IExecContext.CONTENT_TYPE_JSON) || contentType.equals(IExecContext.CONTENT_TYPE_XML)) {
// if (response instanceof HttpServletResponse) {
// ((HttpServletResponse)response).setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1
// ((HttpServletResponse)response).setHeader("Pragma", "no-cache"); // HTTP 1.0
// ((HttpServletResponse)response).setDateHeader("Expires", 0); // Proxies.
// }
// }
}
execContext.remove("content_type");
PrintWriter out = response.getWriter();
out.print(page);
out.close();
} catch (Throwable t) {
// TODO review this, use a better way for reporting the error.
log.info(t.getMessage(), t);
throw new ServletException(t);
} finally {
if (execContext != null) {
execContext.saveToPersistence();
RequestExecContext.remove();
}
}
} else {
String msg =
"Not processing page. Must be HttpServletRequest not ["
+ request.getClass().getName()
+ "] and HttpServletResponse not ["
+ response.getClass().getName() + "]";
log.info(msg);
throw new ServletException(msg);
}
}
private String processAjaxCall(HttpServletRequest request,
HttpServletResponse response, String pageName,
IExecContext execContext) {
try {
if (pageName.indexOf('/') >= 0) {
pageName = pageName.substring(pageName.lastIndexOf('/') + 1);
}
String xml = "<" + nameSpace + ":" + pageName + " />";
log.debug("processAjaxCall - pageName:" + pageName + " xml:" + xml);
Action action = new Action(realPath, null, nameSpace);
return action.processPage(execContext, xml);
} catch (Exception ex) {
return ("EX:" + ex.getMessage() + (ex.getCause() != null ? "\n"
+ ex.getCause() : ""));
}
}
/**
* Process a page from a filter chain.
*/
public void processPageFromFilter(ServletRequest request,
ServletResponse response, String page) throws ServletException,
IOException {
if (StringUtils.isEmpty(page)) {
return;
}
processPage(request, response, page);
}
private String processPrePages(IExecContext execContext,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws IOException,
NestedActionException, ClassNotFoundException,
InstantiationException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException, BadXMLException {
String page = null;
String pageName = prePage;
if (StringUtils.isNotEmpty(pageName)) {
Action action;
action = new Action(realPath, pageName, nameSpace);
page = action.processPage(execContext);
}
return page;
}
private void processPostPages(IExecContext execContext,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws IOException,
NestedActionException, ClassNotFoundException,
InstantiationException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException, BadXMLException {
String pageName = postPage;
if (StringUtils.isNotEmpty(pageName)) {
Action action;
action = new Action(realPath, pageName, nameSpace);
String page = action.processPage(execContext);
}
}
private String getAppName(String uri) {
if (uri.startsWith("/") && uri.indexOf('/', 1) > 0) {
String[] parts = uri.split("/");
return parts[1];
} else if (uri.startsWith("/") == false && uri.indexOf('/') > 0) {
String[] parts = uri.split("/");
return parts[0];
}
return uri;
}
private String serviceJasperPdfRequest(HttpServletResponse response,
byte[] pdfImage, String outputPdfFileName) {
InputStream inputStream = null;
OutputStream responseOutputStream = null;
try {
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename="
+ outputPdfFileName);
response.setContentLength(pdfImage.length);
inputStream = new ByteArrayInputStream(pdfImage);
responseOutputStream = response.getOutputStream();
int bytes;
while ((bytes = inputStream.read()) != -1) {
responseOutputStream.write(bytes);
}
} catch (Exception ex) {
return ("EX:" + ex.getMessage());
} finally {
IOUtils.closeQuietly(inputStream);
// IOUtils.closeQuietly(responseOutputStream);
}
return null;
}
private String buildInfo(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
StringBuilder page = new StringBuilder();
page.append("");
File cd = new File("");
page.append("cd:" + cd.getAbsolutePath() + " ");
page.append("contextPath:" + httpServletRequest.getContextPath() + " ");
page.append("URI:" + httpServletRequest.getRequestURI() + " ");
page.append("root:" + realPath + " wrapperPage:" + wrapperPage + " ");
page.append("" + HttpSessionInfo.sysInfo(httpServletRequest) + "
");
page.append("");
return page.toString();
}
public static void setNamespace(String namespace) {
nameSpace = namespace;
}
public static void setRealPath(String _realPath) {
realPath = _realPath;
}
/**
* If we set this then the execContext will load properties from this file.
*
* The loaded uses apache configuration so can use include to load other property files.
* @param fileName
*/
public static void setAxelProps(String fileName) {
axelProps = fileName;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy