com.netxforge.netxstudio.screens.f1.MonitoringTree.java Source code

Java tutorial

Introduction

Here is the source code for com.netxforge.netxstudio.screens.f1.MonitoringTree.java

Source

/*******************************************************************************
 * Copyright (c) May 9, 2011 NetXForge.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * 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 General Public License for more details.
 *  You should have received a copy of the GNU Lesser General Public License
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>
 *
 * Contributors:
 *    Christophe Bouhier - initial API and implementation and/or initial documentation
 *******************************************************************************/
package com.netxforge.netxstudio.screens.f1;

import java.util.List;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.IEMFListProperty;
import org.eclipse.emf.databinding.edit.EMFEditProperties;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.databinding.viewers.IViewerObservableValue;
import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.Form;

import com.google.common.collect.Lists;
import com.google.inject.Inject;
import com.netxforge.base.NonModelUtils;
import com.netxforge.base.cdo.MonitoringStateEvent;
import com.netxforge.base.context.IComputationContext;
import com.netxforge.base.context.ObjectContext;
import com.netxforge.netxstudio.common.model.MonitoringStateModel;
import com.netxforge.netxstudio.common.model.MonitoringStateModel.MonitoringStateCallBack;
import com.netxforge.netxstudio.common.model.StudioUtils;
import com.netxforge.netxstudio.data.actions.ServerRequest;
import com.netxforge.netxstudio.generics.DateTimeRange;
import com.netxforge.netxstudio.generics.GenericsPackage;
import com.netxforge.netxstudio.operators.OperatorsPackage;
import com.netxforge.netxstudio.scheduling.Job;
import com.netxforge.netxstudio.scheduling.JobState;
import com.netxforge.netxstudio.scheduling.RFSServiceMonitoringJob;
import com.netxforge.netxstudio.scheduling.SchedulingFactory;
import com.netxforge.netxstudio.scheduling.SchedulingPackage;
import com.netxforge.netxstudio.screens.AbstractPeriodScreen;
import com.netxforge.netxstudio.screens.editing.tables.CDOElementComparer;
import com.netxforge.netxstudio.screens.f1.support.MonitoringTreeFactoryImpl;
import com.netxforge.netxstudio.screens.f1.support.MonitoringTreeLabelProvider;
import com.netxforge.netxstudio.screens.f1.support.MonitoringTreeStructureAdvisorImpl;
import com.netxforge.netxstudio.screens.f1.support.ScheduledReportSelectionWizard;
import com.netxforge.netxstudio.screens.f4.NewEditJob;
import com.netxforge.netxstudio.screens.f4.ServiceMonitors;
import com.netxforge.netxstudio.screens.monitoring.AbstractMonitoringProcessor;
import com.netxforge.netxstudio.services.RFSService;
import com.netxforge.netxstudio.services.Service;
import com.netxforge.netxstudio.services.ServicesPackage;
import com.netxforge.screens.editing.base.IDataServiceInjection;
import com.netxforge.screens.editing.base.ScreenUtil;
import com.netxforge.screens.editing.base.WizardUtil;
import com.netxforge.screens.editing.base.actions.SeparatorAction;
import com.netxforge.screens.editing.base.filter.TreeSearchFilter;

/**
 * A non editing Monitoring screen.
 * 
 * @author Christophe Bouhier christophe.bouhier@netxforge.com
 * 
 */
public class MonitoringTree extends AbstractPeriodScreen implements IDataServiceInjection, MonitoringStateCallBack {

    private Text txtFilterText;
    @SuppressWarnings("unused")
    private DataBindingContext bindingContext;
    private TreeViewer monitoringTreeViewer;
    private Resource operatorsResource;

    @Inject
    ServerRequest serverActions;

    @Inject
    MonitoringStateModel monitoringStateModel;

