/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.identifier; import java.io.IOException; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.crosswalk.CrosswalkException; import org.dspace.content.crosswalk.DisseminationCrosswalk; import org.dspace.content.crosswalk.ParameterizedDisseminationCrosswalk; import org.dspace.core.Context; import org.dspace.core.factory.CoreServiceFactory; import org.dspace.handle.factory.HandleServiceFactory; import org.dspace.services.ConfigurationService; import org.dspace.utils.DSpace; import org.jdom.Element; import org.jdom.output.XMLOutputter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Provide XML based metadata crosswalk for EZID Identifier provider module. * * @author mohideen */ public class DataCiteXMLCreator { /** log4j category */ private static final Logger LOG = LoggerFactory.getLogger(DataCiteXMLCreator.class); /** * Name of crosswalk to convert metadata into DataCite Metadata Scheme. */ protected String CROSSWALK_NAME = "DataCite"; private static final String CFG_PREFIX = "identifier.doi.prefix"; private static final String CFG_PUBLISHER = "crosswalk.dissemination.DataCite.publisher"; private static final String CFG_DATAMANAGER = "crosswalk.dissemination.DataCite.dataManager"; private static final String CFG_HOSTINGINSTITUTION = "crosswalk.dissemination.DataCite.hostingInstitution"; /** * DisseminationCrosswalk to map local metadata into DataCite metadata. The * name of the crosswalk is set by {@link #setDisseminationCrosswalkName(String) * setDisseminationCrosswalkName} which instantiates the crosswalk. */ protected ParameterizedDisseminationCrosswalk xwalk; public String getXMLString(Context context, DSpaceObject dso) { if (dso == null) { LOG.info("Invalid object: {}", dso); return null; } this.prepareXwalk(); if (!this.xwalk.canDisseminate(dso)) { LOG.error("Crosswalk " + this.CROSSWALK_NAME + " cannot disseminate DSO with type " + dso.getType() + " and ID " + dso.getID() + "."); return null; } // Set the transform's parameters. // XXX Should the actual list be configurable? ConfigurationService cfg = new DSpace().getConfigurationService(); Map<String, String> parameters = new HashMap<>(); if (cfg.hasProperty(CFG_PREFIX)) parameters.put("prefix", cfg.getProperty(CFG_PREFIX)); if (cfg.hasProperty(CFG_PUBLISHER)) parameters.put("publisher", cfg.getProperty(CFG_PUBLISHER)); if (cfg.hasProperty(CFG_DATAMANAGER)) parameters.put("datamanager", cfg.getProperty(CFG_DATAMANAGER)); if (cfg.hasProperty(CFG_HOSTINGINSTITUTION)) parameters.put("hostinginstitution", cfg.getProperty(CFG_HOSTINGINSTITUTION)); // Transform the metadata Element root; try { root = xwalk.disseminateElement(context, dso, parameters); } catch (CrosswalkException | IOException | SQLException | AuthorizeException e) { LOG.error("Exception while crosswalking DSO with type " + dso.getType() + " and ID " + dso.getID() + ".", e); return null; } XMLOutputter xOut = new XMLOutputter(); return xOut.outputString(root); } /** * Set the name of the dissemination crosswalk used to convert the metadata * into DataCite Metadata Schema. Used by spring dependency injection. * * @param CROSSWALK_NAME * The name of the dissemination crosswalk to use. */ public void setDisseminationCrosswalkName(String CROSSWALK_NAME) { this.CROSSWALK_NAME = CROSSWALK_NAME; } protected void prepareXwalk() { if (null != this.xwalk) return; this.xwalk = (ParameterizedDisseminationCrosswalk) CoreServiceFactory .getInstance().getPluginService() .getNamedPlugin(DisseminationCrosswalk.class, this.CROSSWALK_NAME); if (this.xwalk == null) { throw new RuntimeException("Can't find crosswalk '" + CROSSWALK_NAME + "'!"); } } /** * Test the operation of this class. * * @param argv <br>[0]: handle of an object for which to prepare XML metadata. * @throws Exception if error */ public static void main(String[] argv) throws Exception { String handle = argv[0]; DataCiteXMLCreator instance = new DataCiteXMLCreator(); Context context = new Context(); DSpaceObject dso = HandleServiceFactory.getInstance().getHandleService() .resolveToObject(context, handle); System.out.println(instance.getXMLString(context, dso)); } }