Skip to content

Commit

Permalink
Merge pull request #6060 from IQSS/2471-destroy-command-should-unregi…
Browse files Browse the repository at this point in the history
…ster-doi

2471 destroy command should unregister doi
  • Loading branch information
kcondon authored Aug 5, 2019
2 parents dffb5f6 + 4cd5863 commit 271dbd0
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -57,27 +59,40 @@ protected Map<String, String> addBasicMetadata(DvObject dvObjectIn, Map<String,

String authorString = dvObjectIn.getAuthorString();
if (authorString.isEmpty() || authorString.contains(DatasetField.NA_VALUE)) {
authorString = ":unav";
authorString = UNAVAILABLE;
}

String producerString = dataverseService.findRootDataverse().getName();

if (producerString.isEmpty() || producerString.equals(DatasetField.NA_VALUE)) {
producerString = ":unav";
producerString = UNAVAILABLE;
}

String titleString = dvObjectIn.getCurrentName();

if (titleString.isEmpty() || titleString.equals(DatasetField.NA_VALUE)) {
titleString = ":unav";
titleString = UNAVAILABLE;
}

metadata.put("datacite.creator", authorString);
metadata.put("datacite.title", titleString);
metadata.put("datacite.publisher", producerString);
metadata.put("datacite.publicationyear", generateYear(dvObjectIn));
return metadata;
}
}

