TestFileController.java: file upload system works

This commit is contained in:
mbarbier 2011-04-25 15:48:10 +00:00
parent 0930811696
commit d5b99279c9

View file

@ -11,18 +11,20 @@ import java.util.Map;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.skife.csv.SimpleReader;
import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ExceptionResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ExceptionResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
import edu.cornell.mannlib.vitro.webapp.filestorage.backend.FileStorageSetup;
import edu.cornell.mannlib.vitro.webapp.filestorage.uploadrequest.FileUploadServletRequest; import edu.cornell.mannlib.vitro.webapp.filestorage.uploadrequest.FileUploadServletRequest;
public class TestFileController extends FreemarkerHttpServlet { public class TestFileController extends FreemarkerHttpServlet {
@ -49,6 +51,7 @@ public class TestFileController extends FreemarkerHttpServlet {
return "VIVO Harvester Test"; return "VIVO Harvester Test";
} }
@Override @Override
public void doPost(HttpServletRequest request, HttpServletResponse response) public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException { throws IOException, ServletException {
@ -57,22 +60,49 @@ public class TestFileController extends FreemarkerHttpServlet {
FileUploadServletRequest req = FileUploadServletRequest.parseRequest(request, maxFileSize); FileUploadServletRequest req = FileUploadServletRequest.parseRequest(request, maxFileSize);
if(req.hasFileUploadException()) { if(req.hasFileUploadException()) {
//todo: complete Exception e = req.getFileUploadException();
log.error(e, e);
return;
} }
Map<String, List<FileItem>> fileStreams = req.getFiles(); Map<String, List<FileItem>> fileStreams = req.getFiles();
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
String path = ""; //todo: complete String vitroHomeDirectoryName = ConfigurationProperties.getBean(request.getSession().getServletContext()).getProperty(FileStorageSetup.PROPERTY_VITRO_HOME_DIR);
if (vitroHomeDirectoryName == null) {
log.error("Vitro home directory name could not be found.");
return;
}
String pathBase = vitroHomeDirectoryName + "/" + FileStorageSetup.FILE_STORAGE_SUBDIRECTORY + "/harvester/";
String path = pathBase + getSessionId(request) + "/";
File directory = new File(path);
String firstUpload = req.getParameter("firstUpload"); //clear directory on first upload
if(firstUpload.toLowerCase().equals("true")) {
if(directory.exists()) {
File[] children = directory.listFiles();
for(File child : children) {
child.delete();
}
}
}
if(!directory.exists())
directory.mkdirs();
if(fileStreams.get("csvFile") != null && fileStreams.get("csvFile").size() > 0) { if(fileStreams.get("csvFile") != null && fileStreams.get("csvFile").size() > 0) {
FileItem csvStream = fileStreams.get("csvFile").get(0); FileItem csvStream = fileStreams.get("csvFile").get(0);
String name = csvStream.getName(); String name = csvStream.getName();
name = handleNameCollision(path, name, directory);
File file = new File(path + name); File file = new File(path + name);
try { try {
csvStream.write(file); csvStream.write(file);
} catch (Exception e) { } catch (Exception e) {
//todo: handle log.error(e, e);
return;
} finally { } finally {
csvStream.delete(); csvStream.delete();
} }
@ -81,7 +111,7 @@ public class TestFileController extends FreemarkerHttpServlet {
boolean success; boolean success;
if(errorMessage != null) { if(errorMessage != null) {
success = false; success = false;
//todo: handle file.delete();
} else { } else {
success = true; success = true;
errorMessage = "success"; errorMessage = "success";
@ -89,30 +119,90 @@ public class TestFileController extends FreemarkerHttpServlet {
try { try {
//todo: complete
json.put("success", success); json.put("success", success);
json.put("fileName", name); json.put("fileName", name);
json.put("errorMessage", errorMessage); json.put("errorMessage", errorMessage);
} }
catch(JSONException e) { catch(JSONException e) {
//todo: handle log.error(e, e);
return;
} }
} else { } else {
try { try {
json.put("success", false); json.put("success", false);
json.put("fileName", "(none)");
json.put("errorMessage", "No file uploaded"); json.put("errorMessage", "No file uploaded");
} catch(JSONException e) { } catch(JSONException e) {
//todo: handle log.error(e, e);
return;
} }
} }
response.getWriter().write(json.toString()); response.getWriter().write(json.toString());
} }
private String handleNameCollision(String path, String filename, File directory) {
String base = filename;
String extension = "";
if(filename.contains(".")) {
base = filename.substring(0, filename.lastIndexOf("."));
extension = filename.substring(filename.indexOf("."));
}
String renamed = filename;
for(int i = 1; new File(path + renamed).exists(); i++) {
renamed = base + " (" + String.valueOf(i) + ")" + extension;
}
return renamed;
}
private String validateCsvFile(File file)
{ private String getSessionId(HttpServletRequest request) {
return request.getSession().getId();
}
private String validateCsvFile(File file) {
try {
SimpleReader reader = new SimpleReader();
List csv = reader.parse(file);
int length = csv.size();
if(length == 0)
return "No data in file";
for(int i = 0; i < length; i++) {
String[] line = (String[])csv.get(i);
if(i == 0) {
String errorMessage = validateCsvFirstLine(line);
if(errorMessage != null)
return errorMessage;
}
else if(line.length != 0) {
if(line.length != 2)
return "Mismatch in number of entries in row " + i;
}
}
} catch (IOException e) {
log.error(e, e);
return e.getMessage();
}
return null;
}
private String validateCsvFirstLine(String[] line) {
String errorMessage = "File header does not match specification";
if(line.length != 2)
return errorMessage;
if(!line[0].equals("firstName"))
return errorMessage;
if(!line[1].equals("lastName"))
return errorMessage;
return null; return null;
} }