Skip to content

Commit 7797862

Browse files
authored
Merge pull request #11552 from IQSS/11550-update-dv-object-featured-items-response
update dvObject featured item response
2 parents 92fb903 + 9546ea3 commit 7797862

File tree

17 files changed

+463
-45
lines changed

17 files changed

+463
-45
lines changed

doc/release-notes/11414-add-dvobject-type-to-featured-items.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,3 @@
33
Dataverse Featured Items can now be linked to Dataverses, Datasets, or Datafiles.
44

55
Pre-existing featured items as well as new items without dvObjects will be defaulted to type=custom.
6-
7-
Featured Items with dvObjects will be filtered out of lists if the dvObject should not be viewed (i.e. datafiles that are restricted or datasets that are deaccessioned)

doc/sphinx-guides/source/api/native-api.rst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,9 +1218,9 @@ The ``file`` parameter must be specified for each image we want to attach to fea
12181218

12191219
The ``id`` parameter must be ``0`` for new items or set to the item's identifier for updates. The ``fileName`` parameter should be empty to exclude an image or match the name of a file sent in a ``file`` parameter to set a new image. ``keepFile`` must always be set to ``false``, unless it's an update to a featured item where we want to preserve the existing image, if one exists.
12201220

1221-
The ``type`` and ``dvObject`` parameters are optional. These allow you to link the featured item to a Dataverse, Dataset, or Datafile.
1222-
The ``dvObject`` can be passed as the id or the persistent identifier and the ``type`` must be passed as either "dataverse", "dataset", or "datafile", depending on the type of object.
1223-
If no ``dvObject`` is passed the ``type`` will default to "custom" designating no linked object.
1221+
The ``type`` and ``dvObjectIdentifier`` parameters are optional. These allow you to link the featured item to a Dataverse, Dataset, or Datafile.
1222+
The ``dvObjectIdentifier`` can be passed as the alias, id, or the persistent identifier and the ``type`` must be passed as either "dataverse", "dataset", or "datafile", depending on the type of object.
1223+
If no ``dvObjectIdentifier`` is passed the ``type`` will default to "custom" designating no linked object.
12241224

12251225
Note that any existing featured item not included in the call with its associated identifier and corresponding properties will be removed from the collection.
12261226

