org.talend.scheduler.ui.SchedulerView.java Source code

Java tutorial

Introduction

Here is the source code for org.talend.scheduler.ui.SchedulerView.java

Source

// ============================================================================
//
// Copyright (C) 2006-2015 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.scheduler.ui;

import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.SelectionProviderAction;
import org.eclipse.ui.part.ViewPart;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.commons.ui.runtime.image.EImage;
import org.talend.commons.ui.runtime.image.ImageProvider;
import org.talend.commons.ui.swt.tableviewer.TableViewerCreator;
import org.talend.core.model.repository.job.JobResourceManager;
import org.talend.scheduler.SchedulerPlugin;
import org.talend.scheduler.core.CommandModeType;
import org.talend.scheduler.core.ScheduleTask;
import org.talend.scheduler.i18n.Messages;

/**
 * This is a scheduler viewer to diaplay all the scheduler task. <br/>
 * 
 * $Id$
 * 
 */
public class SchedulerView extends ViewPart {

    public static final int COLUMN_WIDTH = 100;

    private Action addTaskAction;

    private Action editTaskAction;

    private Action delTaskAction;

    private Action genCrontabAction;

    private List<ScheduleTask> tasks;

    private TableViewerCreator tableViewerCreator;

    /**
     * Gets all schedul tasks.
     * 
     * @return List < ScheduleTask >.
     */
    List<ScheduleTask> getAllSchedulTasks() {
        tasks = new ArrayList<ScheduleTask>();
        // todo
        return tasks;
    }

    /**
     * 
     * DOC dev SchedulerView class global comment. Detailled comment <br/>
     * 
     * $Id$
     * 
     */
    class SchedulerViewSorter extends ViewerSorter {
    }

    /**
     * The constructor.
     */
    public SchedulerView() {
    }

    /*
     * implememnts org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     * 
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createPartControl(Composite parent) {
        tableViewerCreator = new TableViewerCreator(parent);
        initialTable(tableViewerCreator.createTable());
        // see bug 4457: click on some column may throw exception
        tableViewerCreator.setCellModifier(null);
        tableViewerCreator.init();
        TableViewer viewer = tableViewerCreator.getTableViewer();

        SchedulerViewProvider provider = new SchedulerViewProvider();
        viewer.setContentProvider(provider);
        viewer.setLabelProvider(provider);
        viewer.setSorter(new SchedulerViewSorter());
        viewer.setCellEditors(null);
        viewer.setInput(getAllSchedulTasks());

        makeActions();
        hookContextMenu();
        hookDoubleClickAction();
        contributeToActionBars();

    }

    /**
     * Initials the table.
     * 
     * @param table Table
     */
    private void initialTable(Table table) {
        TableColumn colMinute = new TableColumn(table, SWT.LEFT);
        TableColumn colHour = new TableColumn(table, SWT.LEFT);
        TableColumn colDay = new TableColumn(table, SWT.LEFT);
        TableColumn colMonth = new TableColumn(table, SWT.LEFT);
        TableColumn colWeekday = new TableColumn(table, SWT.LEFT);
        TableColumn colCommand = new TableColumn(table, SWT.LEFT);

        colMinute.setText(Messages.getString("SchedulerView.tableColumn.minute")); //$NON-NLS-1$
        colHour.setText(Messages.getString("SchedulerView.tableColumn.hour")); //$NON-NLS-1$
        colDay.setText(Messages.getString("SchedulerView.tableColumn.day")); //$NON-NLS-1$
        colMonth.setText(Messages.getString("SchedulerView.tableColumn.month")); //$NON-NLS-1$
        colWeekday.setText(Messages.getString("SchedulerView.tableColumn.weekday")); //$NON-NLS-1$
        colCommand.setText(Messages.getString("SchedulerView.tableColumn.command")); //$NON-NLS-1$

        colMinute.setWidth(COLUMN_WIDTH);
        colHour.setWidth(COLUMN_WIDTH);
        colDay.setWidth(COLUMN_WIDTH);
        colMonth.setWidth(COLUMN_WIDTH);
        colWeekday.setWidth(COLUMN_WIDTH);
        colCommand.setWidth(COLUMN_WIDTH * 3);

    }

    /**
     * HookS context menu.
     */
    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager(Messages.getString("SchedulerView.popupMenuName")); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {

            public void menuAboutToShow(IMenuManager manager) {
                SchedulerView.this.fillContextMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(tableViewerCreator.getTableViewer().getControl());
        tableViewerCreator.getTableViewer().getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, tableViewerCreator.getTableViewer());

    }

    /**
     * Contributes to action bars.
     */
    private void contributeToActionBars() {
        IActionBars bars = getViewSite().getActionBars();
        // fillLocalPullDown(bars.getMenuManager());
        fillLocalToolBar(bars.getToolBarManager());
    }

    /**
     * Fills context menu.
     * 
     * @param manager IMenuManager
     */
    private void fillContextMenu(IMenuManager manager) {
        manager.add(addTaskAction);
        manager.add(editTaskAction);
        // Other plug-ins can contribute there actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
        manager.add(delTaskAction);
    }

