/**
* 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.browse;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.exceptions.NotFoundException;
import org.roda.core.data.v2.common.Pair;
import org.roda.core.data.v2.index.facet.Facets;
import org.roda.core.data.v2.index.facet.SimpleFacetParameter;
import org.roda.core.data.v2.index.filter.EmptyKeyFilterParameter;
import org.roda.core.data.v2.index.filter.Filter;
import org.roda.core.data.v2.index.filter.SimpleFilterParameter;
import org.roda.core.data.v2.ip.AIPState;
import org.roda.core.data.v2.ip.IndexedAIP;
import org.roda.wui.client.browse.bundle.BrowseAIPBundle;
import org.roda.wui.client.browse.bundle.DescriptiveMetadataViewBundle;
import org.roda.wui.client.common.LastSelectedItemsSingleton;
import org.roda.wui.client.common.UserLogin;
import org.roda.wui.client.common.actions.Actionable;
import org.roda.wui.client.common.actions.AipActions;
import org.roda.wui.client.common.actions.DisseminationActions;
import org.roda.wui.client.common.actions.RepresentationActions;
import org.roda.wui.client.common.lists.AIPList;
import org.roda.wui.client.common.lists.DIPList;
import org.roda.wui.client.common.lists.RepresentationList;
import org.roda.wui.client.common.lists.pagination.ListSelectionUtils;
import org.roda.wui.client.common.search.SearchPanel;
import org.roda.wui.client.common.utils.AsyncCallbackUtils;
import org.roda.wui.client.common.utils.HtmlSnippetUtils;
import org.roda.wui.client.common.utils.JavascriptUtils;
import org.roda.wui.client.common.utils.StringUtils;
import org.roda.wui.client.ingest.process.ShowJobReport;
import org.roda.wui.client.ingest.transfer.TransferUpload;
import org.roda.wui.client.main.BreadcrumbItem;
import org.roda.wui.client.main.BreadcrumbPanel;
import org.roda.wui.client.main.BreadcrumbUtils;
import org.roda.wui.client.search.Search;
import org.roda.wui.client.welcome.Welcome;
import org.roda.wui.common.client.HistoryResolver;
import org.roda.wui.common.client.tools.DescriptionLevelUtils;
import org.roda.wui.common.client.tools.FacetUtils;
import org.roda.wui.common.client.tools.HistoryUtils;
import org.roda.wui.common.client.tools.ListUtils;
import org.roda.wui.common.client.tools.RestErrorOverlayType;
import org.roda.wui.common.client.tools.RestUtils;
import org.roda.wui.common.client.widgets.HTMLWidgetWrapper;
import org.roda.wui.common.client.widgets.Toast;
import org.roda.wui.common.client.widgets.wcag.WCAGUtilities;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsonUtils;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.i18n.client.LocaleInfo;
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.safehtml.shared.SafeUri;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.InlineHTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.Widget;
import config.i18n.client.ClientMessages;
/**
* @author Luis Faria
*
*/
public class BrowseAIP extends Composite {
private static final String BROWSE_TOP_CSS = "browse_top";
private static final String BROWSE_AIP_CSS = "browse_aip";
public static final HistoryResolver RESOLVER = new HistoryResolver() {
@Override
public void resolve(List<String> historyTokens, AsyncCallback<Widget> callback) {
getInstance().resolve(historyTokens, callback);
}
@Override
public void isCurrentUserPermitted(AsyncCallback<Boolean> callback) {
UserLogin.getInstance().checkRole(this, callback);
}
@Override
public String getHistoryToken() {
return "browse";
}
@Override
public List<String> getHistoryPath() {
return Arrays.asList(getHistoryToken());
}
};
interface MyUiBinder extends UiBinder<Widget, BrowseAIP> {
}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private static BrowseAIP instance = null;
private static final Filter COLLECTIONS_FILTER = new Filter(new EmptyKeyFilterParameter(RodaConstants.AIP_PARENT_ID));
private static Facets facets = new Facets(new SimpleFacetParameter(RodaConstants.AIP_LEVEL),
new SimpleFacetParameter(RodaConstants.AIP_HAS_REPRESENTATIONS));
private static ClientMessages messages = (ClientMessages) GWT.create(ClientMessages.class);
private static final List<String> aipFieldsToReturn = new ArrayList<>(
Arrays.asList(RodaConstants.INDEX_UUID, RodaConstants.AIP_STATE, RodaConstants.AIP_TITLE, RodaConstants.AIP_LEVEL,
RodaConstants.INGEST_SIP_IDS, RodaConstants.INGEST_JOB_ID, RodaConstants.INGEST_UPDATE_JOB_IDS));
private String aipId;
// Focus
@UiField
FocusPanel keyboardFocus;
// HEADER
@UiField
Label browseTitle;
@UiField
FlowPanel browseDescription;
@UiField
BreadcrumbPanel breadcrumb;
@UiField
SimplePanel itemIcon;
// STATUS
@UiField
HTML aipState;
// IDENTIFICATION
@UiField
Label browseItemHeader, itemTitle, itemId, sipId;
@UiField
FlowPanel ingestJobId, ingestUpdateJobIds;
// DESCRIPTIVE METADATA
@UiField
TabPanel descriptiveMetadata;
@UiField
Button newDescriptiveMetadata;
// REPRESENTATIONS
@UiField
Label representationsTitle;
@UiField(provided = true)
SearchPanel representationsSearch;
@UiField(provided = true)
RepresentationList representationsList;
// DISSEMINATIONS
@UiField
Label disseminationsTitle;
@UiField(provided = true)
SearchPanel disseminationsSearch;
@UiField(provided = true)
DIPList disseminationsList;
// AIP CHILDREN
@UiField
Label aipChildrenTitle;
@UiField(provided = true)
SearchPanel aipChildrenSearch;
@UiField(provided = true)
AIPList aipChildrenList;
// SIDEBAR
@UiField
SimplePanel actionsSidebar;
@UiField
FlowPanel searchSection;
@UiField
Button searchPrevious, searchNext, searchContext;
@UiField
Button searchAIP;
@UiField
FlowPanel itemsFacets;
@UiField(provided = true)
FlowPanel facetDescriptionLevels;
@UiField(provided = true)
FlowPanel facetHasRepresentations;
private List<HandlerRegistration> handlers;
boolean justActive = true;
private BrowseAIP() {
handlers = new ArrayList<>();
boolean selectable = true;
// REPRESENTATIONS
representationsList = new RepresentationList(Filter.NULL, justActive, Facets.NONE, messages.listOfRepresentations(),
true);
ListSelectionUtils.bindBrowseOpener(representationsList);
representationsSearch = new SearchPanel(Filter.NULL, RodaConstants.REPRESENTATION_SEARCH, true,
messages.searchPlaceHolder(), false, false, true);
representationsSearch.setList(representationsList);
// DISSEMINATIONS
disseminationsList = new DIPList(Filter.NULL, Facets.NONE, messages.listOfDisseminations(), true);
disseminationsList.setActionable(DisseminationActions.get());
ListSelectionUtils.bindBrowseOpener(disseminationsList);
disseminationsSearch = new SearchPanel(Filter.NULL, RodaConstants.DIP_SEARCH, true, messages.searchPlaceHolder(),
false, false, true);
disseminationsSearch.setList(disseminationsList);
// AIP CHILDREN
aipChildrenList = new AIPList(Filter.NULL, justActive, facets, messages.listOfAIPs(), selectable);
ListSelectionUtils.bindBrowseOpener(aipChildrenList);
aipChildrenSearch = new SearchPanel(COLLECTIONS_FILTER, RodaConstants.AIP_SEARCH, true,
messages.searchPlaceHolder(), false, false, true);
aipChildrenSearch.setList(aipChildrenList);
facetDescriptionLevels = new FlowPanel();
facetHasRepresentations = new FlowPanel();
Map<String, FlowPanel> facetPanels = new HashMap<>();
facetPanels.put(RodaConstants.AIP_LEVEL, facetDescriptionLevels);
facetPanels.put(RodaConstants.AIP_HAS_REPRESENTATIONS, facetHasRepresentations);
FacetUtils.bindFacets(aipChildrenList, facetPanels);
// INIT
initWidget(uiBinder.createAndBindUi(this));
// HEADER
browseDescription.add(new HTMLWidgetWrapper("BrowseDescription.html"));
// CSS
this.addStyleName("browse");
}
/**
* Get the singleton instance
*
* @return the instance
*/
public static BrowseAIP getInstance() {
if (instance == null) {
instance = new BrowseAIP();
}
return instance;
}
@Override
protected void onLoad() {
super.onLoad();
JavascriptUtils.stickSidebar();
}
public void resolve(List<String> historyTokens, AsyncCallback<Widget> callback) {
clear();
if (historyTokens.isEmpty()) {
viewAction();
callback.onSuccess(this);
} else if (historyTokens.size() == 1
&& !historyTokens.get(0).equals(EditPermissions.AIP_RESOLVER.getHistoryToken())) {
viewAction(historyTokens.get(0));
callback.onSuccess(this);
} else if (historyTokens.size() > 1
&& historyTokens.get(0).equals(EditDescriptiveMetadata.RESOLVER.getHistoryToken())) {
EditDescriptiveMetadata.RESOLVER.resolve(HistoryUtils.tail(historyTokens), callback);
} else if (historyTokens.size() > 1
&& historyTokens.get(0).equals(CreateDescriptiveMetadata.RESOLVER.getHistoryToken())) {
CreateDescriptiveMetadata.RESOLVER.resolve(HistoryUtils.tail(historyTokens), callback);
} else if (historyTokens.size() > 1 && historyTokens.get(0).equals(BrowseFile.RESOLVER.getHistoryToken())) {
BrowseFile.RESOLVER.resolve(HistoryUtils.tail(historyTokens), callback);
} else if (historyTokens.size() > 1 && historyTokens.get(0).equals(BrowseDIP.RESOLVER.getHistoryToken())) {
BrowseDIP.RESOLVER.resolve(HistoryUtils.tail(historyTokens), callback);
} else if (historyTokens.size() > 1
&& historyTokens.get(0).equals(PreservationEvents.BROWSE_RESOLVER.getHistoryToken())) {
PreservationEvents.BROWSE_RESOLVER.resolve(HistoryUtils.tail(historyTokens), callback);
} else if (historyTokens.size() > 1
&& historyTokens.get(0).equals(DescriptiveMetadataHistory.RESOLVER.getHistoryToken())) {
DescriptiveMetadataHistory.RESOLVER.resolve(HistoryUtils.tail(historyTokens), callback);
} else if (!historyTokens.isEmpty()
&& historyTokens.get(0).equals(EditPermissions.AIP_RESOLVER.getHistoryToken())) {
EditPermissions.AIP_RESOLVER.resolve(HistoryUtils.tail(historyTokens), callback);
} else if (!historyTokens.isEmpty()
&& historyTokens.get(0).equals(EditPermissions.DIP_RESOLVER.getHistoryToken())) {
EditPermissions.DIP_RESOLVER.resolve(HistoryUtils.tail(historyTokens), callback);
} else if (historyTokens.size() > 1
&& historyTokens.get(0).equals(BrowseRepresentation.RESOLVER.getHistoryToken())) {
BrowseRepresentation.RESOLVER.resolve(HistoryUtils.tail(historyTokens), callback);
} else if (!historyTokens.isEmpty()
&& historyTokens.get(0).equals(TransferUpload.BROWSE_RESOLVER.getHistoryToken())) {
TransferUpload.BROWSE_RESOLVER.resolve(HistoryUtils.tail(historyTokens), callback);
} else {
HistoryUtils.newHistory(RESOLVER);
callback.onSuccess(null);
}
}
/**
* Call the view action by the history token
*
* @param id
* the pid of the object to view. if pid is null, then the base state
* will be called
*/
public void view(final String id) {
boolean historyUpdated = updateHistory(id);
if (!historyUpdated) {
viewAction(id);
}
}
protected void viewAction(final String id) {
if (id == null) {
viewAction();
} else {
aipId = id;
BrowserService.Util.getInstance().retrieveBrowseAIPBundle(id, LocaleInfo.getCurrentLocale().getLocaleName(),
aipFieldsToReturn, new AsyncCallback<BrowseAIPBundle>() {
@Override
public void onFailure(Throwable caught) {
if (!AsyncCallbackUtils.treatCommonFailures(caught, Welcome.RESOLVER.getHistoryPath())) {
showError(id, caught);
}
}
@Override
public void onSuccess(BrowseAIPBundle bundle) {
viewAction(bundle);
}
});
}
}
private void clear() {
removeStyleName(BROWSE_TOP_CSS);
removeStyleName(BROWSE_AIP_CSS);
justActive = true;
browseItemHeader.setVisible(false);
browseTitle.setVisible(false);
browseDescription.setVisible(false);
HTMLPanel itemIconHtmlPanel = DescriptionLevelUtils.getTopIconHTMLPanel();
itemIconHtmlPanel.addStyleName("browseItemIcon-all");
itemIcon.setWidget(itemIconHtmlPanel);
itemTitle.setText(messages.browseLoading());
itemTitle.removeStyleName("browseTitle-allCollections");
itemIcon.getParent().removeStyleName("browseTitle-allCollections-wrapper");
itemId.setText("");
itemId.removeStyleName("browseItemId");
sipId.setText("");
sipId.removeStyleName("browseSipId");
ingestJobId.clear();
ingestJobId.removeStyleName("browseIngestJobId");
ingestUpdateJobIds.clear();
ingestUpdateJobIds.removeStyleName("browseIngestJobId");
breadcrumb.setVisible(false);
descriptiveMetadata.setVisible(false);
descriptiveMetadata.clear();
removeHandlerRegistrations();
newDescriptiveMetadata.setVisible(false);
// Representations list
representationsTitle.setVisible(false);
representationsSearch.setVisible(false);
representationsSearch.clearSearchInputBox();
representationsList.setVisible(false);
representationsList.getParent().setVisible(false);
// Disseminations list
disseminationsTitle.setVisible(false);
disseminationsSearch.setVisible(false);
disseminationsSearch.clearSearchInputBox();
disseminationsList.setVisible(false);
disseminationsList.getParent().setVisible(false);
// AIP children list
aipChildrenTitle.setVisible(false);
aipChildrenSearch.setVisible(false);
aipChildrenSearch.clearSearchInputBox();
aipChildrenList.setVisible(false);
aipChildrenList.getParent().setVisible(false);
actionsSidebar.setVisible(false);
searchSection.setVisible(false);
// Set button visibility
for (AIPState state : AIPState.values()) {
this.removeStyleName(state.toString().toLowerCase());
}
facets = new Facets(new SimpleFacetParameter(RodaConstants.AIP_LEVEL),
new SimpleFacetParameter(RodaConstants.AIP_HAS_REPRESENTATIONS));
}
protected void showError(String id, Throwable caught) {
breadcrumb.updatePath(new ArrayList<BreadcrumbItem>());
HTMLPanel itemIconHtmlPanel = DescriptionLevelUtils.getElementLevelIconHTMLPanel(null);
itemIconHtmlPanel.addStyleName("browseItemIcon-other");
itemIcon.setWidget(itemIconHtmlPanel);
itemTitle.setText(id);
SafeHtml title;
SafeHtml message;
if (caught instanceof NotFoundException) {
title = messages.notFoundErrorTitle();
message = messages.notFoundErrorMessage(aipId);
} else {
title = messages.genericErrorTitle();
message = messages.genericErrorMessage(caught.getMessage());
}
HTML messageHTML = new HTML(message);
messageHTML.addStyleName("error");
descriptiveMetadata.add(messageHTML, title.asString(), true);
descriptiveMetadata.selectTab(0);
descriptiveMetadata.setVisible(true);
WCAGUtilities.getInstance().makeAccessible(descriptiveMetadata.getElement());
}
protected void viewAction(BrowseAIPBundle bundle) {
if (bundle != null) {
addStyleName(BROWSE_AIP_CSS);
Element firstElement = this.getElement().getFirstChildElement();
if ("input".equalsIgnoreCase(firstElement.getTagName())) {
firstElement.setAttribute("title", "browse input");
}
IndexedAIP aip = bundle.getAip();
AIPState state = aip.getState();
this.justActive = AIPState.ACTIVE.equals(state);
// STATUS
for (AIPState s : AIPState.values()) {
this.removeStyleName(s.toString().toLowerCase());
}
this.addStyleName(state.toString().toLowerCase());
aipState.setHTML(HtmlSnippetUtils.getAIPStateHTML(state));
aipState.setVisible(!justActive);
// IDENTIFICATION
updateSectionIdentification(bundle);
// DESCRIPTIVE METADATA
updateSectionDescriptiveMetadata(bundle);
// REPRESENTATIONS
if (bundle.getRepresentationCount() > 0) {
Filter filter = new Filter(new SimpleFilterParameter(RodaConstants.REPRESENTATION_AIP_ID, aip.getId()));
representationsSearch.setDefaultFilter(filter, true);
representationsSearch.clearSearchInputBox();
representationsList.set(filter, justActive, Facets.NONE);
representationsList.setActionable(RepresentationActions.get(aipId));
}
representationsTitle.setVisible(bundle.getRepresentationCount() > 0);
representationsSearch.setVisible(bundle.getRepresentationCount() > 0);
representationsList.setVisible(bundle.getRepresentationCount() > 0);
representationsList.getParent().setVisible(bundle.getRepresentationCount() > 0);
// DISSEMINATIONS
if (bundle.getDipCount() > 0) {
Filter filter = new Filter(new SimpleFilterParameter(RodaConstants.DIP_AIP_UUIDS, aip.getId()));
disseminationsSearch.setDefaultFilter(filter, true);
disseminationsSearch.clearSearchInputBox();
disseminationsList.set(filter, justActive, Facets.NONE);
}
disseminationsTitle.setVisible(bundle.getDipCount() > 0);
disseminationsSearch.setVisible(bundle.getDipCount() > 0);
disseminationsList.setVisible(bundle.getDipCount() > 0);
disseminationsList.getParent().setVisible(bundle.getDipCount() > 0);
// AIP CHILDREN
if (bundle.getChildAIPCount() > 0) {
Filter filter = new Filter(new SimpleFilterParameter(RodaConstants.AIP_PARENT_ID, aip.getId()));
aipChildrenSearch.setDefaultFilter(filter, true);
aipChildrenSearch.clearSearchInputBox();
aipChildrenList.set(filter, justActive, facets);
LastSelectedItemsSingleton.getInstance().setSelectedJustActive(justActive);
aipChildrenList.setActionable(AipActions.get(aip.getId(), aip.getState()));
}
aipChildrenTitle.setVisible(bundle.getChildAIPCount() > 0);
aipChildrenSearch.setVisible(bundle.getChildAIPCount() > 0);
aipChildrenList.setVisible(bundle.getChildAIPCount() > 0);
aipChildrenList.getParent().setVisible(bundle.getChildAIPCount() > 0);
// SIDEBAR
itemsFacets.setVisible(false);
actionsSidebar.setVisible(true);
actionsSidebar.setWidget(AipActions.get().createActionsLayout(aip, new AsyncCallback<Actionable.ActionImpact>() {
@Override
public void onFailure(Throwable caught) {
AsyncCallbackUtils.defaultFailureTreatment(caught);
}
@Override
public void onSuccess(Actionable.ActionImpact impact) {
if (Actionable.ActionImpact.UPDATED.equals(impact)) {
// reload
clear();
viewAction(aipId);
}
}
}));
// Set button visibility
keyboardFocus.setFocus(true);
ListSelectionUtils.bindLayout(aip, searchPrevious, searchNext, keyboardFocus, true, false, false, searchSection);
} else {
viewAction();
}
}
private void updateSectionDescriptiveMetadata(BrowseAIPBundle bundle) {
final List<Pair<String, HTML>> descriptiveMetadataContainers = new ArrayList<>();
final Map<String, DescriptiveMetadataViewBundle> bundles = new HashMap<>();
List<DescriptiveMetadataViewBundle> descMetadata = bundle.getDescriptiveMetadata();
if (descMetadata != null) {
for (DescriptiveMetadataViewBundle descMetadatum : descMetadata) {
String title = descMetadatum.getLabel() != null ? descMetadatum.getLabel() : descMetadatum.getId();
HTML container = new HTML();
container.addStyleName("metadataContent");
descriptiveMetadata.add(container, title);
descriptiveMetadataContainers.add(Pair.of(descMetadatum.getId(), container));
bundles.put(descMetadatum.getId(), descMetadatum);
}
}
HandlerRegistration tabHandler = descriptiveMetadata.addSelectionHandler(new SelectionHandler<Integer>() {
@Override
public void onSelection(SelectionEvent<Integer> event) {
if (event.getSelectedItem() < descriptiveMetadataContainers.size()) {
Pair<String, HTML> pair = descriptiveMetadataContainers.get(event.getSelectedItem());
String descId = pair.getFirst();
final HTML html = pair.getSecond();
final DescriptiveMetadataViewBundle descBundle = bundles.get(descId);
if (html.getText().length() == 0) {
getDescriptiveMetadataHTML(aipId, descId, descBundle, new AsyncCallback<SafeHtml>() {
@Override
public void onFailure(Throwable caught) {
if (!AsyncCallbackUtils.treatCommonFailures(caught)) {
Toast.showError(messages.errorLoadingDescriptiveMetadata(caught.getMessage()));
}
}
@Override
public void onSuccess(SafeHtml result) {
html.setHTML(result);
}
});
}
}
}
});
final int addTabIndex = descriptiveMetadata.getWidgetCount();
FlowPanel addTab = new FlowPanel();
addTab.add(new HTML(SafeHtmlUtils.fromSafeConstant("<i class=\"fa fa-plus-circle\"></i>")));
descriptiveMetadata.add(new Label(), addTab);
HandlerRegistration addTabHandler = descriptiveMetadata.addSelectionHandler(new SelectionHandler<Integer>() {
@Override
public void onSelection(SelectionEvent<Integer> event) {
if (event.getSelectedItem() == addTabIndex) {
newDescriptiveMetadataRedirect();
}
}
});
addTab.addStyleName("addTab");
addTab.getParent().addStyleName("addTabWrapper");
handlers.add(tabHandler);
handlers.add(addTabHandler);
if (descMetadata != null && !descMetadata.isEmpty()) {
descriptiveMetadata.setVisible(true);
descriptiveMetadata.selectTab(0);
} else {
newDescriptiveMetadata.setVisible(true);
}
WCAGUtilities.getInstance().makeAccessible(descriptiveMetadata.getElement());
}
private void updateSectionIdentification(BrowseAIPBundle bundle) {
IndexedAIP aip = bundle.getAip();
browseItemHeader.setVisible(true);
breadcrumb.updatePath(BreadcrumbUtils.getAipBreadcrumbs(bundle.getAIPAncestors(), aip));
breadcrumb.setVisible(true);
HTMLPanel itemIconHtmlPanel = DescriptionLevelUtils.getElementLevelIconHTMLPanel(aip.getLevel());
itemIconHtmlPanel.addStyleName("browseItemIcon-other");
itemIcon.setWidget(itemIconHtmlPanel);
itemTitle.setText(aip.getTitle() != null ? aip.getTitle() : aip.getId());
itemTitle.removeStyleName("browseTitle-allCollections");
itemIcon.getParent().removeStyleName("browseTitle-allCollections-wrapper");
itemId.setText(messages.itemIdMin(aip.getId()));
itemId.addStyleName("browseItemId");
if (!aip.getIngestSIPIds().isEmpty()) {
sipId.setText(messages.sipIdMin(StringUtils.prettyPrint(aip.getIngestSIPIds())));
sipId.addStyleName("browseSipId");
}
if (StringUtils.isNotBlank(aip.getIngestJobId())) {
final IndexedAIP ingestedAIP = aip;
InlineHTML html = new InlineHTML();
html.setText(messages.processId());
Anchor anchor = new Anchor();
anchor.setText(aip.getIngestJobId());
anchor.setHref(HistoryUtils.createHistoryHashLink(ShowJobReport.RESOLVER,
ingestedAIP.getIngestJobId() + '-' + ingestedAIP.getId()));
ingestJobId.add(html);
ingestJobId.add(anchor);
ingestJobId.addStyleName("browseIngestJobId");
}
if (!aip.getIngestUpdateJobIds().isEmpty()) {
final String id = aip.getId();
InlineHTML html = new InlineHTML();
html.setText(messages.updateProcessId());
ingestUpdateJobIds.add(html);
ingestUpdateJobIds.addStyleName("browseIngestJobId");
Iterator<String> jobIterator = aip.getIngestUpdateJobIds().iterator();
while (jobIterator.hasNext()) {
String updateJobId = jobIterator.next();
Anchor anchor = new Anchor();
anchor.setText(updateJobId);
anchor.setHref(HistoryUtils.createHistoryHashLink(ShowJobReport.RESOLVER, updateJobId + '-' + id));
ingestUpdateJobIds.add(anchor);
if (jobIterator.hasNext()) {
ingestUpdateJobIds.add(new InlineHTML(", "));
}
}
}
}
protected void viewAction() {
aipId = null;
browseTitle.setVisible(true);
browseDescription.setVisible(true);
addStyleName(BROWSE_TOP_CSS);
Element firstElement = this.getElement().getFirstChildElement();
if ("input".equalsIgnoreCase(firstElement.getTagName())) {
firstElement.setAttribute("title", "browse input");
}
breadcrumb.updatePath(
Arrays.asList(new BreadcrumbItem(DescriptionLevelUtils.getTopIconSafeHtml(), "", RESOLVER.getHistoryPath())));
HTMLPanel topIcon = DescriptionLevelUtils.getTopIconHTMLPanel();
topIcon.addStyleName("browseItemIcon-all");
itemIcon.setWidget(topIcon);
itemTitle.setText(messages.allCollectionsTitle());
itemTitle.addStyleName("browseTitle-allCollections");
itemIcon.getParent().addStyleName("browseTitle-allCollections-wrapper");
aipChildrenSearch.setDefaultFilter(COLLECTIONS_FILTER, true);
aipChildrenList.set(COLLECTIONS_FILTER, justActive, facets);
LastSelectedItemsSingleton.getInstance().setSelectedJustActive(justActive);
aipChildrenList.setActionable(AipActions.get());
aipChildrenSearch.setVisible(true);
aipChildrenList.setVisible(true);
aipChildrenList.getParent().setVisible(true);
actionsSidebar.setVisible(true);
actionsSidebar.setWidget(
AipActions.get().createActionsLayout(AipActions.NO_AIP_OBJECT, new AsyncCallback<Actionable.ActionImpact>() {
@Override
public void onFailure(Throwable caught) {
AsyncCallbackUtils.defaultFailureTreatment(caught);
}
@Override
public void onSuccess(Actionable.ActionImpact impact) {
if (Actionable.ActionImpact.UPDATED.equals(impact)) {
// reload
clear();
viewAction(aipId);
}
}
}));
// Set button visibility
searchSection.setVisible(false);
itemsFacets.setVisible(true);
this.removeStyleName("inactive");
aipState.setVisible(false);
WCAGUtilities.getInstance().makeAccessible(descriptiveMetadata.getElement());
}
private void removeHandlerRegistrations() {
for (HandlerRegistration handlerRegistration : handlers) {
handlerRegistration.removeHandler();
}
handlers.clear();
}
private void getDescriptiveMetadataHTML(final String aipId, final String descId,
final DescriptiveMetadataViewBundle bundle, final AsyncCallback<SafeHtml> callback) {
SafeUri uri = RestUtils.createDescriptiveMetadataHTMLUri(aipId, descId);
RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, uri.asString());
requestBuilder.setHeader("Authorization", "Custom");
try {
requestBuilder.sendRequest(null, new RequestCallback() {
@Override
public void onResponseReceived(Request request, Response response) {
String escapedDescId = SafeHtmlUtils.htmlEscape(descId);
if (200 == response.getStatusCode()) {
String html = response.getText();
SafeHtmlBuilder b = new SafeHtmlBuilder();
b.append(SafeHtmlUtils.fromSafeConstant("<div class='descriptiveMetadataLinks'>"));
if (bundle.hasHistory()) {
// History link
String historyLink = HistoryUtils.createHistoryHashLink(DescriptiveMetadataHistory.RESOLVER, aipId,
escapedDescId);
String historyLinkHtml = "<a href='" + historyLink
+ "' class='toolbarLink'><i class='fa fa-history'></i></a>";
b.append(SafeHtmlUtils.fromSafeConstant(historyLinkHtml));
}
// Edit link
String editLink = HistoryUtils.createHistoryHashLink(EditDescriptiveMetadata.RESOLVER, aipId,
escapedDescId);
String editLinkHtml = "<a href='" + editLink + "' class='toolbarLink'><i class='fa fa-edit'></i></a>";
b.append(SafeHtmlUtils.fromSafeConstant(editLinkHtml));
// Download link
SafeUri downloadUri = RestUtils.createDescriptiveMetadataDownloadUri(aipId, escapedDescId);
String downloadLinkHtml = "<a href='" + downloadUri.asString()
+ "' class='toolbarLink'><i class='fa fa-download'></i></a>";
b.append(SafeHtmlUtils.fromSafeConstant(downloadLinkHtml));
b.append(SafeHtmlUtils.fromSafeConstant("</div>"));
b.append(SafeHtmlUtils.fromSafeConstant("<div class='descriptiveMetadataHTML'>"));
b.append(SafeHtmlUtils.fromTrustedString(html));
b.append(SafeHtmlUtils.fromSafeConstant("</div>"));
SafeHtml safeHtml = b.toSafeHtml();
callback.onSuccess(safeHtml);
} else {
String text = response.getText();
String message;
try {
RestErrorOverlayType error = (RestErrorOverlayType) JsonUtils.safeEval(text);
message = error.getMessage();
} catch (IllegalArgumentException e) {
message = text;
}
SafeHtmlBuilder b = new SafeHtmlBuilder();
b.append(SafeHtmlUtils.fromSafeConstant("<div class='descriptiveMetadataLinks'>"));
if (bundle.hasHistory()) {
// History link
String historyLink = HistoryUtils.createHistoryHashLink(DescriptiveMetadataHistory.RESOLVER, aipId,
escapedDescId);
String historyLinkHtml = "<a href='" + historyLink
+ "' class='toolbarLink'><i class='fa fa-history'></i></a>";
b.append(SafeHtmlUtils.fromSafeConstant(historyLinkHtml));
}
// Edit link
String editLink = HistoryUtils.createHistoryHashLink(EditDescriptiveMetadata.RESOLVER, aipId,
escapedDescId);
String editLinkHtml = "<a href='" + editLink + "' class='toolbarLink'><i class='fa fa-edit'></i></a>";
b.append(SafeHtmlUtils.fromSafeConstant(editLinkHtml));
b.append(SafeHtmlUtils.fromSafeConstant("</div>"));
// error message
b.append(SafeHtmlUtils.fromSafeConstant("<div class='error'>"));
b.append(messages.descriptiveMetadataTransformToHTMLError());
b.append(SafeHtmlUtils.fromSafeConstant("<pre><code>"));
b.append(SafeHtmlUtils.fromString(message));
b.append(SafeHtmlUtils.fromSafeConstant("</core></pre>"));
b.append(SafeHtmlUtils.fromSafeConstant("</div>"));
callback.onSuccess(b.toSafeHtml());
}
}
@Override
public void onError(Request request, Throwable exception) {
callback.onFailure(exception);
}
});
} catch (RequestException e) {
callback.onFailure(e);
}
}
private boolean updateHistory(String id) {
boolean historyUpdated;
List<String> path;
if (id == null) {
path = RESOLVER.getHistoryPath();
} else {
path = ListUtils.concat(BrowseAIP.RESOLVER.getHistoryPath(), id);
}
if (path.equals(HistoryUtils.getCurrentHistoryPath())) {
historyUpdated = false;
} else {
HistoryUtils.newHistory(path);
historyUpdated = true;
}
return historyUpdated;
}
@UiHandler("newDescriptiveMetadata")
void buttonNewDescriptiveMetadataHandler(ClickEvent e) {
newDescriptiveMetadataRedirect();
}
private void newDescriptiveMetadataRedirect() {
if (aipId != null) {
HistoryUtils.newHistory(RESOLVER, CreateDescriptiveMetadata.RESOLVER.getHistoryToken(),
RodaConstants.RODA_OBJECT_AIP, aipId);
}
}
@UiHandler("searchContext")
void searchContextHandler(ClickEvent e) {
HistoryUtils.newHistory(Search.RESOLVER, RodaConstants.SEARCH_ITEMS, RodaConstants.AIP_ANCESTORS, aipId);
}
@UiHandler("searchAIP")
void searchAIPHandler(ClickEvent e) {
HistoryUtils.newHistory(Search.RESOLVER, RodaConstants.SEARCH_REPRESENTATIONS, RodaConstants.REPRESENTATION_AIP_ID,
aipId);
}
}