/**
* 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.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.dspace.app.bulkedit.MetadataImportInvalidHeadingException;
import org.dspace.app.webui.util.JSPManager;
import org.dspace.app.webui.util.FileUploadRequest;
import org.dspace.app.bulkedit.MetadataImport;
import org.dspace.app.bulkedit.DSpaceCSV;
import org.dspace.app.bulkedit.BulkEditChange;
import org.dspace.authorize.AuthorizeException;
import org.dspace.core.*;
/**
* Servlet to import metadata as CSV (comma separated values)
*
* @author Stuart Lewis
*/
public class MetadataImportServlet extends DSpaceServlet
{
/** Upload limit */
private int limit;
/** log4j category */
private static Logger log = Logger.getLogger(MetadataImportServlet.class);
/**
* Initalise the servlet
*/
public void init()
{
// Set the lmimt to the number of items that may be changed in one go, default to 20
limit = ConfigurationManager.getIntProperty("bulkedit", "gui-item-limit", 20);
log.debug("Setting bulk edit limit to " + limit + " items");
}
/**
* 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();
HttpSession session = request.getSession(true);
if ((contentType != null) && (contentType.indexOf("multipart/form-data") != -1))
{
// Process the file uploaded
try
{
// Get the changes
log.info(LogManager.getHeader(context, "metadataimport", "loading file"));
List<BulkEditChange> changes = processUpload(context, request);
log.debug(LogManager.getHeader(context, "metadataimport", changes.size() + " items with changes identified"));
// Were there any changes detected?
if (changes.size() != 0)
{
request.setAttribute("changes", changes);
request.setAttribute("changed", false);
// Is the user allowed to make this many changes?
if (changes.size() <= limit)
{
request.setAttribute("allow", true);
}
else
{
request.setAttribute("allow", false);
session.removeAttribute("csv");
log.info(LogManager.getHeader(context, "metadataimport", "too many changes: " +
changes.size() + " (" + limit + " allowed)"));
}
JSPManager.showJSP(request, response, "/dspace-admin/metadataimport-showchanges.jsp");
}
else
{
request.setAttribute("message", "No changes detected");
JSPManager.showJSP(request, response, "/dspace-admin/metadataimport.jsp");
}
}
catch (MetadataImportInvalidHeadingException mihe) {
request.setAttribute("message", mihe.getBadHeader());
request.setAttribute("badheading", mihe.getType());
log.info(LogManager.getHeader(context, "metadataimport", "Error encountered while looking for changes: " + mihe.getMessage()));
JSPManager.showJSP(request, response, "/dspace-admin/metadataimport-error.jsp");
}
catch (Exception e)
{
request.setAttribute("message", e.getMessage());
log.info(LogManager.getHeader(context, "metadataimport", "Error encountered while looking for changes: " + e.getMessage()));
JSPManager.showJSP(request, response, "/dspace-admin/metadataimport-error.jsp");
}
}
else if ("confirm".equals(request.getParameter("type")))
{
// Get the csv lines from the session
DSpaceCSV csv = (DSpaceCSV)session.getAttribute("csv");
// Make the changes
try
{
MetadataImport mImport = new MetadataImport(context, csv);
List<BulkEditChange> changes = mImport.runImport(true, false, false, false);
// Commit the changes
context.commit();
log.debug(LogManager.getHeader(context, "metadataimport", changes.size() + " items changed"));
// Blank out the session data
session.removeAttribute("csv");
request.setAttribute("changes", changes);
request.setAttribute("changed", true);
request.setAttribute("allow", true);
JSPManager.showJSP(request, response, "/dspace-admin/metadataimport-showchanges.jsp");
}
catch (Exception e)
{
request.setAttribute("message", e.getMessage());
log.debug(LogManager.getHeader(context, "metadataimport", "Error encountered while making changes: " + e.getMessage()));
JSPManager.showJSP(request, response, "/dspace-admin/metadataimport-error.jsp");
}
}
else if ("cancel".equals(request.getParameter("type")))
{
// Blank out the session data
session.removeAttribute("csv");
request.setAttribute("message", "Changes cancelled. No items have been modified.");
log.debug(LogManager.getHeader(context, "metadataimport", "Changes cancelled"));
JSPManager.showJSP(request, response, "/dspace-admin/metadataimport.jsp");
}
else
{
// Show the upload screen
JSPManager.showJSP(request, response, "/dspace-admin/metadataimport.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
{
// Show the upload screen
JSPManager.showJSP(request, response, "/dspace-admin/metadataimport.jsp");
}
/**
* Process the uploaded file.
*
* @param context The DSpace Context
* @param request The request object
* @return The response object
* @throws Exception Thrown if an error occurs
*/
private List<BulkEditChange> processUpload(Context context,
HttpServletRequest request) throws Exception
{
// Wrap multipart request to get the submission info
FileUploadRequest wrapper = new FileUploadRequest(request);
File f = wrapper.getFile("file");
// Run the import
DSpaceCSV csv = new DSpaceCSV(f, context);
MetadataImport mImport = new MetadataImport(context, csv);
List<BulkEditChange> changes = mImport.runImport(false, false, false, false);
// Store the csv lines in the session
HttpSession session = request.getSession(true);
session.setAttribute("csv", csv);
// Remove temp file
if (!f.delete())
{
log.error("Unable to delete upload file");
}
// Return the changes
return changes;
}
}