Initial Batch Import ZIP from XMLUI

This commit is contained in:
Peter Dietz
2014-07-25 18:14:41 -04:00
parent 63e960b785
commit 0cbfdbe3a8
9 changed files with 874 additions and 98 deletions

View File

@@ -111,6 +111,8 @@ public class ItemImport
private static PrintWriter mapOut = null;
private static final String ziptempdir = ConfigurationManager.getProperty("org.dspace.app.itemexport.work.dir");
// File listing filter to look for metadata files
private static FilenameFilter metadataFileFilter = new FilenameFilter()
{
@@ -276,7 +278,6 @@ public class ItemImport
boolean zip = false;
String zipfilename = "";
String ziptempdir = ConfigurationManager.getProperty("org.dspace.app.itemexport.work.dir");
if (line.hasOption('z'))
{
zip = true;
@@ -396,39 +397,6 @@ public class ItemImport
System.exit(1);
}
// does the zip file exist and can we write to the temp directory
if (zip)
{
File zipfile = new File(sourcedir);
if (!zipfile.canRead())
{
System.out.println("Zip file '" + sourcedir + "' does not exist, or is not readable.");
System.exit(1);
}
if (ziptempdir == null)
{
System.out.println("Unable to unzip import file as the key 'org.dspace.app.itemexport.work.dir' is not set in dspace.cfg");
System.exit(1);
}
zipfile = new File(ziptempdir);
if (!zipfile.isDirectory())
{
System.out.println("'" + ConfigurationManager.getProperty("org.dspace.app.itemexport.work.dir") +
"' as defined by the key 'org.dspace.app.itemexport.work.dir' in dspace.cfg " +
"is not a valid directory");
System.exit(1);
}
File tempdir = new File(ziptempdir);
if (!tempdir.exists() && !tempdir.mkdirs())
{
log.error("Unable to create temporary directory");
}
sourcedir = ziptempdir + System.getProperty("file.separator") + line.getOptionValue("z");
ziptempdir = ziptempdir + System.getProperty("file.separator") +
line.getOptionValue("z") + System.getProperty("file.separator");
}
ItemImport myloader = new ItemImport();
// create a context
@@ -515,70 +483,11 @@ public class ItemImport
try
{
// If this is a zip archive, unzip it first
if (zip)
{
String sourceDirForZip = sourcedir;
ZipFile zf = new ZipFile(zipfilename);
ZipEntry entry;
Enumeration<? extends ZipEntry> entries = zf.entries();
while (entries.hasMoreElements())
{
entry = entries.nextElement();
if (entry.isDirectory())
{
if (!new File(ziptempdir + entry.getName()).mkdir())
{
log.error("Unable to create contents directory");
}
}
else
{
System.out.println("Extracting file: " + entry.getName());
int index = entry.getName().lastIndexOf('/');
if (index == -1)
{
// Was it created on Windows instead?
index = entry.getName().lastIndexOf('\\');
}
if (index > 0)
{
File dir = new File(ziptempdir + entry.getName().substring(0, index));
if (!dir.mkdirs())
{
log.error("Unable to create directory");
}
//Entries could have too many directories, and we need to adjust the sourcedir
//regex supports either windows or *nix file paths
String[] entryChunks = entry.getName().split("/|\\\\");
if(entryChunks.length > 1) {
if(sourceDirForZip == sourcedir) {
sourceDirForZip += "/" + entryChunks[0];
}
}
}
byte[] buffer = new byte[1024];
int len;
InputStream in = zf.getInputStream(entry);
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(ziptempdir + entry.getName()));
while((len = in.read(buffer)) >= 0)
{
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
if(sourceDirForZip != sourcedir) {
sourcedir = sourceDirForZip;
System.out.println("Set sourceDir using path inside of Zip: " + sourcedir);
}
if (zip) {
sourcedir = unzip(sourcedir, zipfilename);
}
c.turnOffAuthorisationSystem();
if ("add".equals(command))
@@ -741,7 +650,7 @@ public class ItemImport
}
}
private void addItems(Context c, Collection[] mycollections,
public void addItems(Context c, Collection[] mycollections,
String sourceDir, String mapFile, boolean template) throws Exception
{
Map<String, String> skipItems = new HashMap<String, String>(); // set of items to skip if in 'resume'
@@ -2069,6 +1978,103 @@ public class ItemImport
return (pathDeleted);
}
public static String unzip(File zipfile) throws IOException {
log.info("ZIPFILE: " + zipfile.getAbsolutePath());
// 2
// does the zip file exist and can we write to the temp directory
if (!zipfile.canRead())
{
log.error("Zip file '" + zipfile.getAbsolutePath() + "' does not exist, or is not readable.");
}
File tempdir = new File(ziptempdir);
if (!tempdir.isDirectory())
{
log.error("'" + ConfigurationManager.getProperty("org.dspace.app.itemexport.work.dir") +
"' as defined by the key 'org.dspace.app.itemexport.work.dir' in dspace.cfg " +
"is not a valid directory");
}
if (!tempdir.exists() && !tempdir.mkdirs())
{
log.error("Unable to create temporary directory");
}
String sourcedir = ziptempdir + System.getProperty("file.separator") + zipfile.getName();
String zipDir = ziptempdir + System.getProperty("file.separator") + zipfile.getName() + System.getProperty("file.separator");
// 3
String sourceDirForZip = sourcedir;
ZipFile zf = new ZipFile(zipfile);
ZipEntry entry;
Enumeration<? extends ZipEntry> entries = zf.entries();
while (entries.hasMoreElements())
{
entry = entries.nextElement();
if (entry.isDirectory())
{
if (!new File(zipDir + entry.getName()).mkdir())
{
log.error("Unable to create contents directory");
}
}
else
{
System.out.println("Extracting file: " + entry.getName());
int index = entry.getName().lastIndexOf('/');
if (index == -1)
{
// Was it created on Windows instead?
index = entry.getName().lastIndexOf('\\');
}
if (index > 0)
{
File dir = new File(zipDir + entry.getName().substring(0, index));
if (!dir.mkdirs())
{
log.error("Unable to create directory");
}
//Entries could have too many directories, and we need to adjust the sourcedir
//regex supports either windows or *nix file paths
String[] entryChunks = entry.getName().split("/|\\\\");
if(entryChunks.length > 1) {
if(sourceDirForZip == sourcedir) {
sourceDirForZip += "/" + entryChunks[0];
}
}
}
byte[] buffer = new byte[1024];
int len;
InputStream in = zf.getInputStream(entry);
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(zipDir + entry.getName()));
while((len = in.read(buffer)) >= 0)
{
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
if(sourceDirForZip != sourcedir) {
sourcedir = sourceDirForZip;
System.out.println("Set sourceDir using path inside of Zip: " + sourcedir);
}
return sourcedir;
}
public static String unzip(String sourcedir, String zipfilename) throws IOException {
File zipfile = new File(sourcedir + File.separator + zipfilename);
return unzip(zipfile);
}
/**
* Generate a random filename based on current time
* @param hidden: add . as a prefix to make the file hidden

View File

@@ -0,0 +1,215 @@
/**
* 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.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
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.itemimport.ItemImport;
import org.dspace.app.itemimport.ItemImportOptions;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Collection;
import org.dspace.core.Context;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.LogManager;
import org.dspace.eperson.EPerson;
/**
* Utility methods to processes BatchImport actions. These methods are used
* exclusively from the administrative flow scripts.
*
* @author Peter Dietz
*/
public class FlowBatchImportUtils {
/**
* Language Strings
*/
private static final Message T_upload_successful = new Message("default", "xmlui.administrative.batchimport.flow.upload_successful");
private static final Message T_upload_failed = new Message("default", "xmlui.administrative.batchimport.flow.upload_failed");
private static final Message T_upload_badschema = new Message("default", "xmlui.administrative.batchimport.flow.upload_badschema");
private static final Message T_upload_badelement = new Message("default", "xmlui.administrative.batchimport.flow.upload_badelement");
private static final Message T_import_successful = new Message("default", "xmlui.administrative.batchimport.flow.import_successful");
private static final Message T_import_failed = new Message("default", "xmlui.administrative.batchimport.flow.import_failed");
private static final Message T_over_limit = new Message("default", "xmlui.administrative.batchimport.flow.over_limit");
private static final Message T_no_changes = new Message("default", "xmlui.administrative.batchimport.general.no_changes");
// Other variables
private static final int limit = ConfigurationManager.getIntProperty("bulkedit", "gui-item-limit", 20);
private static Logger log = Logger.getLogger(FlowBatchImportUtils.class);
public static FlowResult processBatchImport(Context context, Request request) throws SQLException, AuthorizeException, IOException, Exception {
FlowResult result = new FlowResult();
result.setContinue(false);
String zipFile = (String) request.getSession().getAttribute("zip");
log.info(zipFile);
if (zipFile != null) {
// Commit the changes
context.commit();
request.getSession().removeAttribute("zipFile");
log.debug(LogManager.getHeader(context, "batchimport", " items changed"));
if (true) {
result.setContinue(true);
result.setOutcome(true);
result.setMessage(T_import_successful);
} else {
result.setContinue(false);
result.setOutcome(false);
result.setMessage(T_no_changes);
}
} else {
result.setContinue(false);
result.setOutcome(false);
result.setMessage(T_import_failed);
log.debug(LogManager.getHeader(context, "batchimport", "Changes cancelled"));
}
return result;
}
public static FlowResult processUploadZIP(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);
}
log.info(LogManager.getHeader(context, "batchimport", "loading file"));
// Process CSV without import
ItemImport itemImport = new ItemImport();
/*
ItemImportOptions itemImportOptions = new ItemImportOptions();
itemImportOptions.setZipFilePath(file);
Collection destCollection = Collection.find(context, 10);
itemImportOptions.setCollection(destCollection);
EPerson epersonSubmitter = EPerson.findByEmail(context, "peter@longsight.com");
itemImportOptions.setEpersonSubmitter(epersonSubmitter);
itemImportOptions.setUseTemplate(true);
*/
File mapFile = File.createTempFile("batch", "map");
/* PrintWriter mapOut = new PrintWriter(new FileWriter(mapFile));
itemImportOptions.setMapFileOut(mapOut);
log.info("MapFile: " + mapFile.getAbsolutePath());
//Process ItemImport with ZIP, and other options.
*/
/*
// equivalent command-line would be:
import -a -e <email> -c <collection/handle> -s <parent-dir-of-zip> -z <filename-of-zip> -m <mapfile> --template
-c,--collection <arg> destination collection(s) Handle or database ID
-e,--eperson <arg> email of eperson doing importing
-m,--mapfile <arg> mapfile items in mapfile
-n,--notify if sending submissions through the workflow, send
notification emails
-p,--template apply template
-q,--quiet don't display metadata
-s,--source <arg> source of items (directory)
-t,--test test run - do not actually import items
-w,--workflow send submission through collection's workflow
-z,--zip <arg> name of zip file
//Control
-a,--add add items to DSpace
-R,--resume resume a failed import (add only)
*/
String sourceBatchDir = ItemImport.unzip(file);
Collection col10 = Collection.find(context, 10);
Collection[] collections = new Collection[1];
collections[0] = col10;
itemImport.addItems(context, collections, sourceBatchDir, mapFile.getAbsolutePath(), true);
if(true)
{
// Success!
// Set session and request attributes
//request.setAttribute("changes", changes);
//request.getSession().setAttribute("csv", csv);
log.info("batch success");
result.setContinue(true);
result.setOutcome(true);
result.setMessage(T_upload_successful);
}
else
{
//fail
log.info("batch fail");
result.setContinue(false);
result.setOutcome(false);
result.setMessage(T_no_changes);
}
}
else
{
result.setContinue(false);
result.setOutcome(false);
result.setMessage(T_upload_failed);
}
return result;
}
}

View File

@@ -61,6 +61,7 @@ public class Navigation extends AbstractDSpaceTransformer implements CacheablePr
private static final Message T_context_create_subcommunity = message("xmlui.administrative.Navigation.context_create_subcommunity");
private static final Message T_context_create_community = message("xmlui.administrative.Navigation.context_create_community");
private static final Message T_context_export_metadata = message("xmlui.administrative.Navigation.context_export_metadata");
private static final Message T_administrative_batch_import = message("xmlui.administrative.Navigation.administrative_batch_import");
private static final Message T_administrative_import_metadata = message("xmlui.administrative.Navigation.administrative_import_metadata");
private static final Message T_administrative_head = message("xmlui.administrative.Navigation.administrative_head");
private static final Message T_administrative_access_control = message("xmlui.administrative.Navigation.administrative_access_control");
@@ -297,6 +298,7 @@ public class Navigation extends AbstractDSpaceTransformer implements CacheablePr
admin.addItemXref(contextPath+"/admin/panel", T_administrative_control_panel);
admin.addItemXref(contextPath+"/statistics", T_statistics);
admin.addItemXref(contextPath+ "/admin/metadataimport", T_administrative_import_metadata);
admin.addItemXref(contextPath+"/admin/batchimport", T_administrative_batch_import);
admin.addItemXref(contextPath+ "/admin/curate", T_administrative_curation);
}
}

View File

@@ -0,0 +1,263 @@
/**
* 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.batchimport;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.Body;
import org.dspace.app.xmlui.wing.element.Button;
import org.dspace.app.xmlui.wing.element.Division;
import org.dspace.app.xmlui.wing.element.PageMeta;
import org.dspace.app.xmlui.wing.element.Para;
import org.dspace.app.xmlui.wing.element.Table;
import org.dspace.app.xmlui.wing.element.Row;
import org.dspace.app.xmlui.wing.element.Cell;
import org.dspace.content.Collection;
import org.dspace.content.Item;
import org.dspace.content.DCValue;
import org.xml.sax.SAXException;
import org.dspace.app.bulkedit.BulkEditChange;
/**
* Web interface to Batch Import app.
* Display summary of committed changes
*
* @author Peter Dietz
*/
public class BatchImportConfirm extends AbstractDSpaceTransformer {
/** Language strings */
private static final Message T_dspace_home = message("xmlui.general.dspace_home");
private static final Message T_submit_return = message("xmlui.general.return");
private static final Message T_trail = message("xmlui.administrative.metadataimport.general.trail");
private static final Message T_changes = message("xmlui.administrative.metadataimport.general.changes");
private static final Message T_new_item = message("xmlui.administrative.metadataimport.general.new_item");
private static final Message T_no_changes = message("xmlui.administrative.metadataimport.general.no_changes");
private static final Message T_title = message("xmlui.administrative.metadataimport.general.title");
private static final Message T_head1 = message("xmlui.administrative.metadataimport.general.head1");
private static final Message T_success = message("xmlui.administrative.metadataimport.MetadataImportConfirm.success");
private static final Message T_changes_committed = message("xmlui.administrative.metadataimport.MetadataImportConfirm.changes_committed");
private static final Message T_item_addition = message("xmlui.administrative.metadataimport.MetadataImportConfirm.item_added");
private static final Message T_item_deletion = message("xmlui.administrative.metadataimport.MetadataImportConfirm.item_removed");
private static final Message T_collection_newowner = message("xmlui.administrative.metadataimport.MetadataImportConfirm.collection_newowner");
private static final Message T_collection_oldowner = message("xmlui.administrative.metadataimport.MetadataImportConfirm.collection_oldowner");
private static final Message T_collection_mapped = message("xmlui.administrative.metadataimport.MetadataImportConfirm.collection_mapped");
private static final Message T_collection_unmapped = message("xmlui.administrative.metadataimport.MetadataImportConfirm.collection_unmapped");
private static final Message T_item_deleted = message("xmlui.administrative.metadataimport.MetadataImportConfirm.item_deleted");
private static final Message T_item_withdrawn = message("xmlui.administrative.metadataimport.MetadataImportConfirm.item_withdrawn");
private static final Message T_item_reinstated = message("xmlui.administrative.metadataimport.MetadataImportConfirm.item_reinstated");
public void addPageMeta(PageMeta pageMeta) throws WingException
{
pageMeta.addMetadata("title").addContent(T_title);
pageMeta.addTrailLink(contextPath + "/", T_dspace_home);
pageMeta.addTrail().addContent(T_trail);
}
public void addBody(Body body) throws SAXException, WingException, SQLException
{
// Get list of changes
Request request = ObjectModelHelper.getRequest(objectModel);
ArrayList<BulkEditChange> changes = null;
if(request.getAttribute("changes") != null)
{
changes = ((ArrayList<BulkEditChange>)request.getAttribute("changes"));
}
if (changes == null)
{
changes = new ArrayList<BulkEditChange>();
}
// DIVISION: metadata-import
Division div = body.addInteractiveDivision("batch-import",contextPath + "/admin/batchimport", Division.METHOD_MULTIPART,"primary administrative");
div.setHead(T_head1);
Para para = div.addPara();
para.addContent(T_success);
para.addContent(" " + changes.size() + " ");
para.addContent(T_changes);
if(changes.size() > 0) {
Table mdchanges = div.addTable("metadata-changes", changes.size(), 2);
// Display the changes
for (BulkEditChange change : changes)
{
// Get the changes
List<DCValue> adds = change.getAdds();
List<DCValue> removes = change.getRemoves();
List<Collection> newCollections = change.getNewMappedCollections();
List<Collection> oldCollections = change.getOldMappedCollections();
if ((adds.size() > 0) || (removes.size() > 0) ||
(newCollections.size() > 0) || (oldCollections.size() > 0) ||
(change.getNewOwningCollection() != null) || (change.getOldOwningCollection() != null) ||
(change.isDeleted()) || (change.isWithdrawn()) || (change.isReinstated()))
{
Row headerrow = mdchanges.addRow(Row.ROLE_HEADER);
// Show the item
if (!change.isNewItem())
{
Item i = change.getItem();
Cell cell = headerrow.addCell();
cell.addContent(T_changes_committed);
cell.addContent(" " + i.getID() + " (" + i.getHandle() + ")");
}
else
{
headerrow.addCellContent(T_new_item);
}
headerrow.addCell();
}
// Show actions
if (change.isDeleted())
{
Row mdrow = mdchanges.addRow("addition",Row.ROLE_DATA,"item-delete");
Cell cell = mdrow.addCell();
cell.addContent(T_item_deleted);
mdrow.addCellContent("");
}
if (change.isWithdrawn())
{
Row mdrow = mdchanges.addRow("addition",Row.ROLE_DATA,"item-withdraw");
Cell cell = mdrow.addCell();
cell.addContent(T_item_withdrawn);
mdrow.addCellContent("");
}
if (change.isReinstated())
{
Row mdrow = mdchanges.addRow("addition",Row.ROLE_DATA,"item-reinstate");
Cell cell = mdrow.addCell();
cell.addContent(T_item_reinstated);
mdrow.addCellContent("");
}
// Show new owning collection
if (change.getNewOwningCollection() != null)
{
Collection c = change.getNewOwningCollection();
if (c != null)
{
String cHandle = c.getHandle();
String cName = c.getName();
Row colrow = mdchanges.addRow("addition",Row.ROLE_DATA,"metadata-addition");
colrow.addCellContent(T_collection_newowner);
colrow.addCellContent(cHandle + " (" + cName + ")");
}
}
// Show old owning collection
if (change.getOldOwningCollection() != null)
{
Collection c = change.getOldOwningCollection();
if (c != null)
{
String cHandle = c.getHandle();
String cName = c.getName();
Row colrow = mdchanges.addRow("deletion",Row.ROLE_DATA,"metadata-deletion");
colrow.addCellContent(T_collection_oldowner);
colrow.addCellContent(cHandle + " (" + cName + ")");
}
}
// Show new mapped collections
for (Collection c : newCollections)
{
String cHandle = c.getHandle();
String cName = c.getName();
Row colrow = mdchanges.addRow("addition",Row.ROLE_DATA,"metadata-addition");
colrow.addCellContent(T_collection_mapped);
colrow.addCellContent(cHandle + " (" + cName + ")");
}
// Show old mapped collections
for (Collection c : oldCollections)
{
String cHandle = c.getHandle();
String cName = c.getName();
Row colrow = mdchanges.addRow("deletion",Row.ROLE_DATA,"metadata-deletion");
colrow.addCellContent(T_collection_unmapped);
colrow.addCellContent(cHandle + " (" + cName + ")");
}
// Show additions
for (DCValue dcv : adds)
{
Row mdrow = mdchanges.addRow("addition",Row.ROLE_DATA,"metadata-addition");
String md = dcv.schema + "." + dcv.element;
if (dcv.qualifier != null)
{
md += "." + dcv.qualifier;
}
if (dcv.language != null)
{
md += "[" + dcv.language + "]";
}
Cell cell = mdrow.addCell();
cell.addContent(T_item_addition);
cell.addContent(" (" + md + ")");
mdrow.addCellContent(dcv.value);
}
// Show removals
for (DCValue dcv : removes)
{
Row mdrow = mdchanges.addRow("deletion",Row.ROLE_DATA,"metadata-deletion");
String md = dcv.schema + "." + dcv.element;
if (dcv.qualifier != null)
{
md += "." + dcv.qualifier;
}
if (dcv.language != null)
{
md += "[" + dcv.language + "]";
}
Cell cell = mdrow.addCell();
cell.addContent(T_item_deletion);
cell.addContent(" (" + md + ")");
mdrow.addCellContent(dcv.value);
}
}
}
else
{
Para nochanges = div.addPara();
nochanges.addContent(T_no_changes);
}
Para actions = div.addPara();
Button cancel = actions.addButton("submit_return");
cancel.setValue(T_submit_return);
div.addHidden("administrative-continue").setValue(knot.getId());
}
}

View File

@@ -0,0 +1,66 @@
/**
* 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.batchimport;
import java.sql.SQLException;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.Body;
import org.dspace.app.xmlui.wing.element.Button;
import org.dspace.app.xmlui.wing.element.Division;
import org.dspace.app.xmlui.wing.element.PageMeta;
import org.dspace.app.xmlui.wing.element.Para;
import org.xml.sax.SAXException;
/**
* Web interface to BatchImport app.
*
* @author Peter Dietz
*/
public class BatchImportMain extends AbstractDSpaceTransformer {
/** Language strings */
private static final Message T_dspace_home = message("xmlui.general.dspace_home");
private static final Message T_title = message("xmlui.administrative.batchimport.general.title");
private static final Message T_head1 = message("xmlui.administrative.batchimport.general.head1");
private static final Message T_submit_upload = message("xmlui.administrative.batchimport.MetadataImportMain.submit_upload");
private static final Message T_trail = message("xmlui.administrative.batchimport.general.trail");
public void addPageMeta(PageMeta pageMeta) throws WingException
{
pageMeta.addMetadata("title").addContent(T_title);
pageMeta.addTrailLink(contextPath + "/", T_dspace_home);
pageMeta.addTrail().addContent(T_trail);
}
public void addBody(Body body) throws SAXException, WingException, SQLException
{
// DIVISION: batch-import
Division div = body.addInteractiveDivision("batch-import",contextPath + "/admin/batchimport", Division.METHOD_MULTIPART,"primary administrative");
div.setHead(T_head1);
Para file = div.addPara();
file.addFile("file");
Para actions = div.addPara();
Button button = actions.addButton("submit_upload");
button.setValue(T_submit_upload);
div.addHidden("administrative-continue").setValue(knot.getId());
}
}

View File

@@ -0,0 +1,89 @@
/**
* 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.batchimport;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.Body;
import org.dspace.app.xmlui.wing.element.Button;
import org.dspace.app.xmlui.wing.element.Division;
import org.dspace.app.xmlui.wing.element.PageMeta;
import org.dspace.app.xmlui.wing.element.Para;
import org.dspace.app.xmlui.wing.element.Table;
import org.dspace.app.xmlui.wing.element.Row;
import org.dspace.app.xmlui.wing.element.Cell;
import org.dspace.content.Collection;
import org.dspace.content.Item;
import org.dspace.content.DCValue;
import org.xml.sax.SAXException;
import org.dspace.app.bulkedit.BulkEditChange;
/**
* Web interface to Batch Import app.
*
* Display form for user to review changes and confirm
*
* @author Peter Dietz
*/
public class BatchImportUpload extends AbstractDSpaceTransformer {
/** Language strings */
private static final Message T_dspace_home = message("xmlui.general.dspace_home");
private static final Message T_submit_return = message("xmlui.general.return");
private static final Message T_trail = message("xmlui.administrative.batchimport.general.trail");
private static final Message T_no_changes = message("xmlui.administrative.batchimport.general.no_changes");
private static final Message T_new_item = message("xmlui.administrative.batchimport.general.new_item");
private static final Message T_title = message("xmlui.administrative.batchimport.general.title");
private static final Message T_head1 = message("xmlui.administrative.batchimport.general.head1");
private static final Message T_para = message("xmlui.administrative.batchimport.BatchImportUpload.hint");
private static final Message T_submit_confirm = message("xmlui.administrative.batchimport.BatchImportUpload.submit_confirm");
private static final Message T_changes_pending = message("xmlui.administrative.batchimport.BatchImportUpload.changes_pending");
private static final Message T_item_addition = message("xmlui.administrative.batchimport.BatchImportUpload.item_add");
private static final Message T_item_deletion = message("xmlui.administrative.batchimport.BatchImportUpload.item_remove");
private static final Message T_collection_newowner = message("xmlui.administrative.batchimport.BatchImportUpload.collection_newowner");
private static final Message T_collection_oldowner = message("xmlui.administrative.batchimport.BatchImportUpload.collection_oldowner");
private static final Message T_collection_mapped = message("xmlui.administrative.batchimport.BatchImportUpload.collection_mapped");
private static final Message T_collection_unmapped = message("xmlui.administrative.batchimport.BatchImportUpload.collection_unmapped");
private static final Message T_item_delete = message("xmlui.administrative.batchimport.BatchImportUpload.item_delete");
private static final Message T_item_withdraw = message("xmlui.administrative.batchimport.BatchImportUpload.item_withdraw");
private static final Message T_item_reinstate = message("xmlui.administrative.batchimport.BatchImportUpload.item_reinstate");
public void addPageMeta(PageMeta pageMeta) throws WingException
{
pageMeta.addMetadata("title").addContent(T_title);
pageMeta.addTrailLink(contextPath + "/", T_dspace_home);
pageMeta.addTrail().addContent(T_trail);
}
public void addBody(Body body) throws SAXException, WingException, SQLException
{
// Get list of changes
Request request = ObjectModelHelper.getRequest(objectModel);
// DIVISION: batch-import
Division div = body.addInteractiveDivision("batch-import",contextPath + "/admin/batchimport", Division.METHOD_MULTIPART,"primary administrative");
div.setHead(T_head1);
div.addHidden("administrative-continue").setValue(knot.getId());
}
}

View File

@@ -33,6 +33,7 @@ importClass(Packages.org.dspace.app.xmlui.aspect.administrative.FlowAuthorizatio
importClass(Packages.org.dspace.app.xmlui.aspect.administrative.FlowContainerUtils);
importClass(Packages.org.dspace.app.xmlui.aspect.administrative.FlowCurationUtils);
importClass(Packages.org.dspace.app.xmlui.aspect.administrative.FlowMetadataImportUtils);
importClass(Packages.org.dspace.app.xmlui.aspect.administrative.FlowBatchImportUtils);
importClass(Packages.java.lang.System);
importClass(Packages.org.dspace.core.ConfigurationManager);
@@ -541,6 +542,18 @@ function startMetadataImport()
cocoon.exit();
}
function startBatchImport()
{
assertAdministrator();
doBatchImport();
cocoon.redirectTo(cocoon.request.getContextPath());
getDSContext().complete();
cocoon.exit();
}
/**
* Start creating a new collection.
*/
@@ -1932,6 +1945,61 @@ function doMetadataImportConfirm()
return null;
}
/**
* Manage batch metadata import
*
*/
function doBatchImport()
{
var result;
assertAdministrator();
do
{
sendPageAndWait("admin/batchimport/main",{},result);
result = null;
if (cocoon.request.get("submit_upload"))
{
result = doBatchImportUpload();
}
} while (true);
}
function doBatchImportUpload()
{
var result = FlowBatchImportUtils.processUploadZIP(getDSContext(),cocoon.request);
assertAdministrator();
do
{
sendPageAndWait("admin/batchimport/upload",{},result);
result = null;
if (cocoon.request.get("submit_return"))
{
return null;
}
else if (cocoon.request.get("submit_confirm"))
{
result = doBatchImportConfirm();
return result;
}
} while (true);
}
function doBatchImportConfirm()
{
var result = FlowBatchImportUtils.processBatchImport(getDSContext(),cocoon.request);
assertAdministrator();
sendPageAndWait("admin/batchimport/confirm",{},result);
return null;
}
/**
* Search for new items to map into the collection
*/

