Skip to content

Commit 2917dbe

Browse files
authored
Merge pull request IQSS#5506 from QualitativeDataRepository/5505-Update_modifyRegistration_API_calls_to_only_update_when_necessary
IQSS-5505 - only update DOI metadata at PIDprovider when it changes
2 parents 9985378 + 912a15c commit 2917dbe

File tree

7 files changed

+85
-5
lines changed

7 files changed

+85
-5
lines changed

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,11 @@
550550
<artifactId>opennlp-tools</artifactId>
551551
<version>1.9.1</version>
552552
</dependency>
553+
<dependency>
554+
<groupId>org.xmlunit</groupId>
555+
<artifactId>xmlunit-core</artifactId>
556+
<version>2.9.1</version>
557+
</dependency>
553558
<dependency>
554559
<groupId>com.google.cloud</groupId>
555560
<artifactId>google-cloud-storage</artifactId>

src/main/java/edu/harvard/iq/dataverse/api/Datasets.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -694,8 +694,9 @@ public Response updateDatasetPIDMetadata(@Context ContainerRequestContext crc, @
694694
}
695695

696696
return response(req -> {
697-
execCommand(new UpdateDvObjectPIDMetadataCommand(findDatasetOrDie(id), req));
698-
List<String> args = Arrays.asList(id);
697+
Dataset dataset = findDatasetOrDie(id);
698+
execCommand(new UpdateDvObjectPIDMetadataCommand(dataset, req));
699+
List<String> args = Arrays.asList(dataset.getIdentifier());
699700
return ok(BundleUtil.getStringFromBundle("datasets.api.updatePIDMetadata.success.for.single.dataset", args));
700701
}, getRequestUser(crc));
701702
}
@@ -707,7 +708,14 @@ public Response updateDatasetPIDMetadataAll(@Context ContainerRequestContext crc
707708
return response( req -> {
708709
datasetService.findAll().forEach( ds -> {
709710
try {
711+
logger.fine("ReRegistering: " + ds.getId() + " : " + ds.getIdentifier());
712+
if (!ds.isReleased() || (!ds.isIdentifierRegistered() || (ds.getIdentifier() == null))) {
713+
if (ds.isReleased()) {
714+
logger.warning("Dataset id=" + ds.getId() + " is in an inconsistent state (publicationdate but no identifier/identifier not registered");
715+
}
716+
} else {
710717
execCommand(new UpdateDvObjectPIDMetadataCommand(findDatasetOrDie(ds.getId().toString()), req));
718+
}
711719
} catch (WrappedResponse ex) {
712720
Logger.getLogger(Datasets.class.getName()).log(Level.SEVERE, null, ex);
713721
}

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDvObjectPIDMetadataCommand.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ protected void executeImpl(CommandContext ctxt) throws CommandException {
5050
PidProvider pidProvider = PidUtil.getPidProvider(target.getGlobalId().getProviderId());
5151

5252
try {
53-
Boolean doiRetString = pidProvider.publicizeIdentifier(target);
53+
Boolean doiRetString = pidProvider.updateIdentifier(target);
5454
if (doiRetString) {
5555
target.setGlobalIdCreateTime(new Timestamp(new Date().getTime()));
5656
ctxt.em().merge(target);
@@ -71,7 +71,7 @@ protected void executeImpl(CommandContext ctxt) throws CommandException {
7171
(!(df.getIdentifier() == null || df.getIdentifier().isEmpty()) || // identifier exists, or
7272
canCreatePidsForFiles) // we can create PIDs for files
7373
) {
74-
doiRetString = pidProvider.publicizeIdentifier(df);
74+
doiRetString = pidProvider.updateIdentifier(df);
7575
if (doiRetString) {
7676
df.setGlobalIdCreateTime(new Timestamp(new Date().getTime()));
7777
ctxt.em().merge(df);

src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,4 +547,10 @@ public JsonObject getProviderSpecification() {
547547
providerSpecification.add("excludedSet", Strings.join(",", excludedSet.toArray()));
548548
return providerSpecification.build();
549549
}
550+
551+
@Override
552+
public boolean updateIdentifier(DvObject dvObject) {
553+
//By default, these are the same
554+
return publicizeIdentifier(dvObject);
555+
}
550556
}

src/main/java/edu/harvard/iq/dataverse/pidproviders/PidProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public interface PidProvider {
5454

5555
boolean publicizeIdentifier(DvObject studyIn);
5656

57+
boolean updateIdentifier(DvObject dvObject);
58+
5759
boolean isGlobalIdUnique(GlobalId globalId);
5860

5961
String getUrlPrefix();

src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/datacite/DOIDataCiteRegisterService.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323
import edu.harvard.iq.dataverse.pidproviders.AbstractPidProvider;
2424
import edu.harvard.iq.dataverse.pidproviders.doi.XmlMetadataTemplate;
2525

26+
import org.xmlunit.builder.DiffBuilder;
27+
import org.xmlunit.builder.Input;
28+
import org.xmlunit.builder.Input.Builder;
29+
import org.xmlunit.diff.Diff;
30+
import org.xmlunit.diff.Difference;
31+
2632
/**
2733
*
2834
* @author luopc
@@ -69,6 +75,35 @@ public String registerIdentifier(String identifier, Map<String, String> metadata
6975

7076
return retString;
7177
}
78+
79+
80+
public String reRegisterIdentifier(String identifier, Map<String, String> metadata, DvObject dvObject) throws IOException {
81+
String retString = "";
82+
String numericIdentifier = identifier.substring(identifier.indexOf(":") + 1);
83+
String xmlMetadata = getMetadataFromDvObject(identifier, metadata, dvObject);
84+
String target = metadata.get("_target");
85+
String currentMetadata = client.getMetadata(numericIdentifier);
86+
Diff myDiff = DiffBuilder.compare(xmlMetadata)
87+
.withTest(currentMetadata).ignoreWhitespace().checkForSimilar()
88+
.build();
89+
90+
if (myDiff.hasDifferences()) {
91+
for(Difference d : myDiff.getDifferences()) {
92+
93+
logger.fine(d.toString());
94+
}
95+
retString = "metadata:\\r" + client.postMetadata(xmlMetadata) + "\\r";
96+
}
97+
if (!target.equals(client.getUrl(numericIdentifier))) {
98+
logger.info("Updating target URL to " + target);
99+
client.postUrl(numericIdentifier, target);
100+
retString = retString + "url:\\r" + target;
101+
102+
}
103+
104+
return retString;
105+
}
106+
72107

73108
public String deactivateIdentifier(String identifier, Map<String, String> metadata, DvObject dvObject) throws IOException {
74109
String retString = "";

src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/datacite/DataCiteDOIProvider.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,31 @@ String getPidStatus(DvObject dvObject) {
313313
return status;
314314
}
315315

316-
317316

317+
@Override
318+
public boolean updateIdentifier(DvObject dvObject) {
319+
logger.log(Level.FINE,"updateIdentifierStatus");
320+
if(dvObject.getIdentifier() == null || dvObject.getIdentifier().isEmpty() ){
321+
dvObject = generatePid(dvObject);
322+
}
323+
String identifier = getIdentifier(dvObject);
324+
Map<String, String> metadata = getUpdateMetadata(dvObject);
325+
metadata.put("_status", "public");
326+
metadata.put("datacite.publicationyear", generateYear(dvObject));
327+
metadata.put("_target", getTargetUrl(dvObject));
328+
try {
329+
String updated = doiDataCiteRegisterService.reRegisterIdentifier(identifier, metadata, dvObject);
330+
if(updated.length()!=0) {
331+
logger.info(identifier + "updated: " + updated );
332+
return true;
333+
} else {
334+
logger.info("No updated needed for " + identifier);
335+
return false; //No update needed
336+
}
337+
} catch (Exception e) {
338+
logger.log(Level.WARNING, "updateIdentifier failed: " + e.getMessage(), e);
339+
return false;
340+
}
341+
}
318342

319343
}

0 commit comments

Comments
 (0)