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.net.MalformedURLException;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Properties; import java.util.Properties;
import javax.servlet.RequestDispatcher; import javax.servlet.RequestDispatcher;
@ -25,8 +21,6 @@ import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException; 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.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.joda.time.DateTime; 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.IndividualDao;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.filestorage.uploadrequest.FileUploadServletRequest;
import fedora.client.FedoraClient; import fedora.client.FedoraClient;
import fedora.common.Constants; import fedora.common.Constants;
import fedora.server.management.FedoraAPIM; import fedora.server.management.FedoraAPIM;
@ -223,51 +218,18 @@ public class FedoraDatastreamController extends VitroHttpServlet implements Cons
} }
} }
public void doPost(HttpServletRequest req, HttpServletResponse res) public void doPost(HttpServletRequest rawRequest, HttpServletResponse res)
throws ServletException,IOException { throws ServletException,IOException {
try{ try{
/* the post parameters seem to get consumed by the parsing so we have to FileUploadServletRequest req = null;
* make a copy. */ try {
boolean isMultipart = ServletFileUpload.isMultipartContent(req); req = FileUploadServletRequest
if (!isMultipart) .parseRequest(rawRequest, maxFileSize);
throw new FdcException("Must POST a multipart encoded request");
Iterator<FileItem> iter;
try { iter = getFileItemIterator(req);
} catch (FileUploadException e) { } catch (FileUploadException e) {
e.printStackTrace(); throw new FdcException("Size limit exceeded: " + e.getLocalizedMessage());
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);
}
} }
if (!req.isMultipart()) {
throw new FdcException("Must POST a multipart encoded request");
} }
//check if fedora is on line //check if fedora is on line
@ -296,23 +258,12 @@ public class FedoraDatastreamController extends VitroHttpServlet implements Cons
} }
//get the parameters from the request //get the parameters from the request
String pId=null; String pId=req.getParameter("pid");
if( queryParameters.containsKey("pid") && queryParameters.get("pid") != null && String dsId=req.getParameter("dsid");
queryParameters.get("pid").size() > 0 ){ String fileUri=req.getParameter("fileUri");
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);
}
boolean useNewName=false; boolean useNewName=false;
if( "true".equals(queryParameters.get("useNewName"))){ if( "true".equals(req.getParameter("useNewName"))){
useNewName = true; useNewName = true;
} }
if( pId == null || pId.length() == 0 ) 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 " + throw new FdcException("Your form submission did not contain " +
"enough information to complete your request.(Missing fileUri parameter)"); "enough information to complete your request.(Missing fileUri parameter)");
FileItem fileRes = null; FileItem fileRes = req.getFileItem("fileRes");
if( fileStreams.containsKey("fileRes") && fileStreams.get("fileRes").size()>0)
fileRes = fileStreams.get("fileRes").get(0);
if( fileRes == null ) if( fileRes == null )
throw new FdcException("Your form submission did not contain " + throw new FdcException("Your form submission did not contain " +
"enough information to complete your request.(Missing fileRes)"); "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); RequestDispatcher rd = req.getRequestDispatcher(Controllers.BASIC_JSP);
rd.forward(req, res); rd.forward(req, res);
}catch(FdcException ex){ }catch(FdcException ex){
req.setAttribute("errors", ex.getMessage()); rawRequest.setAttribute("errors", ex.getMessage());
RequestDispatcher rd = req.getRequestDispatcher("/edit/fileUploadError.jsp"); RequestDispatcher rd = rawRequest.getRequestDispatcher("/edit/fileUploadError.jsp");
rd.forward(req, res); rd.forward(rawRequest, res);
return; 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 = private static final String RELOAD_MSG =
"<p>The fedora configuartion file will be reloaded if " + "<p>The fedora configuartion file will be reloaded if " +
"you edit the properties file and check the status.</p>\n"; "you edit the properties file and check the status.</p>\n";