[DS-4300] Add option to use provided Handles if any.

This commit is contained in:
Mark H. Wood
2019-07-15 12:41:13 -04:00
parent 1812099674
commit e02d91122f

View File

@@ -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");