/**
* 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.ingest.process;
import java.util.ArrayList;
import java.util.List;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.v2.jobs.IndexedReport;
import org.roda.core.data.v2.jobs.Report;
import org.roda.wui.client.browse.BrowserService;
import org.roda.wui.client.common.UserLogin;
import org.roda.wui.client.common.lists.pagination.ListSelectionUtils;
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.process.IngestProcess;
import org.roda.wui.common.client.HistoryResolver;
import org.roda.wui.common.client.tools.HistoryUtils;
import org.roda.wui.common.client.tools.Humanize;
import org.roda.wui.common.client.tools.Humanize.DHMSFormat;
import org.roda.wui.common.client.tools.ListUtils;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
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.Label;
import com.google.gwt.user.client.ui.Widget;
import config.i18n.client.ClientMessages;
/**
* @author Luis Faria
*
*/
public class ShowJobReport extends Composite {
public static final HistoryResolver RESOLVER = new HistoryResolver() {
@Override
public void resolve(List<String> historyTokens, final AsyncCallback<Widget> callback) {
if (historyTokens.size() == 1) {
String jobReportId = historyTokens.get(0);
BrowserService.Util.getInstance().retrieve(IndexedReport.class.getName(), jobReportId, fieldsToReturn,
new AsyncCallback<IndexedReport>() {
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccess(IndexedReport jobReport) {
ShowJobReport showJob = new ShowJobReport(jobReport);
callback.onSuccess(showJob);
JavascriptUtils.scrollToHeader();
}
});
} else {
HistoryUtils.newHistory(IngestProcess.RESOLVER);
callback.onSuccess(null);
}
}
@Override
public void isCurrentUserPermitted(AsyncCallback<Boolean> callback) {
// TODO check for show job permission
UserLogin.getInstance().checkRoles(new HistoryResolver[] {IngestProcess.RESOLVER}, false, callback);
}
@Override
public List<String> getHistoryPath() {
return ListUtils.concat(ShowJob.RESOLVER.getHistoryPath(), getHistoryToken());
}
@Override
public String getHistoryToken() {
return "report";
}
};
interface MyUiBinder extends UiBinder<Widget, ShowJobReport> {
}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private static final ClientMessages messages = GWT.create(ClientMessages.class);
// empty to get all report information
private static final List<String> fieldsToReturn = new ArrayList<>();
private final IndexedReport jobReport;
@UiField
Anchor job;
@UiField
Label outcomeObjectLabel;
@UiField
Anchor outcomeObject;
@UiField
HTML outcomeObjectState;
@UiField
Label sourceObjectLabel;
@UiField
Anchor sourceObject;
@UiField
Label dateCreated;
@UiField
Label dateUpdated;
@UiField
Label duration;
@UiField
HTML status;
// FIXME 20160606 hsilva: added jobStateDetails
@UiField
Label progress;
@UiField
FlowPanel reportAttributes;
@UiField
FlowPanel reportItems;
@UiField
Button searchPrevious, searchNext, buttonBack;
@UiField
FocusPanel keyboardFocus;
public ShowJobReport(IndexedReport jobReport) {
this.jobReport = jobReport;
initWidget(uiBinder.createAndBindUi(this));
job.setText(jobReport.getJobName());
job.setHref(HistoryUtils.createHistoryHashLink(ShowJob.RESOLVER, jobReport.getJobId()));
outcomeObjectState.setVisible(false);
boolean hasSource = !jobReport.getSourceObjectOriginalIds().isEmpty() || !jobReport.getSourceObjectId().isEmpty();
if (hasSource) {
String idText = !jobReport.getSourceObjectOriginalIds().isEmpty()
? " (" + StringUtils.prettyPrint(jobReport.getSourceObjectOriginalIds()) + ")" : "";
if (StringUtils.isNotBlank(jobReport.getSourceObjectOriginalName())) {
sourceObject.setText(jobReport.getSourceObjectOriginalName() + idText);
} else if (StringUtils.isNotBlank(jobReport.getSourceObjectLabel())) {
sourceObject.setText(jobReport.getSourceObjectLabel() + idText);
} else if (StringUtils.isNotBlank(jobReport.getSourceObjectId())) {
sourceObject.setText(jobReport.getSourceObjectId() + idText);
} else {
hasSource = false;
}
// sourceObject.setTitle(jobReport.getSourceObjectOriginalName());
sourceObject.setHref(HistoryUtils.createHistoryHashLink(
HistoryUtils.getHistoryUuidResolver(jobReport.getSourceObjectClass(), jobReport.getSourceObjectId())));
sourceObjectLabel.setText(messages.jobReportSource(jobReport.getSourceObjectClass()));
}
sourceObjectLabel.setVisible(hasSource);
sourceObject.setVisible(hasSource);
boolean hasOutcome = StringUtils.isNotBlank(jobReport.getOutcomeObjectId())
&& !jobReport.getOutcomeObjectId().equals(jobReport.getSourceObjectId());
if (hasOutcome) {
if (jobReport.getOutcomeObjectLabel() != null) {
outcomeObject.setText(jobReport.getOutcomeObjectLabel());
} else if (jobReport.getOutcomeObjectId() != null) {
outcomeObject.setText(jobReport.getOutcomeObjectId());
} else {
hasOutcome = false;
}
// outcomeObject.setTitle(jobReport.getSourceObjectOriginalName());
outcomeObject.setHref(HistoryUtils.createHistoryHashLink(
HistoryUtils.getHistoryUuidResolver(jobReport.getOutcomeObjectClass(), jobReport.getOutcomeObjectId())));
outcomeObjectLabel.setText(messages.jobReportOutcome(jobReport.getOutcomeObjectClass()));
outcomeObjectState.setHTML(HtmlSnippetUtils.getAIPStateHTML(jobReport.getOutcomeObjectState()));
}
outcomeObject.setVisible(hasOutcome);
outcomeObjectState.setVisible(hasOutcome);
outcomeObjectLabel.setVisible(hasOutcome);
DateTimeFormat dateTimeFormat = DateTimeFormat.getFormat(RodaConstants.DEFAULT_DATETIME_FORMAT);
dateCreated.setText(dateTimeFormat.format(jobReport.getDateCreated()));
dateUpdated.setText(dateTimeFormat.format(jobReport.getDateUpdated()));
duration.setText(Humanize.durationInDHMS(jobReport.getDateCreated(), jobReport.getDateUpdated(), DHMSFormat.LONG));
status.setHTML(HtmlSnippetUtils.getPluginStateHTML(jobReport.getPluginState()));
progress.setText(messages.showJobReportProgress(jobReport.getCompletionPercentage(), jobReport.getStepsCompleted(),
jobReport.getTotalSteps()));
ListSelectionUtils.bindLayout(jobReport, searchPrevious, searchNext, keyboardFocus, true, false, false);
for (Report reportItem : jobReport.getReports()) {
FlowPanel panel = new FlowPanel();
panel.setStyleName("panel");
panel.addStyleName("panel-counter");
reportItems.add(panel);
FlowPanel panelHeading = new FlowPanel();
panelHeading.setStyleName("panel-heading");
Label panelTitle = new Label(reportItem.getTitle());
panelTitle.setStyleName("panel-title");
panelHeading.add(panelTitle);
panel.add(panelHeading);
FlowPanel panelBody = new FlowPanel();
panelBody.addStyleName("panel-body");
panel.add(panelBody);
Label attributeLabel = new Label(messages.reportAgent());
attributeLabel.setStyleName("label");
panelBody.add(attributeLabel);
String text;
if (StringUtils.isNotBlank(reportItem.getPluginVersion())) {
text = messages.pluginLabelWithVersion(reportItem.getPlugin(), reportItem.getPluginVersion());
} else {
text = messages.pluginLabel(reportItem.getPlugin());
}
Label attributeValue = new Label(text);
attributeValue.setStyleName("value");
panelBody.add(attributeValue);
attributeLabel = new Label(messages.reportStartDatetime());
attributeLabel.setStyleName("label");
panelBody.add(attributeLabel);
attributeValue = new Label(dateTimeFormat.format(reportItem.getDateCreated()));
attributeValue.setStyleName("value");
panelBody.add(attributeValue);
attributeLabel = new Label(messages.reportEndDatetime());
attributeLabel.setStyleName("label");
panelBody.add(attributeLabel);
attributeValue = new Label(dateTimeFormat.format(reportItem.getDateUpdated()));
attributeValue.setStyleName("value");
panelBody.add(attributeValue);
attributeLabel = new Label(messages.reportOutcome());
attributeLabel.setStyleName("label");
panelBody.add(attributeLabel);
HTML outcomeHTML = new HTML(HtmlSnippetUtils.getPluginStateHTML(reportItem.getPluginState()));
panelBody.add(outcomeHTML);
if (reportItem.getPluginDetails() != null && !"".equals(reportItem.getPluginDetails())) {
attributeLabel = new Label(messages.reportOutcomeDetails());
attributeLabel.setStyleName("label");
panelBody.add(attributeLabel);
if (reportItem.isHtmlPluginDetails()) {
attributeValue = new HTML(SafeHtmlUtils.fromTrustedString(reportItem.getPluginDetails()));
} else {
attributeValue = new Label(reportItem.getPluginDetails());
}
attributeValue.addStyleName("code-pre");
panelBody.add(attributeValue);
}
}
Element firstElement = this.getElement().getFirstChildElement();
if ("input".equalsIgnoreCase(firstElement.getTagName())) {
firstElement.removeFromParent();
}
}
@Override
protected void onLoad() {
super.onLoad();
JavascriptUtils.stickSidebar();
}
@UiHandler("buttonBack")
void buttonCancelHandler(ClickEvent e) {
cancel();
}
private void cancel() {
HistoryUtils.newHistory(ShowJob.RESOLVER, jobReport.getJobId());
}
}