org.pentaho.mantle.client.workspace.BlockoutPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.mantle.client.workspace.BlockoutPanel.java

Source

/*!
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.mantle.client.workspace;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback;
import org.pentaho.gwt.widgets.client.dialogs.PromptDialogBox;
import org.pentaho.gwt.widgets.client.table.BaseTable;
import org.pentaho.gwt.widgets.client.table.ColumnComparators.BaseColumnComparator;
import org.pentaho.gwt.widgets.client.table.ColumnComparators.ColumnComparatorTypes;
import org.pentaho.gwt.widgets.client.toolbar.Toolbar;
import org.pentaho.gwt.widgets.client.toolbar.ToolbarButton;
import org.pentaho.gwt.widgets.client.utils.string.StringUtils;
import org.pentaho.mantle.client.dialogs.scheduling.NewBlockoutScheduleDialog;
import org.pentaho.mantle.client.images.ImageUtil;
import org.pentaho.mantle.client.messages.Messages;

import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsonUtils;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.gen2.table.client.SelectionGrid.SelectionPolicy;
import com.google.gwt.gen2.table.event.client.RowSelectionEvent;
import com.google.gwt.gen2.table.event.client.RowSelectionHandler;
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.DateTimeFormat;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;

public class BlockoutPanel extends SimplePanel {
    private BaseTable table;
    // private ListDataProvider<JsJob> dataProvider = new ListDataProvider<JsJob>();
    private List<JsJob> list = new ArrayList<JsJob>();
    private final VerticalPanel widgets = new VerticalPanel();
    private Button blockoutButton;
    private Toolbar tableControls;
    private VerticalPanel tablePanel;
    private ToolbarButton editButton;
    private ToolbarButton removeButton;

    private IDialogCallback refreshCallBack = new IDialogCallback() {
        public void okPressed() {
            refresh();
        }

        public void cancelPressed() {
            refresh();
        }
    };
    private Label headlineLabel;
    private Label blockoutHeading;
    private boolean isAdmin;

    public BlockoutPanel(final boolean isAdmin) {
        this.isAdmin = isAdmin;
        createUI(isAdmin);
        refresh();
    }

    private void createUI(final boolean isAdmin) {
        widgets.setWidth("100%");
        createBlockoutHeadingBar();
        createHeadlineBar();
        createControls(isAdmin);
        createTable();
        widgets.add(tablePanel);
        setWidget(widgets);
    }

    private void createBlockoutHeadingBar() {
        blockoutHeading = new Label("");
        blockoutHeading.setStyleName("workspaceHeading");
        widgets.add(blockoutHeading);
    }

    private void createHeadlineBar() {
        headlineLabel = new Label("");
        widgets.add(headlineLabel);
    }

    private void createControls(final boolean isAdmin) {
        blockoutButton = new Button(Messages.getString("createBlockoutTime"));
        tableControls = new Toolbar();
        tablePanel = new VerticalPanel();
        tablePanel.setVisible(false);
        if (isAdmin) {
            final ClickHandler newBlockoutHandler = new ClickHandler() {
                @Override
                public void onClick(final ClickEvent clickEvent) {
                    DialogBox blockoutDialog = new NewBlockoutScheduleDialog("", refreshCallBack, false, true);
                    blockoutDialog.center();
                }
            };
            createBlockoutButton(newBlockoutHandler);
            createTableControls(newBlockoutHandler);
        }
    }

    private void createBlockoutButton(final ClickHandler newBlockoutHandler) {
        SimplePanel buttonPanel = new SimplePanel();
        buttonPanel.setStyleName("schedulesButtonPanel");
        blockoutButton.addClickHandler(newBlockoutHandler);
        blockoutButton.setStyleName("pentaho-button");
        buttonPanel.add(blockoutButton);
        widgets.add(buttonPanel);
    }

    private void createTableControls(final ClickHandler newBlockoutHandler) {
        tableControls.addSpacer(10);
        tableControls.add(Toolbar.GLUE);
        ToolbarButton addButton = new ToolbarButton(ImageUtil.getThemeableImage("pentaho-addbutton"));
        addButton.setCommand(new Command() {
            @Override
            public void execute() {
                newBlockoutHandler.onClick(null);
            }
        });
        addButton.setToolTip(Messages.getString("blockoutAdd"));
        editButton = new ToolbarButton(ImageUtil.getThemeableImage("pentaho-editbutton"));
        editButton.setEnabled(false);
        editButton.setCommand(new Command() {
            @Override
            public void execute() {
                Set<JsJob> jobs = getSelectedSet();
                final JsJob jsJob = jobs.iterator().next();

                IDialogCallback callback = new IDialogCallback() {
                    public void okPressed() {
                        // delete the old one
                        removeBlockout(jsJob);
                        refreshCallBack.okPressed();
                    }

                    public void cancelPressed() {
                        refreshCallBack.cancelPressed();
                    }
                };

                NewBlockoutScheduleDialog blockoutDialog = new NewBlockoutScheduleDialog(jsJob, callback, false,
                        true);
                table.selectRow(list.indexOf(jsJob));
                blockoutDialog.setUpdateMode();
                blockoutDialog.center();
            }
        });
        editButton.setToolTip(Messages.getString("blockoutEdit"));
        removeButton = new ToolbarButton(ImageUtil.getThemeableImage("pentaho-deletebutton"));
        removeButton.setEnabled(false);
        removeButton.setCommand(new Command() {
            public void execute() {

                final Set<JsJob> selectedSet = getSelectedSet();

                final Label messageTextBox = new Label(
                        Messages.getString("deleteBlockoutWarning", "" + selectedSet.size()));
                final PromptDialogBox blockoutDeleteWarningDialogBox = new PromptDialogBox(
                        Messages.getString("delete"), Messages.getString("yesDelete"), Messages.getString("no"),
                        true, true);
                blockoutDeleteWarningDialogBox.setContent(messageTextBox);
                final IDialogCallback callback = new IDialogCallback() {

                    public void cancelPressed() {
                        blockoutDeleteWarningDialogBox.hide();
                    }

                    public void okPressed() {
                        for (JsJob jsJob : selectedSet) {
                            removeBlockout(jsJob);
                            table.selectRow(list.indexOf(jsJob));
                        }
                    }
                };
                blockoutDeleteWarningDialogBox.setCallback(callback);
                blockoutDeleteWarningDialogBox.center();
            }
        });
        removeButton.setToolTip(Messages.getString("blockoutDelete"));
        tableControls.add(editButton);
        tableControls.add(addButton);
        tableControls.add(removeButton);
        tablePanel.add(tableControls);
    }

    private void createTable() {
        int columnSize = 139;
        String[] tableHeaderNames = { Messages.getString("blockoutColumnStarts"),
                Messages.getString("blockoutColumnEnds"), Messages.getString("blockoutColumnRepeats"),
                Messages.getString("blockoutColumnRepeatsEndBy") };
        int[] columnWidths = { columnSize, columnSize, columnSize, columnSize };
        BaseColumnComparator[] columnComparators = { BaseColumnComparator.getInstance(ColumnComparatorTypes.DATE),
                BaseColumnComparator.getInstance(ColumnComparatorTypes.DATE),
                BaseColumnComparator.getInstance(ColumnComparatorTypes.STRING_NOCASE),
                BaseColumnComparator.getInstance(ColumnComparatorTypes.STRING_NOCASE) };
        table = new BaseTable(tableHeaderNames, columnWidths, columnComparators, SelectionPolicy.MULTI_ROW);
        table.getElement().setId("blockout-table");
        table.setWidth("640px");
        table.setHeight("328px");
        table.fillWidth();
        table.addRowSelectionHandler(new RowSelectionHandler() {
            @Override
            public void onRowSelection(RowSelectionEvent event) {
                boolean isSelected = event.getNewValue().size() > 0;
                boolean isSingleSelect = event.getNewValue().size() == 1;
                editButton.setEnabled(isSingleSelect);
                removeButton.setEnabled(isSelected);
            }
        });
        tablePanel.add(table);
    }

    private String formatDate(final Date date) {
        DateTimeFormat simpleDateFormat = DateTimeFormat.getFormat("EEE, MMM dd h:mm a");
        return simpleDateFormat.format(date);
    }

    private void removeBlockout(final JsJob jsJob) {
        JSONObject jobRequest = new JSONObject();
        jobRequest.put("jobId", new JSONString(jsJob.getJobId())); //$NON-NLS-1$
        makeServiceCall("removeJob", RequestBuilder.DELETE, jobRequest.toString(), "text/plain",
                new RequestCallback() {

                    public void onError(Request request, Throwable exception) {
                        // todo: do something
                    }

                    public void onResponseReceived(Request request, Response response) {
                        if (response.getStatusCode() == Response.SC_OK) {
                            refresh();
                        }
                    }
                });
    }

    public void refresh() {
        makeServiceCall("blockout/blockoutjobs", RequestBuilder.GET, null, "application/json",
                new RequestCallback() {

                    public void onError(Request request, Throwable exception) {
                        // todo: do something
                    }

                    public void onResponseReceived(Request request, Response response) {
                        if (response.getStatusCode() == Response.SC_OK) {
                            if ("null".equals(response.getText())) {
                                showData(null);
                            } else {
                                showData(parseJson(JsonUtils.escapeJsonForEval(response.getText())));
                            }
                        }
                    }
                });
    }

    private void makeServiceCall(final String urlSuffix, final RequestBuilder.Method httpMethod,
            final String requestData, final String acceptHeader, final RequestCallback callback) {
        String moduleBaseURL = GWT.getModuleBaseURL();
        String moduleName = GWT.getModuleName();
        String contextURL = moduleBaseURL.substring(0, moduleBaseURL.lastIndexOf(moduleName));
        final String url = contextURL + "api/scheduler/" + urlSuffix;
        RequestBuilder builder = new RequestBuilder(httpMethod, url);
        builder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
        builder.setHeader("Content-Type", "application/json");
        if (!StringUtils.isEmpty(acceptHeader)) {
            builder.setHeader("accept", acceptHeader);
        }
        try {
            builder.sendRequest(requestData, callback);
        } catch (RequestException e) {
            // showError(e);
        }
    }

    private void showData(final JsArray<JsJob> allBlocks) {
        blockoutHeading.setText(Messages.getString("blockoutTimes"));
        if (allBlocks == null || allBlocks.length() == 0) {
            tablePanel.setVisible(false);
            blockoutButton.setVisible(true);
            headlineLabel.setText(Messages.getString("blockoutNone"));

            if (!isAdmin) {
                blockoutHeading.setVisible(false);
                headlineLabel.setVisible(false);
            }

        } else {
            tablePanel.setVisible(true);
            blockoutButton.setVisible(false);
            blockoutHeading.setVisible(true);
            headlineLabel.setText(Messages.getString("blockoutHeadline"));
            if (!isAdmin) {
                headlineLabel.setVisible(true);
            }
            List<JsJob> jobList = new ArrayList<JsJob>();
            for (int i = 0; i < allBlocks.length(); i++) {
                JsJob job = allBlocks.get(i);
                jobList.add(job);
            }
            // List<JsJob> list = dataProvider.getList();
            list.clear();
            list.addAll(jobList);

            int row = 0;
            Object[][] tableContent = new Object[list.size()][4];
            for (JsJob block : list) {
                tableContent[row][0] = getStartValue(block);
                tableContent[row][1] = getEndValue(block);
                tableContent[row][2] = getRepeatValue(block);
                tableContent[row][3] = getRepeatEndValue(block);
                row++;
            }
            table.populateTable(tableContent);
            table.setVisible(jobList.size() > 0);
        }
    }

    private native JsArray<JsJob> parseJson(String json)
    /*-{
      var obj = JSON.parse(json);
      return obj.job;
    }-*/;

    private String convertDateToValue(Date date) {
        if (date != null) {
            try {
                return formatDate(date);
            } catch (Throwable t) {
                //ignored
            }
        }
        return "-";
    }

    private String getStartValue(JsJob block) {

        long now = System.currentTimeMillis();
        long duration = block.getJobTrigger().getBlockDuration();
        Date lastRun = block.getLastRun();

        // if we have a last execution and we are still within the range of that, the
        // starts / ends need to still reflect this rather than the next execution
        if (lastRun != null && now < lastRun.getTime() + duration && now > lastRun.getTime()) {
            return convertDateToValue(lastRun);
        }

        if (block.getNextRun() != null) {
            return convertDateToValue(block.getNextRun());
        } else if (block.getJobTrigger() != null && block.getJobTrigger().getStartTime() != null) {
            return convertDateToValue(block.getJobTrigger().getStartTime());
        } else if ("COMPLETE".equals(block.getState()) && block.getJobTrigger() != null) {
            // if a job is complete, it will not have the date in the nextRun attribute
            return convertDateToValue(block.getJobTrigger().getStartTime());
        } else {
            return "-";
        }
    }

    private String getEndValue(JsJob block) {

        long now = System.currentTimeMillis();
        long duration = block.getJobTrigger().getBlockDuration();
        Date lastRun = block.getLastRun();

        // if we have a last execution and we are still within the range of that, the
        // starts / ends need to still reflect this rather than the next execution
        if (lastRun != null && now < lastRun.getTime() + duration && now > lastRun.getTime()) {
            return convertDateToValue(new Date(lastRun.getTime() + duration));
        }

        if (block.getNextRun() instanceof Date) {
            return convertDateToValue(new Date(block.getNextRun().getTime() + duration));
        } else if ("COMPLETE".equals(block.getState()) && block.getJobTrigger() != null
                && block.getJobTrigger().getStartTime() != null) {
            // if a job is complete, it will not have the date in the nextRun attribute
            return convertDateToValue(new Date(
                    block.getJobTrigger().getStartTime().getTime() + block.getJobTrigger().getBlockDuration()));

        } else {
            return "-";
        }
    }

    private String getRepeatValue(JsJob block) {
        try {
            return block.getJobTrigger().getDescription();
        } catch (Throwable t) {
            //ignored
        }
        return "-";
    }

    private String getRepeatEndValue(JsJob block) {
        try {
            Date endTime = block.getJobTrigger().getEndTime();
            if (endTime == null) {
                return Messages.getString("never");
            } else {
                return formatDate(endTime);
            }
        } catch (Throwable t) {
            //ignored
        }
        return "-";
    }

    private Set<JsJob> getSelectedSet() {
        Set<Integer> selected = table.getSelectedRows();
        Set<JsJob> selectedSet = new HashSet<JsJob>();
        for (Integer selectedRow : selected) {
            selectedSet.add(list.get(selectedRow));
        }
        return selectedSet;
    }
}