/** * 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.xmlui.aspect.administrative; import java.io.IOException; import java.sql.SQLException; import java.io.File; import java.util.List; import org.apache.log4j.Logger; import org.apache.cocoon.environment.Request; import org.apache.cocoon.servlet.multipart.Part; import org.apache.cocoon.servlet.multipart.PartOnDisk; import org.dspace.app.bulkedit.BulkEditChange; import org.dspace.app.bulkedit.DSpaceCSV; import org.dspace.app.bulkedit.MetadataImport; import org.dspace.app.bulkedit.MetadataImportException; import org.dspace.app.bulkedit.MetadataImportInvalidHeadingException; import org.dspace.app.xmlui.wing.Message; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Context; import org.dspace.core.ConfigurationManager; import org.dspace.core.LogManager; /** * Utility methods to processes MetadataImport actions. These methods are used * exclusively from the administrative flow scripts. * * @author Kim Shepherd */ public class FlowMetadataImportUtils { /** Language Strings */ private static final Message T_upload_successful = new Message("default", "xmlui.administrative.metadataimport.flow.upload_successful"); private static final Message T_upload_failed = new Message("default", "xmlui.administrative.metadataimport.flow.upload_failed"); private static final Message T_upload_badschema = new Message("default", "xmlui.administrative.metadataimport.flow.upload_badschema"); private static final Message T_upload_badelement = new Message("default", "xmlui.administrative.metadataimport.flow.upload_badelement"); private static final Message T_import_successful = new Message("default", "xmlui.administrative.metadataimport.flow.import_successful"); private static final Message T_import_failed = new Message("default", "xmlui.administrative.metadataimport.flow.import_failed"); private static final Message T_over_limit = new Message("default", "xmlui.administrative.metadataimport.flow.over_limit"); private static final Message T_no_changes = new Message("default", "xmlui.administrative.metadataimport.general.no_changes"); // Other variables private static final int limit = ConfigurationManager.getIntProperty("bulkedit", "gui-item-limit", 20); private static Logger log = Logger.getLogger(FlowMetadataImportUtils.class); public static FlowResult processMetadataImport(Context context,Request request) throws SQLException, AuthorizeException, IOException, Exception { FlowResult result = new FlowResult(); result.setContinue(false); DSpaceCSV csv = (DSpaceCSV)request.getSession().getAttribute("csv"); if(csv != null) { try { // Run the import MetadataImport mImport = new MetadataImport(context, csv); List<BulkEditChange> changes = mImport.runImport(true, false, false, false); // Commit the changes context.commit(); request.setAttribute("changes",changes); request.getSession().removeAttribute("csv"); log.debug(LogManager.getHeader(context, "metadataimport", changes.size() + " items changed")); if(changes.size() > 0) { result.setContinue(true); result.setOutcome(true); result.setMessage(T_import_successful); } else { result.setContinue(false); result.setOutcome(false); result.setMessage(T_no_changes); } } catch(MetadataImportException e) { result.setContinue(false); result.setOutcome(false); result.addError(e.getLocalizedMessage()); result.setMessage(T_import_failed); log.debug(LogManager.getHeader(context, "metadataimport", "Error encountered while making changes - " + e.getMessage())); } } else { result.setContinue(false); result.setOutcome(false); result.setMessage(T_import_failed); log.debug(LogManager.getHeader(context, "metadataimport", "Changes cancelled")); } return result; } public static FlowResult processUploadCSV(Context context, Request request) throws SQLException, AuthorizeException, IOException, Exception { FlowResult result = new FlowResult(); result.setContinue(false); Object object = null; if(request.get("file") != null) { object = request.get("file"); } Part filePart = null; File file = null; if (object instanceof Part) { filePart = (Part) object; file = ((PartOnDisk)filePart).getFile(); } if (filePart != null && filePart.getSize() > 0) { String name = filePart.getUploadName(); while (name.indexOf('/') > -1) { name = name.substring(name.indexOf('/') + 1); } while (name.indexOf('\\') > -1) { name = name.substring(name.indexOf('\\') + 1); } try { log.info(LogManager.getHeader(context, "metadataimport", "loading file")); // Process CSV without import DSpaceCSV csv = new DSpaceCSV(file, context); if (!file.delete()) { log.error("Unable to delete CSV file"); } MetadataImport mImport = new MetadataImport(context, csv); List<BulkEditChange> changes = mImport.runImport(false, false, false, false); log.debug(LogManager.getHeader(context, "metadataimport", changes.size() + " items with changes identified")); if(changes.size() > 0) { if(changes.size() > limit) { result.setContinue(false); result.setOutcome(false); result.setMessage(T_over_limit); log.info(LogManager.getHeader(context, "metadataimport", "too many changes - " + changes.size() + " (" + limit + " allowed)")); } else { // Success! // Set session and request attributes request.setAttribute("changes", changes); request.getSession().setAttribute("csv", csv); result.setContinue(true); result.setOutcome(true); result.setMessage(T_upload_successful); } } else { result.setContinue(false); result.setOutcome(false); result.setMessage(T_no_changes); } } catch(MetadataImportInvalidHeadingException mihe) { result.setContinue(false); result.setOutcome(false); if (mihe.getType().equals("" + MetadataImportInvalidHeadingException.SCHEMA)) { result.setMessage(T_upload_badschema); } else { result.setMessage(T_upload_badelement); } result.setCharacters(mihe.getBadHeader()); } catch(MetadataImportException e) { result.setContinue(false); result.setOutcome(false); result.setMessage(T_upload_failed); result.setCharacters(e.getMessage()); log.debug(LogManager.getHeader(context, "metadataimport", "Error encountered while looking for changes - " + e.getMessage())); } } else { result.setContinue(false); result.setOutcome(false); result.setMessage(T_upload_failed); } return result; } }