package de.saumya.mojo.proxy;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import de.saumya.mojo.proxy.Controller.FileLocation;
public class ControllerServlet extends HttpServlet {
private static final long serialVersionUID = -1377408089637782007L;
private Controller controller;
@Override
public void init() throws ServletException {
super.init();
this.controller = (Controller) getServletContext().getAttribute(Controller.class.getName());
}
@Override
protected void doGet(final HttpServletRequest req,
final HttpServletResponse resp) throws ServletException,
IOException {
FileLocation file = controller.locate(req.getPathInfo().substring(1));
switch(file.type){
case NOT_FOUND:
resp.sendError(HttpServletResponse.SC_NOT_FOUND, file.content);
break;
case XML_CONTENT:
resp.setContentType("application/xml");
resp.setCharacterEncoding("utf-8");
resp.setHeader("Vary", "Accept");
write(resp, file.content);
break;
case XML_FILE:
resp.setContentType("application/xml");
resp.setCharacterEncoding("utf-8");
resp.setHeader("Vary", "Accept");
write(resp, file.localFile);
break;
case HTML_CONTENT:
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.setHeader("Vary", "Accept");
write(resp, file.content);
break;
case ASCII_FILE:
resp.setContentType("text/plain");
resp.setCharacterEncoding("ASCII");
write(resp, file.localFile);
break;
case ASCII_CONTENT:
resp.setContentType("text/plain");
resp.setCharacterEncoding("ASCII");
write(resp, file.content);
break;
case REDIRECT_TO_DIRECTORY:
resp.sendRedirect(req.getRequestURI() + "/");
break;
case REDIRECT:
resp.sendRedirect(file.remoteUrl.toString());
break;
case TEMP_UNAVAILABLE:
resp.setHeader("Retry-After", "120");//seconds
resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, file.content);
break;
default:
resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Completely unhandleable request!");
}
}
private void write(HttpServletResponse resp, File localFile) throws IOException {
OutputStream output = resp.getOutputStream();
InputStream input = null;
try {
input = new BufferedInputStream(new FileInputStream(localFile));
int c = input.read();
while(c != -1){
output.write(c);
c = input.read();
}
}
finally {
output.flush();
if(input != null){
input.close();
}
}
}
private void write(HttpServletResponse resp, String content) throws IOException {
PrintWriter writer = resp.getWriter();
writer.append(content);
writer.flush();
}
}