/**
* 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.main;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.roda.core.data.common.RodaConstants;
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.wui.client.browse.BrowseAIP;
import org.roda.wui.client.browse.PreservationEvents;
import org.roda.wui.client.browse.bundle.BrowseFileBundle;
import org.roda.wui.client.browse.bundle.BrowseRepresentationBundle;
import org.roda.wui.client.ingest.transfer.IngestTransfer;
import org.roda.wui.common.client.tools.DescriptionLevelUtils;
import org.roda.wui.common.client.tools.HistoryUtils;
import org.roda.wui.common.client.tools.ListUtils;
import org.roda.wui.common.client.widgets.Toast;
import com.google.gwt.core.client.GWT;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.client.Command;
import config.i18n.client.ClientMessages;
public class BreadcrumbUtils {
private static ClientMessages messages = (ClientMessages) GWT.create(ClientMessages.class);
private BreadcrumbUtils() {
// do nothing
}
private static BreadcrumbItem getBreadcrumbItem(IndexedAIP aip) {
return new BreadcrumbItem(getBreadcrumbLabel(aip), getBreadcrumbTitle(aip), getViewItemHistoryToken(aip.getId()));
}
private static BreadcrumbItem getBreadcrumbItem(IndexedRepresentation representation) {
return new BreadcrumbItem(DescriptionLevelUtils.getRepresentationTypeIcon(representation.getType(), true),
representation.getType(), HistoryUtils.getHistoryBrowse(representation));
}
private static BreadcrumbItem getBreadcrumbItem(IndexedFile file) {
String fileLabel = file.getOriginalName() != null ? file.getOriginalName() : file.getId();
SafeHtml breadcrumbLabel = getBreadcrumbLabel(fileLabel,
file.isDirectory() ? RodaConstants.VIEW_REPRESENTATION_FOLDER : RodaConstants.VIEW_REPRESENTATION_FILE);
return new BreadcrumbItem(breadcrumbLabel, fileLabel, HistoryUtils.getHistoryBrowse(file));
}
public static List<BreadcrumbItem> getAipBreadcrumbs(List<IndexedAIP> aipAncestors, IndexedAIP aip) {
return getAipBreadcrumbs(aipAncestors, aip, false);
}
public static List<BreadcrumbItem> getAipBreadcrumbs(IndexedAIP aip) {
return Arrays.asList(getBreadcrumbItem(aip));
}
public static List<BreadcrumbItem> getAipBreadcrumbs(List<IndexedAIP> aipAncestors, IndexedAIP aip, boolean events) {
List<BreadcrumbItem> breadcrumb = new ArrayList<>();
breadcrumb
.add(new BreadcrumbItem(DescriptionLevelUtils.getTopIconSafeHtml(), "", BrowseAIP.RESOLVER.getHistoryPath()));
if (aipAncestors != null) {
for (IndexedAIP ancestor : aipAncestors) {
if (ancestor != null) {
SafeHtml breadcrumbLabel = getBreadcrumbLabel(ancestor);
String breadcrumbTitle = getBreadcrumbTitle(ancestor);
List<String> historyTokens;
if (events) {
historyTokens = getViewItemEventsHistoryToken(ancestor.getId());
} else {
historyTokens = getViewItemHistoryToken(ancestor.getId());
}
BreadcrumbItem ancestorBreadcrumb = new BreadcrumbItem(breadcrumbLabel, breadcrumbTitle, historyTokens);
breadcrumb.add(1, ancestorBreadcrumb);
} else {
SafeHtml breadcrumbLabel = DescriptionLevelUtils.getElementLevelIconSafeHtml(RodaConstants.AIP_GHOST, false);
BreadcrumbItem unknownAncestorBreadcrumb = new BreadcrumbItem(breadcrumbLabel, "", new Command() {
@Override
public void execute() {
Toast.showError(messages.unknownAncestorError());
}
});
breadcrumb.add(unknownAncestorBreadcrumb);
}
}
}
// AIP
breadcrumb.add(getBreadcrumbItem(aip));
return breadcrumb;
}
public static List<BreadcrumbItem> getRepresentationBreadcrumbs(BrowseRepresentationBundle bundle) {
List<IndexedAIP> aipAncestors = bundle.getAipAncestors();
IndexedAIP aip = bundle.getAip();
IndexedRepresentation representation = bundle.getRepresentation();
return getRepresentationBreadcrumbs(aipAncestors, aip, representation);
}
public static List<BreadcrumbItem> getRepresentationBreadcrumbs(List<IndexedAIP> aipAncestors, IndexedAIP aip,
IndexedRepresentation representation) {
List<BreadcrumbItem> breadcrumb = new ArrayList<>();
breadcrumb
.add(new BreadcrumbItem(DescriptionLevelUtils.getTopIconSafeHtml(), "", BrowseAIP.RESOLVER.getHistoryPath()));
if (aipAncestors != null) {
for (IndexedAIP ancestor : aipAncestors) {
if (ancestor != null) {
SafeHtml breadcrumbLabel = getBreadcrumbLabel(ancestor);
String breadcrumbTitle = getBreadcrumbTitle(ancestor);
BreadcrumbItem ancestorBreadcrumb = new BreadcrumbItem(breadcrumbLabel, breadcrumbTitle,
ListUtils.concat(BrowseAIP.RESOLVER.getHistoryPath(), ancestor.getId()));
breadcrumb.add(1, ancestorBreadcrumb);
} else {
SafeHtml breadcrumbLabel = DescriptionLevelUtils.getElementLevelIconSafeHtml(RodaConstants.AIP_GHOST, false);
BreadcrumbItem unknownAncestorBreadcrumb = new BreadcrumbItem(breadcrumbLabel, "", new Command() {
@Override
public void execute() {
Toast.showError(messages.unknownAncestorError());
}
});
breadcrumb.add(unknownAncestorBreadcrumb);
}
}
}
// AIP
breadcrumb.add(getBreadcrumbItem(aip));
// Representation
breadcrumb.add(getBreadcrumbItem(representation));
return breadcrumb;
}
public static List<BreadcrumbItem> getRepresentationBreadcrumbs(IndexedAIP aip,
IndexedRepresentation representation) {
return Arrays.asList(getBreadcrumbItem(aip), getBreadcrumbItem(representation));
}
public static List<BreadcrumbItem> getFileBreadcrumbs(BrowseFileBundle bundle) {
IndexedAIP aip = bundle.getAip();
IndexedRepresentation representation = bundle.getRepresentation();
IndexedFile file = bundle.getFile();
return getFileBreadcrumbs(aip, representation, file);
}
public static List<BreadcrumbItem> getFileBreadcrumbs(IndexedAIP aip, IndexedRepresentation representation,
IndexedFile file) {
List<BreadcrumbItem> fullBreadcrumb = new ArrayList<>();
List<BreadcrumbItem> fileBreadcrumb = new ArrayList<>();
// AIP
fullBreadcrumb.add(getBreadcrumbItem(aip));
// Representation
fullBreadcrumb.add(getBreadcrumbItem(representation));
if (file != null) {
// File directory path
List<String> filePath = file.getPath();
List<String> fileAncestorsPath = file.getAncestorsPath();
if (filePath != null && fileAncestorsPath != null && filePath.size() == fileAncestorsPath.size()) {
for (int i = 0; i < filePath.size(); i++) {
final String folderName = filePath.get(i);
final String folderUUID = fileAncestorsPath.get(i);
SafeHtml breadcrumbLabel = getBreadcrumbLabel(folderName, RodaConstants.VIEW_REPRESENTATION_FOLDER);
fileBreadcrumb.add(new BreadcrumbItem(breadcrumbLabel, folderName, new Command() {
@Override
public void execute() {
HistoryUtils.resolve(IndexedFile.class.getName(), folderUUID);
}
}));
}
}
// File item
fileBreadcrumb.add(getBreadcrumbItem(file));
}
fullBreadcrumb.addAll(fileBreadcrumb);
return fullBreadcrumb;
}
public static List<BreadcrumbItem> getTransferredResourceBreadcrumbs(TransferredResource r) {
List<BreadcrumbItem> ret = new ArrayList<>();
ret.add(
new BreadcrumbItem(DescriptionLevelUtils.getTopIconSafeHtml(), "", IngestTransfer.RESOLVER.getHistoryPath()));
if (r != null) {
// add parent
if (r.getParentUUID() != null) {
List<String> path = new ArrayList<>();
path.addAll(IngestTransfer.RESOLVER.getHistoryPath());
path.add(r.getParentUUID());
SafeHtml breadcrumbLabel = SafeHtmlUtils.fromString(r.getParentId());
ret.add(new BreadcrumbItem(breadcrumbLabel, r.getParentId(), path));
}
// add self
List<String> path = new ArrayList<>();
path.addAll(IngestTransfer.RESOLVER.getHistoryPath());
path.add(r.getUUID());
SafeHtml breadcrumbLabel = SafeHtmlUtils.fromString(r.getName());
ret.add(new BreadcrumbItem(breadcrumbLabel, r.getName(), path));
}
return ret;
}
public static List<BreadcrumbItem> getDipBreadcrumbs(IndexedDIP dip, DIPFile dipFile,
List<DIPFile> dipFileAncestors) {
List<BreadcrumbItem> ret = new ArrayList<>();
// DIP
ret.add(getBreadcrumbItem(dip));
if (dipFile != null) {
// DIP File ancestors
if (dipFileAncestors != null) {
for (DIPFile dipFileAncestor : dipFileAncestors) {
ret.add(getBreadcrumbItem(dipFileAncestor));
}
}
// DIP File
ret.add(getBreadcrumbItem(dipFile));
}
return ret;
}
private static BreadcrumbItem getBreadcrumbItem(final IndexedDIP dip) {
SafeHtmlBuilder b = new SafeHtmlBuilder();
// TODO get icon from config
b.append(SafeHtmlUtils.fromSafeConstant("<i class='fa fa-play-circle-o'></i>"));
b.append(SafeHtmlUtils.fromString(dip.getTitle()));
SafeHtml label = b.toSafeHtml();
return new BreadcrumbItem(label, dip.getTitle(), new Command() {
@Override
public void execute() {
HistoryUtils.openBrowse(dip);
}
});
}
private static BreadcrumbItem getBreadcrumbItem(final DIPFile dipFile) {
SafeHtmlBuilder b = new SafeHtmlBuilder();
// TODO get icon from config
b.append(SafeHtmlUtils.fromSafeConstant("<i class='fa fa-play-circle'></i>"));
b.append(SafeHtmlUtils.fromString(dipFile.getId()));
SafeHtml label = b.toSafeHtml();
return new BreadcrumbItem(label, dipFile.getId(), new Command() {
@Override
public void execute() {
HistoryUtils.openBrowse(dipFile);
}
});
}
private static SafeHtml getBreadcrumbLabel(String label, String level) {
SafeHtml elementLevelIconSafeHtml = DescriptionLevelUtils.getElementLevelIconSafeHtml(level, false);
SafeHtmlBuilder builder = new SafeHtmlBuilder();
builder.append(elementLevelIconSafeHtml).append(SafeHtmlUtils.fromString(label));
return builder.toSafeHtml();
}
private static SafeHtml getBreadcrumbLabel(IndexedAIP aip) {
SafeHtml breadcrumbLabel;
SafeHtml elementLevelIconSafeHtml;
if (aip.getGhost()) {
elementLevelIconSafeHtml = DescriptionLevelUtils.getElementLevelIconSafeHtml(RodaConstants.AIP_GHOST, true);
SafeHtmlBuilder builder = new SafeHtmlBuilder();
builder.append(elementLevelIconSafeHtml);
breadcrumbLabel = builder.toSafeHtml();
} else {
elementLevelIconSafeHtml = DescriptionLevelUtils.getElementLevelIconSafeHtml(aip.getLevel(), false);
SafeHtmlBuilder builder = new SafeHtmlBuilder();
String label = aip.getTitle() != null ? aip.getTitle() : aip.getId();
builder.append(elementLevelIconSafeHtml).append(SafeHtmlUtils.fromString(label));
breadcrumbLabel = builder.toSafeHtml();
}
return breadcrumbLabel;
}
private static String getBreadcrumbTitle(IndexedAIP aip) {
String title;
if (aip.getGhost()) {
title = "";
} else {
title = aip.getTitle() != null ? aip.getTitle() : aip.getId();
}
return title;
}
private static final List<String> getViewItemEventsHistoryToken(String id) {
return ListUtils.concat(BrowseAIP.RESOLVER.getHistoryPath(), PreservationEvents.BROWSE_RESOLVER.getHistoryToken(),
id);
}
private static final List<String> getViewItemHistoryToken(String id) {
return ListUtils.concat(BrowseAIP.RESOLVER.getHistoryPath(), id);
}
}