/**
* This file is part of PaxmlWeb.
*
* PaxmlWeb is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PaxmlWeb is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with PaxmlWeb. If not, see <http://www.gnu.org/licenses/>.
*/
package org.paxml.web;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.LinkedHashSet;
import java.util.Set;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.paxml.core.EntityFactoryRegistry;
import org.paxml.core.PaxmlResource;
import org.paxml.launch.LaunchModelBuilder;
import org.paxml.launch.PaxmlRunner;
import org.paxml.launch.StaticConfig;
/**
* Servlet that renders paxml execution result as HTML response or serve static
* content if not found as paxml.
*
* @author Xuetao Niu
*
*/
public class PaxmlServlet extends GenericServlet {
public static final String CONFIG_TAG_LIB = "tagLibrary";
public static final String CONFIG_PAXML_DIR = "paxmlDir";
public static final String CONFIG_RES_DIR = "resourceDir";
public static final String CONFIG_VALUE_SEP = "," + File.pathSeparator;
static {
EntityFactoryRegistry.getDefaultRegistry().register(new PageFactory());
}
private final StaticConfig config = new StaticConfig();
private final Set<File> resources = new LinkedHashSet<File>();
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse rsp = (HttpServletResponse) response;
String uri = StringUtils.substringBefore(req.getRequestURI(), "?");
String fn = FilenameUtils.getName(uri);
String bn = FilenameUtils.getBaseName(fn);
boolean found = false;
for (PaxmlResource res : config.getResources()) {
if (bn.equals(res.getName())) {
found = true;
break;
}
}
if (found) {
Object result = PaxmlRunner.run(bn, req.getParameterMap(), config);
if (result != null) {
rsp.setHeader("Content-Type", "text/html; charset=UTF-8");
rsp.getWriter().print(new HtmlBuilder(result).build());
}
return;
}
for (File dir : resources) {
File f = new File(dir, uri);
if (f.isFile()) {
FileInputStream in = new FileInputStream(f);
try {
IOUtils.copy(in, rsp.getOutputStream());
return;
} finally {
IOUtils.closeQuietly(in);
}
}
}
rsp.sendError(404);
}
@Override
public void init(ServletConfig c) throws ServletException {
try {
String tagLibs = c.getInitParameter(CONFIG_TAG_LIB);
if (tagLibs != null) {
for (String lib : StringUtils.split(tagLibs, CONFIG_VALUE_SEP)) {
Class clazz = Class.forName(lib.trim());
config.getTagLibs().add(clazz);
}
}
String paxmlDir = c.getInitParameter(CONFIG_PAXML_DIR);
if (paxmlDir != null) {
for (String dir : StringUtils.split(paxmlDir, CONFIG_VALUE_SEP)) {
dir = dir.trim();
if (!dir.isEmpty()) {
config.getResources().addAll(LaunchModelBuilder.findResources(dir, null, null));
}
}
} else {
config.getResources().addAll(LaunchModelBuilder.findResources(new File(".").getAbsolutePath(), null, null));
}
String resDir = c.getInitParameter(CONFIG_PAXML_DIR);
if (resDir != null) {
for (String dir : StringUtils.split(resDir, CONFIG_VALUE_SEP)) {
dir = dir.trim();
if (!dir.isEmpty()) {
resources.add(new File(dir));
}
}
} else {
resources.add(new File("."));
}
} catch (Exception e) {
throw new ServletException("Cannot init paxml servlet", e);
}
}
}