/**
* 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.RequestNotValidException;
import org.roda.core.data.v2.index.select.SelectedItems;
import org.roda.core.data.v2.ip.IndexedDIP;
import org.roda.wui.client.browse.BrowseAIP;
import org.roda.wui.client.browse.BrowserService;
import org.roda.wui.client.browse.EditPermissions;
import org.roda.wui.client.common.LastSelectedItemsSingleton;
import org.roda.wui.client.common.dialogs.Dialogs;
import org.roda.wui.client.process.CreateSelectedJob;
import org.roda.wui.common.client.tools.HistoryUtils;
import org.roda.wui.common.client.tools.RestUtils;
import com.google.gwt.core.client.GWT;
import com.google.gwt.safehtml.shared.SafeUri;
import com.google.gwt.user.client.History;
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 DisseminationActions extends AbstractActionable<IndexedDIP> {
private static final DisseminationActions INSTANCE = new DisseminationActions();
private static final ClientMessages messages = GWT.create(ClientMessages.class);
private static final Set<DisseminationAction> POSSIBLE_ACTIONS_ON_SINGLE_DISSEMINATION = new HashSet<>(
Arrays.asList(DisseminationAction.values()));
private static final Set<DisseminationAction> POSSIBLE_ACTIONS_ON_MULTIPLE_DISSEMINATIONS = new HashSet<>(
Arrays.asList(DisseminationAction.REMOVE, DisseminationAction.NEW_PROCESS, DisseminationAction.UPDATE_PERMISSIONS));
private DisseminationActions() {
}
public enum DisseminationAction implements Actionable.Action<IndexedDIP> {
DOWNLOAD, REMOVE, NEW_PROCESS, UPDATE_PERMISSIONS;
}
public static DisseminationActions get() {
return INSTANCE;
}
@Override
public boolean canAct(Actionable.Action<IndexedDIP> action, IndexedDIP dip) {
return POSSIBLE_ACTIONS_ON_SINGLE_DISSEMINATION.contains(action);
}
@Override
public boolean canAct(Actionable.Action<IndexedDIP> action, SelectedItems<IndexedDIP> selectedItems) {
return POSSIBLE_ACTIONS_ON_MULTIPLE_DISSEMINATIONS.contains(action);
}
@Override
public void act(Actionable.Action<IndexedDIP> action, IndexedDIP dissemination,
AsyncCallback<ActionImpact> callback) {
if (DisseminationAction.DOWNLOAD.equals(action)) {
download(dissemination, callback);
} else if (DisseminationAction.REMOVE.equals(action)) {
remove(dissemination, callback);
} else if (DisseminationAction.NEW_PROCESS.equals(action)) {
newProcess(dissemination, callback);
} else if (DisseminationAction.UPDATE_PERMISSIONS.equals(action)) {
updatePermissions(dissemination, 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<IndexedDIP> action, SelectedItems<IndexedDIP> selectedItems,
AsyncCallback<ActionImpact> callback) {
if (DisseminationAction.REMOVE.equals(action)) {
remove(selectedItems, callback);
} else if (DisseminationAction.NEW_PROCESS.equals(action)) {
newProcess(selectedItems, callback);
} else if (DisseminationAction.UPDATE_PERMISSIONS.equals(action)) {
updatePermissions(selectedItems, callback);
} else {
callback.onFailure(new RequestNotValidException("Unsupported action in this context: " + action));
}
}
// ACTIONS
private void download(IndexedDIP dissemination, AsyncCallback<ActionImpact> callback) {
SafeUri downloadUri = RestUtils.createDipDownloadUri(dissemination.getUUID());
if (downloadUri != null) {
Window.Location.assign(downloadUri.asString());
}
callback.onSuccess(ActionImpact.NONE);
}
private void remove(IndexedDIP dissemination, AsyncCallback<ActionImpact> callback) {
remove(objectToSelectedItems(dissemination), callback);
}
private void remove(final SelectedItems<IndexedDIP> selectedItems, final AsyncCallback<ActionImpact> callback) {
Dialogs.showConfirmDialog(messages.browseFileDipRepresentationConfirmTitle(),
messages.browseFileDipRepresentationConfirmMessage(), messages.dialogCancel(), messages.dialogYes(),
new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean confirmed) {
if (confirmed) {
BrowserService.Util.getInstance().deleteDIPs(selectedItems, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccess(Void result) {
History.fireCurrentHistoryState();
callback.onSuccess(ActionImpact.DESTROYED);
}
});
}
}
@Override
public void onFailure(Throwable caught) {
// nothing to do
}
});
}
private void newProcess(IndexedDIP dissemination, AsyncCallback<ActionImpact> callback) {
newProcess(objectToSelectedItems(dissemination), callback);
}
private void newProcess(SelectedItems<IndexedDIP> selected, AsyncCallback<ActionImpact> callback) {
LastSelectedItemsSingleton selectedItems = LastSelectedItemsSingleton.getInstance();
selectedItems.setSelectedItems(selected);
selectedItems.setLastHistory(HistoryUtils.getCurrentHistoryPath());
HistoryUtils.newHistory(CreateSelectedJob.RESOLVER, RodaConstants.JOB_PROCESS_ACTION);
callback.onSuccess(ActionImpact.UPDATED);
}
private void updatePermissions(IndexedDIP dip, AsyncCallback<ActionImpact> callback) {
LastSelectedItemsSingleton selectedItems = LastSelectedItemsSingleton.getInstance();
selectedItems.setLastHistory(HistoryUtils.getCurrentHistoryPath());
HistoryUtils.newHistory(BrowseAIP.RESOLVER, EditPermissions.DIP_RESOLVER.getHistoryToken(), dip.getId());
callback.onSuccess(ActionImpact.UPDATED);
}
private void updatePermissions(SelectedItems<IndexedDIP> dips, AsyncCallback<ActionImpact> callback) {
LastSelectedItemsSingleton selectedItems = LastSelectedItemsSingleton.getInstance();
selectedItems.setLastHistory(HistoryUtils.getCurrentHistoryPath());
LastSelectedItemsSingleton.getInstance().setSelectedItems(dips);
HistoryUtils.newHistory(BrowseAIP.RESOLVER, EditPermissions.DIP_RESOLVER.getHistoryToken());
callback.onSuccess(ActionImpact.UPDATED);
}
@Override
public Widget createActionsLayout(IndexedDIP dissemination, AsyncCallback<ActionImpact> callback) {
FlowPanel layout = createLayout();
// MANAGEMENT
addTitle(layout, messages.viewRepresentationFileDisseminationTitle(), dissemination, DisseminationAction.DOWNLOAD,
DisseminationAction.REMOVE);
// DOWNLOAD,REMOVE
addButton(layout, messages.downloadButton(), DisseminationAction.DOWNLOAD, dissemination, ActionImpact.NONE,
callback, "btn-download");
addButton(layout, messages.removeButton(), DisseminationAction.REMOVE, dissemination, ActionImpact.DESTROYED,
callback, "btn-ban");
addButton(layout, messages.disseminationPermissions(), DisseminationAction.UPDATE_PERMISSIONS, dissemination,
ActionImpact.UPDATED, callback, "btn-edit");
// PRESERVATION
addTitle(layout, messages.preservationTitle(), dissemination, DisseminationAction.NEW_PROCESS);
// NEW_PROCESS
addButton(layout, messages.newProcessPreservation(), DisseminationAction.NEW_PROCESS, dissemination,
ActionImpact.UPDATED, callback, "btn-play");
return layout;
}
@Override
public Widget createActionsLayout(SelectedItems<IndexedDIP> disseminations, AsyncCallback<ActionImpact> callback) {
FlowPanel layout = createLayout();
// MANAGEMENT
addTitle(layout, messages.viewRepresentationFileDisseminationTitle(), disseminations, DisseminationAction.DOWNLOAD,
DisseminationAction.REMOVE);
// DOWNLOAD,REMOVE
addButton(layout, messages.downloadButton(), DisseminationAction.DOWNLOAD, disseminations, ActionImpact.NONE,
callback, "btn-download");
addButton(layout, messages.removeButton(), DisseminationAction.REMOVE, disseminations, ActionImpact.DESTROYED,
callback, "btn-ban");
addButton(layout, messages.disseminationPermissions(), DisseminationAction.UPDATE_PERMISSIONS, disseminations,
ActionImpact.UPDATED, callback, "btn-edit");
// PRESERVATION
addTitle(layout, messages.preservationTitle(), disseminations, DisseminationAction.NEW_PROCESS);
// NEW_PROCESS
addButton(layout, messages.newProcessPreservation(), DisseminationAction.NEW_PROCESS, disseminations,
ActionImpact.UPDATED, callback, "btn-play");
return layout;
}
}