NIHVIVO-160 Rewrite FedoraDatastreamController to use the FileUploadServletRequest.

This commit is contained in:
jeb228 2010-06-01 16:54:28 +00:00
parent 77f9fd2d30
commit f584aebbd5

View file

@ -9,11 +9,7 @@ import java.io.InputStream;
import java.net.MalformedURLException;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.servlet.RequestDispatcher;
@ -25,8 +21,6 @@ import javax.servlet.http.HttpSession;
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.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.DateTime;
@ -51,6 +45,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.filestorage.uploadrequest.FileUploadServletRequest;
import fedora.client.FedoraClient;
import fedora.common.Constants;
import fedora.server.management.FedoraAPIM;
@ -223,53 +218,20 @@ public class FedoraDatastreamController extends VitroHttpServlet implements Cons
}
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
public void doPost(HttpServletRequest rawRequest, HttpServletResponse res)
throws ServletException,IOException {
try{
/* the post parameters seem to get consumed by the parsing so we have to
* make a copy. */
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
if (!isMultipart)
throw new FdcException("Must POST a multipart encoded request");
Iterator<FileItem> iter;
try { iter = getFileItemIterator(req);
} catch (FileUploadException e) {
e.printStackTrace();
throw new FdcException("There was an error processing the " +
"parameters of your request.");
}
// get files or parameter values
Map<String, List<String>> queryParameters =new HashMap<String, List<String>>();
Map<String, List<FileItem>> fileStreams = new HashMap<String, List<FileItem>>();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
String name = item.getFieldName();
if (item.isFormField()) {
if (queryParameters.containsKey(name)) {
String value = item.getString("UTF-8");
queryParameters.get(name).add(value);
} else {
List<String> valueList = new ArrayList<String>(1);
String value = item.getString("UTF-8");
valueList.add(value);
queryParameters.put(name, valueList);
}
} else {
if (fileStreams.containsKey(name)) {
fileStreams.get(name).add(item);
log.debug("File in multipart content request: field "
+ name + " with file name " + item.getName()
+ " detected.");
} else {
List<FileItem> itemList = new ArrayList<FileItem>();
itemList.add(item);
fileStreams.put(name, itemList);
}
}
}
FileUploadServletRequest req = null;
try {
req = FileUploadServletRequest
.parseRequest(rawRequest, maxFileSize);
} catch (FileUploadException e) {
throw new FdcException("Size limit exceeded: " + e.getLocalizedMessage());
}
if (!req.isMultipart()) {
throw new FdcException("Must POST a multipart encoded request");
}
//check if fedora is on line
OntModel sessionOntModel = (OntModel)req.getSession().getAttribute("jenaOntModel");
synchronized (FedoraDatastreamController.class) {
@ -296,23 +258,12 @@ public class FedoraDatastreamController extends VitroHttpServlet implements Cons
}
//get the parameters from the request
String pId=null;
if( queryParameters.containsKey("pid") && queryParameters.get("pid") != null &&
queryParameters.get("pid").size() > 0 ){
pId = queryParameters.get("pid").get(0);
}
String dsId=null;
if( queryParameters.containsKey("dsid") && queryParameters.get("dsid") != null &&
queryParameters.get("dsid").size() > 0 ){
dsId = queryParameters.get("dsid").get(0);
}
String fileUri=null;
if( queryParameters.containsKey("fileUri") && queryParameters.get("fileUri") != null &&
queryParameters.get("fileUri").size() > 0 ){
fileUri = queryParameters.get("fileUri").get(0);
}
String pId=req.getParameter("pid");
String dsId=req.getParameter("dsid");
String fileUri=req.getParameter("fileUri");
boolean useNewName=false;
if( "true".equals(queryParameters.get("useNewName"))){
if( "true".equals(req.getParameter("useNewName"))){
useNewName = true;
}
if( pId == null || pId.length() == 0 )
@ -325,9 +276,7 @@ public class FedoraDatastreamController extends VitroHttpServlet implements Cons
throw new FdcException("Your form submission did not contain " +
"enough information to complete your request.(Missing fileUri parameter)");
FileItem fileRes = null;
if( fileStreams.containsKey("fileRes") && fileStreams.get("fileRes").size()>0)
fileRes = fileStreams.get("fileRes").get(0);
FileItem fileRes = req.getFileItem("fileRes");
if( fileRes == null )
throw new FdcException("Your form submission did not contain " +
"enough information to complete your request.(Missing fileRes)");
@ -517,9 +466,9 @@ public class FedoraDatastreamController extends VitroHttpServlet implements Cons
RequestDispatcher rd = req.getRequestDispatcher(Controllers.BASIC_JSP);
rd.forward(req, res);
}catch(FdcException ex){
req.setAttribute("errors", ex.getMessage());
RequestDispatcher rd = req.getRequestDispatcher("/edit/fileUploadError.jsp");
rd.forward(req, res);
rawRequest.setAttribute("errors", ex.getMessage());
RequestDispatcher rd = rawRequest.getRequestDispatcher("/edit/fileUploadError.jsp");
rd.forward(rawRequest, res);
return;
}
}
@ -729,19 +678,6 @@ public class FedoraDatastreamController extends VitroHttpServlet implements Cons
}
};
private Iterator<FileItem> getFileItemIterator(HttpServletRequest request)
throws FileUploadException {
//Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(maxFileSize);
factory.setRepository(new File(baseDirectoryForFiles));
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(maxFileSize);
return upload.parseRequest(request).iterator();
}
private static final String RELOAD_MSG =
"<p>The fedora configuartion file will be reloaded if " +
"you edit the properties file and check the status.</p>\n";