Skip to content

Commit 11cd77c

Browse files
committed
Adding the option of re-exporting select formats only to the API #11405
1 parent a5ca53d commit 11cd77c

4 files changed

Lines changed: 84 additions & 11 deletions

File tree

src/main/java/edu/harvard/iq/dataverse/DatasetServiceBean.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ public void exportAllDatasets(boolean forceReExport) {
739739
|| dataset.getLastExportTime().before(publicationDate)))) {
740740
countAll++;
741741
try {
742-
recordService.exportAllFormatsInNewTransaction(dataset);
742+
recordService.exportFormatsInNewTransaction(dataset, null);
743743
exportLogger.info("Success exporting dataset: " + dataset.getDisplayName() + " " + dataset.getGlobalId().asString());
744744
countSuccess++;
745745
} catch (Exception ex) {
@@ -763,13 +763,18 @@ public void exportAllDatasets(boolean forceReExport) {
763763

764764
@Asynchronous
765765
public void reExportDatasetAsync(Dataset dataset) {
766-
exportDataset(dataset, true);
766+
exportDataset(dataset, true, null);
767+
}
768+
769+
@Asynchronous
770+
public void reExportDatasetAsync(Dataset dataset, List<String> formatNames) {
771+
exportDataset(dataset, true, formatNames);
767772
}
768773

769-
public void exportDataset(Dataset dataset, boolean forceReExport) {
774+
private void exportDataset(Dataset dataset, boolean forceReExport, List<String> formatNames) {
770775
if (dataset != null) {
771776
// Note that the logic for handling a dataset is similar to what is implemented in exportAllDatasets,
772-
// but when only one dataset is exported we do not log in a separate export logging file
777+
// but when only one dataset is exported we do not use a dedicated log file
773778
if (dataset.isReleased() && dataset.getReleasedVersion() != null && !dataset.isDeaccessioned()) {
774779

775780
// can't trust dataset.getPublicationDate(), no.
@@ -778,7 +783,7 @@ public void exportDataset(Dataset dataset, boolean forceReExport) {
778783
&& (dataset.getLastExportTime() == null
779784
|| dataset.getLastExportTime().before(publicationDate)))) {
780785
try {
781-
recordService.exportAllFormatsInNewTransaction(dataset);
786+
recordService.exportFormatsInNewTransaction(dataset, formatNames);
782787
logger.info("Success exporting dataset: " + dataset.getDisplayName() + " " + dataset.getGlobalId().asString());
783788
} catch (Exception ex) {
784789
logger.log(Level.INFO, "Error exporting dataset: " + dataset.getDisplayName() + " " + dataset.getGlobalId().asString() + "; " + ex.getMessage(), ex);

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919

2020
import edu.harvard.iq.dataverse.harvest.server.OAISetServiceBean;
2121
import edu.harvard.iq.dataverse.harvest.server.OAISet;
22+
import java.util.ArrayList;
23+
import java.util.Arrays;
24+
import java.util.List;
2225

2326
/**
2427
*
@@ -64,10 +67,14 @@ public Response reExportAll() {
6467

6568
@GET
6669
@Path("{id}/reExportDataset")
67-
public Response indexDatasetByPersistentId(@PathParam("id") String id) {
70+
public Response indexDatasetByPersistentId(@PathParam("id") String id, @QueryParam("formats") String formats) {
6871
try {
6972
Dataset dataset = findDatasetOrDie(id);
70-
datasetService.reExportDatasetAsync(dataset);
73+
List<String> formatNames = null;
74+
if (formats != null) {
75+
formatNames = new ArrayList<>(Arrays.asList(formats.split(",")));
76+
}
77+
datasetService.reExportDatasetAsync(dataset, formatNames);
7178
return ok("export started");
7279
} catch (WrappedResponse wr) {
7380
return wr.getResponse();

src/main/java/edu/harvard/iq/dataverse/export/ExportService.java

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,16 +318,72 @@ public void exportAllFormats(Dataset dataset) throws ExportException {
318318
}
319319

320320
}
321+
322+
public void exportFormats(Dataset dataset, List<String> formatNames) throws ExportException {
323+
try {
324+
if (formatNames == null) {
325+
clearAllCachedFormats(dataset);
326+
} else {
327+
clearCachedFormats(dataset, formatNames);
328+
}
329+
} catch (IOException ex) {
330+
Logger.getLogger(ExportService.class.getName()).log(Level.SEVERE, null, ex);
331+
}
321332

322-
public void clearAllCachedFormats(Dataset dataset) throws IOException {
323333
try {
334+
DatasetVersion releasedVersion = dataset.getReleasedVersion();
335+
if (releasedVersion == null) {
336+
throw new ExportException("No released version for dataset " + dataset.getGlobalId().toString());
337+
}
338+
InternalExportDataProvider dataProvider = new InternalExportDataProvider(releasedVersion);
324339

325340
for (Exporter e : exporterMap.values()) {
326341
String formatName = e.getFormatName();
327-
clearCachedExport(dataset, formatName);
342+
if (formatNames == null || formatNames.contains(formatName)) {
343+
if (e.getPrerequisiteFormatName().isPresent()) {
344+
String prereqFormatName = e.getPrerequisiteFormatName().get();
345+
try (InputStream preReqStream = getExport(dataset.getReleasedVersion(), prereqFormatName)) {
346+
dataProvider.setPrerequisiteInputStream(preReqStream);
347+
cacheExport(dataset, dataProvider, formatName, e);
348+
dataProvider.setPrerequisiteInputStream(null);
349+
} catch (IOException ioe) {
350+
throw new ExportException("Could not get prerequisite " + e.getPrerequisiteFormatName() + " to create " + formatName + "export for dataset " + dataset.getId(), ioe);
351+
}
352+
} else {
353+
cacheExport(dataset, dataProvider, formatName, e);
354+
}
355+
}
328356
}
357+
// Finally, if we have been able to successfully export in all available
358+
// formats, we'll increment the "last exported" time stamp:
359+
dataset.setLastExportTime(new Timestamp(new Date().getTime()));
360+
361+
} catch (ServiceConfigurationError serviceError) {
362+
throw new ExportException("Service configuration error during export. " + serviceError.getMessage());
363+
} catch (RuntimeException e) {
364+
logger.log(Level.FINE, e.getMessage(), e);
365+
throw new ExportException(
366+
"Unknown runtime exception exporting metadata. " + (e.getMessage() == null ? "" : e.getMessage()));
367+
}
368+
}
329369

330-
dataset.setLastExportTime(null);
370+
public void clearAllCachedFormats(Dataset dataset) throws IOException {
371+
List<String> formatNames = new ArrayList<>();
372+
373+
for (Exporter e : exporterMap.values()) {
374+
String formatName = e.getFormatName();
375+
formatNames.add(formatName);
376+
clearCachedExport(dataset, formatName);
377+
}
378+
clearCachedFormats(dataset, formatNames);
379+
dataset.setLastExportTime(null);
380+
}
381+
382+
public void clearCachedFormats(Dataset dataset, List<String> formatNames) throws IOException {
383+
try {
384+
for (String formatName : formatNames) {
385+
clearCachedExport(dataset, formatName);
386+
}
331387
} catch (IOException ex) {
332388
// not fatal
333389
}

src/main/java/edu/harvard/iq/dataverse/harvest/server/OAIRecordServiceBean.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,9 +259,14 @@ public void exportAllFormats(Dataset dataset) {
259259

260260
@TransactionAttribute(REQUIRES_NEW)
261261
public void exportAllFormatsInNewTransaction(Dataset dataset) throws ExportException {
262+
exportFormatsInNewTransaction(dataset, null);
263+
}
264+
265+
@TransactionAttribute(REQUIRES_NEW)
266+
public void exportFormatsInNewTransaction(Dataset dataset, List<String> formatNames) throws ExportException {
262267
try {
263268
ExportService exportServiceInstance = ExportService.getInstance();
264-
exportServiceInstance.exportAllFormats(dataset);
269+
exportServiceInstance.exportFormats(dataset, formatNames);
265270
dataset = datasetService.merge(dataset);
266271
} catch (Exception e) {
267272
logger.log(Level.FINE, "Caught unknown exception while trying to export", e);

0 commit comments

Comments
 (0)