protected Map<String, String> addDOIMetadataForDestroyedDataset(DvObject dvObjectIn) {
Map<String, String> 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");
Expand Down Expand Up @@ -424,7 +439,7 @@ public String getMetadataFromDvObject(String identifier, Map<String, String> 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"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,22 +116,17 @@ public String registerIdentifier(String identifier, Map<String, String> metadata
return retString;
}

public String deactivateIdentifier(String identifier, HashMap<String, String> metadata, DvObject dvObject) {
public String deactivateIdentifier(String identifier, Map<String, String> 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<String, String> metadata, DvObject dvObject) {
public static String getMetadataFromDvObject(String identifier, Map<String, String> metadata, DvObject dvObject) {

Dataset dataset = null;

Expand All @@ -148,7 +143,7 @@ public static String getMetadataFromDvObject(String identifier, Map<String, Stri
if (dvObject.isInstanceofDataset()) {
String description = dataset.getLatestVersion().getDescriptionPlainText();
if (description.isEmpty() || description.equals(DatasetField.NA_VALUE)) {
description = ":unav";
description = AbstractGlobalIdServiceBean.UNAVAILABLE;
}
metadataTemplate.setDescription(description);
}
Expand All @@ -157,7 +152,7 @@ public static String getMetadataFromDvObject(String identifier, Map<String, Stri
//Note: File metadata is not escaped like dataset metadata is, so adding an xml escape here.
//This could/should be removed if the datafile methods add escaping
String fileDescription = StringEscapeUtils.escapeXml(df.getDescription());
metadataTemplate.setDescription(fileDescription == null ? ":unav" : fileDescription);
metadataTemplate.setDescription(fileDescription == null ? AbstractGlobalIdServiceBean.UNAVAILABLE : fileDescription);
String datasetPid = df.getOwner().getGlobalId().asString();
metadataTemplate.setDatasetIdentifier(datasetPid);
} else {
Expand All @@ -173,13 +168,13 @@ public static String getMetadataFromDvObject(String identifier, Map<String, Stri
}

if (title.isEmpty() || title.equals(DatasetField.NA_VALUE)) {
title = ":unav";
title = AbstractGlobalIdServiceBean.UNAVAILABLE;
}

metadataTemplate.setTitle(title);
String producerString = dataset.getLatestVersion().getRootDataverseNameforCitation();
if (producerString.isEmpty() || producerString.equals(DatasetField.NA_VALUE)) {
producerString = ":unav";
producerString = AbstractGlobalIdServiceBean.UNAVAILABLE;
}
metadataTemplate.setPublisher(producerString);
metadataTemplate.setPublisherYear(metadata.get("datacite.publicationyear"));
Expand All @@ -189,6 +184,31 @@ public static String getMetadataFromDvObject(String identifier, Map<String, Stri
return xmlMetadata;
}

public static String getMetadataForDeactivateIdentifier(String identifier, Map<String, String> 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<String, String> metadata, DvObject dvObject) throws IOException {

String xmlMetadata = getMetadataFromDvObject(identifier, metadata, dvObject);
Expand Down Expand Up @@ -279,6 +299,8 @@ public HashMap<String, String> 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);
Expand Down Expand Up @@ -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("<creator><creatorName>");
creatorsElement.append(author.getName().getDisplayValue());
Expand All @@ -444,27 +467,32 @@ public String generateXML(DvObject dvObject) {
}

} else {
creatorsElement.append("<creator><creatorName>:unav</creatorName></creator>");
creatorsElement.append("<creator><creatorName>").append(AbstractGlobalIdServiceBean.UNAVAILABLE).append("</creatorName></creator>");
}

xmlMetadata = xmlMetadata.replace("${creators}", creatorsElement.toString());

StringBuilder contributorsElement = new StringBuilder();
for (String[] contact : this.getContacts()) {
if (!contact[0].isEmpty()) {
contributorsElement.append("<contributor contributorType=\"ContactPerson\"><contributorName>" + contact[0] + "</contributorName>");
if (!contact[1].isEmpty()) {
contributorsElement.append("<affiliation>" + contact[1] + "</affiliation>");
if (this.getContacts() != null) {
for (String[] contact : this.getContacts()) {
if (!contact[0].isEmpty()) {
contributorsElement.append("<contributor contributorType=\"ContactPerson\"><contributorName>" + contact[0] + "</contributorName>");
if (!contact[1].isEmpty()) {
contributorsElement.append("<affiliation>" + contact[1] + "</affiliation>");
}
contributorsElement.append("</contributor>");
}
contributorsElement.append("</contributor>");
}
}
for (String[] producer : this.getProducers()) {
contributorsElement.append("<contributor contributorType=\"Producer\"><contributorName>" + producer[0] + "</contributorName>");
if (!producer[1].isEmpty()) {
contributorsElement.append("<affiliation>" + producer[1] + "</affiliation>");

if (this.getProducers() != null) {
for (String[] producer : this.getProducers()) {
contributorsElement.append("<contributor contributorType=\"Producer\"><contributorName>" + producer[0] + "</contributorName>");
if (!producer[1].isEmpty()) {
contributorsElement.append("<affiliation>" + producer[1] + "</affiliation>");
}
contributorsElement.append("</contributor>");
}
contributorsElement.append("</contributor>");
}

String relIdentifiers = generateRelatedIdentifiers(dvObject);
Expand Down
26 changes: 15 additions & 11 deletions src/main/java/edu/harvard/iq/dataverse/DOIDataCiteServiceBean.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -168,18 +173,18 @@ public void deleteRecordFromCache(Dataset datasetIn){
public void deleteIdentifier(DvObject dvObject) throws Exception {
logger.log(Level.FINE,"deleteIdentifier");
String identifier = getIdentifier(dvObject);
HashMap<String, String> doiMetadata = new HashMap<>();
Map<String, String> doiMetadata = new HashMap<>();
try {
doiMetadata = doiDataCiteRegisterService.getMetadata(identifier);
} catch (Exception e) {
logger.log(Level.WARNING, "deleteIdentifier: get matadata failed. " + e.getMessage(), e);
}

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);
Expand All @@ -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<String, String> 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);
}
}

Expand All @@ -224,7 +228,7 @@ public boolean publicizeIdentifier(DvObject dvObject) {
}
String identifier = getIdentifier(dvObject);
Map<String, String> metadata = getUpdateMetadata(dvObject);
metadata.put("_status", "public");
metadata.put("_status", PUBLIC);
metadata.put("datacite.publicationyear", generateYear(dvObject));
metadata.put("_target", getTargetUrl(dvObject));
try {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/edu/harvard/iq/dataverse/DataCitation.java
Original file line number Diff line number Diff line change
Expand Up @@ -615,12 +615,12 @@ public Map<String, String> 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);
Expand Down

0 comments on commit 271dbd0

Please sign in to comment.