Skip to content

Commit

Permalink
modified json based on UI requirements
Browse files Browse the repository at this point in the history
  • Loading branch information
stevenwinship committed Feb 14, 2025
1 parent 5781c9f commit 6035ba1
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 53 deletions.
132 changes: 130 additions & 2 deletions src/main/java/edu/harvard/iq/dataverse/FileMetadataVersionsHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,23 @@
import edu.harvard.iq.dataverse.api.AbstractApiBean.WrappedResponse;
import edu.harvard.iq.dataverse.authorization.Permission;
import edu.harvard.iq.dataverse.authorization.exceptions.AuthorizationException;
import edu.harvard.iq.dataverse.search.SearchConstants;
import edu.harvard.iq.dataverse.util.FileUtil;
import edu.harvard.iq.dataverse.util.StringUtil;
import jakarta.ejb.EJB;
import jakarta.ejb.Stateless;
import jakarta.inject.Inject;
import jakarta.json.Json;
import jakarta.json.JsonArrayBuilder;
import jakarta.json.JsonObjectBuilder;
import jakarta.json.JsonValue;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.logging.Logger;
import java.util.stream.Collectors;

import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder;

// Based on FilePage for API use
@Stateless
Expand Down Expand Up @@ -120,6 +129,93 @@ public List<FileMetadata> loadFileVersionList(String id, String version) throws
return retList;
}

public JsonObjectBuilder jsonDataFileVersions(FileMetadata fileMetadata) {
JsonObjectBuilder job = jsonObjectBuilder();
if (fileMetadata.getDatasetVersion() != null) {
job
.add("datasetVersion", fileMetadata.getDatasetVersion().getFriendlyVersionNumber())
.add("versionNumber", fileMetadata.getDatasetVersion().getVersionNumber())
.add("versionMinorNumber", fileMetadata.getDatasetVersion().getMinorVersionNumber())
.add("isDraft", fileMetadata.getDatasetVersion().isDraft())
.add("isReleased", fileMetadata.getDatasetVersion().isReleased())
.add("isDeaccessioned", fileMetadata.getDatasetVersion().isDeaccessioned())
.add("versionState", fileMetadata.getDatasetVersion().getVersionState().name())
.add("summary", fileMetadata.getDatasetVersion().getVersionNote())
.add("contributors", fileMetadata.getContributorNames())
;
if (fileMetadata.getDatasetVersion().getDataset() != null &&
fileMetadata.getDatasetVersion().getDataset().getGlobalId() != null) {
job.add("persistentId", fileMetadata.getDatasetVersion().getDataset().getGlobalId().asString());
}
}
if (fileMetadata.getDataFile() != null) {
job.add("datafileId", fileMetadata.getDataFile().getId());
if (fileMetadata.getDataFile().getPublicationDate() != null) {
job.add("publishedDate", fileMetadata.getDataFile().getPublicationDate().toString());
}
}
FileVersionDifference fvd = fileMetadata.getFileVersionDifference();
if (fvd != null) {
List<FileVersionDifference.FileDifferenceSummaryGroup> groups = fvd.getDifferenceSummaryGroups();
JsonObjectBuilder fileDifferenceSummary = jsonObjectBuilder();

if (fileMetadata.getDatasetVersion().isDeaccessioned() && fileMetadata.getDatasetVersion().getVersionNote() != null) {
fileDifferenceSummary.add("deaccessionedReason", fileMetadata.getDatasetVersion().getVersionNote());
}
String fileAction = getFileAction(fvd.getOriginalFileMetadata(), fvd.getNewFileMetadata());
if (fileAction != null) {
fileDifferenceSummary.add("file", fileAction);
}
fileDifferenceSummary.add("fileAccess", FileUtil.isActivelyEmbargoed(fileMetadata)
? (fileMetadata.isRestricted() ? SearchConstants.EMBARGOEDTHENRESTRICTED
: SearchConstants.EMBARGOEDTHENPUBLIC)
: (fileMetadata.isRestricted() ? SearchConstants.RESTRICTED
: SearchConstants.PUBLIC));

if (groups != null && !groups.isEmpty()) {
List<FileVersionDifference.FileDifferenceSummaryGroup> sortedGroups = groups.stream()
.sorted(Comparator.comparing(FileVersionDifference.FileDifferenceSummaryGroup::getName))
.collect(Collectors.toList());
String groupName = null;
final JsonArrayBuilder groupsArrayBuilder = Json.createArrayBuilder();
Map<String, Integer> itemCounts = new HashMap<>();

for (FileVersionDifference.FileDifferenceSummaryGroup group : sortedGroups) {
if (!StringUtil.isEmpty(group.getName())) {
// if the group name changed then add its data to the fileDifferenceSummary and reset list for next group
if (groupName != null && groupName.compareTo(group.getName()) != 0) {
addJsonObjectFromListOrMap(fileDifferenceSummary, groupName, groupsArrayBuilder.build(), itemCounts);
// Note: groupsArrayBuilder.build() also clears the data within it
itemCounts.clear();
}
groupName = group.getName();

group.getFileDifferenceSummaryItems().forEach(item -> {
JsonObjectBuilder itemObjectBuilder = jsonObjectBuilder();
if (item.getName().isEmpty()) {
// accumulate the counts since we can't make a separate array item
itemCounts.merge("Added", item.getAdded(), Integer::sum);
itemCounts.merge("Changed", item.getChanged(), Integer::sum);
itemCounts.merge("Deleted", item.getDeleted(), Integer::sum);
itemCounts.merge("Replaced", item.getReplaced(), Integer::sum);
} else {
String action = item.getAdded() > 0 ? "Added" : item.getChanged() > 0 ? "Changed" :
item.getDeleted() > 0 ? "Deleted" : item.getReplaced() > 0 ? "Replaced" : "";
itemObjectBuilder.add("name", item.getName());
itemObjectBuilder.add("action", action);
groupsArrayBuilder.add(itemObjectBuilder.build());
}
});
}
}
// process last group
addJsonObjectFromListOrMap(fileDifferenceSummary, groupName, groupsArrayBuilder.build(), itemCounts);
}
job.add("fileDifferenceSummary", fileDifferenceSummary.build());
}
return job;
}

