org.unitime.timetable.gwt.client.admin.TaskExecutionsTable.java Source code

Java tutorial

Introduction

Here is the source code for org.unitime.timetable.gwt.client.admin.TaskExecutionsTable.java

Source

/*
 * Licensed to The Apereo Foundation under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for
 * additional information regarding copyright ownership.
 *
 * The Apereo Foundation licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
*/
package org.unitime.timetable.gwt.client.admin;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import org.unitime.timetable.gwt.client.widgets.P;
import org.unitime.timetable.gwt.client.widgets.ServerDateTimeFormat;
import org.unitime.timetable.gwt.client.widgets.UniTimeTable;
import org.unitime.timetable.gwt.client.widgets.UniTimeTableHeader;
import org.unitime.timetable.gwt.client.widgets.UniTimeTableHeader.HasColumnName;
import org.unitime.timetable.gwt.client.widgets.UniTimeTableHeader.Operation;
import org.unitime.timetable.gwt.resources.GwtConstants;
import org.unitime.timetable.gwt.resources.GwtMessages;
import org.unitime.timetable.gwt.shared.TaskInterface.TaskExecutionInterface;
import org.unitime.timetable.gwt.shared.TaskInterface.TaskOptionsInterface;

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.TakesValue;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant;

/**
 * @author Tomas Muller
 */
