com.centurylink.mdw.plugin.designer.views.ProcessExplorerContentProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.centurylink.mdw.plugin.designer.views.ProcessExplorerContentProvider.java

Source

/*
 * Copyright (C) 2017 CenturyLink, Inc.
 *
 * Licensed 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 com.centurylink.mdw.plugin.designer.views;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;

import com.centurylink.mdw.common.utilities.timer.ProgressMonitor;
import com.centurylink.mdw.dataaccess.DataAccessOfflineException;
import com.centurylink.mdw.designer.DataUnavailableException;
import com.centurylink.mdw.plugin.MdwPlugin;
import com.centurylink.mdw.plugin.PluginMessages;
import com.centurylink.mdw.plugin.designer.SwtProgressMonitor;
import com.centurylink.mdw.plugin.designer.dialogs.MdwProgressMonitorDialog;
import com.centurylink.mdw.plugin.designer.model.ActivityImpl;
import com.centurylink.mdw.plugin.designer.model.AutomatedTestCase;
import com.centurylink.mdw.plugin.designer.model.AutomatedTestSuite;
import com.centurylink.mdw.plugin.designer.model.ElementChangeEvent;
import com.centurylink.mdw.plugin.designer.model.ElementChangeEvent.ChangeType;
import com.centurylink.mdw.plugin.designer.model.ElementChangeListener;
import com.centurylink.mdw.plugin.designer.model.ExternalEvent;
import com.centurylink.mdw.plugin.designer.model.File;
import com.centurylink.mdw.plugin.designer.model.Folder;
import com.centurylink.mdw.plugin.designer.model.LegacyExpectedResults;
import com.centurylink.mdw.plugin.designer.model.WorkflowAsset;
import com.centurylink.mdw.plugin.designer.model.WorkflowElement;
import com.centurylink.mdw.plugin.designer.model.WorkflowPackage;
import com.centurylink.mdw.plugin.designer.model.WorkflowProcess;
import com.centurylink.mdw.plugin.preferences.model.PreferenceConstants;
import com.centurylink.mdw.plugin.project.model.JdbcDataSource;
import com.centurylink.mdw.plugin.project.model.WorkflowProject;

public class ProcessExplorerContentProvider implements ITreeContentProvider, ElementChangeListener {
    private static Object[] EMPTY_ARRAY = new Object[0];

    private TreeViewer treeViewer;

    @SuppressWarnings("unchecked")
    public Object[] getElements(Object inputElement) {
        List<WorkflowProject> workflowProjects = (List<WorkflowProject>) inputElement;
        return workflowProjects.toArray(new WorkflowProject[0]);
    }

    public Object[] getChildren(Object parentElement) {
        if (parentElement instanceof WorkflowProject) {
            final WorkflowProject workflowProject = (WorkflowProject) parentElement;

            if (!workflowProject.isLoaded()) {
                try {
                    IRunnableWithProgress loader = new IRunnableWithProgress() {
                        public void run(IProgressMonitor monitor)
                                throws InvocationTargetException, InterruptedException {
                            ProgressMonitor progressMonitor = new SwtProgressMonitor(monitor);
                            progressMonitor.start("Loading " + workflowProject.getLabel());
                            progressMonitor.progress(5);
                            try {
                                workflowProject.initialize(progressMonitor);
                                if (workflowProject.getDataAccess() != null) {
                                    workflowProject.getTopLevelUserVisiblePackages(progressMonitor);
                                    workflowProject.getArchivedUserVisiblePackagesFolder(progressMonitor);
                                    progressMonitor.done();
                                }
                            } catch (Exception ex) {
                                throw new InvocationTargetException(ex);
                            }
                        }
                    };
                    ProgressMonitorDialog progMonDlg = new MdwProgressMonitorDialog(MdwPlugin.getShell());
                    progMonDlg.run(true, false, loader);
                } catch (InvocationTargetException itx) {
                    if (itx.getCause() instanceof DataUnavailableException) {
                        PluginMessages.log(itx);
                        MessageDialog.openWarning(MdwPlugin.getShell(), "Load Workflow Project",
                                itx.getCause().getMessage());
                    } else if (itx.getCause() instanceof DataAccessOfflineException) {
                        PluginMessages.log(itx);
                        MessageDialog.openError(MdwPlugin.getShell(), "Load Workflow Project",
                                itx.getCause().getMessage());
                        return new WorkflowPackage[0];
                    } else {
                        PluginMessages.uiError(itx, "Load Workflow Project", workflowProject);
                        return new WorkflowPackage[0];
                    }
                } catch (Exception ex) {
                    PluginMessages.uiError(ex, "Load Workflow Project", workflowProject);
                    return new WorkflowPackage[0];
                }
            }

            if (workflowProject.getDataAccess() == null)
                return new WorkflowPackage[0];

            List<WorkflowPackage> topLevelPackages = workflowProject.getTopLevelUserVisiblePackages();
            Folder archivedPackageFolder = workflowProject.getArchivedUserVisiblePackagesFolder();

            int size = topLevelPackages.size();
            boolean showArchived = isShowArchivedItems(workflowProject);
            if (showArchived)
                size++;

            AutomatedTestSuite testSuite = workflowProject.getLegacyTestSuite();
            if (testSuite != null && !testSuite.isEmpty())
                size++;

            Object[] objects = new Object[size];
            for (int i = 0; i < topLevelPackages.size(); i++)
                objects[i] = topLevelPackages.get(i);

            int cur = topLevelPackages.size();
            if (showArchived) {
                objects[cur] = archivedPackageFolder;
                cur++;
            }

            if (testSuite != null && !testSuite.isEmpty())
                objects[cur] = testSuite;

            return objects;
        } else if (parentElement instanceof WorkflowPackage) {
            WorkflowPackage packageVersion = (WorkflowPackage) parentElement;
            if (packageVersion.isArchived() && packageVersion.hasDescendantPackageVersions()) {
                return packageVersion.getDescendantPackageVersions().toArray(new WorkflowPackage[0]);
            } else {
                List<WorkflowElement> elements = new ArrayList<WorkflowElement>();
                IPreferenceStore prefsStore = MdwPlugin.getDefault().getPreferenceStore();

                if (!prefsStore.getBoolean(PreferenceConstants.PREFS_FILTER_PROCESSES_IN_PEX))
                    elements.addAll(packageVersion.getProcesses());
                if (!prefsStore.getBoolean(PreferenceConstants.PREFS_FILTER_WORKFLOW_ASSETS_IN_PEX))
                    elements.addAll(packageVersion.getAssets());
                if (!prefsStore.getBoolean(PreferenceConstants.PREFS_FILTER_EVENT_HANDLERS_IN_PEX))
                    elements.addAll(packageVersion.getExternalEvents());
                if (prefsStore.getBoolean(PreferenceConstants.PREFS_SHOW_ACTIVITY_IMPLEMENTORS_IN_PEX))
                    elements.addAll(packageVersion.getActivityImpls());
                if (!prefsStore.getBoolean(PreferenceConstants.PREFS_FILTER_TASK_TEMPLATES_IN_PEX))
                    elements.addAll(packageVersion.getTaskTemplates());
                elements.addAll(packageVersion.getChildFolders());

                if (isSortPackageContentsAtoZ()) {
                    Collections.sort(elements, new Comparator<WorkflowElement>() {
                        public int compare(WorkflowElement e1, WorkflowElement e2) {
                            return e1.getLabel().compareToIgnoreCase(e2.getLabel());
                        }
                    });
                }

                return elements.toArray(new Object[0]);
            }
        } else if (parentElement instanceof WorkflowProcess) {
            WorkflowProcess processVersion = (WorkflowProcess) parentElement;
            if (processVersion.hasDescendantProcessVersions()) {
                return processVersion.getDescendantProcessVersions().toArray(new WorkflowProcess[0]);
            } else {
                return EMPTY_ARRAY;
            }
        } else if (parentElement instanceof Folder) {
            Folder folder = (Folder) parentElement;
            return folder.getChildren().toArray(new WorkflowElement[0]);
        } else if (parentElement instanceof AutomatedTestSuite) {
            AutomatedTestSuite testSuite = (AutomatedTestSuite) parentElement;
            return testSuite.getTestCases().toArray(new AutomatedTestCase[0]);
        } else if (parentElement instanceof AutomatedTestCase) {
            AutomatedTestCase testCase = (AutomatedTestCase) parentElement;
            if (!testCase.isLegacy())
                return EMPTY_ARRAY;
            List<LegacyExpectedResults> expectedResults = testCase.getLegacyExpectedResults();
            List<File> files = testCase.getFiles();
            Object[] objects = new Object[expectedResults.size() + files.size()];
            for (int i = 0; i < expectedResults.size(); i++)
                objects[i] = expectedResults.get(i);
            for (int i = expectedResults.size(); i < objects.length; i++)
                objects[i] = files.get(i - expectedResults.size());
            return objects;
        } else {
            return EMPTY_ARRAY;
        }
    }

    public boolean isSortPackageContentsAtoZ() {
        IPreferenceStore prefsStore = MdwPlugin.getDefault().getPreferenceStore();
        return prefsStore.getBoolean(PreferenceConstants.PREFS_SORT_PACKAGE_CONTENTS_A_TO_Z);
    }

    public boolean isShowArchivedItems(WorkflowProject workflowProject) {
        if (workflowProject.isRemote() && workflowProject.isFilePersist()) {
            if (!workflowProject.getMdwVcsRepository().isSyncAssetArchive())
                return false;
        }
        IPreferenceStore prefsStore = MdwPlugin.getDefault().getPreferenceStore();
        return !prefsStore.getBoolean(PreferenceConstants.PREFS_FILTER_ARCHIVED_ITEMS_IN_PEX);
    }

    public Object getParent(Object element) {
        if (element instanceof WorkflowProject) {
            return null;
        } else if (element instanceof WorkflowPackage) {
            WorkflowPackage packageVersion = (WorkflowPackage) element;
            if (packageVersion.isArchived()) {
                if (packageVersion.isTopLevel())
                    return packageVersion.getArchivedFolder();
                else
                    return packageVersion.getTopLevelVersion();
            } else {
                return packageVersion.getProject();
            }
        } else if (element instanceof WorkflowProcess) {
            WorkflowProcess processVersion = (WorkflowProcess) element;
            if (processVersion.isTopLevel()) {
                if (processVersion.getPackage() != null)
                    return processVersion.getPackage();
                else
                    return processVersion.getProject().getDefaultPackage();
            } else {
                return processVersion.getTopLevelVersion();
            }
        } else if (element instanceof Folder) {
            Folder folder = (Folder) element;
            return folder.getProject();
        } else if (element instanceof ExternalEvent) {
            ExternalEvent externalEvent = (ExternalEvent) element;
            if (externalEvent.isInDefaultPackage())
                return externalEvent.getProject().getDefaultPackage();
            else
                return externalEvent.getPackage();
        } else if (element instanceof WorkflowAsset) {
            WorkflowAsset asset = (WorkflowAsset) element;
            if (asset.isInDefaultPackage())
                return asset.getProject().getDefaultPackage();
            else
                return asset.getPackage();
        } else if (element instanceof AutomatedTestSuite) {
            AutomatedTestSuite testSuite = (AutomatedTestSuite) element;
            return testSuite.getProject();
        } else if (element instanceof AutomatedTestCase) {
            AutomatedTestCase testCase = (AutomatedTestCase) element;
            if (testCase.isLegacy())
                return testCase.getTestSuite();
        } else if (element instanceof LegacyExpectedResults) {
            LegacyExpectedResults expectedResult = (LegacyExpectedResults) element;
            return expectedResult.getTestCase();
        } else if (element instanceof File) {
            File file = (File) element;
            return file.getParent();
        }
        return null;
    }

    public boolean hasChildren(Object element) {
        if (element instanceof WorkflowProject) {
            return true;
        } else if (element instanceof WorkflowPackage) {
            WorkflowPackage packageVersion = (WorkflowPackage) element;
            IPreferenceStore prefsStore = MdwPlugin.getDefault().getPreferenceStore();
            return packageVersion.hasDescendantPackageVersions()
                    || (packageVersion.hasProcesses()
                            && !prefsStore.getBoolean(PreferenceConstants.PREFS_FILTER_PROCESSES_IN_PEX))
                    || (packageVersion.hasAssets()
                            && !prefsStore.getBoolean(PreferenceConstants.PREFS_FILTER_WORKFLOW_ASSETS_IN_PEX))
                    || (packageVersion.hasExternalEvents()
                            && !prefsStore.getBoolean(PreferenceConstants.PREFS_FILTER_EVENT_HANDLERS_IN_PEX))
                    || (packageVersion.hasActivityImpls()
                            && prefsStore.getBoolean(PreferenceConstants.PREFS_SHOW_ACTIVITY_IMPLEMENTORS_IN_PEX))
                    || (packageVersion.hasTaskTemplates()
                            && !prefsStore.getBoolean(PreferenceConstants.PREFS_FILTER_TASK_TEMPLATES_IN_PEX))
                    || packageVersion.hasChildFolders();
        } else if (element instanceof WorkflowProcess) {
            WorkflowProcess processVersion = (WorkflowProcess) element;
            return processVersion.hasDescendantProcessVersions();
        } else if (element instanceof Folder) {
            Folder packageFolder = (Folder) element;
            return packageFolder.hasChildren();
        } else if (element instanceof AutomatedTestSuite) {
            AutomatedTestSuite testSuite = (AutomatedTestSuite) element;
            return testSuite.getTestCases().size() > 0;
        } else if (element instanceof AutomatedTestCase) {
            AutomatedTestCase testCase = (AutomatedTestCase) element;
            return testCase.isLegacy() && testCase.getLegacyExpectedResults().size() > 0
                    || testCase.getFiles().size() > 0;
        } else {
            return false;
        }
    }

    public void dispose() {
        dispose(treeViewer.getInput());
    }

    private void dispose(Object element) {
        if (element instanceof WorkflowElement)
            ((WorkflowElement) element).dispose();
        for (Object child : getChildren(element))
            dispose(child);
    }

    /**
     * Registers this content provider as a listener to changes on the new input
     * (for workflow element changes), and deregisters the viewer from the old
     * input. In response to these ElementChangeEvents, we update the viewer.
     *
     * For now we are only listening for changes to top level processes and
     * packages as well as definition documents such as scripts, templates and
     * pages.
     */
    @SuppressWarnings("unchecked")
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        this.treeViewer = (TreeViewer) viewer;
        viewer.setSelection(null);

        if (newInput != oldInput) {
            if (oldInput != null) {
                List<WorkflowProject> oldProjects = (List<WorkflowProject>) oldInput;
                for (WorkflowProject oldProject : oldProjects)
                    oldProject.removeElementChangeListener(this);
            }
            if (newInput != null) {
                List<WorkflowProject> newProjects = (List<WorkflowProject>) newInput;
                for (WorkflowProject newProject : newProjects)
                    newProject.addElementChangeListener(this);
            }
        }
    }

    public void elementChanged(final ElementChangeEvent ece) {
        if (!treeViewer.getTree().isDisposed()) {
            // updates to the treeViewer must be on the UI thread
            treeViewer.getTree().getDisplay().asyncExec(new Runnable() {
                public void run() {
                    handleElementChange(ece);
                }
            });
        }
    }

    private void handleElementChange(ElementChangeEvent ece) {
        if (ece.getChangeType().equals(ChangeType.ELEMENT_CREATE)) {
            Object parent = getParent(ece.getElement());
            if (parent == null) {
                treeViewer.refresh(true);
                ece.getElement().addElementChangeListener(this);
            } else {
                treeViewer.refresh(parent, true);
            }
            treeViewer.expandToLevel(ece.getElement(), 0);
            treeViewer.setSelection(ece.getElement());
        } else if (ece.getChangeType().equals(ChangeType.ELEMENT_DELETE)) {
            Object parent = getParent(ece.getElement());
            if (parent != null) {
                if (ece.getElement() instanceof ActivityImpl)
                    treeViewer.refresh(); // impl can be associated with
                                          // multiple packages
                else
                    treeViewer.refresh(parent, true);
            } else {
                // must be a workflowProject
                ece.getElement().removeElementChangeListener(this);
                treeViewer.refresh();
            }
        } else if (ece.getChangeType().equals(ChangeType.RENAME)) {
            treeViewer.refresh(ece.getElement(), true);
            treeViewer.getControl().forceFocus();
        } else if (ece.getChangeType().equals(ChangeType.VERSION_CHANGE)) {
            treeViewer.refresh(ece.getElement(), true);
            if (ece.getElement() instanceof WorkflowPackage)
                treeViewer.refresh(ece.getElement().getProject().getArchivedUserVisiblePackagesFolder(), true);
        } else if (ece.getChangeType().equals(ChangeType.LABEL_CHANGE)) {
            treeViewer.update(ece.getElement(), null);
        } else if (ece.getChangeType().equals(ChangeType.SETTINGS_CHANGE)) {
            // only applies for workflow projects
            if (ece.getElement() instanceof WorkflowProject) {
                WorkflowProject workflowProject = (WorkflowProject) ece.getElement();
                if (ece.getNewValue() instanceof JdbcDataSource) {
                    treeViewer.collapseToLevel(workflowProject, TreeViewer.ALL_LEVELS);
                    treeViewer.refresh(workflowProject, true);
                } else if (ece.getNewValue() == null) {
                    // general refresh
                    treeViewer.refresh(workflowProject, true);
                }
            } else {
                treeViewer.refresh(ece.getElement(), true);
            }
        } else if (ece.getChangeType().equals(ChangeType.STATUS_CHANGE)) {
            treeViewer.update(ece.getElement(), null);
            if (ece.getElement() instanceof AutomatedTestCase) {
                AutomatedTestCase testCase = (AutomatedTestCase) ece.getElement();
                Object testResults;
                if (testCase.isLegacy())
                    testResults = testCase.getLegacyExpectedResults();
                else
                    testResults = testCase.getExpectedResults();
                if (testResults != null)
                    treeViewer.refresh(testResults, true);
            }
        }
    }
}