com.github.jerryxia.devhelper.requestcapture.support.servlet.AbstractResourceServlet Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of devhelper Show documentation
Show all versions of devhelper Show documentation
This is a helper tool library in developing or testing java web application.
package com.github.jerryxia.devhelper.requestcapture.support.servlet;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author guqiankun
*
*/
@SuppressWarnings("serial")
public abstract class AbstractResourceServlet extends HttpServlet {
public final static int DEFAULT_BUFFER_SIZE = 1024 * 4;
protected final String resourcePath;
public AbstractResourceServlet(String resourcePath) {
this.resourcePath = resourcePath;
}
protected String getFilePath(String fileName) {
return resourcePath + fileName;
}
protected void returnResourceFile(String fileName, String uri, HttpServletResponse response)
throws ServletException, IOException {
String filePath = getFilePath(fileName);
if (filePath.endsWith(".html")) {
response.setContentType("text/html;charset=utf-8");
}
if (fileName.endsWith(".jpg")) {
byte[] bytes = readByteArrayFromResource(filePath);
if (bytes != null) {
response.getOutputStream().write(bytes);
}
return;
}
String text = readFromResource(filePath);
if (text == null) {
response.sendRedirect(uri + "/index.html");
return;
}
if (fileName.endsWith(".css")) {
response.setContentType("text/css;charset=utf-8");
} else if (fileName.endsWith(".js")) {
response.setContentType("text/javascript;charset=utf-8");
}
response.getWriter().write(text);
}
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String contextPath = request.getContextPath();
String servletPath = request.getServletPath();
String requestURI = request.getRequestURI();
response.setCharacterEncoding("utf-8");
if (contextPath == null) {
// root context
contextPath = "";
}
String uri = contextPath + servletPath;
String path = requestURI.substring(contextPath.length() + servletPath.length());
if ("".equals(path)) {
if ("".equals(contextPath) || "/".equals(contextPath)) {
response.sendRedirect("/requestcapture/index.html");
} else {
response.sendRedirect("requestcapture/index.html");
}
return;
}
if ("/".equals(path)) {
response.sendRedirect("index.html");
return;
}
if (path.contains(".json")) {
String fullUrl = path;
if (request.getQueryString() != null && request.getQueryString().length() > 0) {
fullUrl += "?" + request.getQueryString();
}
response.setContentType("application/json;charset=utf-8");
response.getWriter().print(process(fullUrl));
return;
}
// find file in resources path
returnResourceFile(path, uri, response);
}
/**
* 处理请求
*
* @param url
* @return
*/
protected abstract String process(String url);
private byte[] readByteArrayFromResource(String resource) throws IOException {
InputStream in = null;
try {
in = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);
if (in == null) {
return null;
}
return readByteArray(in);
} finally {
close(in);
}
}
private byte[] readByteArray(InputStream input) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
copy(input, output);
return output.toByteArray();
}
private final int EOF = -1;
private long copy(InputStream input, OutputStream output) throws IOException {
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
long count = 0;
int n = 0;
while (EOF != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
private String readFromResource(String resource) throws IOException {
InputStream in = null;
try {
in = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);
if (in == null) {
in = AbstractResourceServlet.class.getResourceAsStream(resource);
}
if (in == null) {
return null;
}
String text = read(in);
return text;
} finally {
close(in);
}
}
private String read(InputStream in) {
InputStreamReader reader;
try {
reader = new InputStreamReader(in, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException(e.getMessage(), e);
}
return read(reader);
}
private String read(Reader reader) {
try {
StringWriter writer = new StringWriter();
char[] buffer = new char[DEFAULT_BUFFER_SIZE];
int n = 0;
while (-1 != (n = reader.read(buffer))) {
writer.write(buffer, 0, n);
}
return writer.toString();
} catch (IOException ex) {
throw new IllegalStateException("read error", ex);
}
}
private void close(Closeable x) {
if (x == null) {
return;
}
try {
x.close();
} catch (Exception e) {
// LOG.debug("close error", e);
}
}
}