diff --git a/src/main/java/edu/harvard/iq/dataverse/AbstractGlobalIdServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/AbstractGlobalIdServiceBean.java index 044ca644cc4..6305b871cc0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/AbstractGlobalIdServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/AbstractGlobalIdServiceBean.java @@ -29,6 +29,8 @@ public abstract class AbstractGlobalIdServiceBean implements GlobalIdServiceBean DataFileServiceBean datafileService; @EJB SystemConfig systemConfig; + + public static String UNAVAILABLE = ":unav"; @Override public String getIdentifierForLookup(String protocol, String authority, String identifier) { @@ -57,19 +59,19 @@ protected Map addBasicMetadata(DvObject dvObjectIn, Map addBasicMetadata(DvObject dvObjectIn, Map addDOIMetadataForDestroyedDataset(DvObject dvObjectIn) { + Map metadata = new HashMap<>(); + String authorString = UNAVAILABLE; + String producerString = UNAVAILABLE; + String titleString = "This item has been removed from publication"; + + metadata.put("datacite.creator", authorString); + metadata.put("datacite.title", titleString); + metadata.put("datacite.publisher", producerString); + metadata.put("datacite.publicationyear", "9999"); + return metadata; + } protected String getTargetUrl(DvObject dvObjectIn) { logger.log(Level.FINE,"getTargetUrl"); @@ -424,7 +439,7 @@ public String getMetadataFromDvObject(String identifier, Map met metadataTemplate.setTitle(dvObject.getCurrentName()); String producerString = dataverseService.findRootDataverse().getName(); if (producerString.isEmpty() || producerString.equals(DatasetField.NA_VALUE) ) { - producerString = ":unav"; + producerString = UNAVAILABLE; } metadataTemplate.setPublisher(producerString); metadataTemplate.setPublisherYear(metadata.get("datacite.publicationyear")); diff --git a/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterService.java b/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterService.java index af2e0e43d56..1eae797fa32 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterService.java +++ b/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterService.java @@ -116,22 +116,17 @@ public String registerIdentifier(String identifier, Map metadata return retString; } - public String deactivateIdentifier(String identifier, HashMap metadata, DvObject dvObject) { + public String deactivateIdentifier(String identifier, Map metadata, DvObject dvObject) { String retString = ""; - DOIDataCiteRegisterCache rc = findByDOI(identifier); - try { - DataCiteRESTfullClient client = getClient(); - if (rc != null) { - rc.setStatus("unavailable"); - retString = client.inactiveDataset(identifier.substring(identifier.indexOf(":") + 1)); - } - } catch (IOException io) { - } + String metadataString = getMetadataForDeactivateIdentifier(identifier, metadata, dvObject); + retString = client.postMetadata(metadataString); + retString = client.inactiveDataset(identifier.substring(identifier.indexOf(":") + 1)); + return retString; } - - public static String getMetadataFromDvObject(String identifier, Map metadata, DvObject dvObject) { + + public static String getMetadataFromDvObject(String identifier, Map metadata, DvObject dvObject) { Dataset dataset = null; @@ -148,7 +143,7 @@ public static String getMetadataFromDvObject(String identifier, Map metadata, DvObject dvObject) { + + DataCiteMetadataTemplate metadataTemplate = new DataCiteMetadataTemplate(); + metadataTemplate.setIdentifier(identifier.substring(identifier.indexOf(':') + 1)); + metadataTemplate.setCreators(Util.getListFromStr(metadata.get("datacite.creator"))); + + metadataTemplate.setDescription(AbstractGlobalIdServiceBean.UNAVAILABLE); + + String title =metadata.get("datacite.title"); + + System.out.print("Map metadata title: "+ metadata.get("datacite.title")); + + metadataTemplate.setAuthors(null); + + metadataTemplate.setTitle(title); + String producerString = AbstractGlobalIdServiceBean.UNAVAILABLE; + + metadataTemplate.setPublisher(producerString); + metadataTemplate.setPublisherYear(metadata.get("datacite.publicationyear")); + + String xmlMetadata = metadataTemplate.generateXML(dvObject); + logger.log(Level.FINE, "XML to send to DataCite: {0}", xmlMetadata); + return xmlMetadata; + } + public String modifyIdentifier(String identifier, HashMap metadata, DvObject dvObject) throws IOException { String xmlMetadata = getMetadataFromDvObject(identifier, metadata, dvObject); @@ -279,6 +299,8 @@ public HashMap getMetadata(String identifier) throws IOException DOIDataCiteRegisterCache rc = findByDOI(identifier); if (rc != null) { metadata.put("_status", rc.getStatus()); + } else { + metadata.put("_status", "public"); } } catch (RuntimeException e) { logger.log(Level.INFO, identifier, e); @@ -418,8 +440,9 @@ public String generateXML(DvObject dvObject) { .replace("${publisher}", this.publisher) .replace("${publisherYear}", publisherYearFinal) .replace("${description}", this.description); + StringBuilder creatorsElement = new StringBuilder(); - if (!authors.isEmpty()) { + if (authors!= null && !authors.isEmpty()) { for (DatasetAuthor author : authors) { creatorsElement.append(""); creatorsElement.append(author.getName().getDisplayValue()); @@ -444,27 +467,32 @@ public String generateXML(DvObject dvObject) { } } else { - creatorsElement.append(":unav"); + creatorsElement.append("").append(AbstractGlobalIdServiceBean.UNAVAILABLE).append(""); } xmlMetadata = xmlMetadata.replace("${creators}", creatorsElement.toString()); StringBuilder contributorsElement = new StringBuilder(); - for (String[] contact : this.getContacts()) { - if (!contact[0].isEmpty()) { - contributorsElement.append("" + contact[0] + ""); - if (!contact[1].isEmpty()) { - contributorsElement.append("" + contact[1] + ""); + if (this.getContacts() != null) { + for (String[] contact : this.getContacts()) { + if (!contact[0].isEmpty()) { + contributorsElement.append("" + contact[0] + ""); + if (!contact[1].isEmpty()) { + contributorsElement.append("" + contact[1] + ""); + } + contributorsElement.append(""); } - contributorsElement.append(""); } } - for (String[] producer : this.getProducers()) { - contributorsElement.append("" + producer[0] + ""); - if (!producer[1].isEmpty()) { - contributorsElement.append("" + producer[1] + ""); + + if (this.getProducers() != null) { + for (String[] producer : this.getProducers()) { + contributorsElement.append("" + producer[0] + ""); + if (!producer[1].isEmpty()) { + contributorsElement.append("" + producer[1] + ""); + } + contributorsElement.append(""); } - contributorsElement.append(""); } String relIdentifiers = generateRelatedIdentifiers(dvObject); diff --git a/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteServiceBean.java index fd8fe834586..8753e2138ec 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DOIDataCiteServiceBean.java @@ -17,6 +17,11 @@ public class DOIDataCiteServiceBean extends AbstractGlobalIdServiceBean { private static final Logger logger = Logger.getLogger(DOIDataCiteServiceBean.class.getCanonicalName()); + + private static final String PUBLIC = "public"; + private static final String FINDABLE = "findable"; + private static final String RESERVED = "reserved"; + private static final String DRAFT = "draft"; @EJB DOIDataCiteRegisterService doiDataCiteRegisterService; @@ -168,7 +173,7 @@ public void deleteRecordFromCache(Dataset datasetIn){ public void deleteIdentifier(DvObject dvObject) throws Exception { logger.log(Level.FINE,"deleteIdentifier"); String identifier = getIdentifier(dvObject); - HashMap doiMetadata = new HashMap<>(); + Map doiMetadata = new HashMap<>(); try { doiMetadata = doiDataCiteRegisterService.getMetadata(identifier); } catch (Exception e) { @@ -176,10 +181,10 @@ public void deleteIdentifier(DvObject dvObject) throws Exception { } String idStatus = doiMetadata.get("_status"); - if ( idStatus != null ) { switch ( idStatus ) { - case "reserved": + case RESERVED: + case DRAFT: logger.log(Level.INFO, "Delete status is reserved.."); try { doiDataCiteRegisterService.deleteIdentifier(identifier); @@ -188,16 +193,15 @@ public void deleteIdentifier(DvObject dvObject) throws Exception { } break; - case "public": + case PUBLIC: + case FINDABLE: //if public then it has been released set to unavailable and reset target to n2t url - updateIdentifierStatus(dvObject, "unavailable"); + Map metadata = addDOIMetadataForDestroyedDataset(dvObject); + metadata.put("_status", "registered"); + metadata.put("_target", getTargetUrl(dvObject)); + doiDataCiteRegisterService.deactivateIdentifier(identifier, metadata, dvObject); break; } - return; - } - if (idStatus != null && idStatus.equals("public")) { - //if public then it has been released set to unavailable and reset target to n2t url - doiDataCiteRegisterService.deactivateIdentifier(identifier, doiMetadata, dvObject); } } @@ -224,7 +228,7 @@ public boolean publicizeIdentifier(DvObject dvObject) { } String identifier = getIdentifier(dvObject); Map metadata = getUpdateMetadata(dvObject); - metadata.put("_status", "public"); + metadata.put("_status", PUBLIC); metadata.put("datacite.publicationyear", generateYear(dvObject)); metadata.put("_target", getTargetUrl(dvObject)); try { diff --git a/src/main/java/edu/harvard/iq/dataverse/DataCitation.java b/src/main/java/edu/harvard/iq/dataverse/DataCitation.java index f4aa169516f..051055efb42 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataCitation.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataCitation.java @@ -615,12 +615,12 @@ public Map getDataCiteMetadata() { String authorString = getAuthorsString(); if (authorString.isEmpty()) { - authorString = ":unav"; + authorString = AbstractGlobalIdServiceBean.UNAVAILABLE; } String producerString = getPublisher(); if (producerString.isEmpty()) { - producerString = ":unav"; + producerString = AbstractGlobalIdServiceBean.UNAVAILABLE; } metadata.put("datacite.creator", authorString);