View File

@@ -59,6 +59,10 @@ to administer DSpace.
<map:transformer name="MetadataImportUpload" src="org.dspace.app.xmlui.aspect.administrative.metadataimport.MetadataImportUpload"/>
<map:transformer name="MetadataImportConfirm" src="org.dspace.app.xmlui.aspect.administrative.metadataimport.MetadataImportConfirm"/>
<map:transformer name="BatchImportMain" src="org.dspace.app.xmlui.aspect.administrative.batchimport.BatchImportMain"/>
<map:transformer name="BatchImportUpload" src="org.dspace.app.xmlui.aspect.administrative.batchimport.BatchImportUpload"/>
<map:transformer name="BatchImportConfirm" src="org.dspace.app.xmlui.aspect.administrative.batchimport.BatchImportConfirm"/>
<map:transformer name="EditCollectionMetadataForm" src="org.dspace.app.xmlui.aspect.administrative.collection.EditCollectionMetadataForm"/>
<map:transformer name="ToggleCollectionHarvestingForm" src="org.dspace.app.xmlui.aspect.administrative.collection.ToggleCollectionHarvestingForm"/>
<map:transformer name="SetupCollectionHarvestingForm" src="org.dspace.app.xmlui.aspect.administrative.collection.SetupCollectionHarvestingForm"/>
@@ -209,6 +213,19 @@ to administer DSpace.
</map:match>
<!--
This is the general entry / resume point for the
batch metadata editor
-->
<map:match pattern="admin/batchimport">
<map:match type="request" pattern="administrative-continue">
<map:call continuation="{1}"/>
</map:match>
<map:call function="startBatchImport"/>
</map:match>
<!--
@@ -677,6 +694,23 @@ to administer DSpace.
<map:transform type="MetadataImportConfirm">
</map:transform>
</map:match>
<!-- Batch Metadata Editor -->
<map:match pattern="admin/batchimport/main">
<map:transform type="BatchImportMain">
</map:transform>
</map:match>
<map:match pattern="admin/batchimport/upload">
<map:transform type="BatchImportUpload">
</map:transform>
</map:match>
<map:match pattern="admin/batchimport/confirm">
<map:transform type="BatchImportConfirm">
</map:transform>
</map:match>
<!-- Collection edit pages -->
@@ -925,9 +959,12 @@ to administer DSpace.
<map:match pattern="admin/mapper">
<map:act type="StartAuthentication"/>
</map:match>
<map:match pattern="admin/metadataimport">
<map:match pattern="admin/metadataimport">
<map:act type="StartAuthentication"/>
</map:match>
<map:match pattern="admin/batchimport">
<map:act type="StartAuthentication"/>
</map:match>
<map:match pattern="admin/collection">
<map:act type="StartAuthentication"/>
</map:match>