    /**
     * Create the composite.
     * 
     * @param parent
     * @param style
     */
    public MonitoringTree(Composite parent, int style) {
        super(parent, style);

        addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                toolkit.dispose();
                while (!monitoringStateModel.cancel()) {
                    // Will hang the UI, so should really wait in other
                    // thread...
                    try {
                        monitoringStateModel.wait(500);
                        System.out.println("waiting for job to complete.");
                    } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            }
        });
        toolkit.adapt(this);
        toolkit.paintBordersFor(this);
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.netxforge.netxstudio.data.IDataServiceInjection#injectData()
     */
    public void injectData() {

        operatorsResource = editingService.getData(OperatorsPackage.Literals.OPERATOR);
        // rfsServiceResource = editingService
        // .getData(ServicesPackage.Literals.RFS_SERVICE);

        buildUI();
        initDataBindings_();
    }

    Thread updateDetails;

    protected void buildUI() {
        super.buildUI();

        Form monitoring = getScreenForm();
        monitoring.setText(this.getOperationText() + "Monitoring");
        Composite composite = toolkit.createComposite(monitoring.getBody(), SWT.NONE);
        toolkit.paintBordersFor(composite);
        composite.setLayout(new GridLayout(3, false));

        Label lblFilterLabel = toolkit.createLabel(composite, "Filter:", SWT.NONE);
        lblFilterLabel.setSize(64, 81);

        txtFilterText = toolkit.createText(composite, "New Text", SWT.H_SCROLL | SWT.SEARCH | SWT.CANCEL);
        GridData gd_txtFilterText = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
        // gd_txtFilterText.widthHint = 200;
        txtFilterText.setLayoutData(gd_txtFilterText);
        txtFilterText.setSize(64, 81);
        txtFilterText.setText("");

        txtFilterText.addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent ke) {
                monitoringTreeViewer.refresh();
                ViewerFilter[] filters = monitoringTreeViewer.getFilters();
                for (ViewerFilter viewerFilter : filters) {
                    if (viewerFilter instanceof TreeSearchFilter) {
                        ((TreeSearchFilter) viewerFilter).setSearchText(txtFilterText.getText());
                    }
                }
            }
        });

        monitoringTreeViewer = new TreeViewer(composite, SWT.BORDER | SWT.MULTI | SWT.VIRTUAL | SWT.READ_ONLY);
        monitoringTreeViewer.setUseHashlookup(true);
        monitoringTreeViewer.setComparer(new CDOElementComparer());

        monitoringTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                final ISelection s = event.getSelection();
                @SuppressWarnings("unused")
                final Object o;
                if (s instanceof IStructuredSelection) {
                    IStructuredSelection ss = (IStructuredSelection) s;
                    o = ss.getFirstElement();
                } else {
                    o = null;
                }
            }
        });

        Tree tree = monitoringTreeViewer.getTree();
        tree.setLinesVisible(true);
        tree.setHeaderVisible(true);
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 2));
        tree.setSize(74, 81);

        TreeViewerColumn treeViewerColumn_1 = new TreeViewerColumn(monitoringTreeViewer, SWT.NONE);

        TreeColumn trclmnName_1 = treeViewerColumn_1.getColumn();
        trclmnName_1.setWidth(300);
        trclmnName_1.setText("ID");
        trclmnName_1.setResizable(true);

        TreeViewerColumn treeViewerColumn_2 = new TreeViewerColumn(monitoringTreeViewer, SWT.NONE);
        TreeColumn trclmn_2 = treeViewerColumn_2.getColumn();
        trclmn_2.setWidth(50);
        trclmn_2.setResizable(true);

        TreeViewerColumn treeViewerColumn_3 = new TreeViewerColumn(monitoringTreeViewer, SWT.NONE);
        TreeColumn trclmn_3 = treeViewerColumn_3.getColumn();
        trclmn_3.setWidth(50);
        trclmn_3.setResizable(true);

        TreeViewerColumn treeViewerColumn_4 = new TreeViewerColumn(monitoringTreeViewer, SWT.NONE);
        TreeColumn trclmn_4 = treeViewerColumn_4.getColumn();
        trclmn_4.setWidth(50);
        trclmn_4.setResizable(true);

        toolkit.paintBordersFor(tree);

        monitoringTreeViewer.addFilter(new TreeSearchFilter());
    }

    private final List<IAction> actions = Lists.newArrayList();

    // private MonitoringAggregate monitoringAggregate;

    @Override
    public IAction[] getActions() {

        if (actions.isEmpty()) {
            actions.add(new UpdateMonitoringAction("Update status"));
            actions.add(new CleanMonitoringAction("Clear status"));
            actions.add(new SeparatorAction());
            actions.add(new ScheduleMonitorJobAction("Schedule Monitoring Job..."));
            actions.add(new MonitorNowAction("Monitor Now..."));
            actions.add(new SeparatorAction());
            actions.add(new ServiceMonitoringAction("Monitoring Result..."));
            actions.add(new SeparatorAction());
            actions.add(new SeparatorAction());
            actions.add(new ScheduleReportingJobAction("Schedule Reporting Job..."));
            actions.add(new ReportNowAction("Report Now..."));
            actions.add(new SeparatorAction());
        }

        return actions.toArray(new IAction[actions.size()]);
    }

    public void disposeData() {
        // N/A
    }

    public EMFDataBindingContext initDataBindings_() {

        EMFDataBindingContext bindingContext = new EMFDataBindingContext();

        super.initDataBindings_();

        // Set to one month ago...will be overwritten if state is available.
        getPeriodComponent().presetLastMonth();

        ObservableListTreeContentProvider cp = new ObservableListTreeContentProvider(
                new MonitoringTreeFactoryImpl(editingService.getEditingDomain()),
                new MonitoringTreeStructureAdvisorImpl());
        monitoringTreeViewer.setContentProvider(cp);
        IObservableSet set = cp.getKnownElements();

        List<IObservableMap> mapList = Lists.newArrayList();

        mapList.add(
                EMFEditProperties.value(editingService.getEditingDomain(), GenericsPackage.Literals.COMPANY__NAME)
                        .observeDetail(set));

        mapList.add(EMFEditProperties
                .value(editingService.getEditingDomain(), ServicesPackage.Literals.SERVICE__SERVICE_NAME)
                .observeDetail(set));

        mapList.add(EMFProperties.value(ServicesPackage.Literals.RFS_SERVICE__NODES).observeDetail(set));

        IObservableMap[] map = new IObservableMap[mapList.size()];
        mapList.toArray(map);

        monitoringTreeViewer.setLabelProvider(new MonitoringTreeLabelProvider(monitoringStateModel, map));

        IEMFListProperty projects = EMFEditProperties.resource(editingService.getEditingDomain());

        IObservableList servicesObservableList = projects.observe(operatorsResource);
        monitoringTreeViewer.setInput(servicesObservableList);

        // Monitoring Observable.
        // monitoringAggregate = new MonitoringAggregate(monitoringStateModel);

        // IViewerObservableValue observeSelection = ViewersObservables
        // .observeSingleSelection(monitoringTreeViewer);
        // observeSelection.addValueChangeListener(monitoringAggregate);

        return bindingContext;
    }

    /**
     * Maintains monitoring selection. Note: We don't have a period selector.
     */
    final class MonitoringAggregate extends AbstractMonitoringProcessor {

        public MonitoringAggregate(MonitoringStateModel monitoringStateModel) {
            super(monitoringStateModel);
        }

        /**
         * Track the last value change which corresponds to the selection.
         */
        private EObject lastSelection;

        public void handleValueChange(ValueChangeEvent event) {

            IObservable observable = event.getObservable();
            IObservableValue observableValue = event.getObservableValue();

            if (observable instanceof IViewerObservableValue) {

                IViewerObservableValue ivov = (IViewerObservableValue) observable;
                lastSelection = (EObject) ivov.getValue();
                if (ivov.getViewer() == monitoringTreeViewer) {
                    if (currentService != null) {
                        cleanResourceMon(currentService);
                    }
                    currentService = processServiceChange(observableValue);

                    updateResourceMon(lastSelection);
                }
            } else if (observable instanceof WritableValue) {
                processPeriodChange(observable);
                updateResourceMon(lastSelection);
            }
        }

        protected void updateValues(EObject target) {

            // Should update the whole subtree of a service.
            monitoringTreeViewer.refresh();
        }

        private Service processServiceChange(IObservableValue ob) {
            Service s = null;
            final Object value = ob.getValue();
            if (value instanceof Service) {
                s = (Service) value;
            }
            return s;
        }

        private void processPeriodChange(IObservable observable) {
            @SuppressWarnings("unused")
            Object value = ((WritableValue) observable).getValue();

        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.emf.common.ui.viewer.IViewerProvider#getViewer()
     */
    public Viewer getViewer() {

        return monitoringTreeViewer;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.netxforge.netxstudio.screens.editing.selector.IScreen#isValid()
     */
    public boolean isValid() {
        return true;
    }

    /**
     * Wrap in an action, to contribute to a menu manager.
     * 
     * @author Christophe Bouhier
     * 
     */
    class ServiceMonitoringAction extends Action {

        public ServiceMonitoringAction(String text) {
            super(text);
        }

        @Override
        public void run() {
            super.run();
            if (screenService != null) {
                ISelection selection = getViewer().getSelection();
                if (selection instanceof IStructuredSelection) {
                    Object o = ((IStructuredSelection) selection).getFirstElement();
                    ServiceMonitors smScreen = new ServiceMonitors(screenService.getScreenContainer(), SWT.NONE);
                    // CB 09-04-2012 Will prevent delete!
                    // smScreen.setOperation(ScreenUtil.OPERATION_READ_ONLY);
                    smScreen.setOperation(ScreenUtil.OPERATION_EDIT);
                    smScreen.setScreenService(screenService);
                    smScreen.injectData(null, o);
                    screenService.setActiveScreen(smScreen);
                }
            }
        }
    }

    class MonitorNowAction extends Action {
        public MonitorNowAction(String text) {
            super(text);
        }

        @Override
        public void run() {
            ISelection selection = getViewer().getSelection();
            if (selection instanceof IStructuredSelection) {
                WizardUtil.openWizard("com.netxforge.netxstudio.screens.monitoring",
                        (IStructuredSelection) selection);
            }
        }
    }

    class ReportNowAction extends Action {
        public ReportNowAction(String text) {
            super(text);
        }

        @Override
        public void run() {
            ISelection selection = getViewer().getSelection();
            if (selection instanceof IStructuredSelection) {
                WizardUtil.openWizard("com.netxforge.netxstudio.screens.reporting",
                        (IStructuredSelection) selection);
            }
        }
    }

    class ScheduleMonitorJobAction extends Action {
        public ScheduleMonitorJobAction(String text) {
            super(text);
        }

        @Override
        public void run() {
            if (screenService != null) {
                ISelection selection = getViewer().getSelection();
                if (selection instanceof IStructuredSelection) {
                    Object o = ((IStructuredSelection) selection).getFirstElement();
                    if (o instanceof Service) {

                        int operation = -1;

                        Resource jobResource = editingService.getData(SchedulingPackage.Literals.JOB);

                        Job job = StudioUtils.jobForSingleObject(jobResource,
                                SchedulingPackage.Literals.RFS_SERVICE_MONITORING_JOB,
                                SchedulingPackage.Literals.RFS_SERVICE_MONITORING_JOB__RFS_SERVICE, (Service) o);

                        // List<Job> matchingJobs = editingService
                        // .getDataService().getQueryService()
                        // .getJobWithService((Service) o);

                        // Edit or New if the Service has a job or not.
                        if (job != null) {
                            operation = ScreenUtil.OPERATION_EDIT;
                        } else {
                            operation = ScreenUtil.OPERATION_NEW;
                            job = SchedulingFactory.eINSTANCE.createRFSServiceMonitoringJob();
                            job.setName(((Service) o).getServiceName());
                            job.setInterval(NonModelUtils.SECONDS_IN_A_WEEK);
                            job.setStartTime(NonModelUtils.toXMLDate(NonModelUtils.todayAndNow()));
                            job.setJobState(JobState.IN_ACTIVE);
                            if (job instanceof RFSServiceMonitoringJob) {
                                ((RFSServiceMonitoringJob) job).setRFSService((RFSService) o);
                            }
                        }

                        NewEditJob newEditJob = new NewEditJob(screenService.getScreenContainer(), SWT.NONE);
                        newEditJob.setOperation(operation);
                        newEditJob.setScreenService(screenService);
                        newEditJob.injectData(jobResource, job);
                        screenService.setActiveScreen(newEditJob);
                    }
                }
            }
        }
    }

    class UpdateMonitoringAction extends Action {
        public UpdateMonitoringAction(String text) {
            super(text);
        }

        @Override
        public void run() {
            if (screenService != null) {
                ISelection selection = getViewer().getSelection();
                if (selection instanceof IStructuredSelection) {
                    Object o = ((IStructuredSelection) selection).getFirstElement();
                    monitoringStateModel.summary(MonitoringTree.this, o,
                            new IComputationContext[] { new ObjectContext<DateTimeRange>(getPeriod()) });
                }
            }
        }

        @Override
        public String getToolTipText() {
            return "Updates the RAG status for the selection";
        }
    }

    class CleanMonitoringAction extends Action {
        public CleanMonitoringAction(String text) {
            super(text);
        }

        @Override
        public void run() {
            // Clean all monitoring in this screen!
            EList<EObject> contents = operatorsResource.getContents();
            for (EObject eo : contents) {
                monitoringStateModel.clearSummary(eo);
            }
        }

        @Override
        public String getToolTipText() {
            return "Updates the RAG status for the selection";
        }
    }

    class ScheduleReportingJobAction extends Action {
        public ScheduleReportingJobAction(String text) {
            super(text);
        }

        @Override
        public void run() {
            ISelection selection = getViewer().getSelection();

            Resource jobResource = editingService.getData(SchedulingPackage.Literals.JOB);

            ScheduledReportSelectionWizard wizard = new ScheduledReportSelectionWizard();
            wizard.init(PlatformUI.getWorkbench(), (IStructuredSelection) selection);
            wizard.setEditingService(editingService);

            WizardDialog dialog = new WizardDialog(MonitoringTree.this.getShell(), wizard);
            dialog.open();
            Job job = wizard.getJob();

            NewEditJob newEditJob = new NewEditJob(screenService.getScreenContainer(), SWT.NONE);
            newEditJob.setOperation(wizard.getOperation());
            newEditJob.setScreenService(screenService);
            newEditJob.injectData(jobResource, job);
            screenService.setActiveScreen(newEditJob);
        }
    }

    public void callBackEvent(MonitoringStateEvent event) {
        Display.getDefault().asyncExec(new Runnable() {
            public void run() {
                monitoringTreeViewer.refresh();
            }
        });
    }
}