/** * 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.ArrayList; 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.Job; 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.HtmlSnippetUtils; import org.roda.wui.common.client.tools.Humanize; import org.roda.wui.common.client.tools.Humanize.DHMSFormat; 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.SafeHtmlBuilder; 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 config.i18n.client.ClientMessages; /** * * @author Luis Faria <lfaria@keep.pt> * */ public class JobList extends BasicAsyncTableCell<Job> { private static final ClientMessages messages = GWT.create(ClientMessages.class); private TooltipTextColumn<Job> nameColumn; private TextColumn<Job> usernameColumn; private Column<Job, Date> startDateColumn; private TextColumn<Job> durationColumn; private Column<Job, SafeHtml> statusColumn; private TextColumn<Job> progressColumn; private TextColumn<Job> objectsTotalCountColumn; private Column<Job, SafeHtml> objectsSuccessCountColumn; private Column<Job, SafeHtml> objectsFailureCountColumn; private static final List<String> fieldsToReturn = new ArrayList<>(); public JobList() { this(null, null, null, false); } public JobList(Filter filter, Facets facets, String summary, boolean selectable) { super(Job.class, filter, true, facets, summary, selectable, fieldsToReturn); } public JobList(Filter filter, Facets facets, String summary, boolean selectable, int pageSize, int incrementPage) { super(Job.class, filter, true, facets, summary, selectable, pageSize, incrementPage, fieldsToReturn); } @Override protected void configureDisplay(CellTable<Job> display) { nameColumn = new TooltipTextColumn<Job>() { @Override public String getValue(Job job) { return job != null ? job.getName() : null; } }; usernameColumn = new TextColumn<Job>() { @Override public String getValue(Job job) { return job != null ? job.getUsername() : null; } }; startDateColumn = new Column<Job, Date>( new DateCell(DateTimeFormat.getFormat(RodaConstants.DEFAULT_DATETIME_FORMAT))) { @Override public Date getValue(Job job) { return job != null ? job.getStartDate() : null; } }; durationColumn = new TextColumn<Job>() { @Override public String getValue(Job job) { if (job == null) { return null; } Date end = job.getEndDate() != null ? job.getEndDate() : getDate(); return Humanize.durationInDHMS(job.getStartDate(), end, DHMSFormat.SHORT); } }; statusColumn = new Column<Job, SafeHtml>(new SafeHtmlCell()) { @Override public SafeHtml getValue(Job job) { return HtmlSnippetUtils.getJobStateHtml(job); } }; objectsTotalCountColumn = new TextColumn<Job>() { @Override public String getValue(Job job) { String ret = ""; if (job != null && job.getJobStats().getSourceObjectsCount() > 0) { ret = Integer.toString(job.getJobStats().getSourceObjectsCount()); } return ret; } }; objectsSuccessCountColumn = new Column<Job, SafeHtml>(new SafeHtmlCell()) { @Override public SafeHtml getValue(Job job) { SafeHtmlBuilder b = new SafeHtmlBuilder(); if (job != null) { b.append( job.getJobStats().getSourceObjectsProcessedWithSuccess() > 0 ? SafeHtmlUtils.fromSafeConstant("<span>") : SafeHtmlUtils.fromSafeConstant("<span class='ingest-process-counter-0'>")); b.append(job.getJobStats().getSourceObjectsProcessedWithSuccess()); b.append(SafeHtmlUtils.fromSafeConstant("</span>")); } return b.toSafeHtml(); } }; objectsFailureCountColumn = new Column<Job, SafeHtml>(new SafeHtmlCell()) { @Override public SafeHtml getValue(Job job) { SafeHtmlBuilder b = new SafeHtmlBuilder(); if (job != null) { b.append(SafeHtmlUtils.fromSafeConstant("<span")); if (job.getJobStats().getSourceObjectsProcessedWithFailure() > 0) { b.append(SafeHtmlUtils.fromSafeConstant(" class='ingest-process-failed-column'")); } else { b.append(SafeHtmlUtils.fromSafeConstant(" class='ingest-process-counter-0'")); } b.append(SafeHtmlUtils.fromSafeConstant(">")); b.append(job.getJobStats().getSourceObjectsProcessedWithFailure()); b.append(SafeHtmlUtils.fromSafeConstant("</span>")); } return b.toSafeHtml(); } }; progressColumn = new TextColumn<Job>() { @Override public String getValue(Job job) { return job != null ? job.getJobStats().getCompletionPercentage() + "%" : null; } }; nameColumn.setSortable(true); usernameColumn.setSortable(true); startDateColumn.setSortable(true); statusColumn.setSortable(true); objectsTotalCountColumn.setSortable(true); objectsSuccessCountColumn.setSortable(true); objectsFailureCountColumn.setSortable(true); progressColumn.setSortable(true); addColumn(nameColumn, messages.jobName(), true, false); addColumn(usernameColumn, messages.jobCreator(), true, false); addColumn(startDateColumn, messages.jobStartDate(), true, false, 11); addColumn(durationColumn, messages.jobDuration(), true, true, 6); addColumn(statusColumn, messages.jobStatus(), true, false, 7); addColumn(progressColumn, messages.jobProgress(), true, true, 5); addColumn(objectsTotalCountColumn, messages.jobTotalCountMessage(), true, true, 5); addColumn(objectsSuccessCountColumn, messages.jobSuccessCountMessage(), true, true, 6); addColumn(objectsFailureCountColumn, messages.jobFailureCountMessage(), true, true, 5); // default sorting display.getColumnSortList().push(new ColumnSortInfo(startDateColumn, false)); } @Override protected Sorter getSorter(ColumnSortList columnSortList) { Map<Column<Job, ?>, List<String>> columnSortingKeyMap = new HashMap<>(); columnSortingKeyMap.put(nameColumn, Arrays.asList(RodaConstants.JOB_NAME)); columnSortingKeyMap.put(startDateColumn, Arrays.asList(RodaConstants.JOB_START_DATE)); columnSortingKeyMap.put(statusColumn, Arrays.asList(RodaConstants.JOB_STATE)); columnSortingKeyMap.put(progressColumn, Arrays.asList(RodaConstants.JOB_COMPLETION_PERCENTAGE)); columnSortingKeyMap.put(objectsTotalCountColumn, Arrays.asList(RodaConstants.JOB_SOURCE_OBJECTS_COUNT)); columnSortingKeyMap.put(objectsSuccessCountColumn, Arrays.asList(RodaConstants.JOB_SOURCE_OBJECTS_PROCESSED_WITH_SUCCESS)); columnSortingKeyMap.put(objectsFailureCountColumn, Arrays.asList(RodaConstants.JOB_SOURCE_OBJECTS_PROCESSED_WITH_FAILURE)); columnSortingKeyMap.put(usernameColumn, Arrays.asList(RodaConstants.JOB_USERNAME)); return createSorter(columnSortList, columnSortingKeyMap); } }