package edu.pdx.cs410J.family;
import edu.pdx.cs410J.family.web.FamilyTreeManager;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.List;
/**
* A servlet that uploads a family tree XML file and stores it in the session.
*/
public class FamilyTreeUploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
PrintWriter pw = response.getWriter();
if (ServletFileUpload.isMultipartContent(request)) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items;
try {
items = upload.parseRequest(request);
} catch (FileUploadException ex) {
throw new ServletException("Could not upload file", ex);
}
FileItem file = null;
for (FileItem item : items) {
if (!item.isFormField()) {
if (file != null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Only one file can be uploaded");
return;
} else {
file = item;
}
}
}
if (file == null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No file specified");
return;
}
XmlParser parser = new XmlParser(new InputStreamReader(file.getInputStream()));
pw.println("Uploading " + file.getName());
FamilyTree tree;
try {
tree = parser.parse();
} catch (FamilyTreeException ex) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Couldn't parse " + file.getName());
return;
}
FamilyTreeManager.setFamilyTree(tree, request);
pw.println("Uploaded " + file.getName());
} else {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No files specified");
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
PrintWriter pw = response.getWriter();
FamilyTree tree = FamilyTreeManager.getFamilyTree(request);
if (tree == null) {
pw.println("No tree has been uploaded");
} else {
TextDumper dumper = new TextDumper(pw);
dumper.dump(tree);
}
}
}