package uk.ac.imperial.lsds.seepmaster.ui.web;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.imperial.lsds.seepmaster.infrastructure.master.InfrastructureManager;
import uk.ac.imperial.lsds.seepmaster.query.GenericQueryManager;
public class WebUIHandler extends HttpServlet {
final private static Logger LOG = LoggerFactory.getLogger(WebUIHandler.class);
private static final long serialVersionUID = 1L;
private final int MAX_MEMORY_SIZE_TO_HOLD_FILE = 1024 * 1024 * 100; // 100 MB
private final int MAX_UPLOAD_SIZE_TO_HOLD_FILE = 1024 * 1024 * 100; // 100 MB
private GenericQueryManager qm;
private InfrastructureManager inf;
private String pathToJar;
private String definitionClass;
private String[] queryArgs;
private String composeMethod;
public WebUIHandler(GenericQueryManager qm, InfrastructureManager inf){
this.qm = qm;
this.inf = inf;
}
@Override
public void init(){
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Get parameter map
Map<String, String[]> parameters = request.getParameterMap();
String[] actionIdValues = parameters.get("actionid");
int actionId = Integer.valueOf(actionIdValues[0]);
boolean success = handleAction(actionId);
if(!success){
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.sendRedirect("fail.html");
}
else{
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.sendRedirect("ok.html");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
boolean success = false;
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// sanity check
if(!isMultipart){
success = false;
}
else{
List<FileItem> items = handleFileUploadForm(request);
success = this.handleFileItems(items);
}
if(!success){
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.sendRedirect("fail.html");
}
else{
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.sendRedirect("ok.html");
}
}
private boolean handleFileItems(List<FileItem> items){
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
if (item.isFormField()) {
String name = item.getFieldName();
if(name.equals("baseclass")){
definitionClass = item.getString();
}
}
else {
pathToJar = processUploadedFile(item);
}
}
short queryType = 0; // FIXME: allow to specify query type here as well
return qm.loadQueryFromFile(queryType, pathToJar, definitionClass, new String[]{}, "compose");
}
private String processUploadedFile(FileItem item){
File uploadedFile = new File("queryfile_viaweb.jar");
try {
item.write(uploadedFile);
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return uploadedFile.getAbsolutePath();
}
private List<FileItem> handleFileUploadForm(HttpServletRequest request){
List<FileItem> items = null;
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(MAX_MEMORY_SIZE_TO_HOLD_FILE);
// Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(MAX_UPLOAD_SIZE_TO_HOLD_FILE);
// Parse the request
try {
items = upload.parseRequest(request);
}
catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return items;
}
private boolean handleAction(int action){
boolean allowed = false;
switch(action){
case 1:
LOG.info("Deploying query to nodes...");
allowed = qm.deployQueryToNodes();
if(!allowed){
LOG.warn("Could not deploy query");
}
else{
LOG.info("Deploying query to nodes...OK");
}
return allowed;
case 2:
LOG.info("Starting query...");
allowed = qm.startQuery();
if(!allowed){
LOG.warn("Could not start query");
}
else{
LOG.info("Starting query...OK");
}
return allowed;
case 3:
LOG.info("Stopping query...");
allowed = qm.stopQuery();
if(!allowed){
LOG.warn("Could not stop query");
}
else{
LOG.info("Stopping query...OK");
}
return allowed;
case 4:
LOG.info("Exit");
return true;
default:
}
return false;
}
}