/** * 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.common.client.tools; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.roda.core.data.v2.formats.Format; import org.roda.core.data.v2.index.IsIndexed; import org.roda.core.data.v2.ip.DIPFile; import org.roda.core.data.v2.ip.IndexedAIP; import org.roda.core.data.v2.ip.IndexedDIP; import org.roda.core.data.v2.ip.IndexedFile; import org.roda.core.data.v2.ip.IndexedRepresentation; import org.roda.core.data.v2.ip.TransferredResource; import org.roda.core.data.v2.jobs.IndexedReport; import org.roda.core.data.v2.jobs.Job; import org.roda.core.data.v2.notifications.Notification; import org.roda.core.data.v2.risks.IndexedRisk; import org.roda.core.data.v2.risks.RiskIncidence; import org.roda.wui.client.browse.BrowseAIP; import org.roda.wui.client.browse.BrowseDIP; import org.roda.wui.client.browse.BrowseFile; import org.roda.wui.client.browse.BrowseRepresentation; import org.roda.wui.client.browse.BrowserService; import org.roda.wui.client.common.utils.AsyncCallbackUtils; import org.roda.wui.client.ingest.process.ShowJob; import org.roda.wui.client.ingest.process.ShowJobReport; import org.roda.wui.client.ingest.transfer.IngestTransfer; import org.roda.wui.client.ingest.transfer.TransferUpload; import org.roda.wui.client.management.ShowNotification; import org.roda.wui.client.planning.ShowFormat; import org.roda.wui.client.planning.ShowRisk; import org.roda.wui.client.planning.ShowRiskIncidence; import org.roda.wui.common.client.HistoryResolver; import org.roda.wui.common.client.widgets.Toast; import com.google.gwt.http.client.URL; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Widget; /** * Useful methods * * @author Luis Faria */ public class HistoryUtils { private HistoryUtils() { } public static final String HISTORY_SEP = "/"; public static final String HISTORY_SEP_REGEX = "/"; public static final String HISTORY_SEP_ESCAPE = "%2F"; public static final String HISTORY_PERMISSION_SEP = "."; public static <T> List<T> tail(List<T> list) { return list.subList(1, list.size()); } public static <T> List<T> removeLast(List<T> list) { return list.subList(0, list.size() - 1); } /** * Split history string to history path using HISTORY_SEP as the separator * * @param history * @return the history path */ public static List<String> splitHistory(String history) { List<String> historyPath; if (history.indexOf(HISTORY_SEP) == -1) { historyPath = Arrays.asList(history); } else { historyPath = Arrays.asList(history.split(HISTORY_SEP_REGEX)); } return historyPath; } public static List<String> decodeList(List<String> splitted) { List<String> tokens = new ArrayList<>(); for (String item : splitted) { tokens.add(URL.decodeQueryString(item)); } return tokens; } public static List<String> getCurrentHistoryPath() { String hash = Window.Location.getHash(); if (hash.length() > 0) { hash = hash.substring(1); } return decodeList(Arrays.asList(hash.split(HISTORY_SEP_REGEX))); } public static String createHistoryToken(List<String> tokens) { StringBuilder builder = new StringBuilder(); boolean first = true; for (String token : tokens) { if (first) { first = false; } else { builder.append(HISTORY_SEP); } String encodedToken = URL.encodeQueryString(token).replaceAll(HISTORY_SEP_REGEX, HISTORY_SEP_ESCAPE); builder.append(encodedToken); } return builder.toString(); } public static void newHistory(List<String> path) { String hash = createHistoryToken(path); Window.Location.assign("#" + hash); } public static void replaceHistory(List<String> path) { String hash = createHistoryToken(path); Window.Location.replace("#" + hash); } public static void newHistory(HistoryResolver resolver) { newHistory(resolver.getHistoryPath()); } public static void newHistory(HistoryResolver resolver, String... extrapath) { List<String> path = ListUtils.concat(resolver.getHistoryPath(), extrapath); newHistory(path); } public static void newHistory(HistoryResolver resolver, List<String> extrapath) { List<String> path = ListUtils.concat(resolver.getHistoryPath(), extrapath); newHistory(path); } public static String createHistoryHashLink(List<String> path) { String hash = createHistoryToken(path); return "#" + hash; } public static String createHistoryHashLink(HistoryResolver resolver, String... extrapath) { List<String> path = ListUtils.concat(resolver.getHistoryPath(), extrapath); return createHistoryHashLink(path); } public static String createHistoryHashLink(HistoryResolver resolver, List<String> extrapath) { List<String> path = ListUtils.concat(resolver.getHistoryPath(), extrapath); return createHistoryHashLink(path); } public static List<String> getHistoryBrowse(String aipId) { List<String> history = new ArrayList<>(); history.addAll(BrowseAIP.RESOLVER.getHistoryPath()); history.add(aipId); return history; } public static List<String> getHistoryBrowseDIP(String dipId) { List<String> history = new ArrayList<>(); history.addAll(BrowseAIP.RESOLVER.getHistoryPath()); history.add(BrowseDIP.RESOLVER.getHistoryToken()); history.add(dipId); return history; } public static List<String> getHistoryBrowseDIPFile(String dipId, String dipFileUUID) { List<String> history = new ArrayList<>(); history.addAll(BrowseAIP.RESOLVER.getHistoryPath()); history.add(BrowseDIP.RESOLVER.getHistoryToken()); history.add(dipId); history.add(dipFileUUID); return history; } public static List<String> getHistoryBrowse(DIPFile dipFile) { return getHistoryBrowseDIPFile(dipFile.getDipId(), dipFile.getUUID()); } public static void openBrowse(IndexedDIP dip) { HistoryUtils.newHistory(getHistoryBrowseDIP(dip.getId())); } public static void openBrowse(DIPFile dipFile) { HistoryUtils.newHistory(getHistoryBrowseDIPFile(dipFile.getDipId(), dipFile.getUUID())); } public static void openBrowseDIP(String dipId) { HistoryUtils.newHistory(getHistoryBrowseDIP(dipId)); } public static void openBrowse(String aipId) { HistoryUtils.newHistory(getHistoryBrowse(aipId)); } public static void openBrowse(IndexedAIP aip) { openBrowse(aip.getId()); } public static List<String> getHistoryBrowse(String aipId, String representationId) { List<String> history = new ArrayList<>(); history.addAll(BrowseAIP.RESOLVER.getHistoryPath()); history.add(BrowseRepresentation.RESOLVER.getHistoryToken()); history.add(aipId); history.add(representationId); return history; } public static List<String> getHistoryBrowse(IndexedRepresentation representation) { return getHistoryBrowse(representation.getAipId(), representation.getId()); } public static void openBrowse(String aipId, String representationId) { HistoryUtils.newHistory(getHistoryBrowse(aipId, representationId)); } public static void openBrowse(IndexedRepresentation representation) { openBrowse(representation.getAipId(), representation.getId()); } public static List<String> getHistoryBrowse(String aipId, String representationId, List<String> filePath, String fileId) { List<String> history = new ArrayList<>(); history.addAll(BrowseAIP.RESOLVER.getHistoryPath()); history.add(BrowseFile.RESOLVER.getHistoryToken()); history.add(aipId); history.add(representationId); history.addAll(filePath); history.add(fileId); return history; } public static List<String> getHistoryBrowse(IndexedFile file) { return getHistoryBrowse(file.getAipId(), file.getRepresentationId(), file.getPath(), file.getId()); } public static void openBrowse(String aipId, String representationId, List<String> filePath, String fileId) { HistoryUtils.newHistory(getHistoryBrowse(aipId, representationId, filePath, fileId)); } public static void openBrowse(IndexedFile file) { openBrowse(file.getAipId(), file.getRepresentationId(), file.getPath(), file.getId()); } public static List<String> getHistoryUpload(IndexedFile folder) { List<String> history = new ArrayList<>(); history.addAll(BrowseAIP.RESOLVER.getHistoryPath()); history.add(TransferUpload.BROWSE_RESOLVER.getHistoryToken()); history.add(folder.getAipId()); history.add(folder.getRepresentationId()); history.addAll(folder.getPath()); history.add(folder.getId()); return history; } public static void openUpload(IndexedRepresentation representation) { HistoryUtils.newHistory(getHistoryUpload(representation)); } public static List<String> getHistoryUpload(IndexedRepresentation representation) { List<String> history = new ArrayList<>(); history.addAll(BrowseAIP.RESOLVER.getHistoryPath()); history.add(TransferUpload.BROWSE_RESOLVER.getHistoryToken()); history.add(representation.getAipId()); history.add(representation.getId()); return history; } public static void openUpload(IndexedFile folder) { if (folder.isDirectory()) { HistoryUtils.newHistory(getHistoryUpload(folder)); } } public static List<String> getHistory(List<String> resolverPath, String resourceUUID) { List<String> history = new ArrayList<>(); history.addAll(resolverPath); history.add(resourceUUID); return history; } public static void resolve(final String objectClass, final String objectUUID) { resolve(objectClass, objectUUID, false); } public static <T extends IsIndexed> void resolve(final String objectClass, final String objectUUID, final boolean replace) { BrowserService.Util.getInstance().retrieveFromModel(objectClass, objectUUID, new AsyncCallback<T>() { @Override public void onFailure(Throwable caught) { AsyncCallbackUtils.defaultFailureTreatment(caught); } @Override public void onSuccess(T object) { resolve(object, replace); } }); } public static <T extends IsIndexed> void resolve(T object) { resolve(object, false); } public static <T extends IsIndexed> void resolve(T object, boolean replace) { List<String> path = null; if (object instanceof IndexedAIP) { IndexedAIP aip = (IndexedAIP) object; path = HistoryUtils.getHistoryBrowse(aip.getId()); } else if (object instanceof IndexedRepresentation) { IndexedRepresentation representation = (IndexedRepresentation) object; path = HistoryUtils.getHistoryBrowse(representation); } else if (object instanceof IndexedFile) { IndexedFile file = (IndexedFile) object; path = HistoryUtils.getHistoryBrowse(file); } else if (object instanceof IndexedDIP) { IndexedDIP dip = (IndexedDIP) object; path = HistoryUtils.getHistoryBrowseDIP(dip.getId()); } else if (object instanceof DIPFile) { DIPFile dipFile = (DIPFile) object; path = HistoryUtils.getHistoryBrowseDIPFile(dipFile.getDipId(), dipFile.getUUID()); } else if (object instanceof TransferredResource) { TransferredResource resource = (TransferredResource) object; path = HistoryUtils.getHistory(IngestTransfer.RESOLVER.getHistoryPath(), resource.getUUID()); } else if (object instanceof IndexedRisk) { IndexedRisk risk = (IndexedRisk) object; path = HistoryUtils.getHistory(ShowRisk.RESOLVER.getHistoryPath(), risk.getUUID()); } else if (object instanceof Format) { Format format = (Format) object; path = HistoryUtils.getHistory(ShowFormat.RESOLVER.getHistoryPath(), format.getUUID()); } else if (object instanceof Notification) { Notification notification = (Notification) object; path = HistoryUtils.getHistory(ShowNotification.RESOLVER.getHistoryPath(), notification.getUUID()); } else if (object instanceof RiskIncidence) { RiskIncidence incidence = (RiskIncidence) object; path = HistoryUtils.getHistory(ShowRiskIncidence.RESOLVER.getHistoryPath(), incidence.getUUID()); } else if (object instanceof Job) { Job job = (Job) object; path = HistoryUtils.getHistory(ShowJob.RESOLVER.getHistoryPath(), job.getUUID()); } else if (object instanceof IndexedReport) { IndexedReport report = (IndexedReport) object; path = HistoryUtils.getHistory(ShowJobReport.RESOLVER.getHistoryPath(), report.getUUID()); } else { Toast.showError("Resolve of class not supported: " + object.getClass().getName()); } if (path != null) { if (replace) { HistoryUtils.replaceHistory(path); } else { HistoryUtils.newHistory(path); } } } public static final HistoryResolver UUID_RESOLVER = new HistoryResolver() { @Override public void resolve(List<String> historyTokens, AsyncCallback<Widget> callback) { if (historyTokens.size() == 2) { String objectClass = historyTokens.get(0); String objectUUID = historyTokens.get(1); HistoryUtils.resolve(objectClass, objectUUID, true); } callback.onSuccess(null); } @Override public void isCurrentUserPermitted(AsyncCallback<Boolean> callback) { callback.onSuccess(true); } @Override public String getHistoryToken() { return "uuid"; } @Override public List<String> getHistoryPath() { return new ArrayList<>(); } }; public static List<String> getHistoryUuidResolver(String objectClass, String objectUUID) { return Arrays.asList(UUID_RESOLVER.getHistoryToken(), objectClass, objectUUID); } }