/**
* 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.lists;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.v2.index.facet.Facets;
import org.roda.core.data.v2.index.filter.Filter;
import org.roda.core.data.v2.index.sort.Sorter;
import org.roda.core.data.v2.jobs.IndexedReport;
import org.roda.core.data.v2.jobs.PluginInfo;
import org.roda.core.data.v2.jobs.Report.PluginState;
import org.roda.wui.client.common.lists.utils.BasicAsyncTableCell;
import org.roda.wui.client.common.lists.utils.TooltipTextColumn;
import org.roda.wui.client.common.utils.StringUtils;
import com.google.gwt.cell.client.DateCell;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortList;
import com.google.gwt.user.cellview.client.ColumnSortList.ColumnSortInfo;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.ui.Label;
import config.i18n.client.ClientMessages;
/**
*
* @author Luis Faria <lfaria@keep.pt>
*
*/
public class SimpleJobReportList extends BasicAsyncTableCell<IndexedReport> {
private static final ClientMessages messages = GWT.create(ClientMessages.class);
private TooltipTextColumn<IndexedReport> sourceColumn;
private TooltipTextColumn<IndexedReport> outcomeColumn;
private Column<IndexedReport, Date> updatedDateColumn;
private TextColumn<IndexedReport> lastPluginRunColumn;
private Column<IndexedReport, SafeHtml> lastPluginRunStateColumn;
private TextColumn<IndexedReport> completionStatusColumn;
private static final List<String> fieldsToReturn = Arrays.asList(RodaConstants.INDEX_UUID,
RodaConstants.JOB_REPORT_ID, RodaConstants.JOB_REPORT_JOB_ID, RodaConstants.JOB_REPORT_SOURCE_OBJECT_ORIGINAL_IDS,
RodaConstants.JOB_REPORT_SOURCE_OBJECT_ID, RodaConstants.JOB_REPORT_SOURCE_OBJECT_CLASS,
RodaConstants.JOB_REPORT_SOURCE_OBJECT_LABEL, RodaConstants.JOB_REPORT_SOURCE_OBJECT_ORIGINAL_NAME,
RodaConstants.JOB_REPORT_OUTCOME_OBJECT_LABEL, RodaConstants.JOB_REPORT_OUTCOME_OBJECT_ID,
RodaConstants.JOB_REPORT_DATE_UPDATED, RodaConstants.JOB_REPORT_PLUGIN, RodaConstants.JOB_REPORT_PLUGIN_VERSION,
RodaConstants.JOB_REPORT_PLUGIN_STATE, RodaConstants.JOB_REPORT_STEPS_COMPLETED,
RodaConstants.JOB_REPORT_TOTAL_STEPS, RodaConstants.JOB_REPORT_COMPLETION_PERCENTAGE);
private final Map<String, PluginInfo> pluginsInfo;
@SuppressWarnings("unused")
private String sourceClass;
@SuppressWarnings("unused")
private String outcomeClass;
public SimpleJobReportList() {
this(null, null, null, new HashMap<String, PluginInfo>(), false);
}
public SimpleJobReportList(Filter filter, Facets facets, String summary, boolean selectable) {
this(filter, facets, summary, new HashMap<String, PluginInfo>(), selectable);
}
public SimpleJobReportList(Filter filter, Facets facets, String summary, boolean selectable, int pageSize,
int incrementPage) {
this(filter, facets, summary, new HashMap<String, PluginInfo>(), selectable, pageSize, incrementPage);
}
public SimpleJobReportList(Filter filter, Facets facets, String summary, Map<String, PluginInfo> pluginsInfo,
boolean selectable) {
super(IndexedReport.class, filter, facets, summary, selectable, fieldsToReturn);
this.pluginsInfo = pluginsInfo;
}
public SimpleJobReportList(Filter filter, Facets facets, String summary, Map<String, PluginInfo> pluginsInfo,
boolean selectable, int pageSize, int incrementPage) {
super(IndexedReport.class, filter, facets, summary, selectable, pageSize, incrementPage, fieldsToReturn);
this.pluginsInfo = pluginsInfo;
}
@Override
protected void configureDisplay(CellTable<IndexedReport> display) {
sourceColumn = new TooltipTextColumn<IndexedReport>() {
@Override
public String getValue(IndexedReport report) {
String value = "";
if (report != null) {
value = report.getSourceObjectOriginalIds().isEmpty() ? report.getSourceObjectId()
: StringUtils.prettyPrint(report.getSourceObjectOriginalIds());
sourceClass = report.getSourceObjectClass();
}
return value;
}
};
outcomeColumn = new TooltipTextColumn<IndexedReport>() {
@Override
public String getValue(IndexedReport report) {
String value = "";
if (report != null) {
if (StringUtils.isNotBlank(report.getOutcomeObjectLabel())) {
value = report.getOutcomeObjectLabel() + " (" + report.getOutcomeObjectId() + ")";
} else {
value = report.getOutcomeObjectId();
}
}
return value;
}
};
updatedDateColumn = new Column<IndexedReport, Date>(
new DateCell(DateTimeFormat.getFormat(RodaConstants.DEFAULT_DATETIME_FORMAT))) {
@Override
public Date getValue(IndexedReport job) {
return job != null ? job.getDateUpdated() : null;
}
};
lastPluginRunColumn = new TextColumn<IndexedReport>() {
@Override
public String getValue(IndexedReport job) {
String value = null;
if (job != null) {
String jobPlugin = job.getPlugin();
if (jobPlugin != null) {
PluginInfo pluginInfo = pluginsInfo.get(jobPlugin);
String pluginName;
if (pluginInfo != null) {
pluginName = pluginInfo.getName();
} else {
pluginName = jobPlugin;
}
if (StringUtils.isNotBlank(job.getPluginVersion())) {
value = messages.pluginLabelWithVersion(pluginName, job.getPluginVersion());
} else {
value = messages.pluginLabel(pluginName);
}
}
}
return value;
}
};
lastPluginRunStateColumn = new Column<IndexedReport, SafeHtml>(new SafeHtmlCell()) {
@Override
public SafeHtml getValue(IndexedReport report) {
SafeHtml ret = null;
if (report != null) {
switch (report.getPluginState()) {
case SUCCESS:
ret = SafeHtmlUtils.fromSafeConstant(
"<span class='label-success'>" + messages.pluginStateMessage(PluginState.SUCCESS) + "</span>");
break;
case RUNNING:
ret = SafeHtmlUtils.fromSafeConstant(
"<span class='label-default'>" + messages.pluginStateMessage(PluginState.RUNNING) + "</span>");
break;
case FAILURE:
default:
ret = SafeHtmlUtils.fromSafeConstant(
"<span class='label-danger'>" + messages.pluginStateMessage(PluginState.FAILURE) + "</span>");
break;
}
}
return ret;
}
};
completionStatusColumn = new TextColumn<IndexedReport>() {
@Override
public String getValue(IndexedReport report) {
String value = "";
if (report != null) {
value = report.getStepsCompleted() + " " + messages.of() + " " + report.getTotalSteps() + " ("
+ report.getCompletionPercentage() + "%)";
}
return value;
}
};
sourceColumn.setSortable(true);
outcomeColumn.setSortable(true);
updatedDateColumn.setSortable(true);
lastPluginRunColumn.setSortable(true);
lastPluginRunStateColumn.setSortable(true);
completionStatusColumn.setSortable(false);
addColumn(sourceColumn, messages.reportSource(), true, false);
addColumn(outcomeColumn, messages.reportOutcome(), true, false);
addColumn(updatedDateColumn, messages.reportLastUpdatedAt(), true, false, 11);
addColumn(lastPluginRunColumn, messages.reportLastRunTask(), true, false);
addColumn(lastPluginRunStateColumn, messages.reportStatus(), true, false, 8);
addColumn(completionStatusColumn, messages.reportProgress(), true, false, 8);
Label emptyInfo = new Label(messages.noItemsToDisplay());
display.setEmptyTableWidget(emptyInfo);
// default sorting
display.getColumnSortList().push(new ColumnSortInfo(updatedDateColumn, false));
}
@Override
protected Sorter getSorter(ColumnSortList columnSortList) {
Map<Column<IndexedReport, ?>, List<String>> columnSortingKeyMap = new HashMap<>();
columnSortingKeyMap.put(sourceColumn, Arrays.asList(RodaConstants.JOB_REPORT_SOURCE_OBJECT_ID));
columnSortingKeyMap.put(outcomeColumn, Arrays.asList(RodaConstants.JOB_REPORT_OUTCOME_OBJECT_ID));
columnSortingKeyMap.put(updatedDateColumn, Arrays.asList(RodaConstants.JOB_REPORT_DATE_UPDATED));
columnSortingKeyMap.put(lastPluginRunColumn, Arrays.asList(RodaConstants.JOB_REPORT_PLUGIN));
columnSortingKeyMap.put(lastPluginRunStateColumn, Arrays.asList(RodaConstants.JOB_REPORT_PLUGIN_STATE));
return createSorter(columnSortList, columnSortingKeyMap);
}
}