public class TaskExecutionsTable extends UniTimeTable<TaskExecutionInterface>
        implements TakesValue<Collection<TaskExecutionInterface>> {
    protected static final GwtMessages MESSAGES = GWT.create(GwtMessages.class);
    private static final GwtConstants CONSTANTS = GWT.create(GwtConstants.class);
    private TaskExecutionsTableColumn iSortBy = null;
    private boolean iAsc = true;
    private TaskOptionsInterface iOptions;

    private static DateTimeFormat sDateFormatMeeting = ServerDateTimeFormat
            .getFormat(CONSTANTS.meetingDateFormat());
    private static DateTimeFormat sDateFormatTS = ServerDateTimeFormat.getFormat(CONSTANTS.timeStampFormatShort());

    public TaskExecutionsTable() {
        setStyleName("unitime-PeriodicTaskTable");

        List<UniTimeTableHeader> header = new ArrayList<UniTimeTableHeader>();
        for (TaskExecutionsTableColumn column : TaskExecutionsTableColumn.values()) {
            int nrCells = getNbrCells(column);
            for (int idx = 0; idx < nrCells; idx++) {
                UniTimeTableHeader h = new UniTimeTableHeader(getColumnName(column, idx),
                        getColumnAlignment(column, idx));
                header.add(h);
            }
        }

        for (final TaskExecutionsTableColumn column : TaskExecutionsTableColumn.values()) {
            if (TaskExecutionsTableComparator.isApplicable(column) && getNbrCells(column) > 0) {
                final UniTimeTableHeader h = header.get(getCellIndex(column));
                Operation op = new SortOperation() {
                    @Override
                    public void execute() {
                        doSort(column);
                    }

                    @Override
                    public boolean isApplicable() {
                        return getRowCount() > 1 && h.isVisible();
                    }

                    @Override
                    public boolean hasSeparator() {
                        return false;
                    }

                    @Override
                    public String getName() {
                        return MESSAGES.opSortBy(getColumnName());
                    }

                    @Override
                    public String getColumnName() {
                        return h.getHTML().replace("<br>", " ");
                    }
                };
                h.addOperation(op);
            }
        }

        addRow(null, header);

        for (int i = 0; i < getCellCount(0); i++)
            getCellFormatter().setStyleName(0, i, "unitime-ClickableTableHeader");

        setSortBy(AdminCookie.getInstance().getSortTaskExecutionsBy());
    }

    public void setOptions(TaskOptionsInterface options) {
        iOptions = options;
    }

    public TaskOptionsInterface getOptions() {
        return iOptions;
    }

    protected void doSort(TaskExecutionsTableColumn column) {
        if (column == iSortBy) {
            iAsc = !iAsc;
        } else {
            iSortBy = column;
            iAsc = true;
        }
        AdminCookie.getInstance().setSortTaskExecutionsBy(getSortBy());
        sort();
    }

    public boolean hasSortBy() {
        return iSortBy != null;
    }

    public int getSortBy() {
        return iSortBy == null ? 0 : iAsc ? 1 + iSortBy.ordinal() : -1 - iSortBy.ordinal();
    }

    public void setSortBy(int sortBy) {
        if (sortBy == 0) {
            iSortBy = null;
            iAsc = true;
        } else if (sortBy > 0) {
            iSortBy = TaskExecutionsTableColumn.values()[sortBy - 1];
            iAsc = true;
        } else {
            iSortBy = TaskExecutionsTableColumn.values()[-1 - sortBy];
            iAsc = false;
        }
        sort();
    }

    public void sort() {
        if (iSortBy == null)
            return;
        if (getNbrCells(iSortBy) == 0)
            iSortBy = TaskExecutionsTableColumn.DATE;
        UniTimeTableHeader header = getHeader(getCellIndex(iSortBy));
        sort(header, new TaskExecutionsTableComparator(iSortBy, true), iAsc);
    }

    protected int getNbrCells(TaskExecutionsTableColumn column) {
        switch (column) {
        default:
            return 1;
        }
    }

    public String getColumnName(TaskExecutionsTableColumn column, int idx) {
        switch (column) {
        case DATE:
            return MESSAGES.colTaskScheduleDate();
        case TIME:
            return MESSAGES.colTaskScheduleTime();
        case QUEUED:
            return MESSAGES.colTaskQueued();
        case STARTED:
            return MESSAGES.colTaskStarted();
        case FINISHED:
            return MESSAGES.colTaskFinished();
        case STATUS:
            return MESSAGES.colTaskStatus();
        case MESSAGE:
            return MESSAGES.colTaskStatusMessage();
        case OUTPUT:
            return MESSAGES.colTaskOutput();
        default:
            return column.name();
        }
    }

    public int getColumnIndex(TaskExecutionsTableColumn column) {
        int before = 0;
        for (TaskExecutionsTableColumn c : TaskExecutionsTableColumn.values()) {
            if (c.equals(column))
                return before;
            before += getNbrCells(c);
        }
        return -1;
    }

    protected HorizontalAlignmentConstant getColumnAlignment(TaskExecutionsTableColumn column, int idx) {
        switch (column) {
        default:
            return HasHorizontalAlignment.ALIGN_LEFT;
        }
    }

    protected int getCellIndex(TaskExecutionsTableColumn column) {
        int ret = 0;
        for (TaskExecutionsTableColumn c : TaskExecutionsTableColumn.values())
            if (c.ordinal() < column.ordinal())
                ret += getNbrCells(c);
        return ret;
    }

    protected Widget getCell(final TaskExecutionInterface e, final TaskExecutionsTableColumn column,
            final int idx) {
        switch (column) {
        case DATE:
            return new Label(sDateFormatMeeting.format(e.getExecutionDate()));
        case TIME:
            return new Label(e.getExecutionTime(CONSTANTS));
        case QUEUED:
            return new Label(e.getQueued() == null ? "" : sDateFormatTS.format(e.getQueued()));
        case STARTED:
            return new Label(e.getStarted() == null ? "" : sDateFormatTS.format(e.getStarted()));
        case FINISHED:
            return new Label(e.getFinished() == null ? "" : sDateFormatTS.format(e.getFinished()));
        case STATUS:
            return new Label(CONSTANTS.taskStatus()[e.getStatus().ordinal()]);
        case MESSAGE:
            Label message = new Label(e.getStatusMessage() == null ? "" : e.getStatusMessage());
            message.addStyleName("status-message");
            if (e.getStatusMessage() != null)
                message.setTitle(e.getStatusMessage());
            return message;
        case OUTPUT:
            if (e.getOutput() != null)
                return new Anchor(e.getOutput(), GWT.getHostPageBaseURL() + "taskfile?e=" + e.getId());
            return new Label("");
        default:
            return null;
        }
    }

    public int getRow(Long execId) {
        if (execId == null)
            return -1;
        for (int row = 1; row < getRowCount(); row++) {
            TaskExecutionInterface task = getData(row);
            if (task != null && execId.equals(task.getId()))
                return row;
        }
        return -1;
    }

    public void scrollToTaskExecution(Long execId) {
        if (execId == null)
            return;
        for (int row = 1; row < getRowCount(); row++) {
            TaskExecutionInterface task = getData(row);
            if (task != null && execId.equals(task.getId())) {
                getRowFormatter().getElement(row).scrollIntoView();
                return;
            }
        }
    }

    public static class TaskExecutionsTableComparator implements Comparator<TaskExecutionInterface> {
        private TaskExecutionsTableColumn iColumn;
        private boolean iAsc;

        public TaskExecutionsTableComparator(TaskExecutionsTableColumn column, boolean asc) {
            iColumn = column;
            iAsc = asc;
        }

        protected int compareByTime(TaskExecutionInterface e1, TaskExecutionInterface e2) {
            int cmp = new Integer(e1.getSlot()).compareTo(e2.getSlot());
            if (cmp != 0)
                return cmp;
            return e1.getDayOfYear().compareTo(e2.getDayOfYear());
        }

        protected int compareByDate(TaskExecutionInterface e1, TaskExecutionInterface e2) {
            int cmp = e1.getDayOfYear().compareTo(e2.getDayOfYear());
            if (cmp != 0)
                return cmp;
            return new Integer(e1.getSlot()).compareTo(e2.getSlot());
        }

        protected int compareByStatus(TaskExecutionInterface e1, TaskExecutionInterface e2) {
            return (e1 == null ? e2 == null ? 0 : -1 : e2 == null ? 1 : e1.compareTo(e2));
        }

        protected int compareByColumn(TaskExecutionInterface e1, TaskExecutionInterface e2) {
            switch (iColumn) {
            case DATE:
                return compareByDate(e1, e2);
            case TIME:
                return compareByTime(e1, e2);
            case STATUS:
                return compareByStatus(e1, e2);
            case QUEUED:
                return compare(e1.getQueued(), e2.getQueued());
            case FINISHED:
                return compare(e1.getFinished(), e1.getFinished());
            case STARTED:
                return compare(e1.getStarted(), e2.getStarted());
            case MESSAGE:
                return compare(e1.getStatusMessage(), e2.getStatusMessage());
            case OUTPUT:
                return compare(e1.getOutput(), e2.getOutput());
            default:
                return e1.compareTo(e2);
            }
        }

        public static boolean isApplicable(TaskExecutionsTableColumn column) {
            switch (column) {
            case DATE:
            case TIME:
            case STATUS:
            case QUEUED:
            case FINISHED:
            case STARTED:
            case MESSAGE:
            case OUTPUT:
                return true;
            default:
                return false;
            }
        }

        @Override
        public int compare(TaskExecutionInterface e1, TaskExecutionInterface e2) {
            int cmp = compareByColumn(e1, e2);
            if (cmp != 0)
                return (iAsc ? cmp : -cmp);
            return (iAsc ? e1.compareTo(e2) : e2.compareTo(e1));
        }

        protected int compare(String s1, String s2) {
            if (s1 == null || s1.isEmpty()) {
                return (s2 == null || s2.isEmpty() ? 0 : 1);
            } else {
                return (s2 == null || s2.isEmpty() ? -1 : s1.compareToIgnoreCase(s2));
            }
        }

        protected int compare(Number n1, Number n2) {
            return (n1 == null ? n2 == null ? 0 : -1
                    : n2 == null ? 1 : Double.compare(n1.doubleValue(), n2.doubleValue()));
        }

        protected int compare(Date n1, Date n2) {
            return (n1 == null ? n2 == null ? 0 : -1 : n2 == null ? 1 : n1.compareTo(n2));
        }

        protected int compare(Boolean b1, Boolean b2) {
            return (b1 == null ? b2 == null ? 0 : -1
                    : b2 == null ? 1 : (b1.booleanValue() == b2.booleanValue()) ? 0 : (b1.booleanValue() ? 1 : -1));
        }
    }

    public static enum TaskExecutionsTableColumn {
        DATE, TIME, QUEUED, STARTED, FINISHED, STATUS, MESSAGE, OUTPUT,;
    }

    public int addExecution(final TaskExecutionInterface exec) {
        List<Widget> widgets = new ArrayList<Widget>();
        for (TaskExecutionsTableColumn column : TaskExecutionsTableColumn.values()) {
            int nbrCells = getNbrCells(column);
            for (int idx = 0; idx < nbrCells; idx++) {
                Widget cell = getCell(exec, column, idx);
                if (cell == null)
                    cell = new P();
                widgets.add(cell);
            }
        }
        for (Widget w : widgets)
            if (w != null)
                w.addStyleName("status-" + exec.getStatus().name().toLowerCase());
        int row = addRow(exec, widgets);
        getRowFormatter().setStyleName(row, "row");
        for (int col = 0; col < getCellCount(row); col++)
            getCellFormatter().setStyleName(row, col, "cell");
        return row;
    }

    @Override
    public void setValue(Collection<TaskExecutionInterface> value) {
        clearTable(1);
        boolean hasOutput = false;
        if (value != null) {
            for (TaskExecutionInterface exec : value) {
                addExecution(exec);
                if (exec.getOutput() != null)
                    hasOutput = true;
            }
        }
        setColumnVisible(getColumnIndex(TaskExecutionsTableColumn.OUTPUT), hasOutput);
        sort();
    }

    @Override
    public Collection<TaskExecutionInterface> getValue() {
        return getData();
    }

    public static interface SortOperation extends Operation, HasColumnName {
    }
}