Skip to content

Commit 8bbd737

Browse files
Auto Create thumbnail so Search API will return image_url when publis… (#12403)
* Auto Create thumbnail so Search API will return image_url when publishing Datasets * clean up test * review comments * review comments * clean up JsonPrinter * Fixing an old bug that resulted in jsf triggering auto-selection of a dataset-level thumbnail in some situations. #11588 * fix race comdition updating dataset with thumbnail * fix race comdition updating dataset with thumbnail * increase max dataset index wait --------- Co-authored-by: Leonid Andreev <leonid@hmdc.harvard.edu>
1 parent 14f8206 commit 8bbd737

9 files changed

Lines changed: 115 additions & 40 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
## BUG ##
2+
Search API doesn't return image_url after newly created dataset is published.
3+
4+
The Dataset thumbnail will be created automatically when a Dataset is published under the following conditions: The Dataset has no existing thumbnail; The Dataset has image files that can be converted to a thumbnail; The Feature Flag "disable-dataset-thumbnail-autoselect" is not enabled;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,10 @@ public void setThumbnailFile(DataFile thumbnailFile) {
763763
this.thumbnailFile = thumbnailFile;
764764
}
765765

766+
public String getThumbnailUrl() {
767+
return thumbnailFile != null ? SystemConfig.getDataverseSiteUrlStatic() + "/api/datasets/" + this.getId() + "/logo" : null;
768+
}
769+
766770
public boolean isUseGenericThumbnail() {
767771
return useGenericThumbnail;
768772
}

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import jakarta.json.JsonObjectBuilder;
3636
import jakarta.persistence.EntityManager;
3737
import jakarta.persistence.NoResultException;
38-
import jakarta.persistence.OptimisticLockException;
3938
import jakarta.persistence.PersistenceContext;
4039
import jakarta.persistence.Query;
4140
import jakarta.persistence.TypedQuery;
@@ -892,7 +891,7 @@ public Long getThumbnailByVersionId(Long versionId) {
892891

893892
if (thumbnailFileId != null) {
894893
logger.fine("obtained file id: " + thumbnailFileId);
895-
DataFile thumbnailFile = datafileService.find(thumbnailFileId);
894+
DataFile thumbnailFile = getDataFileById(thumbnailFileId);
896895
if (thumbnailFile != null) {
897896
if (datafileService.isThumbnailAvailable(thumbnailFile)) {
898897
assignDatasetThumbnailByNativeQuery(versionId, thumbnailFileId);
@@ -925,7 +924,7 @@ public Long getThumbnailByVersionId(Long versionId) {
925924
}
926925

927926
if (thumbnailFileId != null) {
928-
DataFile thumbnailFile = datafileService.find(thumbnailFileId);
927+
DataFile thumbnailFile = getDataFileById(thumbnailFileId);
929928
if (thumbnailFile != null) {
930929
if (datafileService.isThumbnailAvailable(thumbnailFile)) {
931930
assignDatasetThumbnailByNativeQuery(versionId, thumbnailFileId);
@@ -937,7 +936,11 @@ public Long getThumbnailByVersionId(Long versionId) {
937936
}
938937
return null;
939938
}
940-
939+
940+
public DataFile getDataFileById(Long id) {
941+
return datafileService.find(id);
942+
}
943+
941944
private void assignDatasetThumbnailByNativeQuery(Long versionId, Long dataFileId) {
942945
try {
943946
em.createNativeQuery("UPDATE dataset SET thumbnailfile_id=" + dataFileId + " WHERE id in (SELECT dataset_id FROM datasetversion WHERE id=" + versionId + ")").executeUpdate();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,11 @@ public String getDatasetCardImageAsUrl(Dataset dataset, Long versionId, boolean
208208
// If no other logo we attempt to auto-select via the optimized, native
209209
// query-based method
210210
// from the DatasetVersionService:
211-
if (!hasDatasetLogo && datasetVersionService.getThumbnailByVersionId(versionId) == null) {
211+
if (!hasDatasetLogo && (!autoselect || datasetVersionService.getThumbnailByVersionId(versionId) == null)) {
212212
return null;
213213
}
214214
}
215-
String url = SystemConfig.getDataverseSiteUrlStatic() + "/api/datasets/" + dataset.getId() + "/logo";
215+
String url = dataset.getThumbnailUrl();
216216
logger.fine("getDatasetCardImageAsUrl: " + url);
217217
this.dvobjectThumbnailsMap.put(datasetId,url);
218218
return url;

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,16 @@ public Dataset execute(CommandContext ctxt) throws CommandException {
171171

172172
//Use dataset pub date (which may not be the current date for migrated datasets)
173173
updateFiles(new Timestamp(version.getReleaseTime().getTime()), ctxt);
174-
174+
175+
// Populate thumbnail if needed and allowed
176+
if (theDataset.getThumbnailFile() == null && !theDataset.isUseGenericThumbnail()) {
177+
Long thumbnailFileId = ctxt.datasetVersion().getThumbnailByVersionId(version.getId());
178+
if (thumbnailFileId != null) {
179+
theDataset.setThumbnailFile(ctxt.datasetVersion().getDataFileById(thumbnailFileId));
180+
logger.info("Setting default thumbnail " + theDataset.getThumbnailUrl());
181+
}
182+
}
183+
175184
//
176185
// TODO: Not sure if this .merge() is necessary here - ?
177186
// I'm moving a bunch of code from PublishDatasetCommand here; and this .merge()

src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,7 @@ public static JsonObjectBuilder json(Dataset ds, Boolean returnOwners) {
551551
.add("separator", ds.getSeparator())
552552
.add("publisher", BrandingUtil.getInstallationBrandName())
553553
.add("publicationDate", ds.getPublicationDateFormattedYYYYMMDD())
554+
.add("image_url", ds.getThumbnailUrl())
554555
.add("storageIdentifier", ds.getStorageIdentifier());
555556
if (ds.getGuestbook() != null) {
556557
bld.add("guestbookId", ds.getGuestbook().getId());

src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import static org.hamcrest.CoreMatchers.equalTo;
2222
import static org.hamcrest.CoreMatchers.startsWith;
2323
import static org.junit.jupiter.api.Assertions.*;
24-
import org.junit.jupiter.api.Disabled;
2524

2625
public class DataRetrieverApiIT {
2726

@@ -78,7 +77,7 @@ public void testRetrieveMyDataAsJsonString() throws InterruptedException {
7877
Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, normalUserApiToken);
7978
createDatasetResponse.prettyPrint();
8079
Integer datasetId = UtilIT.getDatasetIdFromResponse(createDatasetResponse);
81-
UtilIT.sleepForReindex(datasetId.toString(), normalUserApiToken, 4);
80+
UtilIT.sleepForDatasetIndex(datasetId.toString(), normalUserApiToken);
8281
Response oneDatasetResponse = UtilIT.retrieveMyDataAsJsonString(normalUserApiToken, "", new ArrayList<>(Arrays.asList(6L)));
8382
assertEquals(OK.getStatusCode(), oneDatasetResponse.getStatusCode());
8483
JsonPath jsonPathOneDataset = oneDatasetResponse.getBody().jsonPath();
@@ -277,13 +276,13 @@ public void testRetrieveMyDataAsJsonStringSortOrder() {
277276
createDatasetOneResponse.prettyPrint();
278277
Integer datasetOneId = UtilIT.getDatasetIdFromResponse(createDatasetOneResponse);
279278
String datasetOnePid = UtilIT.getDatasetPersistentIdFromResponse(createDatasetOneResponse);
280-
UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4);
279+
UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken);
281280

282281
Response createDatasetTwoResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, userApiToken);
283282
createDatasetTwoResponse.prettyPrint();
284283
Integer datasetTwoId = UtilIT.getDatasetIdFromResponse(createDatasetTwoResponse);
285284
String datasetTwoPid = UtilIT.getDatasetPersistentIdFromResponse(createDatasetTwoResponse);
286-
UtilIT.sleepForReindex(datasetTwoId.toString(), userApiToken, 4);
285+
UtilIT.sleepForDatasetIndex(datasetTwoId.toString(), userApiToken);
287286

288287
// Request datasets belonging to user
289288
Response twoDatasetsInReviewResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L)));
@@ -301,13 +300,13 @@ public void testRetrieveMyDataAsJsonStringSortOrder() {
301300
Response publishDatasetOne = UtilIT.publishDatasetViaNativeApi(datasetOneId, "major", superUserApiToken);
302301
publishDatasetOne.prettyPrint();
303302
publishDatasetOne.then().assertThat().statusCode(OK.getStatusCode());
304-
UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4);
303+
UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken);
305304

306305
// Publish dataset 2
307306
Response publishDatasetTwo = UtilIT.publishDatasetViaNativeApi(datasetTwoId, "major", superUserApiToken);
308307
publishDatasetTwo.prettyPrint();
309308
publishDatasetTwo.then().assertThat().statusCode(OK.getStatusCode());
310-
UtilIT.sleepForReindex(datasetTwoId.toString(), userApiToken, 4);
309+
UtilIT.sleepForDatasetIndex(datasetTwoId.toString(), userApiToken);
311310

312311
// Request datasets belonging to user
313312
Response twoPublishedDatasetsResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L)));
@@ -326,7 +325,7 @@ public void testRetrieveMyDataAsJsonStringSortOrder() {
326325
Response addDataToPublishedVersion = UtilIT.addDatasetMetadataViaNative(datasetOnePid, pathToJsonFilePostPub, userApiToken);
327326
addDataToPublishedVersion.prettyPrint();
328327
addDataToPublishedVersion.then().assertThat().statusCode(OK.getStatusCode());
329-
UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4);
328+
UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken);
330329

331330
// Request datasets belonging to user
332331
Response twoPublishedDatasetsOneDraftResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L)));
@@ -350,7 +349,7 @@ public void testRetrieveMyDataAsJsonStringSortOrder() {
350349
Response uploadImage = UtilIT.uploadFileViaNative(datasetTwoId.toString(), pathToFile, userApiToken);
351350
uploadImage.prettyPrint();
352351
uploadImage.then().assertThat().statusCode(OK.getStatusCode());
353-
UtilIT.sleepForReindex(datasetTwoId.toString(), userApiToken, 4);
352+
UtilIT.sleepForDatasetIndex(datasetTwoId.toString(), userApiToken);
354353

355354
// Request datasets belonging to user
356355
Response twoPublishedDatasetsTwoDraftsResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L)));
@@ -373,7 +372,7 @@ public void testRetrieveMyDataAsJsonStringSortOrder() {
373372
Response publishDatasetOneMinor = UtilIT.publishDatasetViaNativeApi(datasetOneId, "minor", superUserApiToken);
374373
publishDatasetOneMinor.prettyPrint();
375374
publishDatasetOneMinor.then().assertThat().statusCode(OK.getStatusCode());
376-
UtilIT.sleepForReindex(datasetOneId.toString(), userApiToken, 4);
375+
UtilIT.sleepForDatasetIndex(datasetOneId.toString(), userApiToken);
377376

378377
// Request datasets belonging to user
379378
Response oneMinorOneMajorOneDraftDatasetResponse = UtilIT.retrieveMyDataAsJsonString(userApiToken, "", new ArrayList<>(Arrays.asList(6L)));
@@ -429,7 +428,7 @@ public void testRetrieveMyDataWithMetadataFields() {
429428
Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, apiToken);
430429
String datasetId = UtilIT.getDatasetIdFromResponse(createDatasetResponse).toString();
431430

432-
UtilIT.sleepForReindex(datasetId, apiToken, 5);
431+
UtilIT.sleepForDatasetIndex(datasetId, apiToken);
433432

434433
Response myDataWithAuthor = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&metadata_fields=citation:author");
435434
myDataWithAuthor.prettyPrint();
@@ -482,7 +481,7 @@ public void testRetrieveMyDataWithCollections() {
482481

483482
UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken).then().assertThat().statusCode(OK.getStatusCode());
484483

485-
UtilIT.sleepForReindex(datasetPid, apiToken, 5);
484+
UtilIT.sleepForDatasetIndex(datasetPid, apiToken);
486485

487486
// Test that the Dataverse collection that the dataset was created in is returned
488487
Response myDataResponse = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&show_collections=true");
@@ -506,7 +505,7 @@ public void testRetrieveMyDataWithCollections() {
506505

507506
UtilIT.linkDataset(datasetPid, dataverse2Alias, apiToken).then().assertThat().statusCode(OK.getStatusCode());
508507

509-
UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5);
508+
UtilIT.sleepForDatasetIndex(String.valueOf(datasetId), apiToken);
510509

511510
// Test that the Dataverse collection that the dataset was linked to is also returned
512511
myDataResponse = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&show_collections=true");

0 commit comments

Comments
 (0)