    /**
     * Fills local toolbar.
     * 
     * @param manager IToolBarManager
     */
    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(genCrontabAction);
        manager.add(addTaskAction);
        manager.add(editTaskAction);
        manager.add(new Separator());
        manager.add(delTaskAction);

    }

    /**
     * 
     * DOC dev SchedulerView class global comment. Detailled comment <br/>
     * 
     * $Id$
     * 
     */
    class ModifyTaskAction extends SelectionProviderAction {

        public ModifyTaskAction(ISelectionProvider provider, String text) {
            super(provider, text);
            setEnabled(false);
        }

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection
         * )
         */
        @Override
        public void selectionChanged(IStructuredSelection selection) {
            if (selection.size() != 1) {
                this.setEnabled(false);
            } else {
                this.setEnabled(true);
            }
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.action.Action#run()
         */
        @Override
        public void run() {
            editSelectedTaskProperty();
        }

    }

    /**
     * Uses this action to delete scheduler task. <br/> $Id: org.eclipse.jdt.ui.prefs,v 1.1 2006/10/20 16:09:46 qianbing
     * Exp $
     */
    class DelTaskAction extends SelectionProviderAction {

        public DelTaskAction(ISelectionProvider provider, String text) {
            super(provider, text);
            setEnabled(false);
        }

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection
         * )
         */
        @Override
        public void selectionChanged(IStructuredSelection selection) {
            if (selection.size() == 0) {
                this.setEnabled(false);
            } else {
                this.setEnabled(true);
            }
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.action.Action#run()
         */
        @Override
        public void run() {
            boolean sure = false;
            sure = MessageDialog.openConfirm(tableViewerCreator.getTableViewer().getControl().getShell(),
                    Messages.getString("SchedulerView.deleteDialogTitle"), //$NON-NLS-1$
                    Messages.getString("SchedulerView.deleteDialogContent")); //$NON-NLS-1$
            if (sure) {
                StructuredSelection selection = (StructuredSelection) tableViewerCreator.getTableViewer()
                        .getSelection();

                List<ScheduleTask> list = selection.toList();
                JobResourceManager jobResourceManager = JobResourceManager.getInstance();

                for (ScheduleTask tasks : list) {
                    if (tasks.getTaskMode() == CommandModeType.TalendJob) {
                        jobResourceManager.removeProtection(tasks);
                        for (String id : tasks.getProtectedIds()) {
                            jobResourceManager.deleteResource(tasks.getJobResource(id));
                        }
                    }
                }
                tasks.removeAll(list);
                tableViewerCreator.getTableViewer().remove(list.toArray());
            } else {
                return;
            }
        }
    }

    /**
     * Creates all the actions.
     */
    private void makeActions() {
        final Image imgAdd = ImageProvider.getImage(EImage.ADD_ICON);
        final Image imgDel = ImageProvider.getImage(EImage.DELETE_ICON);
        final Image imgSave = ImageProvider.getImage(EImage.SAVE_ICON);

        final ImageDescriptor imgDesAdd = ImageDescriptor.createFromImage(imgAdd);
        final ImageDescriptor imgDesDel = ImageDescriptor.createFromImage(imgDel);
        final ImageDescriptor imgDesSave = ImageDescriptor.createFromImage(imgSave);

        addTaskAction = new Action() {

            @Override
            public void run() {
                addScheduleTask();
            }
        };
        addTaskAction.setText(Messages.getString("SchedulerView.addTaskText")); //$NON-NLS-1$
        addTaskAction.setToolTipText(Messages.getString("SchedulerView.addTaskToolTip")); //$NON-NLS-1$
        addTaskAction.setImageDescriptor(imgDesAdd);

        editTaskAction = new ModifyTaskAction(tableViewerCreator.getTableViewer(),
                Messages.getString("SchedulerView.modifyTaskText")); //$NON-NLS-1$
        editTaskAction.setToolTipText(Messages.getString("SchedulerView.modifyTaskToolTip")); //$NON-NLS-1$
        editTaskAction.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));

        delTaskAction = new DelTaskAction(tableViewerCreator.getTableViewer(),
                Messages.getString("SchedulerView.deleteTaskText")); //$NON-NLS-1$
        delTaskAction.setToolTipText(Messages.getString("SchedulerView.deleteTaskToolTip")); //$NON-NLS-1$
        delTaskAction.setImageDescriptor(imgDesDel);

        genCrontabAction = new Action() {

            @Override
            public void run() {
                genCrontab2File();
            }
        };
        genCrontabAction.setText(Messages.getString("SchedulerView.generateFileToolTip")); //$NON-NLS-1$
        genCrontabAction.setImageDescriptor(imgDesSave);

    }

    /**
     * Generate the crontab file according to this table.
     */
    protected void genCrontab2File() {
        FileDialog fd = new FileDialog(this.getSite().getShell(), SWT.SAVE);
        String fileName = fd.open();
        if (fileName == null) {
            return;
        }
        PrintWriter pw = null;
        // output
        try {
            pw = new PrintWriter(new FileWriter(fileName), true);
            print2File(pw, tasks);
        } catch (Exception e) {
            // todo
            // e.printStackTrace();
            ExceptionHandler.process(e);
        } finally {
            if (pw != null) {
                try {
                    pw.close();
                } catch (Exception e) {
                    SchedulerPlugin.log(e);
                }
            }
        }
    }

    /**
     * Prints List< ScheduleTask > to plain file.
     * 
     * @param pw PrintWriter
     * @param list List< ScheduleTask >
     */
    private void print2File(PrintWriter pw, List<ScheduleTask> list) {
        for (ScheduleTask task : list) {
            StringBuilder sb = new StringBuilder();
            String blank = " "; //$NON-NLS-1$
            sb.append(task.getMinute()).append(blank).append(task.getHour()).append(blank).append(task.getDay())
                    .append(blank).append(task.getMonth()).append(blank).append(task.getWeekly()).append(blank)
                    .append(task.getCommand());

            pw.println(sb.toString());
        }
    }

    /**
     * Adds a scheduler task to scheduler viewer.
     */
    private void addScheduleTask() {
        try {
            SchedulerTaskPropertyDialog d = new SchedulerTaskPropertyDialog(getViewSite().getShell());
            if (d.open() != IDialogConstants.OK_ID) {
                return;
            }
            ScheduleTask newTask = d.getResult();

            tasks.add(newTask);
            tableViewerCreator.getTableViewer().add(newTask);
            if (newTask.getTaskMode() == CommandModeType.TalendJob) {
                newTask.setTaskNo(tableViewerCreator.getTableViewer().getTable().getItemCount());
                newTask.initProtectionIdAndResource();
                JobResourceManager.getInstance().addProtection(newTask);
            }
        } catch (Exception e) {
            // TODO: handle exception
            // e.printStackTrace();
            ExceptionHandler.process(e);
        }

    }

    /**
     * Edits a scheduler task in scheduler viewer.
     */
    protected void editSelectedTaskProperty() {
        JobResourceManager reManager = JobResourceManager.getInstance();

        ScheduleTask task = getSelectedTask();
        if (task.getTaskMode() == CommandModeType.TalendJob) {
            reManager.removeProtection(task);
        }
        SchedulerTaskPropertyDialog d = new SchedulerTaskPropertyDialog(getViewSite().getShell(), task);

        if (d.open() != IDialogConstants.OK_ID) {
            if (task.getTaskMode() == CommandModeType.TalendJob) {
                reManager.addProtection(task);
            }
            return;
        }

        ScheduleTask newTask = d.getResult();
        if (newTask.getTaskMode() == CommandModeType.TalendJob) {
            reManager.addProtection(newTask);
        }
        tableViewerCreator.getTableViewer().refresh(newTask);
    }

    /**
     * Gets the selected one scheduler task.
     * 
     * @return ScheduleTask
     */
    private ScheduleTask getSelectedTask() {
        Object o = ((IStructuredSelection) tableViewerCreator.getTableViewer().getSelection()).getFirstElement();
        return (ScheduleTask) o;
    }

    /**
     * Hooks doubleclick action.
     */
    private void hookDoubleClickAction() {
        tableViewerCreator.getTableViewer().addDoubleClickListener(new IDoubleClickListener() {

            public void doubleClick(DoubleClickEvent event) {
                // new ModifyTaskAction(tableViewerCreator.getTableViewer(), Messages
                // .getString("SchedulerView.modifyTaskTitle")).run(); //$NON-NLS-1$
                editTaskAction.run();
            }
        });
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    @Override
    public void setFocus() {
        tableViewerCreator.getTableViewer().getControl().setFocus();
    }

}

/**
 * Scheduler viewer's label provider and content provider.
 * 
 * @author dev
 * 
 */
class SchedulerViewProvider extends LabelProvider implements IStructuredContentProvider, ITableLabelProvider {

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object,
     * java.lang.Object)
     */
    public void inputChanged(Viewer v, Object oldInput, Object newInput) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.LabelProvider#dispose()
     */
    @Override
    public void dispose() {
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
     */
    public Object[] getElements(Object parent) {
        return ((List) parent).toArray();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
     */
    public String getColumnText(Object obj, int index) {

        ScheduleTask schedule = (ScheduleTask) obj;

        switch (index) {

        case 0:
            return schedule.getMinute();
        case 1:
            return schedule.getHour();
        case 2:
            return schedule.getDay();
        case 3:
            return schedule.getMonth();
        case 4:
            return schedule.getWeekly();
        case 5:
            return schedule.getCommand();
        default:
            return ""; //$NON-NLS-1$

        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
     */
    public Image getColumnImage(Object obj, int index) {
        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
     */
    @Override
    public Image getImage(Object obj) {
        return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
    }

}