/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.app.webui.servlet; import java.io.*; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.ResourceBundle; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.webui.util.JSPManager; import org.dspace.app.webui.util.FileUploadRequest; import org.dspace.app.itemimport.BTEBatchImportService; import org.dspace.app.itemimport.ItemImport; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.core.*; import org.dspace.utils.DSpace; /** * Servlet to batch import metadata via the BTE * * @author Stuart Lewis */ public class BatchImportServlet extends DSpaceServlet { /** log4j category */ private static Logger log = Logger.getLogger(BatchImportServlet.class); /** * Respond to a post request for metadata bulk importing via csv * * @param context a DSpace Context object * @param request the HTTP request * @param response the HTTP response * * @throws ServletException * @throws IOException * @throws SQLException * @throws AuthorizeException */ protected void doDSPost(Context context, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException, AuthorizeException { // First, see if we have a multipart request (uploading a metadata file) String contentType = request.getContentType(); if ((contentType != null) && (contentType.indexOf("multipart/form-data") != -1)) { String message = null; // Process the file uploaded try { // Wrap multipart request to get the submission info FileUploadRequest wrapper = new FileUploadRequest(request); String inputType = wrapper.getParameter("inputType"); List<String> reqCollectionsTmp = getRepeatedParameter(wrapper, "collections", "collections"); String[] reqCollections = new String[reqCollectionsTmp.size()]; reqCollectionsTmp.toArray(reqCollections); //Get all collections List<Collection> collections = null; String colIdS = wrapper.getParameter("colId"); if (colIdS!=null){ collections = new ArrayList<Collection>(); collections.add(Collection.find(context, Integer.parseInt(colIdS))); } else { collections = Arrays.asList(Collection.findAll(context)); } request.setAttribute("collections", collections); Collection owningCollection = null; if (wrapper.getParameter("collection") != null) { int colId = Integer.parseInt(wrapper.getParameter("collection")); if (colId > 0) owningCollection = Collection.find(context, colId); } //Get all the possible data loaders from the Spring configuration BTEBatchImportService dls = new DSpace().getSingletonService(BTEBatchImportService.class); List<String> inputTypes =dls.getFileDataLoaders(); request.setAttribute("input-types", inputTypes); if (reqCollectionsTmp!=null) request.setAttribute("otherCollections", reqCollectionsTmp); if (owningCollection!=null) request.setAttribute("owningCollection", owningCollection.getID()); request.setAttribute("inputType", inputType); File f = null; String zipurl = null; if (inputType.equals("saf")){ zipurl = wrapper.getParameter("zipurl"); if (StringUtils.isEmpty(zipurl)) { request.setAttribute("has-error", "true"); Locale locale = request.getLocale(); ResourceBundle msgs = ResourceBundle.getBundle("Messages", locale); try { message = msgs.getString("jsp.layout.navbar-admin.batchimport.fileurlempty"); } catch (Exception e) { message = "???jsp.layout.navbar-admin.batchimport.fileurlempty???"; } request.setAttribute("message", message); JSPManager.showJSP(request, response, "/dspace-admin/batchimport.jsp"); return; } } else { f = wrapper.getFile("file"); if (f == null) { request.setAttribute("has-error", "true"); Locale locale = request.getLocale(); ResourceBundle msgs = ResourceBundle.getBundle("Messages", locale); try { message = msgs.getString("jsp.layout.navbar-admin.batchimport.fileempty"); } catch (Exception e) { message = "???jsp.layout.navbar-admin.batchimport.fileempty???"; } request.setAttribute("message", message); JSPManager.showJSP(request, response, "/dspace-admin/batchimport.jsp"); return; } else if (owningCollection==null){ request.setAttribute("has-error", "true"); Locale locale = request.getLocale(); ResourceBundle msgs = ResourceBundle.getBundle("Messages", locale); try { message = msgs.getString("jsp.layout.navbar-admin.batchimport.owningcollectionempty"); } catch (Exception e) { message = "???jsp.layout.navbar-admin.batchimport.owningcollectionempty???"; } request.setAttribute("message", message); JSPManager.showJSP(request, response, "/dspace-admin/batchimport.jsp"); return; } } String uploadId = wrapper.getParameter("uploadId"); if (uploadId != null){ request.setAttribute("uploadId", uploadId); } if (owningCollection==null && reqCollections != null && reqCollections.length > 0){ request.setAttribute("has-error", "true"); Locale locale = request.getLocale(); ResourceBundle msgs = ResourceBundle.getBundle("Messages", locale); String ms = msgs.getString("jsp.layout.navbar-admin.batchimport.owningcollection"); if (ms == null){ ms = "???jsp.layout.navbar-admin.batchimport.owningcollection???"; } request.setAttribute("message", ms); JSPManager.showJSP(request, response, "/dspace-admin/batchimport.jsp"); return; } try { String finalInputType = "saf"; String filePath = zipurl; if (f!=null){ finalInputType = inputType; filePath = f.getAbsolutePath(); } ItemImport.processUIImport(filePath, owningCollection, reqCollections, uploadId, finalInputType, context); request.setAttribute("has-error", "false"); request.setAttribute("uploadId", null); } catch (Exception e) { request.setAttribute("has-error", "true"); message = e.getMessage(); e.printStackTrace(); } } catch (FileSizeLimitExceededException e) { request.setAttribute("has-error", "true"); message = e.getMessage(); e.printStackTrace(); } catch (Exception e) { request.setAttribute("has-error", "true"); message = e.getMessage(); e.printStackTrace(); } request.setAttribute("message", message); // Show the upload screen JSPManager.showJSP(request, response, "/dspace-admin/batchimport.jsp"); } else { request.setAttribute("has-error", "true"); // Show the upload screen JSPManager.showJSP(request, response, "/dspace-admin/batchimport.jsp"); } } /** * GET request is only ever used to show the upload form * * @param context * a DSpace Context object * @param request * the HTTP request * @param response * the HTTP response * * @throws ServletException * @throws IOException * @throws SQLException * @throws AuthorizeException */ protected void doDSGet(Context context, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException, AuthorizeException { //Get all collections List<Collection> collections = null; String colIdS = request.getParameter("colId"); if (colIdS!=null){ collections = new ArrayList<Collection>(); collections.add(Collection.find(context, Integer.parseInt(colIdS))); } else { collections = Arrays.asList(Collection.findAll(context)); } request.setAttribute("collections", collections); //Get all the possible data loaders from the Spring configuration BTEBatchImportService dls = new DSpace().getSingletonService(BTEBatchImportService.class); List<String> inputTypes = dls.getFileDataLoaders(); request.setAttribute("input-types", inputTypes); // Show the upload screen JSPManager.showJSP(request, response, "/dspace-admin/batchimport.jsp"); } /** * Get repeated values from a form. If "foo" is passed in as the parameter, * values in the form of parameters "foo", "foo_1", "foo_2", etc. are * returned. * <P> * This method can also handle "composite fields" (metadata fields which may * require multiple params, etc. a first name and last name). * * @param request * the HTTP request containing the form information * @param metadataField * the metadata field which can store repeated values * @param param * the repeated parameter on the page (used to fill out the * metadataField) * * @return a List of Strings */ protected List<String> getRepeatedParameter(HttpServletRequest request, String metadataField, String param) { List<String> vals = new LinkedList<String>(); int i = 1; //start index at the first of the previously entered values boolean foundLast = false; // Iterate through the values in the form. while (!foundLast) { String s = null; //First, add the previously entered values. // This ensures we preserve the order that these values were entered s = request.getParameter(param + "_" + i); // If there are no more previously entered values, // see if there's a new value entered in textbox if (s==null) { s = request.getParameter(param); //this will be the last value added foundLast = true; } // We're only going to add non-null values if (s != null) { boolean addValue = true; // Check to make sure that this value was not selected to be // removed. // (This is for the "remove multiple" option available in // Manakin) String[] selected = request.getParameterValues(metadataField + "_selected"); if (selected != null) { for (int j = 0; j < selected.length; j++) { if (selected[j].equals(metadataField + "_" + i)) { addValue = false; } } } if (addValue) { vals.add(s.trim()); } } i++; } log.debug("getRepeatedParameter: metadataField=" + metadataField + " param=" + metadataField + ", return count = "+vals.size()); return vals; } }