mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-15 05:53:08 +00:00
[DS-161] Bulk metadata editing
git-svn-id: http://scm.dspace.org/svn/repo/dspace/trunk@3954 9c30dcfa-912a-0410-8fc2-9e0234be79fd
This commit is contained in:
@@ -0,0 +1,291 @@
|
|||||||
|
/*
|
||||||
|
* BulkEditChange.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.bulkedit;
|
||||||
|
|
||||||
|
import org.dspace.content.Item;
|
||||||
|
import org.dspace.content.DCValue;
|
||||||
|
import org.dspace.content.Collection;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class to store changes to item that may occur during a batch edit.
|
||||||
|
*
|
||||||
|
* @author Stuart Lewis
|
||||||
|
*/
|
||||||
|
public class BulkEditChange
|
||||||
|
{
|
||||||
|
/** The item these changes relate to */
|
||||||
|
private Item item;
|
||||||
|
|
||||||
|
/** The ArrayList of hashtables with the new elements */
|
||||||
|
private ArrayList<DCValue> adds;
|
||||||
|
|
||||||
|
/** The ArrayList of hashtables with the removed elements */
|
||||||
|
private ArrayList<DCValue> removes;
|
||||||
|
|
||||||
|
/** The ArrayList of hashtablles with the unchanged elements */
|
||||||
|
private ArrayList<DCValue> constant;
|
||||||
|
|
||||||
|
/** The ArrayList of the complete set of new values (constant + adds) */
|
||||||
|
private ArrayList<DCValue> complete;
|
||||||
|
|
||||||
|
/** The Arraylist of old collections the item has been moved from */
|
||||||
|
private ArrayList<Collection> oldOwningCollections;
|
||||||
|
|
||||||
|
/** The Arraylist of new collections the item has been moved into */
|
||||||
|
private ArrayList<Collection> newOwningCollections;
|
||||||
|
|
||||||
|
/** Is this a new item */
|
||||||
|
private boolean newItem;
|
||||||
|
|
||||||
|
/** Have any changes actually been made? */
|
||||||
|
private boolean empty;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initalise a change holder for a new item
|
||||||
|
*/
|
||||||
|
public BulkEditChange()
|
||||||
|
{
|
||||||
|
// Set the item to be null
|
||||||
|
item = null;
|
||||||
|
newItem = true;
|
||||||
|
empty = true;
|
||||||
|
|
||||||
|
// Initialise the arrays
|
||||||
|
adds = new ArrayList<DCValue>();
|
||||||
|
removes = new ArrayList<DCValue>();
|
||||||
|
constant = new ArrayList<DCValue>();
|
||||||
|
complete = new ArrayList<DCValue>();
|
||||||
|
oldOwningCollections = new ArrayList<Collection>();
|
||||||
|
newOwningCollections = new ArrayList<Collection>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initalise a new change holder for an existing item
|
||||||
|
*
|
||||||
|
* @param i The Item to store
|
||||||
|
*/
|
||||||
|
public BulkEditChange(Item i)
|
||||||
|
{
|
||||||
|
// Store the item
|
||||||
|
item = i;
|
||||||
|
newItem = false;
|
||||||
|
empty = true;
|
||||||
|
|
||||||
|
// Initalise the arrays
|
||||||
|
adds = new ArrayList<DCValue>();
|
||||||
|
removes = new ArrayList<DCValue>();
|
||||||
|
constant = new ArrayList<DCValue>();
|
||||||
|
complete = new ArrayList<DCValue>();
|
||||||
|
oldOwningCollections = new ArrayList<Collection>();
|
||||||
|
newOwningCollections = new ArrayList<Collection>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store the item - used when a new item is created
|
||||||
|
*
|
||||||
|
* @param i The item
|
||||||
|
*/
|
||||||
|
public void setItem(Item i)
|
||||||
|
{
|
||||||
|
// Store the item
|
||||||
|
item = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an added metadata value
|
||||||
|
*
|
||||||
|
* @param dcv The value to add
|
||||||
|
*/
|
||||||
|
public void registerAdd(DCValue dcv)
|
||||||
|
{
|
||||||
|
// Add the added value
|
||||||
|
adds.add(dcv);
|
||||||
|
complete.add(dcv);
|
||||||
|
empty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a removed metadata value
|
||||||
|
*
|
||||||
|
* @param dcv The value to remove
|
||||||
|
*/
|
||||||
|
public void registerRemove(DCValue dcv)
|
||||||
|
{
|
||||||
|
// Add the removed value
|
||||||
|
removes.add(dcv);
|
||||||
|
empty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an unchanged metadata value
|
||||||
|
*
|
||||||
|
* @param dcv The value to keep unchanged
|
||||||
|
*/
|
||||||
|
public void registerConstant(DCValue dcv)
|
||||||
|
{
|
||||||
|
// Add the removed value
|
||||||
|
constant.add(dcv);
|
||||||
|
complete.add(dcv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new owning Collection
|
||||||
|
*
|
||||||
|
* @param c The new owning Collection
|
||||||
|
*/
|
||||||
|
public void registerNewOwningCollection(Collection c)
|
||||||
|
{
|
||||||
|
// Add the new owning Collection\
|
||||||
|
newOwningCollections.add(c);
|
||||||
|
empty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an old owning Collection
|
||||||
|
*
|
||||||
|
* @param c The old owning Collection
|
||||||
|
*/
|
||||||
|
public void registerOldOwningCollection(Collection c)
|
||||||
|
{
|
||||||
|
// Add the old owning Collection\
|
||||||
|
oldOwningCollections.add(c);
|
||||||
|
empty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the DSpace Item that these changes are applicable to.
|
||||||
|
*
|
||||||
|
* @return The item
|
||||||
|
*/
|
||||||
|
public Item getItem()
|
||||||
|
{
|
||||||
|
// Return the item
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of elements and their values that have been added.
|
||||||
|
*
|
||||||
|
* @return the list of elements and their values that have been added.
|
||||||
|
*/
|
||||||
|
public ArrayList<DCValue> getAdds()
|
||||||
|
{
|
||||||
|
// Return the array
|
||||||
|
return adds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of elements and their values that have been removed.
|
||||||
|
*
|
||||||
|
* @return the list of elements and their values that have been removed.
|
||||||
|
*/
|
||||||
|
public ArrayList<DCValue> getRemoves()
|
||||||
|
{
|
||||||
|
// Return the array
|
||||||
|
return removes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of unchanged values
|
||||||
|
*
|
||||||
|
* @return the list of unchanged values
|
||||||
|
*/
|
||||||
|
public ArrayList<DCValue> getConstant()
|
||||||
|
{
|
||||||
|
// Return the array
|
||||||
|
return constant;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of all values
|
||||||
|
*
|
||||||
|
* @return the list of all values
|
||||||
|
*/
|
||||||
|
public ArrayList<DCValue> getComplete()
|
||||||
|
{
|
||||||
|
// Return the array
|
||||||
|
return complete;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of new owning Collections
|
||||||
|
*
|
||||||
|
* @return the list of new owning collections
|
||||||
|
*/
|
||||||
|
public ArrayList<Collection> getNewOwningCollections()
|
||||||
|
{
|
||||||
|
// Return the array
|
||||||
|
return newOwningCollections;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of old owning Collections
|
||||||
|
*
|
||||||
|
* @return the list of old owning collections
|
||||||
|
*/
|
||||||
|
public ArrayList<Collection> getOldOwningCollections()
|
||||||
|
{
|
||||||
|
// Return the array
|
||||||
|
return oldOwningCollections;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does this change object represent a new item?
|
||||||
|
*
|
||||||
|
* @return Whether or not this is for a new item
|
||||||
|
*/
|
||||||
|
public boolean isNewItem()
|
||||||
|
{
|
||||||
|
// Return the new item status
|
||||||
|
return newItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Have any changes actually been recorded, or is this empty?
|
||||||
|
*
|
||||||
|
* @return Whether or not changes have been made
|
||||||
|
*/
|
||||||
|
public boolean hasChanges()
|
||||||
|
{
|
||||||
|
return !empty;
|
||||||
|
}
|
||||||
|
}
|
517
dspace-api/src/main/java/org/dspace/app/bulkedit/DSpaceCSV.java
Normal file
517
dspace-api/src/main/java/org/dspace/app/bulkedit/DSpaceCSV.java
Normal file
@@ -0,0 +1,517 @@
|
|||||||
|
/*
|
||||||
|
* DSpaceCSV.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.bulkedit;
|
||||||
|
|
||||||
|
import org.dspace.content.*;
|
||||||
|
import org.dspace.content.Collection;
|
||||||
|
import org.dspace.core.ConfigurationManager;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class to read and write CSV files
|
||||||
|
*
|
||||||
|
* @author Stuart Lewis
|
||||||
|
*/
|
||||||
|
public class DSpaceCSV
|
||||||
|
{
|
||||||
|
/** The headings of the CSV file */
|
||||||
|
private ArrayList<String> headings;
|
||||||
|
|
||||||
|
/** An array list of CSV lines */
|
||||||
|
private ArrayList<DSpaceCSVLine> lines;
|
||||||
|
|
||||||
|
/** A counter of how many CSV lines this object holds */
|
||||||
|
private int counter;
|
||||||
|
|
||||||
|
/** The value separator (defaults to double pipe '||') */
|
||||||
|
protected static String valueSeparator;
|
||||||
|
|
||||||
|
/** The value separator in an escaped form for using in regexs */
|
||||||
|
protected static String escpaedValueSeparator;
|
||||||
|
|
||||||
|
/** The field separator (defaults to comma) */
|
||||||
|
protected static String fieldSeparator;
|
||||||
|
|
||||||
|
/** The field separator in an escaped form for using in regexs */
|
||||||
|
protected static String escpaedFieldSeparator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance of a CSV line holder
|
||||||
|
*/
|
||||||
|
public DSpaceCSV()
|
||||||
|
{
|
||||||
|
// Set the value separator
|
||||||
|
setValueSeparator();
|
||||||
|
|
||||||
|
// Set the field separator
|
||||||
|
setFieldSeparator();
|
||||||
|
|
||||||
|
// Create the headings
|
||||||
|
headings = new ArrayList<String>();
|
||||||
|
|
||||||
|
// Create the blank list of items
|
||||||
|
lines = new ArrayList<DSpaceCSVLine>();
|
||||||
|
|
||||||
|
// Initalise the counter
|
||||||
|
counter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance, reading the lines in from file
|
||||||
|
*
|
||||||
|
* @param f The file to read from
|
||||||
|
*
|
||||||
|
* @throws Exception thrown if there is an error reading or processing the file
|
||||||
|
*/
|
||||||
|
public DSpaceCSV(File f) throws Exception
|
||||||
|
{
|
||||||
|
// Set the value separator
|
||||||
|
setValueSeparator();
|
||||||
|
|
||||||
|
// Set the field separator
|
||||||
|
setFieldSeparator();
|
||||||
|
|
||||||
|
// Create the headings
|
||||||
|
headings = new ArrayList<String>();
|
||||||
|
|
||||||
|
// Create the blank list of items
|
||||||
|
lines = new ArrayList<DSpaceCSVLine>();
|
||||||
|
|
||||||
|
// Initalise the counter
|
||||||
|
counter = 0;
|
||||||
|
|
||||||
|
// Open the CSV file
|
||||||
|
BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(f),"UTF8"));
|
||||||
|
|
||||||
|
// Read the heading line
|
||||||
|
String head = input.readLine();
|
||||||
|
String[] headingElements = head.split(fieldSeparator);
|
||||||
|
for (String element : headingElements)
|
||||||
|
{
|
||||||
|
// Remove surrounding quotes if there are any
|
||||||
|
if ((element.startsWith("\"")) && (element.endsWith("\"")))
|
||||||
|
{
|
||||||
|
element = element.substring(1, element.length() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!"id".equals(element))
|
||||||
|
{
|
||||||
|
// Store the heading
|
||||||
|
headings.add(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read each subsequent line
|
||||||
|
String line;
|
||||||
|
while ((line = input.readLine()) != null){
|
||||||
|
// Are there an odd number of quotes?
|
||||||
|
while (((" " + line + " ").split("\"").length)%2 == 0)
|
||||||
|
{
|
||||||
|
line = line + "\n" + input.readLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse the item metadata
|
||||||
|
addItem(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the value separator for multiple values stored in one csv value.
|
||||||
|
*
|
||||||
|
* Is set in dspace.cfg as bulkedit.valueseparator
|
||||||
|
*
|
||||||
|
* If not set, defaults to double pipe '||'
|
||||||
|
*/
|
||||||
|
private void setValueSeparator()
|
||||||
|
{
|
||||||
|
// Get the value separator
|
||||||
|
valueSeparator = ConfigurationManager.getProperty("bulkedit.valueseparator");
|
||||||
|
if ((valueSeparator != null) && (!"".equals(valueSeparator.trim())))
|
||||||
|
{
|
||||||
|
valueSeparator = valueSeparator.trim();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
valueSeparator = "||";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now store the escaped version
|
||||||
|
Pattern spchars = Pattern.compile("([\\\\*+\\[\\](){}\\$.?\\^|])");
|
||||||
|
Matcher match = spchars.matcher(valueSeparator);
|
||||||
|
escpaedValueSeparator = match.replaceAll("\\\\$1");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the field separator use to separate fields in the csv.
|
||||||
|
*
|
||||||
|
* Is set in dspace.cfg as bulkedit.fieldseparator
|
||||||
|
*
|
||||||
|
* If not set, defaults to comma ','.
|
||||||
|
*
|
||||||
|
* Special values are 'tab', 'hash' and 'semicolon' which will
|
||||||
|
* get substituted from the text to the value.
|
||||||
|
*/
|
||||||
|
private void setFieldSeparator()
|
||||||
|
{
|
||||||
|
// Get the value separator
|
||||||
|
fieldSeparator = ConfigurationManager.getProperty("bulkedit.fieldseparator");
|
||||||
|
if ((fieldSeparator != null) && (!"".equals(fieldSeparator.trim())))
|
||||||
|
{
|
||||||
|
fieldSeparator = fieldSeparator.trim();
|
||||||
|
if ("tab".equals(fieldSeparator))
|
||||||
|
{
|
||||||
|
fieldSeparator = "\t";
|
||||||
|
}
|
||||||
|
else if ("semicolon".equals(fieldSeparator))
|
||||||
|
{
|
||||||
|
fieldSeparator = ";";
|
||||||
|
}
|
||||||
|
else if ("hash".equals(fieldSeparator))
|
||||||
|
{
|
||||||
|
fieldSeparator = "#";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fieldSeparator = fieldSeparator.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fieldSeparator = ",";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now store the escaped version
|
||||||
|
Pattern spchars = Pattern.compile("([\\\\*+\\[\\](){}\\$.?\\^|])");
|
||||||
|
Matcher match = spchars.matcher(fieldSeparator);
|
||||||
|
escpaedFieldSeparator = match.replaceAll("\\\\$1");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a DSpace item to the CSV file
|
||||||
|
*
|
||||||
|
* @param i The DSpace item
|
||||||
|
*
|
||||||
|
* @throws Exception if something goes wrong with adding the Item
|
||||||
|
*/
|
||||||
|
public void addItem(Item i) throws Exception
|
||||||
|
{
|
||||||
|
// Create the CSV line
|
||||||
|
DSpaceCSVLine line = new DSpaceCSVLine(i.getID());
|
||||||
|
|
||||||
|
// Add in owning collections
|
||||||
|
Collection[] collections = i.getCollections();
|
||||||
|
for (Collection c : collections)
|
||||||
|
{
|
||||||
|
line.add("collection", c.getHandle());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate it
|
||||||
|
DCValue md[] = i.getMetadata(Item.ANY, Item.ANY, Item.ANY, Item.ANY);
|
||||||
|
for (DCValue value : md)
|
||||||
|
{
|
||||||
|
// Get the key (schema.element)
|
||||||
|
String key = value.schema + "." + value.element;
|
||||||
|
|
||||||
|
// Add the qualifer if there is one (schema.element.qualifier)
|
||||||
|
if (value.qualifier != null)
|
||||||
|
{
|
||||||
|
key = key + "." + value.qualifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the language if there is one (schema.element.qualifier[langauge])
|
||||||
|
//if ((value.language != null) && (!"".equals(value.language)))
|
||||||
|
if (value.language != null)
|
||||||
|
{
|
||||||
|
key = key + "[" + value.language + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the item
|
||||||
|
line.add(key, value.value);
|
||||||
|
if (!headings.contains(key))
|
||||||
|
{
|
||||||
|
headings.add(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lines.add(line);
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an item to the CSV file, from a CSV line of elements
|
||||||
|
*
|
||||||
|
* @param line The line of elements
|
||||||
|
* @throws Exception Thrown if an error occurs when adding the item
|
||||||
|
*/
|
||||||
|
public void addItem(String line) throws Exception
|
||||||
|
{
|
||||||
|
// Check to see if the last character is a field separator, which hides the last empy column
|
||||||
|
boolean last = false;
|
||||||
|
if (line.endsWith(fieldSeparator))
|
||||||
|
{
|
||||||
|
// Add a space to the end, then remove it later
|
||||||
|
last = true;
|
||||||
|
line += " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Split up on field separator
|
||||||
|
String[] parts = line.split(fieldSeparator);
|
||||||
|
ArrayList<String> bits = new ArrayList<String>();
|
||||||
|
bits.addAll(Arrays.asList(parts));
|
||||||
|
|
||||||
|
// Merge parts with embedded separators
|
||||||
|
boolean alldone = false;
|
||||||
|
while (!alldone)
|
||||||
|
{
|
||||||
|
boolean found = false;
|
||||||
|
int i = 0;
|
||||||
|
for (String part : bits)
|
||||||
|
{
|
||||||
|
int bitcounter = part.length() - part.replaceAll("\"", "").length();
|
||||||
|
if ((part.startsWith("\"")) && ((!part.endsWith("\"")) || ((bitcounter %2) == 1)))
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
String add = bits.get(i) + fieldSeparator + bits.get(i + 1);
|
||||||
|
bits.remove(i);
|
||||||
|
bits.add(i, add);
|
||||||
|
bits.remove(i + 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
alldone = !found;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deal with quotes around the elements
|
||||||
|
int i = 0;
|
||||||
|
for (String part : bits)
|
||||||
|
{
|
||||||
|
if ((part.startsWith("\"")) && (part.endsWith("\"")))
|
||||||
|
{
|
||||||
|
part = part.substring(1, part.length() - 1);
|
||||||
|
bits.set(i, part);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove embedded quotes
|
||||||
|
i = 0;
|
||||||
|
for (String part : bits)
|
||||||
|
{
|
||||||
|
if (part.contains("\"\""))
|
||||||
|
{
|
||||||
|
part = part.replaceAll("\"\"", "\"");
|
||||||
|
bits.set(i, part);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add elements to a DSpaceCSVLine
|
||||||
|
String id = parts[0].replaceAll("\"", "");
|
||||||
|
DSpaceCSVLine csvLine;
|
||||||
|
|
||||||
|
// Is this an existing item, or a new item (where id = '+')
|
||||||
|
if ("+".equals(id))
|
||||||
|
{
|
||||||
|
csvLine = new DSpaceCSVLine();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
csvLine = new DSpaceCSVLine(Integer.parseInt(id));
|
||||||
|
}
|
||||||
|
catch (NumberFormatException nfe)
|
||||||
|
{
|
||||||
|
System.err.println("Invalid item identifer: " + id);
|
||||||
|
System.err.println("Please check your CSV file for informaton. " +
|
||||||
|
"Item id must be numeric, or a '+' to add a new item");
|
||||||
|
throw(nfe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the rest of the parts
|
||||||
|
i = 0;
|
||||||
|
for (String part : bits)
|
||||||
|
{
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
// Is this a last empty item?
|
||||||
|
if ((last) && (i == headings.size()))
|
||||||
|
{
|
||||||
|
part = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure we register that this column was there
|
||||||
|
csvLine.add(headings.get(i - 1), null);
|
||||||
|
String[] elements = part.split(escpaedValueSeparator);
|
||||||
|
for (String element : elements)
|
||||||
|
{
|
||||||
|
if ((element != null) && (!"".equals(element)))
|
||||||
|
{
|
||||||
|
csvLine.add(headings.get(i - 1), element);
|
||||||
|
System.out.println(i + ":" + headings.size() + ":" + headings.get(i - 1) + ":" + element + ":");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
lines.add(csvLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the lines in CSV holders
|
||||||
|
*
|
||||||
|
* @return The lines
|
||||||
|
*/
|
||||||
|
public ArrayList<DSpaceCSVLine> getCSVLines()
|
||||||
|
{
|
||||||
|
// Return the lines
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the CSV lines as an array of CSV formatted strings
|
||||||
|
*
|
||||||
|
* @return the array of CSV formatted Strings
|
||||||
|
*/
|
||||||
|
public String[] getCSVLinesAsStringArray()
|
||||||
|
{
|
||||||
|
// Create the headings line
|
||||||
|
String[] csvLines = new String[counter + 1];
|
||||||
|
csvLines[0] = "id" + fieldSeparator + "collection";
|
||||||
|
Collections.sort(headings);
|
||||||
|
for (String value : headings)
|
||||||
|
{
|
||||||
|
csvLines[0] = csvLines[0] + fieldSeparator + value;
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator<DSpaceCSVLine> i = lines.iterator();
|
||||||
|
int c = 1;
|
||||||
|
while (i.hasNext())
|
||||||
|
{
|
||||||
|
csvLines[c++] = i.next().toCSV(headings);
|
||||||
|
}
|
||||||
|
|
||||||
|
return csvLines;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the CSV file to the given filename
|
||||||
|
*
|
||||||
|
* @param filename The filename to save the CSV file to
|
||||||
|
*
|
||||||
|
* @throws IOException Thrown if an error occurs when writing the file
|
||||||
|
*/
|
||||||
|
public void save(String filename) throws IOException
|
||||||
|
{
|
||||||
|
// Save the file
|
||||||
|
BufferedWriter out = new BufferedWriter(
|
||||||
|
new OutputStreamWriter(
|
||||||
|
new FileOutputStream(filename), "UTF8"));
|
||||||
|
for (String csvLine : getCSVLinesAsStringArray()) {
|
||||||
|
out.write(csvLine + "\n");
|
||||||
|
}
|
||||||
|
out.flush();
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the csv file as one long formatted string
|
||||||
|
*
|
||||||
|
* @return The formatted String as a csv
|
||||||
|
*/
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
// Return the csv as one long string
|
||||||
|
StringBuffer csvLines = new StringBuffer();
|
||||||
|
String[] lines = this.getCSVLinesAsStringArray();
|
||||||
|
for (String line : lines)
|
||||||
|
{
|
||||||
|
csvLines.append(line).append("\n");
|
||||||
|
}
|
||||||
|
return csvLines.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test main method to check the marshalling and unmarshalling of strings in and out of CSV format
|
||||||
|
*
|
||||||
|
* @param args Not used
|
||||||
|
* @throws Exception Thrown if something goes wrong
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
// Test the CSV parsing
|
||||||
|
String[] csv = {"id,\"dc.title\",dc.contributor.author,dc.description.abstract",
|
||||||
|
"1,Easy line,\"Lewis, Stuart\",A nice short abstract",
|
||||||
|
"2,Two authors,\"Lewis, Stuart||Bloggs, Joe\",Two people wrote this item",
|
||||||
|
"3,Three authors,\"Lewis, Stuart||Bloggs, Joe||Loaf, Meat\",Three people wrote this item",
|
||||||
|
"4,\"Two line\ntitle\",\"Lewis, Stuart\",abstract",
|
||||||
|
"5,\"\"\"Embedded quotes\"\" here\",\"Lewis, Stuart\",\"Abstract with\ntwo\nnew lines\""};
|
||||||
|
|
||||||
|
// Write the string to a file
|
||||||
|
String filename = "test.csv";
|
||||||
|
BufferedWriter out = new BufferedWriter(
|
||||||
|
new OutputStreamWriter(
|
||||||
|
new FileOutputStream(filename), "UTF8"));
|
||||||
|
for (String csvLine : csv) {
|
||||||
|
out.write(csvLine + "\n");
|
||||||
|
}
|
||||||
|
out.flush();
|
||||||
|
out.close();
|
||||||
|
System.gc();
|
||||||
|
|
||||||
|
// test the CSV parsing
|
||||||
|
DSpaceCSV dcsv = new DSpaceCSV(new File(filename));
|
||||||
|
String[] lines = dcsv.getCSVLinesAsStringArray();
|
||||||
|
for (String line : lines)
|
||||||
|
{
|
||||||
|
System.out.println(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the test file
|
||||||
|
File toDelete = new File(filename);
|
||||||
|
toDelete.delete();
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,212 @@
|
|||||||
|
/*
|
||||||
|
* DSpaceCSVLine.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.bulkedit;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Hashtable;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class to store a line from a CSV file
|
||||||
|
*
|
||||||
|
* @author Stuart Lewis
|
||||||
|
*/
|
||||||
|
public class DSpaceCSVLine
|
||||||
|
{
|
||||||
|
/** The item id of the item represented by this line. -1 is for a new item */
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
/** The elements in this line in a hashtable, keyed by the metadata type */
|
||||||
|
private Hashtable<String, ArrayList> items;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new CSV line
|
||||||
|
*
|
||||||
|
* @param id The item ID of the line
|
||||||
|
*/
|
||||||
|
public DSpaceCSVLine(int id)
|
||||||
|
{
|
||||||
|
// Store the ID + separator, and initalise the hashtable
|
||||||
|
this.id = id;
|
||||||
|
items = new Hashtable<String, ArrayList>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new CSV line for a new item
|
||||||
|
*/
|
||||||
|
public DSpaceCSVLine()
|
||||||
|
{
|
||||||
|
// Set the ID to be -1, and initalise the hashtable
|
||||||
|
this.id = -1;
|
||||||
|
this.items = new Hashtable<String, ArrayList>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the item ID that this line represents
|
||||||
|
*
|
||||||
|
* @return The item ID
|
||||||
|
*/
|
||||||
|
public int getID()
|
||||||
|
{
|
||||||
|
// Return the ID
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new metadata value to this line
|
||||||
|
*
|
||||||
|
* @param key The metadata key (e.g. dc.contributor.author)
|
||||||
|
* @param value The metadata value
|
||||||
|
*/
|
||||||
|
public void add(String key, String value)
|
||||||
|
{
|
||||||
|
// Create the array list if we need to
|
||||||
|
if (items.get(key) == null)
|
||||||
|
{
|
||||||
|
items.put(key, new ArrayList<String>());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the item if it is not null
|
||||||
|
if (value != null)
|
||||||
|
{
|
||||||
|
items.get(key).add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all the values that match the given metadata key. Will be null if none exist.
|
||||||
|
*
|
||||||
|
* @param key The metadata key
|
||||||
|
* @return All the elements that match
|
||||||
|
*/
|
||||||
|
public ArrayList<String> get(String key)
|
||||||
|
{
|
||||||
|
// Return any relevant values
|
||||||
|
return items.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all the metadata keys that are represented in this line
|
||||||
|
*
|
||||||
|
* @return An enumeration of all the keys
|
||||||
|
*/
|
||||||
|
public Enumeration<String> keys()
|
||||||
|
{
|
||||||
|
// Return the keys
|
||||||
|
return items.keys();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write this line out as a CSV formatted string, in the order given by the headings provided
|
||||||
|
*
|
||||||
|
* @param headings The headings which define the order the elements must be presented in
|
||||||
|
* @return The CSV formatted String
|
||||||
|
*/
|
||||||
|
protected String toCSV(ArrayList<String> headings)
|
||||||
|
{
|
||||||
|
// Add the id
|
||||||
|
String bits = "\"" + id + "\"" + DSpaceCSV.fieldSeparator;
|
||||||
|
bits += valueToCSV(items.get("collection")) + DSpaceCSV.fieldSeparator;
|
||||||
|
|
||||||
|
// Add the rest of the elements
|
||||||
|
Iterator<String> i = headings.iterator();
|
||||||
|
String key;
|
||||||
|
while (i.hasNext())
|
||||||
|
{
|
||||||
|
key = i.next();
|
||||||
|
if ((items.get(key) != null) && (!"collection".equals(key)))
|
||||||
|
{
|
||||||
|
bits = bits + valueToCSV(items.get(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i.hasNext())
|
||||||
|
{
|
||||||
|
bits = bits + DSpaceCSV.fieldSeparator;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bits;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal method to create a CSV formatted String joining a given set of elements
|
||||||
|
*
|
||||||
|
* @param values The values to create the string from
|
||||||
|
* @return The line as a CSV formatted String
|
||||||
|
*/
|
||||||
|
private String valueToCSV(ArrayList<String> values)
|
||||||
|
{
|
||||||
|
// Concatenate any fields together
|
||||||
|
String s = "";
|
||||||
|
|
||||||
|
// Check there is some content
|
||||||
|
if (values == null)
|
||||||
|
{
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get on with the work
|
||||||
|
if (values.size() == 1)
|
||||||
|
{
|
||||||
|
s = values.get(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Iterator i = values.iterator();
|
||||||
|
while (i.hasNext())
|
||||||
|
{
|
||||||
|
s = s + i.next();
|
||||||
|
if (i.hasNext())
|
||||||
|
{
|
||||||
|
s = s + DSpaceCSV.valueSeparator;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace internal quotes with two sets of quotes
|
||||||
|
s = s.replaceAll("\"", "\"\"");
|
||||||
|
|
||||||
|
// Wrap in quotes
|
||||||
|
s = "\"" + s + "\"";
|
||||||
|
|
||||||
|
// Return the csv formatted string
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@@ -0,0 +1,279 @@
|
|||||||
|
/*
|
||||||
|
* MetadataExport.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.bulkedit;
|
||||||
|
|
||||||
|
import org.apache.commons.cli.*;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import org.dspace.content.*;
|
||||||
|
import org.dspace.core.Constants;
|
||||||
|
import org.dspace.core.Context;
|
||||||
|
import org.dspace.handle.HandleManager;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Metadata exporter to allow the batch export of metadata into a file
|
||||||
|
*
|
||||||
|
* @author Stuart Lewis
|
||||||
|
*/
|
||||||
|
public class MetadataExport
|
||||||
|
{
|
||||||
|
/** The Context */
|
||||||
|
Context c;
|
||||||
|
|
||||||
|
/** The items to export */
|
||||||
|
ItemIterator toExport;
|
||||||
|
|
||||||
|
/** log4j logger */
|
||||||
|
private static Logger log = Logger.getLogger(MetadataExport.class);
|
||||||
|
|
||||||
|
public MetadataExport(Context c, ItemIterator toExport)
|
||||||
|
{
|
||||||
|
// Store the export settings
|
||||||
|
this.c = c;
|
||||||
|
this.toExport = toExport;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to export a community (and sub-communites and collections)
|
||||||
|
*
|
||||||
|
* @param c The Context
|
||||||
|
* @param toExport The Community to export
|
||||||
|
*/
|
||||||
|
public MetadataExport(Context c, Community toExport)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Try to export the community
|
||||||
|
this.c = c;
|
||||||
|
this.toExport = new ItemIterator(c, buildFromCommunity(toExport, new ArrayList(), 0));
|
||||||
|
}
|
||||||
|
catch (SQLException sqle)
|
||||||
|
{
|
||||||
|
// Something went wrong...
|
||||||
|
System.err.println("Error running exporter:");
|
||||||
|
sqle.printStackTrace(System.err);
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build an array list of item ids that are in a community (include sub-communities and collections)
|
||||||
|
*
|
||||||
|
* @param community The community to build from
|
||||||
|
* @param itemIDs The itemID (used for recuriosn - use an empty ArrayList)
|
||||||
|
* @param indent How many spaces to use when writing out the names of items added
|
||||||
|
* @return The list of item ids
|
||||||
|
* @throws SQLException
|
||||||
|
*/
|
||||||
|
private ArrayList buildFromCommunity(Community community, ArrayList itemIDs, int indent)
|
||||||
|
throws SQLException
|
||||||
|
{
|
||||||
|
// Add all the collections
|
||||||
|
Collection[] collections = community.getCollections();
|
||||||
|
for (Collection collection : collections)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < indent; i++) System.out.print(" ");
|
||||||
|
ItemIterator items = collection.getAllItems();
|
||||||
|
while (items.hasNext())
|
||||||
|
{
|
||||||
|
int id = items.next().getID();
|
||||||
|
// Only add if not already included (so mapped items only appear once)
|
||||||
|
if (!itemIDs.contains(id))
|
||||||
|
{
|
||||||
|
itemIDs.add(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add all the sub-communities
|
||||||
|
Community[] communities = community.getSubcommunities();
|
||||||
|
for (Community subCommunity : communities)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < indent; i++) System.out.print(" ");
|
||||||
|
buildFromCommunity(subCommunity, itemIDs, indent + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return itemIDs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the export
|
||||||
|
*
|
||||||
|
* @return the exported CSV lines
|
||||||
|
*/
|
||||||
|
public DSpaceCSV export()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Process each item
|
||||||
|
DSpaceCSV csv = new DSpaceCSV();
|
||||||
|
while (toExport.hasNext())
|
||||||
|
{
|
||||||
|
csv.addItem(toExport.next());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the results
|
||||||
|
return csv;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Print the help message
|
||||||
|
*
|
||||||
|
* @param options The command line options the user gave
|
||||||
|
* @param exitCode the system exit code to use
|
||||||
|
*/
|
||||||
|
private static void printHelp(Options options, int exitCode)
|
||||||
|
{
|
||||||
|
// print the help message
|
||||||
|
HelpFormatter myhelp = new HelpFormatter();
|
||||||
|
myhelp.printHelp("MetadataExport\n", options);
|
||||||
|
System.out.println("\nfull export: metadataexport -f filename");
|
||||||
|
System.out.println("partial export: metadataexport -i handle -f filename");
|
||||||
|
System.exit(exitCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* main method to run the metadata exporter
|
||||||
|
*
|
||||||
|
* @param argv the command line arguments given
|
||||||
|
*/
|
||||||
|
public static void main(String[] argv) throws Exception
|
||||||
|
{
|
||||||
|
// Create an options object and populate it
|
||||||
|
CommandLineParser parser = new PosixParser();
|
||||||
|
|
||||||
|
Options options = new Options();
|
||||||
|
|
||||||
|
options.addOption("i", "id", true, "ID or handle of thing to export (item, collection, or community)");
|
||||||
|
options.addOption("f", "file", true, "destination where you want file written");
|
||||||
|
options.addOption("h", "help", false, "help");
|
||||||
|
|
||||||
|
CommandLine line = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
line = parser.parse(options, argv);
|
||||||
|
}
|
||||||
|
catch (ParseException pe)
|
||||||
|
{
|
||||||
|
System.err.println("Error with commands.");
|
||||||
|
printHelp(options, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.hasOption('h'))
|
||||||
|
{
|
||||||
|
printHelp(options, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check a filename is given
|
||||||
|
if (!line.hasOption('f'))
|
||||||
|
{
|
||||||
|
System.err.println("Required parameter -f missing!");
|
||||||
|
printHelp(options, 1);
|
||||||
|
}
|
||||||
|
String filename = line.getOptionValue('f');
|
||||||
|
|
||||||
|
// Create a context
|
||||||
|
Context c = new Context();
|
||||||
|
c.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
// The things we'll export
|
||||||
|
ItemIterator toExport = null;
|
||||||
|
MetadataExport exporter = null;
|
||||||
|
|
||||||
|
// Check we have an item OK
|
||||||
|
if (!line.hasOption('i'))
|
||||||
|
{
|
||||||
|
System.out.println("Exporting whole repository WARNING: May take some time!");
|
||||||
|
exporter = new MetadataExport(c, Item.findAll(c));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
String handle = line.getOptionValue('i');
|
||||||
|
DSpaceObject dso = HandleManager.resolveToObject(c, handle);
|
||||||
|
if (dso == null)
|
||||||
|
{
|
||||||
|
System.err.println("Item '" + handle + "' does not resolve to an item in your repository!");
|
||||||
|
printHelp(options, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dso.getType() == Constants.ITEM)
|
||||||
|
{
|
||||||
|
System.out.println("Exporting item '" + dso.getName() + "' (" + handle + ")");
|
||||||
|
ArrayList item = new ArrayList();
|
||||||
|
item.add(dso.getID());
|
||||||
|
exporter = new MetadataExport(c, new ItemIterator(c, item));
|
||||||
|
}
|
||||||
|
else if (dso.getType() == Constants.COLLECTION)
|
||||||
|
{
|
||||||
|
System.out.println("Exporting collection '" + dso.getName() + "' (" + handle + ")");
|
||||||
|
Collection collection = (Collection)dso;
|
||||||
|
toExport = collection.getAllItems();
|
||||||
|
exporter = new MetadataExport(c, toExport);
|
||||||
|
}
|
||||||
|
else if (dso.getType() == Constants.COMMUNITY)
|
||||||
|
{
|
||||||
|
System.out.println("Exporting community '" + dso.getName() + "' (" + handle + ")");
|
||||||
|
exporter = new MetadataExport(c, (Community)dso);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.err.println("Error identifying '" + handle + "'");
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perform the export
|
||||||
|
DSpaceCSV csv = exporter.export();
|
||||||
|
|
||||||
|
// Save the files to the file
|
||||||
|
csv.save(filename);
|
||||||
|
|
||||||
|
// Finsh off and tidy up
|
||||||
|
c.restoreAuthSystemState();
|
||||||
|
c.complete();
|
||||||
|
}
|
||||||
|
}
|
1018
dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java
Normal file
1018
dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* MetadataImportException.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.bulkedit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Metadata importer exception
|
||||||
|
*
|
||||||
|
* @author Stuart Lewis
|
||||||
|
*/
|
||||||
|
public class MetadataImportException extends Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Instantiate a new MetadataImportException
|
||||||
|
*
|
||||||
|
* @param message the error message
|
||||||
|
*/
|
||||||
|
public MetadataImportException(String message)
|
||||||
|
{
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@@ -281,6 +281,20 @@ jsp.dspace-admin.group-eperson-select.title = Select EPerson
|
|||||||
jsp.dspace-admin.group-group-select.add = Add Group
|
jsp.dspace-admin.group-group-select.add = Add Group
|
||||||
jsp.dspace-admin.group-group-select.heading = Select Group to Add to Group {0}
|
jsp.dspace-admin.group-group-select.heading = Select Group to Add to Group {0}
|
||||||
jsp.dspace-admin.group-group-select.title = Select Group
|
jsp.dspace-admin.group-group-select.title = Select Group
|
||||||
|
jsp.dspace-admin.metadataimport.title = Import metadata
|
||||||
|
jsp.dspace-admin.metadataimport.apply = Apply changes
|
||||||
|
jsp.dspace-admin.metadataimport.unknownerror = An unknown error has occured
|
||||||
|
jsp.dspace-admin.metadataimport.changesforitem = Changes for item
|
||||||
|
jsp.dspace-admin.metadataimport.newitem = New item
|
||||||
|
jsp.dspace-admin.metadataimport.addtocollection = Add to collection
|
||||||
|
jsp.dspace-admin.metadataimport.addedtocollection = Added to collection
|
||||||
|
jsp.dspace-admin.metadataimport.removefromcollection = Remove from collection
|
||||||
|
jsp.dspace-admin.metadataimport.removedfromcollection = Removed from collection
|
||||||
|
jsp.dspace-admin.metadataimport.add = Add
|
||||||
|
jsp.dspace-admin.metadataimport.added = Added
|
||||||
|
jsp.dspace-admin.metadataimport.remove = Remove
|
||||||
|
jsp.dspace-admin.metadataimport.removed = Removed
|
||||||
|
jsp.dspace-admin.metadataimport.
|
||||||
jsp.dspace-admin.index.heading = Administration Tools
|
jsp.dspace-admin.index.heading = Administration Tools
|
||||||
jsp.dspace-admin.index.text = Please select an operation from the navigation bar on the left.
|
jsp.dspace-admin.index.text = Please select an operation from the navigation bar on the left.
|
||||||
jsp.dspace-admin.item-select.enter = Enter the Handle or internal item ID of the item you wish to select.
|
jsp.dspace-admin.item-select.enter = Enter the Handle or internal item ID of the item you wish to select.
|
||||||
@@ -490,6 +504,7 @@ jsp.general.goto = Go to
|
|||||||
jsp.general.home = DSpace Home
|
jsp.general.home = DSpace Home
|
||||||
jsp.general.id = ID
|
jsp.general.id = ID
|
||||||
jsp.general.location = In:
|
jsp.general.location = In:
|
||||||
|
jsp.general.metadataexport.button = Export metadata
|
||||||
jsp.general.mydspace = My DSpace
|
jsp.general.mydspace = My DSpace
|
||||||
jsp.general.orbrowse = or <strong>browse</strong>
|
jsp.general.orbrowse = or <strong>browse</strong>
|
||||||
jsp.general.search.button = Go
|
jsp.general.search.button = Go
|
||||||
@@ -538,6 +553,7 @@ jsp.layout.navbar-admin.groups = Groups
|
|||||||
jsp.layout.navbar-admin.help = Help
|
jsp.layout.navbar-admin.help = Help
|
||||||
jsp.layout.navbar-admin.items = Items
|
jsp.layout.navbar-admin.items = Items
|
||||||
jsp.layout.navbar-admin.logout = Log Out
|
jsp.layout.navbar-admin.logout = Log Out
|
||||||
|
jsp.layout.navbar-admin.metadataimport = Import metadata
|
||||||
jsp.layout.navbar-admin.metadataregistry = Metadata<br/>Registry
|
jsp.layout.navbar-admin.metadataregistry = Metadata<br/>Registry
|
||||||
jsp.layout.navbar-admin.statistics = Statistics
|
jsp.layout.navbar-admin.statistics = Statistics
|
||||||
jsp.layout.navbar-admin.supervisors = Supervisors
|
jsp.layout.navbar-admin.supervisors = Supervisors
|
||||||
|
@@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
* MetadataExportServlet.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.webui.servlet;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.dspace.app.bulkedit.MetadataExport;
|
||||||
|
import org.dspace.app.bulkedit.DSpaceCSV;
|
||||||
|
import org.dspace.app.webui.util.JSPManager;
|
||||||
|
import org.dspace.authorize.AuthorizeException;
|
||||||
|
import org.dspace.core.*;
|
||||||
|
import org.dspace.content.DSpaceObject;
|
||||||
|
import org.dspace.content.ItemIterator;
|
||||||
|
import org.dspace.content.Collection;
|
||||||
|
import org.dspace.content.Community;
|
||||||
|
import org.dspace.handle.HandleManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Servlet to export metadata as CSV (comma separated values)
|
||||||
|
*
|
||||||
|
* @author Stuart Lewis
|
||||||
|
*/
|
||||||
|
public class MetadataExportServlet extends DSpaceServlet
|
||||||
|
{
|
||||||
|
/** log4j category */
|
||||||
|
private static Logger log = Logger.getLogger(MetadataExportServlet.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Respond to a post request
|
||||||
|
*
|
||||||
|
* @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
|
||||||
|
{
|
||||||
|
// Get the handle requested for the export
|
||||||
|
String handle = request.getParameter("handle");
|
||||||
|
log.info(LogManager.getHeader(context, "metadataexport", "exporting_handle:" + handle));
|
||||||
|
ItemIterator toExport = null;
|
||||||
|
MetadataExport exporter = null;
|
||||||
|
if (handle != null)
|
||||||
|
{
|
||||||
|
DSpaceObject thing = HandleManager.resolveToObject(context, handle);
|
||||||
|
if (thing != null)
|
||||||
|
{
|
||||||
|
if (thing.getType() == Constants.ITEM)
|
||||||
|
{
|
||||||
|
ArrayList item = new ArrayList();
|
||||||
|
item.add(thing.getID());
|
||||||
|
exporter = new MetadataExport(context, new ItemIterator(context, item));
|
||||||
|
}
|
||||||
|
else if (thing.getType() == Constants.COLLECTION)
|
||||||
|
{
|
||||||
|
Collection collection = (Collection)thing;
|
||||||
|
toExport = collection.getAllItems();
|
||||||
|
exporter = new MetadataExport(context, toExport);
|
||||||
|
}
|
||||||
|
else if (thing.getType() == Constants.COMMUNITY)
|
||||||
|
{
|
||||||
|
exporter = new MetadataExport(context, (Community)thing);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perform the export
|
||||||
|
DSpaceCSV csv = exporter.export();
|
||||||
|
|
||||||
|
// Return the csv file
|
||||||
|
response.setContentType("text/csv; charset=UTF-8");
|
||||||
|
response.setHeader("Content-Disposition", "attachment; filename=" + handle.replaceAll("/", "-") + ".csv");
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
out.write(csv.toString());
|
||||||
|
out.flush();
|
||||||
|
out.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Something has gone wrong
|
||||||
|
JSPManager.showIntegrityError(request, response);
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,194 @@
|
|||||||
|
/*
|
||||||
|
* MetadataImportServlet.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.webui.servlet;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
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.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
|
||||||
|
{
|
||||||
|
/** log4j category */
|
||||||
|
private static Logger log = Logger.getLogger(MetadataImportServlet.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))
|
||||||
|
{
|
||||||
|
// Process the file uploaded
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Get the changes
|
||||||
|
log.info(LogManager.getHeader(context, "metadataimport", "loading file"));
|
||||||
|
ArrayList<BulkEditChange> changes = processUpload(context, request);
|
||||||
|
log.debug(LogManager.getHeader(context, "metadataimport", changes.size() + " items with changes identifed"));
|
||||||
|
|
||||||
|
// Were there any changes detected?
|
||||||
|
if (changes.size() != 0)
|
||||||
|
{
|
||||||
|
request.setAttribute("changes", changes);
|
||||||
|
request.setAttribute("changed", false);
|
||||||
|
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 (Exception e)
|
||||||
|
{
|
||||||
|
request.setAttribute("message", e.getMessage());
|
||||||
|
log.debug(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
|
||||||
|
HttpSession session = request.getSession(true);
|
||||||
|
DSpaceCSV csv = (DSpaceCSV)session.getAttribute("csv");
|
||||||
|
|
||||||
|
// Make the changes
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MetadataImport mImport = new MetadataImport(context, csv.getCSVLines());
|
||||||
|
ArrayList<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);
|
||||||
|
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
|
||||||
|
HttpSession session = request.getSession(true);
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private ArrayList<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);
|
||||||
|
MetadataImport mImport = new MetadataImport(context, csv.getCSVLines());
|
||||||
|
ArrayList<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
|
||||||
|
f.delete();
|
||||||
|
|
||||||
|
// Return the changes
|
||||||
|
return changes;
|
||||||
|
}
|
||||||
|
}
|
@@ -278,6 +278,16 @@
|
|||||||
<servlet-class>org.dspace.app.webui.servlet.LogoutServlet</servlet-class>
|
<servlet-class>org.dspace.app.webui.servlet.LogoutServlet</servlet-class>
|
||||||
</servlet>
|
</servlet>
|
||||||
|
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>metadataexport</servlet-name>
|
||||||
|
<servlet-class>org.dspace.app.webui.servlet.MetadataExportServlet</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>metadataimport</servlet-name>
|
||||||
|
<servlet-class>org.dspace.app.webui.servlet.MetadataImportServlet</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
|
||||||
<servlet>
|
<servlet>
|
||||||
<servlet-name>metadata-field-registry</servlet-name>
|
<servlet-name>metadata-field-registry</servlet-name>
|
||||||
<servlet-class>org.dspace.app.webui.servlet.admin.MetadataFieldRegistryServlet</servlet-class>
|
<servlet-class>org.dspace.app.webui.servlet.admin.MetadataFieldRegistryServlet</servlet-class>
|
||||||
@@ -546,6 +556,16 @@
|
|||||||
<url-pattern>/logout</url-pattern>
|
<url-pattern>/logout</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>metadataexport</servlet-name>
|
||||||
|
<url-pattern>/dspace-admin/metadataexport</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>metadataimport</servlet-name>
|
||||||
|
<url-pattern>/dspace-admin/metadataimport</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
<servlet-mapping>
|
<servlet-mapping>
|
||||||
<servlet-name>metadata-field-registry</servlet-name>
|
<servlet-name>metadata-field-registry</servlet-name>
|
||||||
<url-pattern>/dspace-admin/metadata-field-registry</url-pattern>
|
<url-pattern>/dspace-admin/metadata-field-registry</url-pattern>
|
||||||
|
@@ -309,6 +309,14 @@
|
|||||||
</form>
|
</form>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td headers="t1" class="standard" align="center">
|
||||||
|
<form method="post" action="<%=request.getContextPath()%>/dspace-admin/metadataexport">
|
||||||
|
<input type="hidden" name="handle" value="<%= collection.getHandle() %>" />
|
||||||
|
<input type="submit" value="<fmt:message key="jsp.general.metadataexport.button"/>" />
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<% } %>
|
<% } %>
|
||||||
<tr>
|
<tr>
|
||||||
<td headers="t1" class="standard" align="center">
|
<td headers="t1" class="standard" align="center">
|
||||||
|
@@ -352,6 +352,14 @@
|
|||||||
<input type="submit" value="<fmt:message key="jsp.mydspace.request.export.migratecommunity"/>" />
|
<input type="submit" value="<fmt:message key="jsp.mydspace.request.export.migratecommunity"/>" />
|
||||||
</form>
|
</form>
|
||||||
</td>
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td headers="t1" class="standard" align="center">
|
||||||
|
<form method="post" action="<%=request.getContextPath()%>/dspace-admin/metadataexport">
|
||||||
|
<input type="hidden" name="handle" value="<%= community.getHandle() %>" />
|
||||||
|
<input type="submit" value="<fmt:message key="jsp.general.metadataexport.button"/>" />
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<% } %>
|
<% } %>
|
||||||
<tr>
|
<tr>
|
||||||
|
@@ -61,9 +61,7 @@
|
|||||||
|
|
||||||
<%@ taglib uri="http://www.dspace.org/dspace-tags.tld" prefix="dspace" %>
|
<%@ taglib uri="http://www.dspace.org/dspace-tags.tld" prefix="dspace" %>
|
||||||
|
|
||||||
<%@ page import="org.dspace.app.webui.util.UIUtil" %>
|
|
||||||
<%@ page import="org.dspace.content.Collection" %>
|
<%@ page import="org.dspace.content.Collection" %>
|
||||||
<%@ page import="org.dspace.content.Community" %>
|
|
||||||
<%@ page import="org.dspace.content.DCValue" %>
|
<%@ page import="org.dspace.content.DCValue" %>
|
||||||
<%@ page import="org.dspace.content.Item" %>
|
<%@ page import="org.dspace.content.Item" %>
|
||||||
<%@ page import="org.dspace.core.ConfigurationManager" %>
|
<%@ page import="org.dspace.core.ConfigurationManager" %>
|
||||||
@@ -141,6 +139,10 @@
|
|||||||
<input type="hidden" name="step" value="<%= MyDSpaceServlet.REQUEST_MIGRATE_ARCHIVE %>" />
|
<input type="hidden" name="step" value="<%= MyDSpaceServlet.REQUEST_MIGRATE_ARCHIVE %>" />
|
||||||
<input type="submit" name="submit" value="<fmt:message key="jsp.mydspace.request.export.migrateitem"/>" />
|
<input type="submit" name="submit" value="<fmt:message key="jsp.mydspace.request.export.migrateitem"/>" />
|
||||||
</form>
|
</form>
|
||||||
|
<form method="post" action="<%= request.getContextPath() %>/dspace-admin/metadataexport">
|
||||||
|
<input type="hidden" name="handle" value="<%= item.getHandle() %>" />
|
||||||
|
<input type="submit" name="submit" value="<fmt:message key="jsp.general.metadataexport.button"/>" />
|
||||||
|
</form>
|
||||||
</td>
|
</td>
|
||||||
<td class="evenRowEvenCol" align="center">
|
<td class="evenRowEvenCol" align="center">
|
||||||
<form method="get" action="<%= request.getContextPath() %>/tools/edit-item">
|
<form method="get" action="<%= request.getContextPath() %>/tools/edit-item">
|
||||||
|
@@ -0,0 +1,68 @@
|
|||||||
|
<%@ page import="javax.servlet.jsp.jstl.fmt.LocaleSupport" %>
|
||||||
|
<%--
|
||||||
|
- 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 their
|
||||||
|
- 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.
|
||||||
|
--%>
|
||||||
|
|
||||||
|
<%--
|
||||||
|
- Form to show an error from the metadata importer
|
||||||
|
--%>
|
||||||
|
|
||||||
|
<%@ page contentType="text/html;charset=UTF-8" %>
|
||||||
|
|
||||||
|
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
|
||||||
|
|
||||||
|
<%@ taglib uri="http://www.dspace.org/dspace-tags.tld" prefix="dspace" %>
|
||||||
|
|
||||||
|
<%
|
||||||
|
String error = (String)request.getAttribute("error");
|
||||||
|
if (error == null)
|
||||||
|
{
|
||||||
|
error = LocaleSupport.getLocalizedMessage(pageContext, "jsp.dspace-admin.metadataimport.unknownerror");
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
|
||||||
|
<dspace:layout titlekey="jsp.dspace-admin.metadataimport.title"
|
||||||
|
navbar="admin"
|
||||||
|
locbar="link"
|
||||||
|
parenttitlekey="jsp.administer"
|
||||||
|
parentlink="/dspace-admin"
|
||||||
|
nocache="true">
|
||||||
|
|
||||||
|
<h1><fmt:message key="jsp.dspace-admin.metadataimport.title"/></h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<b><%= error %></b>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</dspace:layout>
|
@@ -0,0 +1,194 @@
|
|||||||
|
<%--
|
||||||
|
- 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 their
|
||||||
|
- 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.
|
||||||
|
--%>
|
||||||
|
|
||||||
|
<%--
|
||||||
|
- Show the changes that might be made
|
||||||
|
--%>
|
||||||
|
|
||||||
|
<%@ page contentType="text/html;charset=UTF-8" %>
|
||||||
|
|
||||||
|
<%@ page import="org.dspace.app.bulkedit.BulkEditChange" %>
|
||||||
|
<%@ page import="java.util.ArrayList" %>
|
||||||
|
<%@ page import="org.dspace.content.Item" %>
|
||||||
|
<%@ page import="org.dspace.content.DCValue" %>
|
||||||
|
<%@ page import="org.dspace.content.Collection" %>
|
||||||
|
|
||||||
|
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
|
||||||
|
|
||||||
|
<%@ taglib uri="http://www.dspace.org/dspace-tags.tld" prefix="dspace" %>
|
||||||
|
|
||||||
|
<%
|
||||||
|
ArrayList<BulkEditChange> changes = (ArrayList<BulkEditChange>)request.getAttribute("changes");
|
||||||
|
boolean changed = ((Boolean)request.getAttribute("changed")).booleanValue();
|
||||||
|
%>
|
||||||
|
|
||||||
|
<dspace:layout titlekey="jsp.dspace-admin.metadataimport.title"
|
||||||
|
navbar="admin"
|
||||||
|
locbar="link"
|
||||||
|
parenttitlekey="jsp.administer"
|
||||||
|
parentlink="/dspace-admin"
|
||||||
|
nocache="true">
|
||||||
|
|
||||||
|
<h1><fmt:message key="jsp.dspace-admin.metadataimport.title"/></h1>
|
||||||
|
|
||||||
|
<table class="miscTable">
|
||||||
|
|
||||||
|
<%
|
||||||
|
// Display the changes
|
||||||
|
int changeCounter = 0;
|
||||||
|
for (BulkEditChange change : changes)
|
||||||
|
{
|
||||||
|
// Get the changes
|
||||||
|
ArrayList<DCValue> adds = change.getAdds();
|
||||||
|
ArrayList<DCValue> removes = change.getRemoves();
|
||||||
|
ArrayList<Collection> newCollections = change.getNewOwningCollections();
|
||||||
|
ArrayList<Collection> oldCollections = change.getOldOwningCollections();
|
||||||
|
boolean isAChange = false;
|
||||||
|
if ((adds.size() > 0) || (removes.size() > 0) ||
|
||||||
|
(newCollections.size() > 0) || (oldCollections.size() > 0))
|
||||||
|
{
|
||||||
|
// Show the item
|
||||||
|
if (!change.isNewItem())
|
||||||
|
{
|
||||||
|
Item i = change.getItem();
|
||||||
|
%><tr><th class="oddRowOddCol"><fmt:message key="jsp.dspace-admin.metadataimport.changesforitem"/>: <%= i.getID() %> (<%= i.getHandle() %>)</th><th></th><th></th></tr><%
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
%><tr><th bgcolor="4E9258"><fmt:message key="jsp.dspace-admin.metadataimport.newitem"/>:</th><th></th><th></th></tr><%
|
||||||
|
}
|
||||||
|
changeCounter++;
|
||||||
|
isAChange = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show new collections
|
||||||
|
for (Collection c : newCollections)
|
||||||
|
{
|
||||||
|
String cHandle = c.getHandle();
|
||||||
|
String cName = c.getName();
|
||||||
|
if (!changed)
|
||||||
|
{
|
||||||
|
%><tr><td></td><td bgcolor="4E9258"><fmt:message key="jsp.dspace-admin.metadataimport.addtocollection"/></td><td bgcolor="4E9258">(<%= cHandle %>): <%= cName %></td></tr><%
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
%><tr><td></td><td bgcolor="4E9258"><fmt:message key="jsp.dspace-admin.metadataimport.addedtocollection"/></td><td bgcolor="4E9258">(<%= cHandle %>): <%= cName %></td></tr><%
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show old collections
|
||||||
|
for (Collection c : oldCollections)
|
||||||
|
{
|
||||||
|
String cHandle = c.getHandle();
|
||||||
|
String cName = c.getName();
|
||||||
|
if (!changed)
|
||||||
|
{
|
||||||
|
%><tr><td></td><td bgcolor="98AFC7"><fmt:message key="jsp.dspace-admin.metadataimport.removefromcollection"/></td><td bgcolor="98AFC7">(<%= cHandle %>): <%= cName %></td></tr><%
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
%><tr><td></td><td bgcolor="98AFC7"><fmt:message key="jsp.dspace-admin.metadataimport.removedfromcollection"/></td><td bgcolor="98AFC7">(<%= cHandle %>): <%= cName %></td></tr><%
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show additions
|
||||||
|
for (DCValue dcv : adds)
|
||||||
|
{
|
||||||
|
String md = dcv.schema + "." + dcv.element;
|
||||||
|
if (dcv.qualifier != null)
|
||||||
|
{
|
||||||
|
md += "." + dcv.qualifier;
|
||||||
|
}
|
||||||
|
if (dcv.language != null)
|
||||||
|
{
|
||||||
|
md += "[" + dcv.language + "]";
|
||||||
|
}
|
||||||
|
if (!changed)
|
||||||
|
{
|
||||||
|
%><tr><td></td><td bgcolor="4E9258"><fmt:message key="jsp.dspace-admin.metadataimport.add"/> (<%= md %>)</td><td bgcolor="4E9258"><%= dcv.value %></td></tr><%
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
%><tr><td></td><td bgcolor="4E9258"><fmt:message key="jsp.dspace-admin.metadataimport.added"/> (<%= md %>)</td><td bgcolor="4E9258"><%= dcv.value %></td></tr><%
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show removals
|
||||||
|
for (DCValue dcv : removes)
|
||||||
|
{
|
||||||
|
String md = dcv.schema + "." + dcv.element;
|
||||||
|
if (dcv.qualifier != null)
|
||||||
|
{
|
||||||
|
md += "." + dcv.qualifier;
|
||||||
|
}
|
||||||
|
if (dcv.language != null)
|
||||||
|
{
|
||||||
|
md += "[" + dcv.language + "]";
|
||||||
|
}
|
||||||
|
if (!changed)
|
||||||
|
{
|
||||||
|
%><tr><td></td><td bgcolor="98AFC7"><fmt:message key="jsp.dspace-admin.metadataimport.remove"/> (<%= md %>)</td><td bgcolor="98AFC7"><%= dcv.value %></td></tr><%
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
%><tr><td></td><td bgcolor="98AFC7"><fmt:message key="jsp.dspace-admin.metadataimport.removed"/> (<%= md %>)</td><td bgcolor="98AFC7"><%= dcv.value %></td></tr><%
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<%
|
||||||
|
if (!changed)
|
||||||
|
{
|
||||||
|
%>
|
||||||
|
<p align="center">
|
||||||
|
<form method="post" action="">
|
||||||
|
<input type="hidden" name="type" value="confirm" />
|
||||||
|
<input type="submit" name="submit" value="<fmt:message key="jsp.dspace-admin.metadataimport.apply"/>" />
|
||||||
|
</form>
|
||||||
|
<form method="post" action="">
|
||||||
|
<input type="hidden" name="type" value="cancel" />
|
||||||
|
<input type="submit" name="submit" value="<fmt:message key="jsp.dspace-admin.general.cancel"/>" />
|
||||||
|
</form>
|
||||||
|
</p>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</dspace:layout>
|
@@ -0,0 +1,81 @@
|
|||||||
|
<%--
|
||||||
|
- 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 their
|
||||||
|
- 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.
|
||||||
|
--%>
|
||||||
|
|
||||||
|
<%--
|
||||||
|
- Form to upload a csv metadata file
|
||||||
|
--%>
|
||||||
|
|
||||||
|
<%@ page contentType="text/html;charset=UTF-8" %>
|
||||||
|
|
||||||
|
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
|
||||||
|
|
||||||
|
<%@ taglib uri="http://www.dspace.org/dspace-tags.tld" prefix="dspace" %>
|
||||||
|
|
||||||
|
<%
|
||||||
|
String message = (String)request.getAttribute("message");
|
||||||
|
if (message == null)
|
||||||
|
{
|
||||||
|
message = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message = "<p><b>" + message + "</b></p>";
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
|
||||||
|
<dspace:layout titlekey="jsp.dspace-admin.metadataimport.title"
|
||||||
|
navbar="admin"
|
||||||
|
locbar="link"
|
||||||
|
parenttitlekey="jsp.administer"
|
||||||
|
parentlink="/dspace-admin"
|
||||||
|
nocache="true">
|
||||||
|
|
||||||
|
<h1><fmt:message key="jsp.dspace-admin.metadataimport.title"/></h1>
|
||||||
|
|
||||||
|
<form method="post" enctype="multipart/form-data" action="">
|
||||||
|
|
||||||
|
<%= message %>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<input type="file" size="40" name="file"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<input type="submit" name="submit" value="<fmt:message key="jsp.dspace-admin.general.upload"/>" />
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</dspace:layout>
|
@@ -168,7 +168,7 @@
|
|||||||
<a href="<%= request.getContextPath() %>/dspace-admin/supervise"><fmt:message key="jsp.layout.navbar-admin.supervisors"/></a>
|
<a href="<%= request.getContextPath() %>/dspace-admin/supervise"><fmt:message key="jsp.layout.navbar-admin.supervisors"/></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr class="navigationBarItem">
|
<tr class="navigationBarItem">
|
||||||
<td>
|
<td>
|
||||||
<img alt="" src="<%= request.getContextPath() %>/image/<%= (currentPage.endsWith("/statistics") ? "arrow-highlight" : "arrow") %>.gif" width="16" height="16"/>
|
<img alt="" src="<%= request.getContextPath() %>/image/<%= (currentPage.endsWith("/statistics") ? "arrow-highlight" : "arrow") %>.gif" width="16" height="16"/>
|
||||||
@@ -177,6 +177,15 @@
|
|||||||
<a href="<%= request.getContextPath() %>/statistics"><fmt:message key="jsp.layout.navbar-admin.statistics"/></a>
|
<a href="<%= request.getContextPath() %>/statistics"><fmt:message key="jsp.layout.navbar-admin.statistics"/></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
<tr class="navigationBarItem">
|
||||||
|
<td>
|
||||||
|
<img alt="" src="<%= request.getContextPath() %>/image/<%= (currentPage.endsWith("/metadataimport") ? "arrow-highlight" : "arrow") %>.gif" width="16" height="16"/>
|
||||||
|
</td>
|
||||||
|
<td nowrap="nowrap" class="navigationBarItem">
|
||||||
|
<a href="<%= request.getContextPath() %>/dspace-admin/metadataimport"><fmt:message key="jsp.layout.navbar-admin.metadataimport"/></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2"> </td>
|
<td colspan="2"> </td>
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
- [DS-190] Portuguese (pt_PT) translation Messages.properties JSP-UI v1.5.2
|
- [DS-190] Portuguese (pt_PT) translation Messages.properties JSP-UI v1.5.2
|
||||||
|
|
||||||
(Stuart Lewis)
|
(Stuart Lewis)
|
||||||
|
- [DS-161] Bulk metadata editing
|
||||||
- [DS-194] Give METS ingester configuration option to make use of collection templates
|
- [DS-194] Give METS ingester configuration option to make use of collection templates
|
||||||
- [DS-195] Allow the primary bitstream to be set in the item importer / exporter
|
- [DS-195] Allow the primary bitstream to be set in the item importer / exporter
|
||||||
- [DS-196] METS exposed via OAI-PMH includes description.provenance information
|
- [DS-196] METS exposed via OAI-PMH includes description.provenance information
|
||||||
|
Reference in New Issue
Block a user