View File

@@ -1019,6 +1019,7 @@
<message key="xmlui.administrative.Navigation.administrative_private">Private Items</message>
<message key="xmlui.administrative.Navigation.administrative_control_panel">Control Panel</message>
<message key="xmlui.administrative.Navigation.statistics">Statistics</message>
<message key="xmlui.administrative.Navigation.administrative_batch_import">Batch Import (ZIP)</message>
<message key="xmlui.administrative.Navigation.administrative_import_metadata">Import Metadata</message>
<message key="xmlui.administrative.Navigation.administrative_curation">Curation Tasks</message>
@@ -1438,6 +1439,35 @@
<message key="xmlui.administrative.authorization.DeletePoliciesConfirm.head_action">Action</message>
<message key="xmlui.administrative.authorization.DeletePoliciesConfirm.head_group">Group</message>
<!-- Batch Import Tool -->
<!-- org.dspace.app.xmlui.administrative.batchimport -->
<message key="xmlui.administrative.batchimport.general.title">Import Batch Load (ZIP)</message>
<message key="xmlui.administrative.batchimport.general.head1">Import Batch Load (ZIP)</message>
<message key="xmlui.administrative.batchimport.general.trail">Import Batch Load (ZIP)</message>
<message key="xmlui.administrative.batchimport.general.changes">changes</message>
<message key="xmlui.administrative.batchimport.general.no_changes">No changes were detected</message>
<message key="xmlui.administrative.batchimport.general.new_item">New item</message>
<message key="xmlui.administrative.batchimport.flow.upload_successful">Upload successful</message>
<message key="xmlui.administrative.batchimport.flow.upload_failed">Upload failed</message>
<message key="xmlui.administrative.batchimport.flow.upload_badschema">Unknown metadata schema in heading</message>
<message key="xmlui.administrative.batchimport.flow.upload_badelement">Unknown metadata element in heading</message>
<message key="xmlui.administrative.batchimport.flow.import_successful">Import successful</message>
<message key="xmlui.administrative.batchimport.flow.import_failed">Import failed</message>
<!-- org.dspace.app.xmlui.administrative.batchimport.BatchImportConfirm -->
<message key="xmlui.administrative.batchimport.BatchmportMain.submit_upload">Upload SimpleArchiveFormat ZIP</message>
<!-- org.dspace.app.xmlui.administrative.batchimport.BatchImportConfirm -->
<message key="xmlui.administrative.batchimport.BatchImportConfirm.success">Successfully processed</message>
<message key="xmlui.administrative.batchimport.BatchImportConfirm.changes_committed">Changes applied to item</message>
<message key="xmlui.administrative.batchimport.BatchImportConfirm.item_added">Added: </message>
<message key="xmlui.administrative.batchimport.BatchImportConfirm.item_removed">Removed: </message>
<!-- org.dspace.app.xmlui.administrative.batchimport.BatchImportUpload -->
<message key="xmlui.administrative.batchimport.BatchImportUpload.item_add">Add: </message>
<message key="xmlui.administrative.batchimport.BatchImportUpload.item_remove">Remove: </message>
<!-- general edit item messages -->
<message key="xmlui.administrative.item.general.item_trail">Items</message>
<message key="xmlui.administrative.item.general.template_head">Edit Template Item for Collection: {0}</message>