Skip to content

Commit a0fb35c

Browse files
authored
Refactor DIP/File actions, fix ancestors 404s, v2 api and improve audit logs (#3576)
* refactor DIP/File actions, fix ancestors 404s, v2 download and remove calls and improve/update audit logs. * added PT translation; improve error handling in dip file ancestors. * added missing PT translations.
1 parent b26d72b commit a0fb35c

18 files changed

Lines changed: 202 additions & 135 deletions

File tree

DEV_NOTES.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,8 @@ Follow the official documentation page: <https://docs.github.com/en/authenticati
3131
## Debug WUI
3232

3333
```bash
34-
# If never GWT compiled before, compile once and copy gwt.rpc files
34+
# If never GWT compiled before, compile once
3535
mvn -pl roda-ui/roda-wui -am gwt:compile -Pdebug-main -Dscope.gwt-dev=compile
36-
./roda-ui/roda-wui/copy_gwt_rpc.sh
3736

3837
mvn install -Pcore -DskipTests
3938

roda-common/roda-common-data/src/main/java/org/roda/core/data/common/RodaConstants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2103,7 +2103,7 @@ public enum RODA_TYPE {
21032103
public static final String PERMISSION_METHOD_FIND_RISK = "org.roda.wui.api.v2.services.IndexService.find(IndexedRisk)";
21042104

21052105
public static final String PERMISSION_METHOD_DELETE_AIP = "org.roda.wui.api.v2.controller.AIPController.deleteAIPs";
2106-
public static final String PERMISSION_METHOD_DELETE_DIP = "org.roda.wui.api.v2.controller.DIPController.deleteIndexedDIPs";
2106+
public static final String PERMISSION_METHOD_DELETE_DIP = "org.roda.wui.api.v2.controller.DIPController.deleteDIPs";
21072107
public static final String PERMISSION_METHOD_DELETE_REPRESENTATION = "org.roda.wui.api.v2.controller.RepresentationController.deleteRepresentation";
21082108
public static final String PERMISSION_METHOD_DELETE_FILE = "org.roda.wui.api.v2.controller.FilesController.deleteFiles";
21092109
public static final String PERMISSION_METHOD_DELETE_REPRESENTATION_INFORMATION = "org.roda.wui.api.v2.controller.RepresentationInformationController.deleteMultipleRepresentationInformation";

roda-core/roda-core/src/main/resources/config/roda-permissions.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ core.permissions.org.roda.wui.api.v2.controller.RepresentationController.retriev
7373
# DIP permissions
7474
core.permissions.org.roda.wui.api.v2.controller.DIPController.downloadBinary = READ
7575
core.permissions.org.roda.wui.api.v2.controller.DIPController.updatePermissions = GRANT
76+
core.permissions.org.roda.wui.api.v2.controller.DIPController.deleteDIPs = DELETE
7677

7778
# File permissions
7879
core.permissions.org.roda.wui.api.v2.controller.FilesController.downloadBinary = READ

roda-core/roda-core/src/main/resources/config/roda-roles.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ core.roles.org.roda.wui.api.v2.controller.PreservationEventController.getPreserv
249249
core.roles.org.roda.wui.api.v2.controller.PreservationAgentController.downloadPreservationAgent = preservation_metadata.read
250250

251251
# DIP roles
252-
core.roles.org.roda.wui.api.v2.controller.DIPController.deleteIndexedDIPs = aip.delete
252+
core.roles.org.roda.wui.api.v2.controller.DIPController.deleteDIPs = aip.delete
253253
core.roles.org.roda.wui.api.v2.controller.DIPController.downloadBinary = aip.read
254254
core.roles.org.roda.wui.api.v2.controller.DIPController.updatePermissions = aip.update
255255

roda-ui/roda-wui/copy_gwt_rpc.sh

Lines changed: 0 additions & 9 deletions
This file was deleted.

roda-ui/roda-wui/src/main/java/org/roda/wui/api/v2/controller/DIPController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public ResponseEntity<StreamingResponseBody> process(RequestContext requestConte
117117
}
118118

119119
@Override
120-
public Job deleteIndexedDIPs(@RequestBody DeleteRequest deleteRequest) {
120+
public Job deleteDIPs(@RequestBody DeleteRequest deleteRequest) {
121121
return requestHandler.processRequestWithTransaction(new RequestHandler.RequestProcessor<Job>() {
122122
@Override
123123
public Job process(RequestContext requestContext, RequestControllerAssistant controllerAssistant)

roda-ui/roda-wui/src/main/java/org/roda/wui/api/v2/controller/DIPFileController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ public ResponseEntity<StreamingResponseBody> process(RequestContext requestConte
129129
RequestControllerAssistant controllerAssistant) throws RODAException, RESTException {
130130
List<String> fileFields = new ArrayList<>(RodaConstants.DIPFILE_FIELDS_TO_RETURN);
131131
DIPFile dipFile = requestContext.getIndexService().retrieve(DIPFile.class, dipFileUUID, fileFields);
132+
controllerAssistant.setRelatedObjectId(dipFile.getDipId());
133+
controllerAssistant.setParameters(RodaConstants.CONTROLLER_DIP_FILE_ID_PARAM, dipFile.getId(),
134+
RodaConstants.CONTROLLER_DIP_FILE_UUID_PARAM, dipFileUUID);
132135
return ApiUtils.okResponse(dipFileService.retrieveDIPFileStreamResponse(requestContext, dipFile));
133136
}
134137
});

roda-ui/roda-wui/src/main/java/org/roda/wui/api/v2/controller/FilesController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,12 @@ public ResponseEntity<StreamingResponseBody> downloadBinary(
132132
@Override
133133
public ResponseEntity<StreamingResponseBody> process(RequestContext requestContext,
134134
RequestControllerAssistant controllerAssistant) throws RODAException, RESTException {
135-
controllerAssistant.setRelatedObjectId(fileUUID);
136-
controllerAssistant.setParameters(RodaConstants.CONTROLLER_FILE_UUID_PARAM, fileUUID);
137135
List<String> fileFields = new ArrayList<>(RodaConstants.FILE_FIELDS_TO_RETURN);
138136
fileFields.add(RodaConstants.FILE_ISDIRECTORY);
139137
IndexedFile file = indexService.retrieve(IndexedFile.class, fileUUID, fileFields);
138+
controllerAssistant.setRelatedObjectId(file.getAipId());
139+
controllerAssistant.setParameters(RodaConstants.CONTROLLER_FILE_UUID_PARAM, fileUUID, RodaConstants.CONTROLLER_FILE_ID_PARAM, file.getId());
140+
140141
controllerAssistant.checkObjectPermissions(requestContext.getUser(), file);
141142

142143
StreamResponse response = filesService.retrieveAIPRepresentationFile(requestContext, file);

roda-ui/roda-wui/src/main/java/org/roda/wui/client/browse/BrowseDIP.java

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.HashMap;
1414
import java.util.List;
1515
import java.util.Map;
16+
import java.util.Optional;
1617
import java.util.concurrent.CompletableFuture;
1718
import java.util.stream.Collectors;
1819

@@ -37,9 +38,7 @@
3738
import org.roda.core.data.v2.ip.RepresentationLink;
3839
import org.roda.wui.client.browse.tabs.BrowseDIPTabs;
3940
import org.roda.wui.client.common.ActionsToolbar;
40-
import org.roda.wui.client.common.BrowseDIPActionsToolbar;
41-
import org.roda.wui.client.common.BrowseDIPFileActionsToolbar;
42-
import org.roda.wui.client.common.BrowseObjectActionsToolbar;
41+
import org.roda.wui.client.common.BrowseDIPContentActionsToolbar;
4342
import org.roda.wui.client.common.NavigationToolbar;
4443
import org.roda.wui.client.common.NoAsyncCallback;
4544
import org.roda.wui.client.common.UserLogin;
@@ -49,6 +48,7 @@
4948
import org.roda.wui.client.common.utils.JavascriptUtils;
5049
import org.roda.wui.client.services.ConfigurationRestService;
5150
import org.roda.wui.client.services.Services;
51+
import org.roda.wui.common.client.ClientLogger;
5252
import org.roda.wui.common.client.HistoryResolver;
5353
import org.roda.wui.common.client.tools.HistoryUtils;
5454
import org.roda.wui.common.client.tools.ListUtils;
@@ -77,6 +77,7 @@ public class BrowseDIP extends Composite {
7777

7878
public static final Sorter DEFAULT_DIPFILE_SORTER = new Sorter(new SortParameter(RodaConstants.DIPFILE_ID, false));
7979
private static final ClientMessages messages = GWT.create(ClientMessages.class);
80+
private static final ClientLogger logger = new ClientLogger(BrowseDIP.class.getName());
8081
public static final HistoryResolver RESOLVER = new HistoryResolver() {
8182

8283
@Override
@@ -169,14 +170,22 @@ private void applyWhenIndexedAIP(Services services, String historyDipUUID, Strin
169170
return response;
170171
}).whenComplete((response, throwable1) -> {
171172
if (response.getDipFile() != null) {
172-
List<CompletableFuture<DIPFile>> dipFileAncestors = response.getDipFile().getAncestorsUUIDs().stream()
173-
.map(m -> services.dipFileResource(s -> s.findByUuid(m, LocaleInfo.getCurrentLocale().getLocaleName())))
173+
List<CompletableFuture<Optional<DIPFile>>> dipFileAncestors = response.getDipFile().getAncestorsUUIDs()
174+
.stream()
175+
.map(
176+
uuid -> services.dipFileResource(s -> s.findByUuid(uuid, LocaleInfo.getCurrentLocale().getLocaleName()))
177+
.handle((file, e) -> {
178+
if (e != null) {
179+
logger.warn("Failed to retrieve DIP file for DIP ID " + uuid + ": " + e.getMessage());
180+
return Optional.<DIPFile> empty();
181+
} else
182+
return Optional.ofNullable(file);
183+
}))
174184
.collect(Collectors.toList());
175185
CompletableFuture<?>[] futuresArray = dipFileAncestors.toArray(new CompletableFuture<?>[0]);
176186
CompletableFuture.allOf(futuresArray).thenApply(v -> {
177-
for (CompletableFuture<DIPFile> dipFileAncestor : dipFileAncestors) {
178-
DIPFile file = dipFileAncestor.join();
179-
response.getDipFileAncestors().add(file);
187+
for (CompletableFuture<Optional<DIPFile>> dipFileAncestor : dipFileAncestors) {
188+
dipFileAncestor.join().ifPresent(response.getDipFileAncestors()::add);
180189
}
181190
return response;
182191
}).whenComplete((o, throwable) -> render(o, viewers, callback, services));
@@ -243,13 +252,21 @@ private void applyWhenIndexedRepresentation(Services services, String historyDip
243252
}).whenComplete((response, throwable1) -> {
244253
if (response.getDipFile() != null) {
245254
List<CompletableFuture<DIPFile>> dipFileAncestors = response.getDipFile().getAncestorsUUIDs().stream()
246-
.map(m -> services.dipFileResource(s -> s.findByUuid(m, LocaleInfo.getCurrentLocale().getLocaleName())))
255+
.map(
256+
uuid -> services.dipFileResource(s -> s.findByUuid(uuid, LocaleInfo.getCurrentLocale().getLocaleName()))
257+
.handle((file, e) -> {
258+
if (e != null)
259+
return null;
260+
else
261+
return file;
262+
}))
247263
.collect(Collectors.toList());
248264
CompletableFuture<?>[] futuresArray = dipFileAncestors.toArray(new CompletableFuture<?>[0]);
249265
CompletableFuture.allOf(futuresArray).thenApply(v -> {
250266
for (CompletableFuture<DIPFile> dipFileAncestor : dipFileAncestors) {
251267
DIPFile file = dipFileAncestor.join();
252-
response.getDipFileAncestors().add(file);
268+
if (file != null)
269+
response.getDipFileAncestors().add(file);
253270
}
254271
return response;
255272
}).whenComplete((o, throwable) -> render(o, viewers, callback, services));
@@ -306,13 +323,22 @@ private void applyWhenIndexedFile(Services services, String historyDipUUID, Stri
306323
}).whenComplete((response, throwable1) -> {
307324
if (response.getDipFile() != null) {
308325
List<CompletableFuture<DIPFile>> dipFileAncestors = response.getDipFile().getAncestorsUUIDs().stream()
309-
.map(m -> services.dipFileResource(s -> s.findByUuid(m, LocaleInfo.getCurrentLocale().getLocaleName())))
326+
.map(
327+
uuid -> services.dipFileResource(s -> s.findByUuid(uuid, LocaleInfo.getCurrentLocale().getLocaleName()))
328+
.handle((file, e) -> {
329+
if (e != null)
330+
return null;
331+
else
332+
return file;
333+
}))
310334
.collect(Collectors.toList());
335+
311336
CompletableFuture<?>[] futuresArray = dipFileAncestors.toArray(new CompletableFuture<?>[0]);
312337
CompletableFuture.allOf(futuresArray).thenApply(v -> {
313338
for (CompletableFuture<DIPFile> dipFileAncestor : dipFileAncestors) {
314339
DIPFile file = dipFileAncestor.join();
315-
response.getDipFileAncestors().add(file);
340+
if (file != null)
341+
response.getDipFileAncestors().add(file);
316342
}
317343
return response;
318344
}).whenComplete((o, throwable) -> render(o, viewers, callback, services));
@@ -358,34 +384,25 @@ public BrowseDIP(Viewers viewers, BrowseDIPResponse response, Services services)
358384
IndexedDIP dip = response.getDip();
359385
DIPFile dipFile = response.getDipFile();
360386

361-
if (dipFile != null) {
362-
BrowseObjectActionsToolbar<DIPFile> toolbar = new BrowseDIPFileActionsToolbar();
363-
toolbar.setObjectAndBuild(dipFile, response.getPermissions(), handler);
364-
objectToolbar = toolbar;
365-
366-
} else {
367-
BrowseObjectActionsToolbar<IndexedDIP> toolbar = new BrowseDIPActionsToolbar();
368-
toolbar.setObjectAndBuild(dip, dip.getPermissions(), handler);
369-
objectToolbar = toolbar;
370-
}
387+
BrowseDIPContentActionsToolbar toolbar = new BrowseDIPContentActionsToolbar();
388+
toolbar.setObjectsAndBuild(dip, dipFile, response.getPermissions(), handler);
389+
objectToolbar = toolbar;
371390

372391
initWidget(uiBinder.createAndBindUi(this));
373392

374393
navigationToolbar.withObject(dipFile != null ? dipFile : dip);
375394

376395
handlers.put(Actionable.ActionImpact.DESTROYED, () -> {
377-
if (dipFile == null) {
378-
// dip was removed
379-
if (!dip.getFileIds().isEmpty()) {
380-
FileLink link = dip.getFileIds().get(0);
381-
HistoryUtils.openBrowse(link.getAipId(), link.getRepresentationId(), link.getPath(), link.getFileId());
382-
} else if (!dip.getRepresentationIds().isEmpty()) {
383-
RepresentationLink link = dip.getRepresentationIds().get(0);
384-
HistoryUtils.openBrowse(link.getAipId(), link.getRepresentationId());
385-
} else if (!dip.getAipIds().isEmpty()) {
386-
AIPLink link = dip.getAipIds().get(0);
387-
HistoryUtils.openBrowse(link.getAipId());
388-
}
396+
// dip was removed
397+
if (!dip.getAipIds().isEmpty()) {
398+
AIPLink link = dip.getAipIds().get(0);
399+
HistoryUtils.openBrowse(link.getAipId());
400+
} else if (!dip.getRepresentationIds().isEmpty()) {
401+
RepresentationLink link = dip.getRepresentationIds().get(0);
402+
HistoryUtils.openBrowse(link.getAipId());
403+
} else if (!dip.getFileIds().isEmpty()) {
404+
AIPLink link = dip.getFileIds().get(0);
405+
HistoryUtils.openBrowse(link.getAipId());
389406
}
390407
});
391408

roda-ui/roda-wui/src/main/java/org/roda/wui/client/common/BrowseDIPActionsToolbar.java

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)