/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
package org.roda.wui.client.common.actions;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.exceptions.NotFoundException;
import org.roda.core.data.exceptions.RequestNotValidException;
import org.roda.core.data.v2.index.filter.Filter;
import org.roda.core.data.v2.index.filter.NotSimpleFilterParameter;
import org.roda.core.data.v2.index.select.SelectedItems;
import org.roda.core.data.v2.index.select.SelectedItemsFilter;
import org.roda.core.data.v2.index.select.SelectedItemsList;
import org.roda.core.data.v2.ip.AIPState;
import org.roda.core.data.v2.ip.IndexedAIP;
import org.roda.wui.client.browse.BrowseAIP;
import org.roda.wui.client.browse.BrowseRepresentation;
import org.roda.wui.client.browse.BrowserService;
import org.roda.wui.client.browse.CreateDescriptiveMetadata;
import org.roda.wui.client.browse.EditPermissions;
import org.roda.wui.client.browse.PreservationEvents;
import org.roda.wui.client.common.LastSelectedItemsSingleton;
import org.roda.wui.client.common.LoadingAsyncCallback;
import org.roda.wui.client.common.dialogs.Dialogs;
import org.roda.wui.client.common.dialogs.SelectAipDialog;
import org.roda.wui.client.common.lists.utils.ClientSelectedItemsUtils;
import org.roda.wui.client.common.utils.AsyncCallbackUtils;
import org.roda.wui.client.ingest.appraisal.IngestAppraisal;
import org.roda.wui.client.management.UserLog;
import org.roda.wui.client.planning.RiskIncidenceRegister;
import org.roda.wui.client.process.CreateSelectedJob;
import org.roda.wui.common.client.tools.HistoryUtils;
import org.roda.wui.common.client.tools.RestUtils;
import org.roda.wui.common.client.widgets.Toast;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.regexp.shared.RegExp;
import com.google.gwt.safehtml.shared.SafeUri;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Widget;
import config.i18n.client.ClientMessages;
public class AipActions extends AbstractActionable<IndexedAIP> {
public static final IndexedAIP NO_AIP_OBJECT = null;
public static final String NO_AIP_PARENT = null;
public static final AIPState NO_AIP_STATE = null;
private static final AipActions GENERAL_INSTANCE = new AipActions(NO_AIP_PARENT, NO_AIP_STATE);
private static final ClientMessages messages = GWT.create(ClientMessages.class);
private static final Set<AipAction> POSSIBLE_ACTIONS_ON_NO_AIP = new HashSet<>(
Arrays.asList(AipAction.NEW_CHILD_AIP));
private static final Set<AipAction> POSSIBLE_ACTIONS_ON_SINGLE_AIP = new HashSet<>(
Arrays.asList(AipAction.NEW_CHILD_AIP, AipAction.DOWNLOAD, AipAction.MOVE_IN_HIERARCHY,
AipAction.UPDATE_PERMISSIONS, AipAction.ADD_REPRESENTATION, AipAction.REMOVE, AipAction.NEW_PROCESS,
AipAction.SHOW_EVENTS, AipAction.SHOW_RISKS, AipAction.SHOW_LOGS, AipAction.DOWNLOAD_DOCUMENTATION));
private static final Set<AipAction> POSSIBLE_ACTIONS_ON_MULTIPLE_AIPS = new HashSet<>(
Arrays.asList(AipAction.MOVE_IN_HIERARCHY, AipAction.UPDATE_PERMISSIONS, AipAction.REMOVE, AipAction.NEW_PROCESS));
private static final Set<AipAction> APPRAISAL_ACTIONS = new HashSet<>(
Arrays.asList(AipAction.APPRAISAL_ACCEPT, AipAction.APPRAISAL_REJECT));
private final String parentAipId;
private final AIPState parentAipState;
private AipActions(String parentAipId, AIPState parentAipState) {
this.parentAipId = parentAipId;
this.parentAipState = parentAipState;
}
public enum AipAction implements Actionable.Action<IndexedAIP> {
NEW_CHILD_AIP, DOWNLOAD, MOVE_IN_HIERARCHY, UPDATE_PERMISSIONS, ADD_REPRESENTATION, REMOVE, NEW_PROCESS,
SHOW_EVENTS, SHOW_RISKS, SHOW_LOGS, APPRAISAL_ACCEPT, APPRAISAL_REJECT, DOWNLOAD_DOCUMENTATION;
}
public static AipActions get() {
return GENERAL_INSTANCE;
}
public static AipActions get(String parentAipId, AIPState parentAipState) {
return new AipActions(parentAipId, parentAipState);
}
@Override
public boolean canAct(Actionable.Action<IndexedAIP> action, IndexedAIP aip) {
boolean canAct;
if (aip == NO_AIP_OBJECT) {
canAct = POSSIBLE_ACTIONS_ON_NO_AIP.contains(action);
} else if (AIPState.UNDER_APPRAISAL.equals(aip.getState())) {
canAct = POSSIBLE_ACTIONS_ON_SINGLE_AIP.contains(action) || APPRAISAL_ACTIONS.contains(action);
} else {
canAct = POSSIBLE_ACTIONS_ON_SINGLE_AIP.contains(action);
}
return canAct;
}
@Override
public boolean canAct(Actionable.Action<IndexedAIP> action, SelectedItems<IndexedAIP> selectedItems) {
boolean canAct;
if (AIPState.UNDER_APPRAISAL.equals(parentAipState)) {
canAct = POSSIBLE_ACTIONS_ON_MULTIPLE_AIPS.contains(action) || APPRAISAL_ACTIONS.contains(action);
} else {
canAct = POSSIBLE_ACTIONS_ON_MULTIPLE_AIPS.contains(action);
}
return canAct;
}
@Override
public void act(Actionable.Action<IndexedAIP> action, IndexedAIP aip, AsyncCallback<ActionImpact> callback) {
if (AipAction.NEW_CHILD_AIP.equals(action)) {
newChildAip(aip, callback);
} else if (AipAction.DOWNLOAD.equals(action)) {
download(aip, callback);
} else if (AipAction.MOVE_IN_HIERARCHY.equals(action)) {
move(aip, callback);
} else if (AipAction.UPDATE_PERMISSIONS.equals(action)) {
updatePermissions(aip, callback);
} else if (AipAction.ADD_REPRESENTATION.equals(action)) {
addRepresentation(aip, callback);
} else if (AipAction.REMOVE.equals(action)) {
remove(aip, callback);
} else if (AipAction.NEW_PROCESS.equals(action)) {
newProcess(aip, callback);
} else if (AipAction.SHOW_EVENTS.equals(action)) {
showEvents(aip, callback);
} else if (AipAction.SHOW_RISKS.equals(action)) {
showRisks(aip, callback);
} else if (AipAction.SHOW_LOGS.equals(action)) {
showLogs(aip, callback);
} else if (AipAction.APPRAISAL_ACCEPT.equals(action)) {
appraisalAccept(aip, callback);
} else if (AipAction.APPRAISAL_REJECT.equals(action)) {
appraisalReject(aip, callback);
} else if (AipAction.DOWNLOAD_DOCUMENTATION.equals(action)) {
downloadDocumentation(aip, callback);
} else {
callback.onFailure(new RequestNotValidException("Unsupported action in this context: " + action));
}
}
/**
* Act on multiple files from different representations
*/
@Override
public void act(Actionable.Action<IndexedAIP> action, SelectedItems<IndexedAIP> aips,
AsyncCallback<ActionImpact> callback) {
if (AipAction.MOVE_IN_HIERARCHY.equals(action)) {
move(aips, callback);
} else if (AipAction.UPDATE_PERMISSIONS.equals(action)) {
updatePermissions(aips, callback);
} else if (AipAction.REMOVE.equals(action)) {
remove(aips, callback);
} else if (AipAction.NEW_PROCESS.equals(action)) {
newProcess(aips, callback);
} else if (AipAction.APPRAISAL_ACCEPT.equals(action)) {
appraisalAccept(aips, callback);
} else if (AipAction.APPRAISAL_REJECT.equals(action)) {
appraisalReject(aips, callback);
} else {
callback.onFailure(new RequestNotValidException("Unsupported action in this context: " + action));
}
}
// ACTIONS
private void newChildAip(final IndexedAIP aip, final AsyncCallback<ActionImpact> callback) {
String newChildParentAipId = aip != null ? aip.getId() : null;
String aipType = RodaConstants.AIP_TYPE_MIXED;
BrowserService.Util.getInstance().createAIP(newChildParentAipId, aipType, new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccess(String itemAIPId) {
LastSelectedItemsSingleton.getInstance().setLastHistory(HistoryUtils.getCurrentHistoryPath());
HistoryUtils.newHistory(CreateDescriptiveMetadata.RESOLVER, RodaConstants.RODA_OBJECT_AIP, itemAIPId,
CreateDescriptiveMetadata.NEW);
callback.onSuccess(ActionImpact.UPDATED);
}
});
}
private void download(IndexedAIP aip, AsyncCallback<ActionImpact> callback) {
SafeUri downloadUri = RestUtils.createAIPDownloadUri(aip.getId());
Window.Location.assign(downloadUri.asString());
callback.onSuccess(ActionImpact.NONE);
}
private void move(final IndexedAIP aip, final AsyncCallback<ActionImpact> callback) {
final String aipId = aip.getId();
boolean justActive = AIPState.ACTIVE.equals(aip.getState());
Filter filter = new Filter(new NotSimpleFilterParameter(RodaConstants.INDEX_UUID, aipId));
SelectAipDialog selectAipDialog = new SelectAipDialog(messages.moveItemTitle(), filter, justActive, false);
selectAipDialog.setEmptyParentButtonVisible(true);
selectAipDialog.setSingleSelectionMode();
selectAipDialog.showAndCenter();
selectAipDialog.addValueChangeHandler(new ValueChangeHandler<IndexedAIP>() {
@Override
public void onValueChange(ValueChangeEvent<IndexedAIP> event) {
final IndexedAIP parentAIP = event.getValue();
final String parentId = (parentAIP != null) ? parentAIP.getId() : null;
final SelectedItemsList<IndexedAIP> selected = new SelectedItemsList<>(Arrays.asList(aipId),
IndexedAIP.class.getName());
Dialogs.showPromptDialog(messages.outcomeDetailTitle(), null, null, messages.outcomeDetailPlaceholder(),
RegExp.compile(".*"), messages.cancelButton(), messages.confirmButton(), false, new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
// do nothing
}
@Override
public void onSuccess(String details) {
BrowserService.Util.getInstance().moveAIPInHierarchy(selected, parentId, details,
new AsyncCallback<IndexedAIP>() {
@Override
public void onSuccess(IndexedAIP result) {
Toast.showInfo(messages.moveItemTitle(), messages.movingAIP());
if (result != null) {
HistoryUtils.newHistory(BrowseAIP.RESOLVER, result.getId());
} else {
HistoryUtils.newHistory(BrowseAIP.RESOLVER);
}
}
@Override
public void onFailure(Throwable caught) {
if (caught instanceof NotFoundException) {
Toast.showError(messages.moveNoSuchObject(caught.getMessage()));
} else {
callback.onFailure(caught);
}
}
});
}
});
}
});
}
private void move(final SelectedItems<IndexedAIP> selected, final AsyncCallback<ActionImpact> callback) {
int counter = 0;
boolean justActive = parentAipState != null ? AIPState.ACTIVE.equals(parentAipState) : true;
Filter filter = new Filter();
if (selected instanceof SelectedItemsList) {
SelectedItemsList<IndexedAIP> list = (SelectedItemsList<IndexedAIP>) selected;
counter = list.getIds().size();
if (counter <= RodaConstants.DIALOG_FILTER_LIMIT_NUMBER) {
for (String id : list.getIds()) {
filter.add(new NotSimpleFilterParameter(RodaConstants.AIP_ANCESTORS, id));
filter.add(new NotSimpleFilterParameter(RodaConstants.INDEX_UUID, id));
}
}
if (parentAipId != null) {
filter.add(new NotSimpleFilterParameter(RodaConstants.INDEX_UUID, parentAipId));
}
} else if (selected instanceof SelectedItemsFilter && parentAipId != null) {
filter.add(new NotSimpleFilterParameter(RodaConstants.INDEX_UUID, parentAipId));
}
SelectAipDialog selectAipDialog = new SelectAipDialog(messages.moveItemTitle(), filter, justActive, true);
selectAipDialog.setEmptyParentButtonVisible(parentAipId != null);
selectAipDialog.showAndCenter();
if (counter > 0 && counter <= RodaConstants.DIALOG_FILTER_LIMIT_NUMBER) {
selectAipDialog.addStyleName("object-dialog");
}
selectAipDialog.addValueChangeHandler(new ValueChangeHandler<IndexedAIP>() {
@Override
public void onValueChange(ValueChangeEvent<IndexedAIP> event) {
final IndexedAIP parentAIP = event.getValue();
final String parentId = (parentAIP != null) ? parentAIP.getId() : null;
Dialogs.showPromptDialog(messages.outcomeDetailTitle(), null, null, messages.outcomeDetailPlaceholder(),
RegExp.compile(".*"), messages.cancelButton(), messages.confirmButton(), false, new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
// do nothing
}
@Override
public void onSuccess(String details) {
BrowserService.Util.getInstance().moveAIPInHierarchy(selected, parentId, details,
new LoadingAsyncCallback<IndexedAIP>() {
@Override
public void onSuccessImpl(IndexedAIP result) {
Toast.showInfo(messages.runningInBackgroundTitle(), messages.runningInBackgroundDescription());
if (result != null) {
HistoryUtils.newHistory(BrowseAIP.RESOLVER, result.getId());
} else {
HistoryUtils.newHistory(BrowseAIP.RESOLVER);
}
callback.onSuccess(ActionImpact.UPDATED);
}
@Override
public void onFailureImpl(Throwable caught) {
if (caught instanceof NotFoundException) {
Toast.showError(messages.moveNoSuchObject(caught.getMessage()));
} else {
callback.onFailure(caught);
}
}
});
}
});
}
});
}
private void updatePermissions(IndexedAIP aip, AsyncCallback<ActionImpact> callback) {
LastSelectedItemsSingleton.getInstance().setLastHistory(HistoryUtils.getCurrentHistoryPath());
HistoryUtils.newHistory(BrowseAIP.RESOLVER, EditPermissions.AIP_RESOLVER.getHistoryToken(), aip.getId());
callback.onSuccess(ActionImpact.UPDATED);
}
private void updatePermissions(SelectedItems<IndexedAIP> aips, AsyncCallback<ActionImpact> callback) {
LastSelectedItemsSingleton.getInstance().setSelectedItems(aips);
LastSelectedItemsSingleton.getInstance().setLastHistory(HistoryUtils.getCurrentHistoryPath());
HistoryUtils.newHistory(BrowseAIP.RESOLVER, EditPermissions.AIP_RESOLVER.getHistoryToken());
callback.onSuccess(ActionImpact.UPDATED);
}
private void addRepresentation(final IndexedAIP aip, final AsyncCallback<ActionImpact> callback) {
Dialogs.showPromptDialog(messages.outcomeDetailTitle(), null, null, messages.outcomeDetailPlaceholder(),
RegExp.compile(".*"), messages.cancelButton(), messages.confirmButton(), false, new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
// do nothing
}
@Override
public void onSuccess(String details) {
BrowserService.Util.getInstance().createRepresentation(aip.getId(), details,
new LoadingAsyncCallback<String>() {
@Override
public void onSuccessImpl(String representationId) {
HistoryUtils.newHistory(BrowseRepresentation.RESOLVER, aip.getId(), representationId);
callback.onSuccess(ActionImpact.UPDATED);
}
});
}
});
}
private void remove(final IndexedAIP aip, final AsyncCallback<ActionImpact> callback) {
Dialogs.showConfirmDialog(messages.removeConfirmDialogTitle(), messages.removeAllConfirmDialogMessage(),
messages.dialogNo(), messages.dialogYes(), new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
// nothing to do
}
@Override
public void onSuccess(Boolean confirmed) {
if (confirmed) {
Dialogs.showPromptDialog(messages.outcomeDetailTitle(), null, null, messages.outcomeDetailPlaceholder(),
RegExp.compile(".*"), messages.cancelButton(), messages.confirmButton(), false,
new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
// do nothing
}
@Override
public void onSuccess(final String details) {
final String parentId = aip.getParentID();
BrowserService.Util.getInstance().deleteAIP(objectToSelectedItems(aip), details,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccess(Void result) {
Toast.showInfo(messages.removingSuccessTitle(), messages.removingSuccessMessage(1L));
Timer timer = new Timer() {
@Override
public void run() {
if (parentId != null) {
HistoryUtils.newHistory(BrowseAIP.RESOLVER, parentId);
} else {
HistoryUtils.newHistory(BrowseAIP.RESOLVER);
}
callback.onSuccess(ActionImpact.DESTROYED);
}
};
timer.schedule(RodaConstants.ACTION_TIMEOUT);
}
});
}
});
}
}
});
}
private void remove(final SelectedItems<IndexedAIP> selected, final AsyncCallback<ActionImpact> callback) {
ClientSelectedItemsUtils.size(IndexedAIP.class, selected, new AsyncCallback<Long>() {
@Override
public void onFailure(Throwable caught) {
AsyncCallbackUtils.defaultFailureTreatment(caught);
}
@Override
public void onSuccess(final Long size) {
Dialogs.showConfirmDialog(messages.removeConfirmDialogTitle(),
messages.removeSelectedConfirmDialogMessage(size), messages.dialogNo(), messages.dialogYes(),
new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean confirmed) {
if (confirmed) {
Dialogs.showPromptDialog(messages.outcomeDetailTitle(), null, null, messages.outcomeDetailPlaceholder(),
RegExp.compile(".*"), messages.cancelButton(), messages.confirmButton(), false,
new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
// do nothing
}
@Override
public void onSuccess(final String details) {
BrowserService.Util.getInstance().deleteAIP(selected, details, new LoadingAsyncCallback<Void>() {
@Override
public void onFailureImpl(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccessImpl(Void result) {
Toast.showInfo(messages.runningInBackgroundTitle(),
messages.runningInBackgroundDescription());
callback.onSuccess(ActionImpact.DESTROYED);
}
});
}
});
}
}
@Override
public void onFailure(Throwable caught) {
// do nothing
}
});
}
});
}
private void newProcess(IndexedAIP aip, AsyncCallback<ActionImpact> callback) {
LastSelectedItemsSingleton.getInstance().setSelectedItems(objectToSelectedItems(aip));
LastSelectedItemsSingleton.getInstance().setLastHistory(HistoryUtils.getCurrentHistoryPath());
HistoryUtils.newHistory(CreateSelectedJob.RESOLVER, RodaConstants.JOB_PROCESS_ACTION);
callback.onSuccess(ActionImpact.UPDATED);
}
private void newProcess(SelectedItems<IndexedAIP> aips, AsyncCallback<ActionImpact> callback) {
LastSelectedItemsSingleton.getInstance().setSelectedItems(aips);
LastSelectedItemsSingleton.getInstance().setLastHistory(HistoryUtils.getCurrentHistoryPath());
HistoryUtils.newHistory(CreateSelectedJob.RESOLVER, RodaConstants.JOB_PROCESS_ACTION);
callback.onSuccess(ActionImpact.UPDATED);
}
private void showEvents(IndexedAIP aip, AsyncCallback<ActionImpact> callback) {
HistoryUtils.newHistory(BrowseAIP.RESOLVER, PreservationEvents.BROWSE_RESOLVER.getHistoryToken(), aip.getId());
callback.onSuccess(ActionImpact.NONE);
}
private void showRisks(IndexedAIP aip, AsyncCallback<ActionImpact> callback) {
HistoryUtils.newHistory(RiskIncidenceRegister.RESOLVER, aip.getId());
callback.onSuccess(ActionImpact.NONE);
}
private void showLogs(IndexedAIP aip, AsyncCallback<ActionImpact> callback) {
HistoryUtils.newHistory(UserLog.RESOLVER, aip.getId());
callback.onSuccess(ActionImpact.NONE);
}
private void appraisalAccept(final IndexedAIP aip, final AsyncCallback<ActionImpact> callback) {
final boolean accept = true;
String rejectReason = null;
BrowserService.Util.getInstance().appraisal(objectToSelectedItems(aip), accept, rejectReason,
LocaleInfo.getCurrentLocale().getLocaleName(), new LoadingAsyncCallback<Void>() {
@Override
public void onSuccessImpl(Void result) {
Toast.showInfo(messages.dialogDone(), messages.itemWasAccepted());
callback.onSuccess(ActionImpact.UPDATED);
}
});
}
private void appraisalAccept(final SelectedItems<IndexedAIP> aips, final AsyncCallback<ActionImpact> callback) {
final boolean accept = true;
String rejectReason = null;
BrowserService.Util.getInstance().appraisal(aips, accept, rejectReason,
LocaleInfo.getCurrentLocale().getLocaleName(), new LoadingAsyncCallback<Void>() {
@Override
public void onSuccessImpl(Void result) {
Toast.showInfo(messages.dialogDone(), messages.itemWasAccepted());
callback.onSuccess(ActionImpact.UPDATED);
}
});
}
private void appraisalReject(final IndexedAIP aip, final AsyncCallback<ActionImpact> callback) {
final boolean accept = false;
Dialogs.showPromptDialog(messages.rejectMessage(), messages.rejectQuestion(), null, null, RegExp.compile(".+"),
messages.dialogCancel(), messages.dialogOk(), true, new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
// nothing to do
}
@Override
public void onSuccess(final String rejectReason) {
BrowserService.Util.getInstance().appraisal(objectToSelectedItems(aip), accept, rejectReason,
LocaleInfo.getCurrentLocale().getLocaleName(), new LoadingAsyncCallback<Void>() {
@Override
public void onSuccessImpl(Void result) {
Toast.showInfo(messages.dialogDone(), messages.itemWasRejected());
HistoryUtils.newHistory(IngestAppraisal.RESOLVER);
callback.onSuccess(ActionImpact.DESTROYED);
}
});
}
});
}
private void appraisalReject(final SelectedItems<IndexedAIP> aips, final AsyncCallback<ActionImpact> callback) {
final boolean accept = false;
Dialogs.showPromptDialog(messages.rejectMessage(), messages.rejectQuestion(), null, null, RegExp.compile(".+"),
messages.dialogCancel(), messages.dialogOk(), true, new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
// nothing to do
}
@Override
public void onSuccess(final String rejectReason) {
BrowserService.Util.getInstance().appraisal(aips, accept, rejectReason,
LocaleInfo.getCurrentLocale().getLocaleName(), new LoadingAsyncCallback<Void>() {
@Override
public void onSuccessImpl(Void result) {
Toast.showInfo(messages.dialogDone(), messages.itemWasRejected());
HistoryUtils.newHistory(IngestAppraisal.RESOLVER);
callback.onSuccess(ActionImpact.DESTROYED);
}
});
}
});
}
private void downloadDocumentation(final IndexedAIP aip, final AsyncCallback<ActionImpact> callback) {
BrowserService.Util.getInstance().hasDocumentation(aip.getId(), new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccess(Boolean result) {
if (result) {
SafeUri downloadUri = RestUtils.createAIPPartDownloadUri(aip.getId(),
RodaConstants.STORAGE_DIRECTORY_DOCUMENTATION);
Window.Location.assign(downloadUri.asString());
} else {
Toast.showInfo(messages.downloadNoDocumentationTitle(), messages.downloadNoDocumentationDescription());
}
callback.onSuccess(ActionImpact.NONE);
}
});
}
@Override
public Widget createActionsLayout(IndexedAIP aip, AsyncCallback<ActionImpact> callback) {
FlowPanel layout = createLayout();
// MANAGEMENT
addTitle(layout, messages.intellectualEntity(), aip, AipAction.NEW_CHILD_AIP, AipAction.MOVE_IN_HIERARCHY,
AipAction.UPDATE_PERMISSIONS, AipAction.ADD_REPRESENTATION, AipAction.REMOVE, AipAction.DOWNLOAD);
addButton(layout, messages.newArchivalPackage(), AipAction.NEW_CHILD_AIP, aip, ActionImpact.UPDATED, callback,
"btn-plus");
addButton(layout, messages.moveArchivalPackage(), AipAction.MOVE_IN_HIERARCHY, aip, ActionImpact.UPDATED, callback,
"btn-edit");
addButton(layout, messages.archivalPackagePermissions(), AipAction.UPDATE_PERMISSIONS, aip, ActionImpact.UPDATED,
callback, "btn-edit");
addButton(layout, messages.addRepresentation(), AipAction.ADD_REPRESENTATION, aip, ActionImpact.UPDATED, callback,
"btn-plus");
addButton(layout, messages.removeArchivalPackage(), AipAction.REMOVE, aip, ActionImpact.DESTROYED, callback,
"btn-ban");
addButton(layout, messages.downloadButton(), AipAction.DOWNLOAD, aip, ActionImpact.NONE, callback, "btn-download");
// PRESERVATION
addTitle(layout, messages.preservationTitle(), aip, AipAction.NEW_PROCESS, AipAction.SHOW_EVENTS,
AipAction.SHOW_RISKS, AipAction.SHOW_LOGS);
addButton(layout, messages.newProcessPreservation(), AipAction.NEW_PROCESS, aip, ActionImpact.UPDATED, callback,
"btn-play");
addButton(layout, messages.preservationEvents(), AipAction.SHOW_EVENTS, aip, ActionImpact.NONE, callback,
"btn-clock");
addButton(layout, messages.preservationLogs(), AipAction.SHOW_LOGS, aip, ActionImpact.NONE, callback, "btn-clock");
addButton(layout, messages.preservationRisks(), AipAction.SHOW_RISKS, aip, ActionImpact.NONE, callback,
"btn-exclamation-triangle");
// APPRAISAL
addTitle(layout, messages.appraisalTitle(), aip, AipAction.APPRAISAL_ACCEPT, AipAction.APPRAISAL_REJECT);
addButton(layout, messages.appraisalAccept(), AipAction.APPRAISAL_ACCEPT, aip, ActionImpact.UPDATED, callback,
"btn-play");
addButton(layout, messages.appraisalReject(), AipAction.APPRAISAL_REJECT, aip, ActionImpact.DESTROYED, callback,
"btn-ban");
addButton(layout, messages.downloadDocumentation(), AipAction.DOWNLOAD_DOCUMENTATION, aip, ActionImpact.NONE,
callback, "btn-download");
return layout;
}
@Override
public Widget createActionsLayout(SelectedItems<IndexedAIP> aips, AsyncCallback<ActionImpact> callback) {
FlowPanel layout = createLayout();
// MANAGEMENT
addTitle(layout, messages.intellectualEntity(), aips, AipAction.NEW_CHILD_AIP, AipAction.MOVE_IN_HIERARCHY,
AipAction.UPDATE_PERMISSIONS, AipAction.ADD_REPRESENTATION, AipAction.REMOVE, AipAction.DOWNLOAD);
addButton(layout, messages.moveArchivalPackage(), AipAction.MOVE_IN_HIERARCHY, aips, ActionImpact.UPDATED, callback,
"btn-edit");
addButton(layout, messages.archivalPackagePermissions(), AipAction.UPDATE_PERMISSIONS, aips, ActionImpact.UPDATED,
callback, "btn-edit");
addButton(layout, messages.addRepresentation(), AipAction.ADD_REPRESENTATION, aips, ActionImpact.UPDATED, callback,
"btn-plus");
addButton(layout, messages.removeArchivalPackage(), AipAction.REMOVE, aips, ActionImpact.DESTROYED, callback,
"btn-ban");
addButton(layout, messages.downloadButton(), AipAction.DOWNLOAD, aips, ActionImpact.NONE, callback, "btn-download");
// PRESERVATION
addTitle(layout, messages.preservationTitle(), aips, AipAction.NEW_PROCESS, AipAction.SHOW_EVENTS,
AipAction.SHOW_RISKS, AipAction.SHOW_LOGS);
addButton(layout, messages.newProcessPreservation(), AipAction.NEW_PROCESS, aips, ActionImpact.UPDATED, callback,
"btn-play");
addButton(layout, messages.preservationEvents(), AipAction.SHOW_EVENTS, aips, ActionImpact.NONE, callback,
"btn-clock");
addButton(layout, messages.preservationLogs(), AipAction.SHOW_LOGS, aips, ActionImpact.NONE, callback, "btn-clock");
addButton(layout, messages.preservationRisks(), AipAction.SHOW_RISKS, aips, ActionImpact.NONE, callback,
"btn-exclamation-triangle");
// APPRAISAL
addTitle(layout, messages.appraisalTitle(), aips, AipAction.APPRAISAL_ACCEPT, AipAction.APPRAISAL_REJECT);
addButton(layout, messages.appraisalAccept(), AipAction.APPRAISAL_ACCEPT, aips, ActionImpact.UPDATED, callback,
"btn-play");
addButton(layout, messages.appraisalReject(), AipAction.APPRAISAL_REJECT, aips, ActionImpact.DESTROYED, callback,
"btn-ban");
addButton(layout, messages.downloadDocumentation(), AipAction.DOWNLOAD_DOCUMENTATION, aips, ActionImpact.NONE,
callback, "btn-download");
return layout;
}
}