mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-17 06:53:09 +00:00
[DS-4300] Add option to use provided Handles if any.
This commit is contained in:
@@ -30,6 +30,7 @@ import org.apache.commons.cli.HelpFormatter;
|
|||||||
import org.apache.commons.cli.Option;
|
import org.apache.commons.cli.Option;
|
||||||
import org.apache.commons.cli.Options;
|
import org.apache.commons.cli.Options;
|
||||||
import org.apache.commons.cli.ParseException;
|
import org.apache.commons.cli.ParseException;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.xpath.XPathAPI;
|
import org.apache.xpath.XPathAPI;
|
||||||
import org.dspace.authorize.AuthorizeException;
|
import org.dspace.authorize.AuthorizeException;
|
||||||
import org.dspace.content.Collection;
|
import org.dspace.content.Collection;
|
||||||
@@ -43,6 +44,8 @@ import org.dspace.content.service.CommunityService;
|
|||||||
import org.dspace.core.Context;
|
import org.dspace.core.Context;
|
||||||
import org.dspace.eperson.factory.EPersonServiceFactory;
|
import org.dspace.eperson.factory.EPersonServiceFactory;
|
||||||
import org.dspace.eperson.service.EPersonService;
|
import org.dspace.eperson.service.EPersonService;
|
||||||
|
import org.dspace.handle.factory.HandleServiceFactory;
|
||||||
|
import org.dspace.handle.service.HandleService;
|
||||||
import org.jdom.Element;
|
import org.jdom.Element;
|
||||||
import org.jdom.output.Format;
|
import org.jdom.output.Format;
|
||||||
import org.jdom.output.XMLOutputter;
|
import org.jdom.output.XMLOutputter;
|
||||||
@@ -67,6 +70,7 @@ import org.xml.sax.SAXException;
|
|||||||
* </community>
|
* </community>
|
||||||
* </import_structure>
|
* </import_structure>
|
||||||
* }</pre>
|
* }</pre>
|
||||||
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* It can be arbitrarily deep, and supports all the metadata elements
|
* It can be arbitrarily deep, and supports all the metadata elements
|
||||||
* that make up the community and collection metadata. See the system
|
* that make up the community and collection metadata. See the system
|
||||||
@@ -95,12 +99,16 @@ public class StructBuilder {
|
|||||||
*/
|
*/
|
||||||
private static final Map<String, String> communityMap = new HashMap<>();
|
private static final Map<String, String> communityMap = new HashMap<>();
|
||||||
|
|
||||||
protected static CommunityService communityService
|
protected static final CommunityService communityService
|
||||||
= ContentServiceFactory.getInstance().getCommunityService();
|
= ContentServiceFactory.getInstance().getCommunityService();
|
||||||
protected static CollectionService collectionService
|
protected static final CollectionService collectionService
|
||||||
= ContentServiceFactory.getInstance().getCollectionService();
|
= ContentServiceFactory.getInstance().getCollectionService();
|
||||||
protected static EPersonService ePersonService
|
protected static final EPersonService ePersonService
|
||||||
= EPersonServiceFactory.getInstance().getEPersonService();
|
= EPersonServiceFactory.getInstance().getEPersonService();
|
||||||
|
protected static final HandleService handleService
|
||||||
|
= HandleServiceFactory.getInstance().getHandleService();
|
||||||
|
|
||||||
|
private static boolean keepHandles;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor
|
* Default constructor
|
||||||
@@ -136,6 +144,7 @@ public class StructBuilder {
|
|||||||
options.addOption("h", "help", false, "Print this help message.");
|
options.addOption("h", "help", false, "Print this help message.");
|
||||||
options.addOption("?", "help");
|
options.addOption("?", "help");
|
||||||
options.addOption("x", "export", false, "Export the current structure as XML.");
|
options.addOption("x", "export", false, "Export the current structure as XML.");
|
||||||
|
options.addOption("k", "keep-handles", false, "Apply Handles from input document.");
|
||||||
|
|
||||||
options.addOption(Option.builder("e").longOpt("eperson")
|
options.addOption(Option.builder("e").longOpt("eperson")
|
||||||
.desc("User who is manipulating the repository's structure.")
|
.desc("User who is manipulating the repository's structure.")
|
||||||
@@ -211,6 +220,7 @@ public class StructBuilder {
|
|||||||
inputStream = new FileInputStream(input);
|
inputStream = new FileInputStream(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keepHandles = options.hasOption("k");
|
||||||
importStructure(context, inputStream, outputStream);
|
importStructure(context, inputStream, outputStream);
|
||||||
}
|
}
|
||||||
System.exit(0);
|
System.exit(0);
|
||||||
@@ -228,8 +238,10 @@ public class StructBuilder {
|
|||||||
* @throws TransformerException
|
* @throws TransformerException
|
||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
static void importStructure(Context context, InputStream input, OutputStream output)
|
static void importStructure(Context context, InputStream input,
|
||||||
throws IOException, ParserConfigurationException, SQLException, TransformerException {
|
OutputStream output)
|
||||||
|
throws IOException, ParserConfigurationException, SQLException,
|
||||||
|
TransformerException {
|
||||||
|
|
||||||
// load the XML
|
// load the XML
|
||||||
Document document = null;
|
Document document = null;
|
||||||
@@ -255,7 +267,19 @@ public class StructBuilder {
|
|||||||
// Check for 'identifier' attributes -- possibly output by this class.
|
// Check for 'identifier' attributes -- possibly output by this class.
|
||||||
NodeList identifierNodes = XPathAPI.selectNodeList(document, "//*[@identifier]");
|
NodeList identifierNodes = XPathAPI.selectNodeList(document, "//*[@identifier]");
|
||||||
if (identifierNodes.getLength() > 0) {
|
if (identifierNodes.getLength() > 0) {
|
||||||
System.err.println("The input document has 'identifier' attributes, which will be ignored.");
|
if (!keepHandles) {
|
||||||
|
System.err.println("The input document has 'identifier' attributes, which will be ignored.");
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < identifierNodes.getLength() ; i++) {
|
||||||
|
String identifier = identifierNodes.item(i).getAttributes().item(0).getTextContent();
|
||||||
|
if (handleService.resolveToURL(context, identifier) != null) {
|
||||||
|
System.err.printf("The input document contains handle %s,"
|
||||||
|
+ " which is in use already. Aborting...%n",
|
||||||
|
identifier);
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// load the mappings into the member variable hashmaps
|
// load the mappings into the member variable hashmaps
|
||||||
@@ -608,21 +632,23 @@ public class StructBuilder {
|
|||||||
Element[] elements = new Element[communities.getLength()];
|
Element[] elements = new Element[communities.getLength()];
|
||||||
|
|
||||||
for (int i = 0; i < communities.getLength(); i++) {
|
for (int i = 0; i < communities.getLength(); i++) {
|
||||||
Community community;
|
Node tn = communities.item(i);
|
||||||
Element element = new Element("community");
|
Node identifier = tn.getAttributes().getNamedItem("identifier");
|
||||||
|
|
||||||
// create the community or sub community
|
// create the community or sub community
|
||||||
if (parent != null) {
|
Community community;
|
||||||
|
if (null == identifier
|
||||||
|
|| StringUtils.isBlank(identifier.getNodeValue())
|
||||||
|
|| !keepHandles) {
|
||||||
community = communityService.create(parent, context);
|
community = communityService.create(parent, context);
|
||||||
} else {
|
} else {
|
||||||
community = communityService.create(null, context);
|
community = communityService.create(parent, context, identifier.getNodeValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
// default the short description to be an empty string
|
// default the short description to be an empty string
|
||||||
communityService.setMetadata(context, community, "short_description", " ");
|
communityService.setMetadata(context, community, "short_description", " ");
|
||||||
|
|
||||||
// now update the metadata
|
// now update the metadata
|
||||||
Node tn = communities.item(i);
|
|
||||||
for (Map.Entry<String, String> entry : communityMap.entrySet()) {
|
for (Map.Entry<String, String> entry : communityMap.entrySet()) {
|
||||||
NodeList nl = XPathAPI.selectNodeList(tn, entry.getKey());
|
NodeList nl = XPathAPI.selectNodeList(tn, entry.getKey());
|
||||||
if (nl.getLength() == 1) {
|
if (nl.getLength() == 1) {
|
||||||
@@ -647,6 +673,7 @@ public class StructBuilder {
|
|||||||
// but it's here to keep it separate from the create process in
|
// but it's here to keep it separate from the create process in
|
||||||
// case
|
// case
|
||||||
// we want to move it or make it switchable later
|
// we want to move it or make it switchable later
|
||||||
|
Element element = new Element("community");
|
||||||
element.setAttribute("identifier", community.getHandle());
|
element.setAttribute("identifier", community.getHandle());
|
||||||
|
|
||||||
Element nameElement = new Element("name");
|
Element nameElement = new Element("name");
|
||||||
@@ -713,14 +740,23 @@ public class StructBuilder {
|
|||||||
Element[] elements = new Element[collections.getLength()];
|
Element[] elements = new Element[collections.getLength()];
|
||||||
|
|
||||||
for (int i = 0; i < collections.getLength(); i++) {
|
for (int i = 0; i < collections.getLength(); i++) {
|
||||||
Element element = new Element("collection");
|
Node tn = collections.item(i);
|
||||||
Collection collection = collectionService.create(context, parent);
|
Node identifier = tn.getAttributes().getNamedItem("identifier");
|
||||||
|
|
||||||
|
// Create the Collection.
|
||||||
|
Collection collection;
|
||||||
|
if (null == identifier
|
||||||
|
|| StringUtils.isBlank(identifier.getNodeValue())
|
||||||
|
|| !keepHandles) {
|
||||||
|
collection = collectionService.create(context, parent);
|
||||||
|
} else {
|
||||||
|
collection = collectionService.create(context, parent, identifier.getNodeValue());
|
||||||
|
}
|
||||||
|
|
||||||
// default the short description to the empty string
|
// default the short description to the empty string
|
||||||
collectionService.setMetadata(context, collection, "short_description", " ");
|
collectionService.setMetadata(context, collection, "short_description", " ");
|
||||||
|
|
||||||
// import the rest of the metadata
|
// import the rest of the metadata
|
||||||
Node tn = collections.item(i);
|
|
||||||
for (Map.Entry<String, String> entry : collectionMap.entrySet()) {
|
for (Map.Entry<String, String> entry : collectionMap.entrySet()) {
|
||||||
NodeList nl = XPathAPI.selectNodeList(tn, entry.getKey());
|
NodeList nl = XPathAPI.selectNodeList(tn, entry.getKey());
|
||||||
if (nl.getLength() == 1) {
|
if (nl.getLength() == 1) {
|
||||||
@@ -730,6 +766,7 @@ public class StructBuilder {
|
|||||||
|
|
||||||
collectionService.update(context, collection);
|
collectionService.update(context, collection);
|
||||||
|
|
||||||
|
Element element = new Element("collection");
|
||||||
element.setAttribute("identifier", collection.getHandle());
|
element.setAttribute("identifier", collection.getHandle());
|
||||||
|
|
||||||
Element nameElement = new Element("name");
|
Element nameElement = new Element("name");
|
||||||
|
Reference in New Issue
Block a user