Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

send relatedIdentifier to DataCite #4782 #4795

Merged
merged 12 commits into from
Jul 27, 2018
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
147 changes: 114 additions & 33 deletions src/main/java/edu/harvard/iq/dataverse/DOIDataCiteRegisterService.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,16 @@ public class DOIDataCiteRegisterService {

@PersistenceContext(unitName = "VDCNet-ejbPU")
private EntityManager em;

@EJB
DataverseServiceBean dataverseService;

private DataCiteRESTfullClient openClient() throws IOException {
return new DataCiteRESTfullClient(System.getProperty("doi.baseurlstring"), System.getProperty("doi.username"), System.getProperty("doi.password"));
}

public String createIdentifierLocal(String identifier, Map<String, String> metadata, DvObject dvObject) {

String xmlMetadata = getMetadataFromDvObject(identifier, metadata, dvObject);
String status = metadata.get("_status").trim();
String target = metadata.get("_target");
Expand All @@ -65,9 +66,10 @@ public String createIdentifierLocal(String identifier, Map<String, String> metad
rc.setUrl(target);
}
retString = "success to reserved " + identifier;

return retString;
}

public String registerIdentifier(String identifier, Map<String, String> metadata, DvObject dvObject) throws IOException {
String retString = "";
String xmlMetadata = getMetadataFromDvObject(identifier, metadata, dvObject);
Expand All @@ -88,63 +90,69 @@ public String registerIdentifier(String identifier, Map<String, String> metadata
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(DOIDataCiteRegisterService.class.getName()).log(Level.SEVERE, null, ex);
}
} else{
} else {
try (DataCiteRESTfullClient client = openClient()) {
retString = client.postMetadata(xmlMetadata);
client.postUrl(identifier.substring(identifier.indexOf(":") + 1), target);
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(DOIDataCiteRegisterService.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
return retString;
}

public String deactivateIdentifier (String identifier, HashMap<String, String> metadata, DvObject dvObject){
String retString = "";
DOIDataCiteRegisterCache rc = findByDOI(identifier);
try (DataCiteRESTfullClient client = openClient()) {
if (rc != null) {
rc.setStatus("unavailable");
retString = client.inactiveDataset(identifier.substring(identifier.indexOf(":") + 1));
}
} catch (IOException io) {

public String deactivateIdentifier(String identifier, HashMap<String, String> metadata, DvObject dvObject) {
String retString = "";
DOIDataCiteRegisterCache rc = findByDOI(identifier);
try (DataCiteRESTfullClient client = openClient()) {
if (rc != null) {
rc.setStatus("unavailable");
retString = client.inactiveDataset(identifier.substring(identifier.indexOf(":") + 1));
}
return retString;
} catch (IOException io) {

}
return retString;
}
private String getMetadataFromDvObject(String identifier, Map<String, String> metadata,DvObject dvObject) {

private String getMetadataFromDvObject(String identifier, Map<String, String> metadata, DvObject dvObject) {

Dataset dataset = null;
if (dvObject instanceof Dataset){

if (dvObject instanceof Dataset) {
dataset = (Dataset) dvObject;
} else {
dataset = (Dataset) dvObject.getOwner();
}
}

DataCiteMetadataTemplate metadataTemplate = new DataCiteMetadataTemplate();
metadataTemplate.setIdentifier(identifier.substring(identifier.indexOf(':') + 1));
metadataTemplate.setIdentifier(identifier.substring(identifier.indexOf(':') + 1));
metadataTemplate.setCreators(Util.getListFromStr(metadata.get("datacite.creator")));
metadataTemplate.setAuthors(dataset.getLatestVersion().getDatasetAuthors());
if (dvObject.isInstanceofDataset()) {
metadataTemplate.setDescription(dataset.getLatestVersion().getDescriptionPlainText());
}
if (dvObject.isInstanceofDataFile()) {
DataFile df = (DataFile) dvObject;
String fileDescription =df.getDescription();
metadataTemplate.setDescription(fileDescription == null ? "" :fileDescription );
String fileDescription = df.getDescription();
metadataTemplate.setDescription(fileDescription == null ? "" : fileDescription);
String datasetPid = df.getOwner().getGlobalId().asString();
metadataTemplate.setDatasetIdentifier(datasetPid);
} else {
metadataTemplate.setDatasetIdentifier("");
}

metadataTemplate.setContacts(dataset.getLatestVersion().getDatasetContacts());
metadataTemplate.setProducers(dataset.getLatestVersion().getDatasetProducers());
metadataTemplate.setTitle(dvObject.getDisplayName());
String producerString = dataverseService.findRootDataverse().getName();
String producerString = dataverseService.findRootDataverse().getName();
if (producerString.isEmpty()) {
producerString = ":unav";
}
metadataTemplate.setPublisher(producerString);
metadataTemplate.setPublisherYear(metadata.get("datacite.publicationyear"));
String xmlMetadata = metadataTemplate.generateXML();

String xmlMetadata = metadataTemplate.generateXML(dvObject);
logger.log(Level.FINE, "XML to send to DataCite: {0}", xmlMetadata);
return xmlMetadata;
}
Expand Down Expand Up @@ -188,14 +196,14 @@ public String modifyIdentifier(String identifier, HashMap<String, String> metada
try (DataCiteRESTfullClient client = openClient()) {
retString = client.postMetadata(xmlMetadata);
client.postUrl(identifier.substring(identifier.indexOf(":") + 1), target);

} catch (UnsupportedEncodingException ex) {
logger.log(Level.SEVERE, null, ex);
} catch ( RuntimeException rte ) {

} catch (RuntimeException rte) {
logger.log(Level.SEVERE, "Error creating DOI at DataCite: {0}", rte.getMessage());
logger.log(Level.SEVERE, "Exception", rte);

}
}
} else if (status.equals("unavailable")) {
Expand Down Expand Up @@ -281,6 +289,8 @@ class DataCiteMetadataTemplate {

private String xmlMetadata;
private String identifier;
private String datasetIdentifier;
private List<String> datafileIdentifiers;
private List<String> creators;
private String title;
private String publisher;
Expand Down Expand Up @@ -325,6 +335,14 @@ public void setAuthors(List<DatasetAuthor> authors) {
public DataCiteMetadataTemplate() {
}

public List<String> getDatafileIdentifiers() {
return datafileIdentifiers;
}

public void setDatafileIdentifiers(List<String> datafileIdentifiers) {
this.datafileIdentifiers = datafileIdentifiers;
}

public DataCiteMetadataTemplate(String xmlMetaData) {
this.xmlMetadata = xmlMetaData;
Document doc = Jsoup.parseBodyFragment(xmlMetaData);
Expand All @@ -351,7 +369,7 @@ public DataCiteMetadataTemplate(String xmlMetaData) {
}
}

public String generateXML() {
public String generateXML(DvObject dvObject) {
// Can't use "UNKNOWN" here because DataCite will respond with "[facet 'pattern'] the value 'unknown' is not accepted by the pattern '[\d]{4}'"
String publisherYearFinal = "9999";
// FIXME: Investigate why this.publisherYear is sometimes null now that pull request #4606 has been merged.
Expand Down Expand Up @@ -406,10 +424,69 @@ public String generateXML() {
}
contributorsElement.append("</contributor>");
}

String relIdentifiers = generateRelatedIdentifiers(dvObject);

xmlMetadata = xmlMetadata.replace("${relatedIdentifiers}", relIdentifiers);

xmlMetadata = xmlMetadata.replace("{$contributors}", contributorsElement.toString());
return xmlMetadata;
}

private String generateRelatedIdentifiers(DvObject dvObject) {

StringBuilder sb = new StringBuilder();
if (dvObject.isInstanceofDataset()) {
Dataset dataset = (Dataset) dvObject;
if (!dataset.getFiles().isEmpty() && !(dataset.getFiles().get(0).getIdentifier() == null)) {

datafileIdentifiers = new ArrayList<>();
for (DataFile dataFile : dataset.getFiles()) {
if (!dataFile.getGlobalId().asString().isEmpty()) {
if (sb.toString().isEmpty()) {
sb.append("<relatedIdentifiers>");
}
sb.append("<relatedIdentifier relatedIdentifierType=\"DOI\" relationType=\"HasPart\">" + dataFile.getGlobalId() + "</relatedIdentifier>");
}
}

if (!sb.toString().isEmpty()) {
sb.append("</relatedIdentifiers>");
}
}
} else if (dvObject.isInstanceofDataFile()) {
DataFile df = (DataFile) dvObject;
sb.append("<relatedIdentifiers>");
sb.append("<relatedIdentifier relatedIdentifierType=\"DOI\" relationType=\"IsPartOf\""
+ ">" + df.getOwner().getGlobalId() + "</relatedIdentifier>");
sb.append("</relatedIdentifiers>");
}
return sb.toString();
}

public void generateFileIdentifiers(DvObject dvObject) {

if (dvObject.isInstanceofDataset()) {
Dataset dataset = (Dataset) dvObject;

if (!dataset.getFiles().isEmpty() && !(dataset.getFiles().get(0).getIdentifier() == null)) {

datafileIdentifiers = new ArrayList<>();
for (DataFile dataFile : dataset.getFiles()) {
datafileIdentifiers.add(dataFile.getIdentifier());
int x = xmlMetadata.indexOf("</relatedIdentifiers>") - 1;
xmlMetadata = xmlMetadata.replace("{relatedIdentifier}", dataFile.getIdentifier());
xmlMetadata = xmlMetadata.substring(0, x) + "<relatedIdentifier relatedIdentifierType=\"hasPart\" "
+ "relationType=\"doi\">${relatedIdentifier}</relatedIdentifier>" + template.substring(x, template.length() - 1);

}

} else {
xmlMetadata = xmlMetadata.replace("<relatedIdentifier relatedIdentifierType=\"hasPart\" relationType=\"doi\">${relatedIdentifier}</relatedIdentifier>", "");
}
}
}

public static String getTemplate() {
return template;
}
Expand All @@ -426,6 +503,10 @@ public void setIdentifier(String identifier) {
this.identifier = identifier;
}

public void setDatasetIdentifier(String datasetIdentifier) {
this.datasetIdentifier = datasetIdentifier;
}

public List<String> getCreators() {
return creators;
}
Expand Down
8 changes: 0 additions & 8 deletions src/main/java/edu/harvard/iq/dataverse/DataFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -401,14 +401,6 @@ public void setOwner(Dataset dataset) {
super.setOwner(dataset);
}

// public String getStorageIdentifier() {
// return this.fileSystemName;
// }
//
// public void setStorageIdentifier(String storageIdentifier) {
// this.fileSystemName = storageIdentifier;
// }

public String getDescription() {
FileMetadata fmd = getLatestFileMetadata();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,15 +182,15 @@ private void publicizeExternalIdentifier(Dataset dataset, CommandContext ctxt) t
GlobalIdServiceBean idServiceBean = GlobalIdServiceBean.getBean(protocol, ctxt);
if ( idServiceBean != null ){
try {
idServiceBean.publicizeIdentifier(dataset);
dataset.setGlobalIdCreateTime(new Date()); // TODO these two methods should be in the responsibility of the idServiceBean.
dataset.setIdentifierRegistered(true);
for (DataFile df : dataset.getFiles()) {
logger.log(Level.FINE, "registering global id for file {0}", df.getId());
idServiceBean.publicizeIdentifier(df);
df.setGlobalIdCreateTime(getTimestamp());
df.setIdentifierRegistered(true);
}
idServiceBean.publicizeIdentifier(dataset);
dataset.setGlobalIdCreateTime(new Date()); // TODO these two methods should be in the responsibility of the idServiceBean.
dataset.setIdentifierRegistered(true);
} catch (Throwable e) {
ctxt.datasets().removeDatasetLocks(dataset, DatasetLock.Reason.pidRegister);
throw new CommandException(BundleUtil.getStringFromBundle("dataset.publish.error", idServiceBean.getProviderInformation()),this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<publisher>${publisher}</publisher>
<publicationYear>${publisherYear}</publicationYear>
<resourceType resourceTypeGeneral="Dataset"/>
${relatedIdentifiers}
<descriptions>
<description descriptionType="Abstract">${description}</description>
</descriptions>
Expand Down
7 changes: 6 additions & 1 deletion src/test/java/edu/harvard/iq/dataverse/api/DataCiteIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
* These tests will only work if you are using "DataCite" rather than "EZID" for
* your :DoiProvider and have done all the other related setup to switch from
* EZID, including setting JVM options. Look for DataCite in the dev guide for
* more tips.
* more tips. You should switch away from EZID for dev anyway because it's going
* away: https://www.cdlib.org/cdlinfo/2017/08/04/ezid-doi-service-is-evolving/
*/
public class DataCiteIT {

Expand All @@ -35,6 +36,10 @@ public void testCreateAndPublishDataset() {
createDataset.prettyPrint();
String datasetPersistentId = UtilIT.getDatasetPersistentIdFromResponse(createDataset);

Response uploadFile = UtilIT.uploadRandomFile(datasetPersistentId, apiToken);
uploadFile.then().assertThat()
.statusCode(201);

Response publishDataverse = UtilIT.publishDataverseViaSword(dataverseAlias, apiToken);
assertEquals(200, publishDataverse.getStatusCode());

Expand Down
20 changes: 0 additions & 20 deletions workingDataCiteMetadataTemplate-Files.xml

This file was deleted.