@@ -1250,7 +1250,7 @@ The following example creates two featured items, with an image and a dataset as
12501250
-F "keepFile=false" -F "keepFile=false" \
12511251
-F "file=@$SECOND_ITEM_IMAGE_FILENAME" \
12521252
-F "type=" -F "type=@$SECOND_ITEM_TYPE" \
1253-
-F "dvObject=" -F "dvObject=@$SECOND_ITEM_DVOBJECT" \
1253+
-F "dvObjectIdentifier=" -F "dvObjectIdentifier=@$SECOND_ITEM_DVOBJECT" \
12541254
"$SERVER_URL/api/dataverses/$ID/featuredItems"
12551255
12561256
@@ -1267,7 +1267,7 @@ The fully expanded example above (without environment variables) looks like this
12671267
-F "keepFile=false" -F "keepFile=false" \
12681268
12691269
-F "type=" -F "type=dataset" \
1270-
-F "dvObject=" -F "dvObject=doi:ZZ7/MOSEISLEYDB94" \
1270+
-F "dvObjectIdentifier=" -F "dvObjectIdentifier=doi:ZZ7/MOSEISLEYDB94" \
12711271
"https://demo.dataverse.org/api/dataverses/root/featuredItems"
12721272
12731273
The following example creates one featured item and updates a second one, keeping the existing image it may have had but removes the dataset link and defaults the type to "custom":

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,14 @@ protected DvObject findDvo(@NotNull final String id) throws WrappedResponse {
590590
protected DvObject findDvoByIdAndFeaturedItemTypeOrDie(@NotNull final String dvIdtf, String type) throws WrappedResponse {
591591
try {
592592
DataverseFeaturedItem.TYPES dvType = DataverseFeaturedItem.getDvType(type);
593-
DvObject dvObject = isNumeric(dvIdtf) ? findDvo(Long.valueOf(dvIdtf)) : null;
593+
DvObject dvObject = null;
594+
if (isNumeric(dvIdtf)) {
595+
try {
596+
dvObject = findDvo(Long.valueOf(dvIdtf));
597+
} catch (Exception e) {
598+
throw new WrappedResponse(error(Response.Status.BAD_REQUEST,BundleUtil.getStringFromBundle("find.dvo.error.dvObjectNotFound", Arrays.asList(dvIdtf))));
599+
}
600+
}
594601
if (dvObject == null) {
595602
List<DataverseFeaturedItem.TYPES> types = new ArrayList<>();
596603
types.addAll(List.of(DataverseFeaturedItem.TYPES.values()));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public Response updateFeaturedItem(@Context ContainerRequestContext crc,
5353
@PathParam("id") Long id,
5454
@FormDataParam("content") String content,
5555
@FormDataParam("type") String type,
56-
@FormDataParam("dvObject") String dvObjectIdtf,
56+
@FormDataParam("dvObjectIdentifier") String dvObjectIdtf,
5757
@FormDataParam("displayOrder") int displayOrder,
5858
@FormDataParam("keepFile") boolean keepFile,
5959
@FormDataParam("file") InputStream imageFileInputStream,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1793,7 +1793,7 @@ public Response getUserPermissionsOnDataverse(@Context ContainerRequestContext c
17931793
public Response createFeaturedItem(@Context ContainerRequestContext crc,
17941794
@PathParam("identifier") String dvIdtf,
17951795
@FormDataParam("type") String type,
1796-
@FormDataParam("dvObject") String dvObjectIdtf,
1796+
@FormDataParam("dvObjectIdentifier") String dvObjectIdtf,
17971797
@FormDataParam("content") String content,
17981798
@FormDataParam("displayOrder") int displayOrder,
17991799
@FormDataParam("file") InputStream imageFileInputStream,
@@ -1844,7 +1844,7 @@ public Response updateFeaturedItems(
18441844
@FormDataParam("id") List<Long> ids,
18451845
@FormDataParam("content") List<String> contents,
18461846
@FormDataParam("type") List<String> types,
1847-
@FormDataParam("dvObject") List<String> dvObjectIdtf,
1847+
@FormDataParam("dvObjectIdentifier") List<String> dvObjectIdtf,
18481848
@FormDataParam("displayOrder") List<Integer> displayOrders,
18491849
@FormDataParam("keepFile") List<Boolean> keepFiles,
18501850
@FormDataParam("fileName") List<String> fileNames,

src/main/java/edu/harvard/iq/dataverse/dataverse/featured/DataverseFeaturedItem.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import jakarta.validation.constraints.NotBlank;
1212
import jakarta.validation.constraints.Min;
1313
import jakarta.validation.constraints.Size;
14+
import org.apache.commons.text.CaseUtils;
1415

1516
import java.util.Arrays;
1617
import java.util.List;
@@ -144,6 +145,17 @@ public static void validateTypeAndDvObject(String dvIdtf, DvObject dvObject, Dat
144145
(dvObject instanceof DataFile && dvType != DataverseFeaturedItem.TYPES.DATAFILE)) {
145146
throw new IllegalArgumentException(BundleUtil.getStringFromBundle("dataverse.update.featuredItems.error.typeAndDvObjectMismatch"));
146147
}
148+
if (dvObject instanceof DataFile) {
149+
DataFile df = (DataFile)dvObject;
150+
if (df.isRestricted()) {
151+
throw new IllegalArgumentException(BundleUtil.getStringFromBundle("dataverseFeaturedItems.errors.restricted"));
152+
}
153+
if (!df.isReleased()) {
154+
throw new IllegalArgumentException(BundleUtil.getStringFromBundle("dataverseFeaturedItems.errors.notPublished", List.of("Dataset")));
155+
}
156+
} else if (!dvObject.isReleased()) {
157+
throw new IllegalArgumentException(BundleUtil.getStringFromBundle("dataverseFeaturedItems.errors.notPublished", List.of(CaseUtils.toCamelCase(dvType.name(), true))));
158+
}
147159
} else {
148160
if (dvType != DataverseFeaturedItem.TYPES.CUSTOM) {
149161
throw new IllegalArgumentException(BundleUtil.getStringFromBundle("find.dvo.error.dvObjectNotFound", List.of(dvIdtf == null ? "unknown" : dvIdtf)));

src/main/java/edu/harvard/iq/dataverse/dataverse/featured/DataverseFeaturedItemServiceBean.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package edu.harvard.iq.dataverse.dataverse.featured;
22

3-
import com.google.common.collect.Lists;
43
import edu.harvard.iq.dataverse.*;
5-
import edu.harvard.iq.dataverse.authorization.Permission;
6-
import edu.harvard.iq.dataverse.authorization.users.User;
7-
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
84
import edu.harvard.iq.dataverse.settings.JvmSettings;
95
import edu.harvard.iq.dataverse.util.BundleUtil;
106
import edu.harvard.iq.dataverse.util.FileUtil;
@@ -13,7 +9,6 @@
139
import jakarta.inject.Named;
1410
import jakarta.persistence.EntityManager;
1511
import jakarta.persistence.PersistenceContext;
16-
import jakarta.servlet.http.HttpServletRequest;
1712

1813
import java.io.File;
1914
import java.io.IOException;
@@ -22,12 +17,14 @@
2217
import java.nio.file.Files;
2318
import java.nio.file.Path;
2419
import java.nio.file.StandardCopyOption;
25-
import java.util.EnumSet;
20+
import java.util.ArrayList;
2621
import java.util.List;
22+
import java.util.logging.Logger;
2723

2824
@Stateless
2925
@Named
3026
public class DataverseFeaturedItemServiceBean implements Serializable {
27+
private static final Logger logger = Logger.getLogger(DataverseFeaturedItemServiceBean.class.getCanonicalName());
3128

3229
public static class InvalidImageFileException extends Exception {
3330
public InvalidImageFileException(String message) {
@@ -70,6 +67,25 @@ public void deleteAllByDvObjectId(Long id) {
7067
.executeUpdate();
7168
}
7269

70+
public void deleteInvalidatedFeaturedItemsByDataset(Dataset dataset) {
71+
// Delete any Featured Items that contain Datafiles that were removed or restricted in the latest published version
72+
List<DataverseFeaturedItem> featuredItems = findAllByDataverseOrdered(dataset.getOwner());
73+
for (DataverseFeaturedItem featuredItem : featuredItems) {
74+
if (featuredItem.getDvObject() != null && featuredItem.getType().equalsIgnoreCase(DataverseFeaturedItem.TYPES.DATAFILE.name())) {
75+
DataFile df = (DataFile) featuredItem.getDvObject();
76+
List<Long> latestVersionFileIds = new ArrayList<>();
77+
dataset.getLatestVersion().getFileMetadatas().stream()
78+
.map(FileMetadata::getId)
79+
.forEachOrdered(latestVersionFileIds::add);
80+
// If the datafile is restricted or part of this dataset but not in the latest version we need to delete the featured item
81+
if (df.isRestricted() || (dataset.getFiles().contains(df) && !latestVersionFileIds.contains(df.getId()))) {
82+
logger.fine("Deleting invalidated Featured Item for " + (df.isRestricted() ? "Restricted" : "Deleted") + "Datafile ID: " + df.getId());
83+
deleteAllByDvObjectId(df.getId());
84+
}
85+
}
86+
}
87+
}
88+
7389
public List<DataverseFeaturedItem> findAllByDataverseOrdered(Dataverse dataverse) {
7490
List<DataverseFeaturedItem> items = em
7591
.createNamedQuery("DataverseFeaturedItem.findByDataverseOrderedByDisplayOrder", DataverseFeaturedItem.class)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,9 @@ public Dataset execute(CommandContext ctxt) throws CommandException {
246246

247247
logger.info("Successfully published the dataset "+readyDataset.getGlobalId().asString());
248248
readyDataset = ctxt.em().merge(readyDataset);
249+
250+
// Delete any Featured Items that are invalidated by publishing this version
251+
ctxt.dataverseFeaturedItems().deleteInvalidatedFeaturedItemsByDataset(readyDataset);
249252

250253
return readyDataset;
251254
}

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

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,13 +1501,33 @@ public static JsonArrayBuilder jsonDataverseFeaturedItems(List<DataverseFeatured
15011501
}
15021502

15031503
public static JsonObjectBuilder json(DataverseFeaturedItem dataverseFeaturedItem) {
1504-
return jsonObjectBuilder()
1504+
NullSafeJsonBuilder job = jsonObjectBuilder()
15051505
.add("id", dataverseFeaturedItem.getId())
15061506
.add("content", dataverseFeaturedItem.getContent())
15071507
.add("imageFileName", dataverseFeaturedItem.getImageFileName())
15081508
.add("imageFileUrl", dataverseFeaturedItem.getImageFileUrl())
15091509
.add("displayOrder", dataverseFeaturedItem.getDisplayOrder())
1510-
.add("type", dataverseFeaturedItem.getType())
1511-
.add("dvObject", (dataverseFeaturedItem.getDvObject() != null) ? dataverseFeaturedItem.getDvObject().getId() : null);
1510+
.add("type", dataverseFeaturedItem.getType());
1511+
1512+
DvObject dvObject = dataverseFeaturedItem.getDvObject();
1513+
if (dvObject != null) {
1514+
String identifier = null;
1515+
String displayName = null;
1516+
1517+
if (dvObject.isInstanceofDataverse()) {
1518+
identifier = ((Dataverse) dvObject).getAlias();
1519+
displayName = ((Dataverse) dvObject).getName();
1520+
} else if (dvObject.isInstanceofDataset()) {
1521+
identifier = dvObject.getGlobalId() != null ? dvObject.getGlobalId().asString() : String.valueOf(dvObject.getId());
1522+
displayName = ((Dataset) dvObject).getCurrentName();
1523+
} else if (dvObject.isInstanceofDataFile()) {
1524+
identifier = String.valueOf(dvObject.getId());
1525+
displayName = ((DataFile) dvObject).getDisplayName();
1526+
}
1527+
1528+
job.add("dvObjectIdentifier", identifier);
1529+
job.add("dvObjectDisplayName", displayName);
1530+
}
1531+
return job;
15121532
}
15131533
}

src/main/java/propertyFiles/Bundle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3193,6 +3193,8 @@ sendfeedback.fromEmail.error.invalid=Invalid fromEmail: {0}
31933193

31943194
#DataverseFeaturedItems.java
31953195
dataverseFeaturedItems.errors.notFound=Could not find dataverse featured item with identifier {0}
3196+
dataverseFeaturedItems.errors.notPublished={0} must be published to be featured.
3197+
dataverseFeaturedItems.errors.restricted=Datafile must not be restricted to be featured.
31963198
dataverseFeaturedItems.delete.successful=Successfully deleted dataverse featured item with identifier {0}
31973199

31983200
#DatasetFieldValidator.java

0 commit comments

Comments
 (0)