/*
* FlowMetadataImportUtils.java
*
* Version: $Revision: $
*
* Date: $Date: $
*
* Copyright (c) 2002-2009, The DSpace Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of the DSpace Foundation nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
package org.dspace.app.xmlui.aspect.administrative;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.io.File;
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.xmlui.wing.Message;
import org.dspace.authorize.AuthorizeException;
import org.dspace.core.Context;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.LogManager;
import org.dspace.app.bulkedit.MetadataImport;
import org.dspace.app.bulkedit.MetadataImportException;
import org.dspace.app.bulkedit.DSpaceCSV;
import org.dspace.app.bulkedit.BulkEditChange;
/**
* 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_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.getCSVLines());
ArrayList<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);
file.delete();
MetadataImport mImport = new MetadataImport(context, csv.getCSVLines());
ArrayList<BulkEditChange> changes = mImport.runImport(false, false, false, false);
log.debug(LogManager.getHeader(context, "metadataimport", changes.size() + " items with changes identifed"));
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(MetadataImportException e) {
result.setContinue(false);
result.setOutcome(false);
result.setMessage(T_upload_failed);
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;
}
}