private FileMetadata getPreviousFileMetadata(FileMetadata fileMetadata, FileMetadata fmdIn){

DataFile dfPrevious = datafileService.findPreviousFile(fmdIn.getDataFile());
Expand Down Expand Up @@ -199,4 +295,36 @@ private List<DataFile> allRelatedFiles(FileMetadata fileMetadata) {
private boolean canViewUnpublishedDataset(FileMetadata fileMetadata) {
return permissionsWrapper.canViewUnpublishedDataset( dvRequestService.getDataverseRequest(), fileMetadata.getDatasetVersion().getDataset());
}

private String getFileAction(FileMetadata originalFileMetadata, FileMetadata newFileMetadata) {
if (newFileMetadata.getDataFile() != null && originalFileMetadata == null) {
return "Added";
} else if (newFileMetadata.getDataFile() == null && originalFileMetadata != null) {
return "Deleted";
} else if (originalFileMetadata != null &&
newFileMetadata.getDataFile() != null && originalFileMetadata.getDataFile() != null &&!originalFileMetadata.getDataFile().equals(newFileMetadata.getDataFile())){
return "Replaced";
} else {
return null;
}
}

private void addJsonObjectFromListOrMap(JsonObjectBuilder jsonObjectBuilder, String key, JsonValue jsonObjectValue, Map<String, Integer> itemCounts) {
if (key != null && !key.isEmpty()) {
String sanitizedKey = key.replaceAll("\\s+", "");
if (itemCounts.isEmpty()) {
// add the array
jsonObjectBuilder.add(sanitizedKey, jsonObjectValue);
} else {
// add the accumulated totals
JsonObjectBuilder accumulatedTotalsObjectBuilder = jsonObjectBuilder();
itemCounts.forEach((k, v) -> {
if (v != 0) {
accumulatedTotalsObjectBuilder.add(k, v);
}
});
jsonObjectBuilder.add(sanitizedKey, accumulatedTotalsObjectBuilder.build());
}
}
}
}
2 changes: 1 addition & 1 deletion src/main/java/edu/harvard/iq/dataverse/api/Files.java
Original file line number Diff line number Diff line change
Expand Up @@ -992,7 +992,7 @@ public Response getFileVersionsList(@Context ContainerRequestContext crc, @PathP
List<FileMetadata> fileMetadataList = fileMetadataVersionsHelper.loadFileVersionList(fileIdOrPersistentId, versionNumber);
JsonArrayBuilder jab = Json.createArrayBuilder();
for (FileMetadata fileMetadata : fileMetadataList) {
jab.add(JsonPrinter.jsonDataFileVersions(fileMetadata).build());
jab.add(fileMetadataVersionsHelper.jsonDataFileVersions(fileMetadata).build());
}
return Response.ok()
.entity(Json.createObjectBuilder()
Expand Down
50 changes: 0 additions & 50 deletions src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import edu.harvard.iq.dataverse.util.DatasetFieldWalker;
import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder;

import edu.harvard.iq.dataverse.util.StringUtil;
import edu.harvard.iq.dataverse.workflow.Workflow;
import edu.harvard.iq.dataverse.workflow.step.WorkflowStepData;

Expand Down Expand Up @@ -921,55 +920,6 @@ public static JsonArrayBuilder jsonDV(List<DataVariable> dvl) {
return varArr;
}

public static JsonObjectBuilder jsonDataFileVersions(FileMetadata fileMetadata) {
JsonObjectBuilder job = jsonObjectBuilder();
if (fileMetadata.getDatasetVersion() != null) {
job
.add("datasetVersion", fileMetadata.getDatasetVersion().getFriendlyVersionNumber())
.add("versionNumber", fileMetadata.getDatasetVersion().getVersionNumber())
.add("versionMinorNumber", fileMetadata.getDatasetVersion().getMinorVersionNumber())
.add("isDraft", fileMetadata.getDatasetVersion().isDraft())
.add("isReleased", fileMetadata.getDatasetVersion().isReleased())
.add("isDeaccessioned", fileMetadata.getDatasetVersion().isDeaccessioned())
.add("versionState", fileMetadata.getDatasetVersion().getVersionState().name())
.add("summary", fileMetadata.getDatasetVersion().getVersionNote())
.add("contributors", fileMetadata.getContributorNames())
;
if (fileMetadata.getDatasetVersion().getDataset() != null &&
fileMetadata.getDatasetVersion().getDataset().getGlobalId() != null) {
job.add("persistentId", fileMetadata.getDatasetVersion().getDataset().getGlobalId().asString());
}
}
if (fileMetadata.getDataFile() != null) {
job.add("datafileId", fileMetadata.getDataFile().getId());
if (fileMetadata.getDataFile().getPublicationDate() != null) {
job.add("publishedDate", fileMetadata.getDataFile().getPublicationDate().toString());
}
}
FileVersionDifference fvd = fileMetadata.getFileVersionDifference();
if (fvd != null) {
List<FileVersionDifference.FileDifferenceSummaryGroup> groups = fvd.getDifferenceSummaryGroups();
if (groups != null && !groups.isEmpty()) {
JsonArrayBuilder groupsArrayBuilder = Json.createArrayBuilder();
for (FileVersionDifference.FileDifferenceSummaryGroup group : groups) {
JsonObjectBuilder groupObjectBuilder = jsonObjectBuilder();
group.getFileDifferenceSummaryItems().forEach(item -> {
JsonObjectBuilder itemObjectBuilder = jsonObjectBuilder();
itemObjectBuilder.add("name", item.getName());
itemObjectBuilder.add("added", item.getAdded());
itemObjectBuilder.add("changed", item.getChanged());
itemObjectBuilder.add("deleted", item.getDeleted());
itemObjectBuilder.add("replaced", item.getReplaced());
groupObjectBuilder.add(!StringUtil.isEmpty(group.getName()) ? group.getName() : "new", itemObjectBuilder.build());
});
groupsArrayBuilder.add(groupObjectBuilder.build());
}
job.add("fileDifferenceGroupSummary", groupsArrayBuilder.build());
}
}
return job;
}

// TODO: add sumstat and variable categories, check formats
public static JsonObjectBuilder json(DataVariable dv) {
return jsonObjectBuilder()
Expand Down

0 comments on commit 6035ba1

Please sign in to comment.