Java tutorial
/* * 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.actions; import java.awt.EventQueue; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.net.ConnectException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import javax.swing.JFrame; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.jface.dialogs.Dialog; 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.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.search.ui.ISearchPageContainer; import org.eclipse.search.ui.ISearchResultViewPart; import org.eclipse.search.ui.NewSearchUI; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWizard; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.part.FileEditorInput; import com.centurylink.mdw.designer.pages.FormPanel; import com.centurylink.mdw.model.FormDataDocument; import com.centurylink.mdw.plugin.MdwPlugin; import com.centurylink.mdw.plugin.PluginMessages; import com.centurylink.mdw.plugin.PluginUtil; import com.centurylink.mdw.plugin.ProcessConsoleRunner; import com.centurylink.mdw.plugin.actions.WebLaunchActions.WebApp; import com.centurylink.mdw.plugin.actions.WebLaunchActions.WebLaunchAction; import com.centurylink.mdw.plugin.ant.TestResultsFormatter; import com.centurylink.mdw.plugin.codegen.activity.ActivityWizard; import com.centurylink.mdw.plugin.codegen.activity.AdapterActivityWizard; import com.centurylink.mdw.plugin.codegen.activity.EvaluatorActivityWizard; import com.centurylink.mdw.plugin.codegen.activity.StartActivityWizard; import com.centurylink.mdw.plugin.codegen.event.CamelNotifyHandlerWizard; import com.centurylink.mdw.plugin.codegen.event.CamelProcessHandlerWizard; import com.centurylink.mdw.plugin.codegen.event.EventHandlerWizard; import com.centurylink.mdw.plugin.designer.DesignerProxy; import com.centurylink.mdw.plugin.designer.DesignerRunner.RunnerStatus; import com.centurylink.mdw.plugin.designer.dialogs.ActivityImplDeleteDialog; import com.centurylink.mdw.plugin.designer.dialogs.ExportAsDialog; import com.centurylink.mdw.plugin.designer.dialogs.MdwListInputDialog; import com.centurylink.mdw.plugin.designer.dialogs.MdwProgressMonitorDialog; import com.centurylink.mdw.plugin.designer.dialogs.PackageDeleteDialog; import com.centurylink.mdw.plugin.designer.dialogs.ProcessDeleteDialog; import com.centurylink.mdw.plugin.designer.dialogs.RenameDialog; import com.centurylink.mdw.plugin.designer.dialogs.SetVersionDialog; import com.centurylink.mdw.plugin.designer.dialogs.TemplateRunDialog; import com.centurylink.mdw.plugin.designer.dialogs.WorkflowElementDeleteDialog; import com.centurylink.mdw.plugin.designer.editors.ProcessEditor; import com.centurylink.mdw.plugin.designer.model.Activity; import com.centurylink.mdw.plugin.designer.model.Activity.AdapterActivity; import com.centurylink.mdw.plugin.designer.model.Activity.EvaluatorActivity; import com.centurylink.mdw.plugin.designer.model.Activity.StartActivity; import com.centurylink.mdw.plugin.designer.model.ActivityImpl; import com.centurylink.mdw.plugin.designer.model.AutomatedTestCase; import com.centurylink.mdw.plugin.designer.model.AutomatedTestResults; import com.centurylink.mdw.plugin.designer.model.AutomatedTestSuite; import com.centurylink.mdw.plugin.designer.model.CamelRoute; import com.centurylink.mdw.plugin.designer.model.ElementChangeEvent.ChangeType; import com.centurylink.mdw.plugin.designer.model.ExternalEvent; import com.centurylink.mdw.plugin.designer.model.JarFile; import com.centurylink.mdw.plugin.designer.model.JavaSource; import com.centurylink.mdw.plugin.designer.model.Json; import com.centurylink.mdw.plugin.designer.model.LegacyExpectedResults; import com.centurylink.mdw.plugin.designer.model.Page; import com.centurylink.mdw.plugin.designer.model.Report; import com.centurylink.mdw.plugin.designer.model.Rule; import com.centurylink.mdw.plugin.designer.model.Script; import com.centurylink.mdw.plugin.designer.model.SpringConfig; import com.centurylink.mdw.plugin.designer.model.TaskTemplate; import com.centurylink.mdw.plugin.designer.model.Template; import com.centurylink.mdw.plugin.designer.model.TextResource; import com.centurylink.mdw.plugin.designer.model.WebResource; import com.centurylink.mdw.plugin.designer.model.WordDoc; import com.centurylink.mdw.plugin.designer.model.WorkflowAsset; import com.centurylink.mdw.plugin.designer.model.WorkflowAsset.AssetWorkbenchListener; import com.centurylink.mdw.plugin.designer.model.WorkflowAssetFactory; 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.designer.model.XmlDoc; import com.centurylink.mdw.plugin.designer.views.MyTasksView; import com.centurylink.mdw.plugin.designer.views.ProcessExplorerDropTarget; import com.centurylink.mdw.plugin.designer.views.ProcessHierarchyView; import com.centurylink.mdw.plugin.designer.views.ProcessInstanceListView; import com.centurylink.mdw.plugin.designer.views.ProcessLaunchView; import com.centurylink.mdw.plugin.designer.wizards.ExportAssetWizard; import com.centurylink.mdw.plugin.designer.wizards.ExportAttributesWizard; import com.centurylink.mdw.plugin.designer.wizards.ExportPackageWizard; import com.centurylink.mdw.plugin.designer.wizards.ExportProcessWizard; import com.centurylink.mdw.plugin.designer.wizards.ExportProjectWizard; import com.centurylink.mdw.plugin.designer.wizards.ExportTaskTemplatesWizard; import com.centurylink.mdw.plugin.designer.wizards.ImportAssetWizard; import com.centurylink.mdw.plugin.designer.wizards.ImportAttributesWizard; import com.centurylink.mdw.plugin.designer.wizards.ImportPackageWizard; import com.centurylink.mdw.plugin.designer.wizards.ImportProcessWizard; import com.centurylink.mdw.plugin.designer.wizards.ImportProjectWizard; import com.centurylink.mdw.plugin.designer.wizards.ImportTaskTemplatesWizard; import com.centurylink.mdw.plugin.designer.wizards.NewCamelRouteWizard; import com.centurylink.mdw.plugin.designer.wizards.NewJarFileWizard; import com.centurylink.mdw.plugin.designer.wizards.NewJavaWizard; import com.centurylink.mdw.plugin.designer.wizards.NewJsonWizard; import com.centurylink.mdw.plugin.designer.wizards.NewPackageWizard; import com.centurylink.mdw.plugin.designer.wizards.NewPageWizard; import com.centurylink.mdw.plugin.designer.wizards.NewProcessWizard; import com.centurylink.mdw.plugin.designer.wizards.NewReportWizard; import com.centurylink.mdw.plugin.designer.wizards.NewRuleWizard; import com.centurylink.mdw.plugin.designer.wizards.NewScriptWizard; import com.centurylink.mdw.plugin.designer.wizards.NewSpringConfigWizard; import com.centurylink.mdw.plugin.designer.wizards.NewTaskTemplateWizard; import com.centurylink.mdw.plugin.designer.wizards.NewTemplateWizard; import com.centurylink.mdw.plugin.designer.wizards.NewTestCaseWizard; import com.centurylink.mdw.plugin.designer.wizards.NewTextResourceWizard; import com.centurylink.mdw.plugin.designer.wizards.NewWebResourceWizard; import com.centurylink.mdw.plugin.designer.wizards.NewWordDocWizard; import com.centurylink.mdw.plugin.designer.wizards.NewXmlDocWizard; import com.centurylink.mdw.plugin.designer.wizards.NewYamlWizard; import com.centurylink.mdw.plugin.launch.ActivityLaunchShortcut; import com.centurylink.mdw.plugin.launch.AutomatedTestLaunchShortcut; import com.centurylink.mdw.plugin.launch.ExternalEventLaunchShortcut; import com.centurylink.mdw.plugin.launch.ProcessLaunchShortcut; import com.centurylink.mdw.plugin.preferences.model.PreferenceConstants; import com.centurylink.mdw.plugin.project.LocalCloudProjectWizard; import com.centurylink.mdw.plugin.project.RemoteWorkflowProjectWizard; import com.centurylink.mdw.plugin.project.WorkflowProjectManager; import com.centurylink.mdw.plugin.project.model.ServerSettings; import com.centurylink.mdw.plugin.project.model.VcsRepository; import com.centurylink.mdw.plugin.project.model.WorkflowProject; import com.centurylink.mdw.plugin.search.ProcessSearchQuery; import com.centurylink.mdw.plugin.search.SearchQuery; import com.centurylink.mdw.plugin.search.SearchResultsPage; import com.centurylink.mdw.plugin.server.ServerConfigurator; import com.centurylink.mdw.plugin.server.ServerRunner; /** * Handles the actions that can be performed on various workflow model objects. * All access should be in the context of the SWT UI thread. */ public class WorkflowElementActionHandler { public static final String REFRESH_CACHES = "refreshCaches"; public static final String STUB_SERVER = "stubServer"; public static final String LOG_WATCHER = "logWatcher"; public static final String EVT_HANDLER_FILE_EXTENSION = ".evth"; public void create(Class<? extends WorkflowElement> elementClass, WorkflowElement element) { if (elementClass.equals(WorkflowElement.class)) launchWizard(new LocalCloudProjectWizard(), element); else if (elementClass.equals(WorkflowProject.class)) launchWizard(new RemoteWorkflowProjectWizard(), element); else if (elementClass.equals(WorkflowPackage.class)) launchWizard(new NewPackageWizard(), element); else if (elementClass.equals(WorkflowProcess.class)) launchWizard(new NewProcessWizard(), element); else if (elementClass.equals(StartActivity.class)) launchWizard(new StartActivityWizard(), element); else if (elementClass.equals(AdapterActivity.class)) launchWizard(new AdapterActivityWizard(), element); else if (elementClass.equals(EvaluatorActivity.class)) launchWizard(new EvaluatorActivityWizard(), element); else if (elementClass.equals(Activity.class)) launchWizard(new ActivityWizard(), element); else if (elementClass.equals(ExternalEvent.class)) launchWizard(new EventHandlerWizard(), element); else if (elementClass.equals(ExternalEvent.CamelProcessLaunch.class)) launchWizard(new CamelProcessHandlerWizard(), element); else if (elementClass.equals(ExternalEvent.CamelEventNotify.class)) launchWizard(new CamelNotifyHandlerWizard(), element); else if (elementClass.equals(Page.class)) launchWizard(new NewPageWizard(), element); else if (elementClass.equals(Report.class)) launchWizard(new NewReportWizard(), element); else if (elementClass.equals(Rule.class)) launchWizard(new NewRuleWizard(), element); else if (elementClass.equals(WordDoc.class)) launchWizard(new NewWordDocWizard(), element); else if (elementClass.equals(Script.class)) launchWizard(new NewScriptWizard(), element); else if (elementClass.equals(JavaSource.class)) launchWizard(new NewJavaWizard(), element); else if (elementClass.equals(CamelRoute.class)) launchWizard(new NewCamelRouteWizard(), element); else if (elementClass.equals(Template.class)) launchWizard(new NewTemplateWizard(), element); else if (elementClass.equals(WebResource.class)) launchWizard(new NewWebResourceWizard(), element); else if (elementClass.equals(SpringConfig.class)) launchWizard(new NewSpringConfigWizard(), element); else if (elementClass.equals(JarFile.class)) launchWizard(new NewJarFileWizard(), element); else if (elementClass.equals(AutomatedTestCase.class)) launchWizard(new NewTestCaseWizard(), element); else if (elementClass.equals(AutomatedTestResults.class)) launchWizard(new NewYamlWizard(), element); else if (elementClass.equals(Json.class)) launchWizard(new NewJsonWizard(), element); else if (elementClass.equals(TaskTemplate.class)) launchWizard(new NewTaskTemplateWizard(), element); else if (elementClass.equals(TextResource.class)) launchWizard(new NewTextResourceWizard(), element); else if (elementClass.equals(XmlDoc.class)) launchWizard(new NewXmlDocWizard(), element); } private void launchWizard(IWorkbenchWizard wizard, WorkflowElement element) { wizard.init(getWorkbench(), element); new WizardDialog(getShell(), wizard).open(); } public boolean open(WorkflowElement element) { if (element instanceof WorkflowProcess) { WorkflowProcess processVersion = (WorkflowProcess) element; try { ProcessEditor processEditor = (ProcessEditor) getPage().openEditor(processVersion, "mdw.editors.process"); showPropertiesView(); processEditor.setFocus(); } catch (PartInitException ex) { PluginMessages.uiError(getShell(), ex, "Open Process", processVersion.getProject()); } } else if (element instanceof AutomatedTestCase && ((AutomatedTestCase) element).isLegacy()) { // open the old way instead of as workflow asset AutomatedTestCase testCase = (AutomatedTestCase) element; IFile file = testCase.getCommandsFile(); IWorkbenchPage activePage = MdwPlugin.getActivePage(); try { IDE.openEditor(activePage, file, true); } catch (PartInitException ex) { PluginMessages.uiError(ex, "Open Test Case", testCase.getProject()); } } else if (element instanceof WorkflowAsset) { WorkflowAsset asset = (WorkflowAsset) element; asset.openFile(new NullProgressMonitor()); } else if (element instanceof LegacyExpectedResults) { LegacyExpectedResults expectedResult = (LegacyExpectedResults) element; IFile file = expectedResult.getExpectedResult(); IWorkbenchPage activePage = MdwPlugin.getActivePage(); try { IDE.openEditor(activePage, file, true); } catch (PartInitException ex) { PluginMessages.uiError(ex, "Open Expected Result", expectedResult.getProject()); } } else if (element instanceof com.centurylink.mdw.plugin.designer.model.File) { com.centurylink.mdw.plugin.designer.model.File file = (com.centurylink.mdw.plugin.designer.model.File) element; IFile workspaceFile = file.getWorkspaceFile(); IWorkbenchPage activePage = MdwPlugin.getActivePage(); try { IDE.openEditor(activePage, workspaceFile, true); } catch (PartInitException ex) { PluginMessages.uiError(ex, "Open File", file.getProject()); } } else if (element instanceof ExternalEvent) { ExternalEvent event = (ExternalEvent) element; IFile file = event.getProject().getAssetFolder() .getFolder(event.getPackage().getName().replace('.', '/')) .getFile(event.getName() + EVT_HANDLER_FILE_EXTENSION); IWorkbenchPage activePage = MdwPlugin.getActivePage(); try { IDE.openEditor(activePage, file, true); } catch (PartInitException ex) { PluginMessages.uiError(ex, "Open File", event.getProject()); } } else { return false; } return true; } public void refresh(WorkflowElement element) { if (element instanceof WorkflowProject) { final WorkflowProject workflowProject = (WorkflowProject) element; workflowProject.clear(); workflowProject.fireElementChangeEvent(workflowProject, ChangeType.SETTINGS_CHANGE, null); BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() { public void run() { if (!workflowProject.isFilePersist()) syncOpenEditors(workflowProject); } }); } else if (element instanceof AutomatedTestSuite) { AutomatedTestSuite testSuite = (AutomatedTestSuite) element; testSuite.readLegacyCases(); testSuite.fireElementChangeEvent(testSuite, ChangeType.SETTINGS_CHANGE, null); } else if (element instanceof AutomatedTestCase) { AutomatedTestCase testCase = (AutomatedTestCase) element; testCase.setTestCase(testCase.getTestCase()); testCase.fireElementChangeEvent(testCase, ChangeType.SETTINGS_CHANGE, null); } } public void update(WorkflowElement element) { if (element instanceof WorkflowPackage) { WorkflowPackage packageVersion = (WorkflowPackage) element; if (MessageDialog.openConfirm(getShell(), "Update Package", "Bring latest versions of Processes and Workflow Assets into package '" + packageVersion.getLabel() + "'?")) { packageVersion.getProject().getDesignerProxy().updateProcessesAndAssetsToLatest(packageVersion); packageVersion.fireElementChangeEvent(packageVersion, ChangeType.SETTINGS_CHANGE, null); } } } public void serverAction(WorkflowElement element, String action) { if (element instanceof WorkflowProject) { WorkflowProject project = (WorkflowProject) element; if (action.equals(REFRESH_CACHES)) project.getDesignerProxy().getCacheRefresh().doRefresh(false); else if (action.equals(STUB_SERVER)) project.getDesignerProxy().toggleStubServer(); else if (action.equals(LOG_WATCHER)) { // TODO } } } public void run(Object element) { if (element instanceof WorkflowProcess) { WorkflowProcess processVersion = (WorkflowProcess) element; IEditorPart editorPart = findOpenEditor(processVersion); if (editorPart != null && editorPart.isDirty()) { if (MessageDialog.openQuestion(getShell(), "Process Launch", "Save process '" + processVersion.getLabel() + "' before launching?")) editorPart.doSave(new NullProgressMonitor()); } if (MdwPlugin.getDefault().getPreferenceStore() .getBoolean(PreferenceConstants.PREFS_WEB_BASED_PROCESS_LAUNCH)) { // web-based process launch try { IViewPart viewPart = getPage().showView("mdw.views.designer.process.launch"); if (viewPart != null) { ProcessLaunchView launchView = (ProcessLaunchView) viewPart; launchView.setProcess(processVersion); } } catch (PartInitException ex) { PluginMessages.log(ex); } } else { if (editorPart == null) { // process must be open open((WorkflowElement) element); } ProcessLaunchShortcut launchShortcut = new ProcessLaunchShortcut(); launchShortcut.launch(new StructuredSelection(processVersion), ILaunchManager.RUN_MODE); } } else if (element instanceof Activity) { Activity activity = (Activity) element; WorkflowProcess processVersion = activity.getProcess(); IEditorPart editorPart = findOpenEditor(processVersion); if (editorPart != null && editorPart.isDirty()) { if (MessageDialog.openQuestion(getShell(), "Activity Launch", "Save process '" + processVersion.getLabel() + "' before launching?")) editorPart.doSave(new NullProgressMonitor()); } ActivityLaunchShortcut launchShortcut = new ActivityLaunchShortcut(); launchShortcut.launch(new StructuredSelection(activity), ILaunchManager.RUN_MODE); } else if (element instanceof ExternalEvent) { ExternalEvent externalEvent = (ExternalEvent) element; ExternalEventLaunchShortcut launchShortcut = new ExternalEventLaunchShortcut(); launchShortcut.launch(new StructuredSelection(externalEvent), ILaunchManager.RUN_MODE); } else if (element instanceof Template) { Template template = (Template) element; IEditorPart editorPart = template.getFileEditor(); if (editorPart != null && editorPart.isDirty()) { if (MessageDialog.openQuestion(getShell(), "Run Template", "Save template '" + template.getName() + "' before running?")) editorPart.doSave(new NullProgressMonitor()); } template.openFile(new NullProgressMonitor()); new TemplateRunDialog(getShell(), template).open(); } else if (element instanceof Page) { Page page = (Page) element; IEditorPart editorPart = page.getFileEditor(); if (editorPart != null) { if (editorPart.isDirty()) { if (MessageDialog.openQuestion(getShell(), "Run Page", "Save page '" + page.getName() + "' before running?")) editorPart.doSave(new NullProgressMonitor()); } } page.run(); } else if (element instanceof WorkflowProject || element instanceof ServerSettings) { ServerSettings serverSettings; if (element instanceof WorkflowProject) { WorkflowProject workflowProject = (WorkflowProject) element; if (workflowProject.isRemote()) throw new IllegalArgumentException("Cannot run server for remote projects."); serverSettings = workflowProject.getServerSettings(); } else { serverSettings = (ServerSettings) element; } if (ServerRunner.isServerRunning()) { String question = "A server may be running already. Shut down the currently-running server?"; MessageDialog dlg = new MessageDialog(getShell(), "Server Running", null, question, MessageDialog.QUESTION_WITH_CANCEL, new String[] { "Shutdown", "Ignore", "Cancel" }, 0); int res = dlg.open(); if (res == 0) new ServerRunner(serverSettings, getShell().getDisplay()).stop(); else if (res == 2) return; } if (serverSettings.getHome() == null && element instanceof WorkflowProject) { final IProject project = serverSettings.getProject().isCloudProject() ? serverSettings.getProject().getSourceProject() : serverSettings.getProject().getEarProject(); @SuppressWarnings("restriction") org.eclipse.ui.internal.dialogs.PropertyDialog dialog = org.eclipse.ui.internal.dialogs.PropertyDialog .createDialogOn(getShell(), "mdw.workflow.mdwServerConnectionsPropertyPage", project); if (dialog != null) dialog.open(); } else { IPreferenceStore prefStore = MdwPlugin.getDefault().getPreferenceStore(); if (element instanceof WorkflowProject) prefStore.setValue(PreferenceConstants.PREFS_SERVER_WF_PROJECT, ((WorkflowProject) element).getName()); else prefStore.setValue(PreferenceConstants.PREFS_RUNNING_SERVER, serverSettings.getServerName()); ServerRunner runner = new ServerRunner(serverSettings, getShell().getDisplay()); if (serverSettings.getProject() != null) runner.setJavaProject(serverSettings.getProject().getJavaProject()); runner.start(); } } } public void runFromPage(WorkflowElement element) { if (element instanceof WorkflowProcess) { WorkflowProcess processVersion = (WorkflowProcess) element; IEditorPart editorPart = findOpenEditor(processVersion); if (editorPart != null && editorPart.isDirty()) { if (MessageDialog.openQuestion(getShell(), "Process Launch", "Save process '" + processVersion.getLabel() + "' before launching?")) editorPart.doSave(new NullProgressMonitor()); } WebApp webapp = WebApp.TaskManager; if (element.getProject().checkRequiredVersion(5, 5) && !processVersion.isCompatibilityRendering()) webapp = WebApp.MdwHub; WebLaunchAction launchAction = WebLaunchActions.getLaunchAction(element.getProject(), webapp); String urlPath = "/start.jsf?process=" + processVersion.getName(); if (webapp.equals(WebApp.MdwHub)) { urlPath = urlPath + "&processVersion=" + processVersion.getVersion(); } launchAction.launch(element.getProject(), urlPath); } } public void debug(Object element) { if (element instanceof WorkflowProcess) { WorkflowProcess processVersion = (WorkflowProcess) element; IEditorPart editorPart = findOpenEditor(processVersion); if (editorPart != null && editorPart.isDirty()) { if (MessageDialog.openQuestion(getShell(), "Process Launch", "Save process '" + processVersion.getLabel() + "' before launching?")) editorPart.doSave(new NullProgressMonitor()); } if (editorPart == null) { // process must be open open(processVersion); } ProcessLaunchShortcut launchShortcut = new ProcessLaunchShortcut(); launchShortcut.launch(new StructuredSelection(processVersion), ILaunchManager.DEBUG_MODE); } else if (element instanceof Activity) { Activity activity = (Activity) element; WorkflowProcess processVersion = activity.getProcess(); IEditorPart editorPart = findOpenEditor(processVersion); if (editorPart != null && editorPart.isDirty()) { if (MessageDialog.openQuestion(getShell(), "Activity Launch", "Save process '" + processVersion.getLabel() + "' before launching?")) editorPart.doSave(new NullProgressMonitor()); } ActivityLaunchShortcut launchShortcut = new ActivityLaunchShortcut(); launchShortcut.launch(new StructuredSelection(activity), ILaunchManager.DEBUG_MODE); } else if (element instanceof ExternalEvent) { ExternalEvent externalEvent = (ExternalEvent) element; ExternalEventLaunchShortcut launchShortcut = new ExternalEventLaunchShortcut(); launchShortcut.launch(new StructuredSelection(externalEvent), ILaunchManager.DEBUG_MODE); } else if (element instanceof WorkflowProject || element instanceof ServerSettings) { ServerSettings serverSettings; if (element instanceof WorkflowProject) { WorkflowProject workflowProject = (WorkflowProject) element; serverSettings = workflowProject.getServerSettings(); } else { serverSettings = (ServerSettings) element; } serverSettings.setDebug(true); if (serverSettings.getDebugPort() == 0) serverSettings.setDebugPort(8500); run(serverSettings); } } public void clientShell(Object element) { ServerSettings serverSettings; if (element instanceof WorkflowProject || element instanceof ServerSettings) { if (element instanceof WorkflowProject) { WorkflowProject workflowProject = (WorkflowProject) element; serverSettings = workflowProject.getServerSettings(); MdwPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.PREFS_SERVER_WF_PROJECT, workflowProject.getName()); } else { serverSettings = (ServerSettings) element; MdwPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.PREFS_RUNNING_SERVER, serverSettings.getServerName()); } ServerConfigurator configurator = ServerConfigurator.Factory.create(serverSettings); configurator.doClientShell(getShell()); } } public void deploy(Object element) { if (element instanceof WorkflowProject || element instanceof ServerSettings) { ServerSettings serverSettings; if (element instanceof WorkflowProject) { WorkflowProject workflowProject = (WorkflowProject) element; serverSettings = workflowProject.getServerSettings(); MdwPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.PREFS_SERVER_WF_PROJECT, workflowProject.getName()); } else { serverSettings = (ServerSettings) element; MdwPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.PREFS_RUNNING_SERVER, serverSettings.getServerName()); } ServerConfigurator configurator = ServerConfigurator.Factory.create(serverSettings); configurator.doDeploy(getShell()); } } public void stop(Object element) { if (element instanceof WorkflowProject || element instanceof ServerSettings) { ServerSettings serverSettings; if (element instanceof WorkflowProject) { WorkflowProject workflowProject = (WorkflowProject) element; serverSettings = workflowProject.getServerSettings(); } else { serverSettings = (ServerSettings) element; } ServerRunner runner = new ServerRunner(serverSettings, getShell().getDisplay()); runner.stop(); } } public void delete(WorkflowElement[] elements) { boolean globalConf = false; boolean includeInstances = false; if (elements.length > 1) { boolean globalConfAllowed = true; List<WorkflowElement> lockedElems = new ArrayList<WorkflowElement>(); for (WorkflowElement element : elements) { if ((element instanceof WorkflowProject) || (element instanceof WorkflowPackage)) { globalConfAllowed = false; break; } else if (element instanceof WorkflowProcess) { WorkflowProcess pv = (WorkflowProcess) element; if (pv.getLockingUser() != null && !pv.isLockedToUser()) lockedElems.add(pv); } else if (element instanceof WorkflowAsset) { WorkflowAsset dd = (WorkflowAsset) element; if (dd.getLockingUser() != null && !dd.isLockedToUser()) lockedElems.add(dd); } } if (!lockedElems.isEmpty()) { PluginMessages.uiList(getShell(), "Error: The following elements are locked to other users.\nPlease exclude them from your selection or have them unlocked before proceeding.", "Delete Elements", lockedElems); return; } if (globalConfAllowed) { WorkflowElementDeleteDialog multipleDeleteDialog = new WorkflowElementDeleteDialog(getShell(), Arrays.asList(elements)); int res = multipleDeleteDialog.open(); if (res == Dialog.CANCEL) return; else if (res == Dialog.OK) { globalConf = true; includeInstances = multipleDeleteDialog.isIncludeInstances(); } } } for (WorkflowElement element : elements) { if (element instanceof WorkflowProject) { WorkflowProject workflowProject = (WorkflowProject) element; if (!workflowProject.isRemote()) { MessageDialog.openWarning(getShell(), "Delete Project", "Please delete the underlying Java Project in Package Explorer view."); return; } boolean confirmed = MessageDialog.openConfirm(getShell(), "Confirm Delete", "Delete workflow project: " + workflowProject.getName() + "?"); if (confirmed) { WorkflowProjectManager.getInstance().deleteProject(workflowProject); workflowProject.fireElementChangeEvent(ChangeType.ELEMENT_DELETE, null); } else { return; } } else if (element instanceof AutomatedTestCase && ((AutomatedTestCase) element).isLegacy()) { // still allow deletion of legacy test stuff final AutomatedTestCase testCase = (AutomatedTestCase) element; if (globalConf || MessageDialog.openConfirm(getShell(), "Delete Legacy Test Case", "Delete " + testCase.getLabel() + "?")) { BusyIndicator.showWhile(Display.getCurrent(), new Runnable() { public void run() { File tcDir = testCase.getTestCaseDirectory(); try { PluginUtil.deleteDirectory(tcDir); testCase.getTestSuite().getTestCases().remove(testCase); try { IFolder folder = testCase.getProject().getOldTestCasesFolder(); if (folder.exists()) folder.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); } catch (CoreException ex) { PluginMessages.uiError(ex, "Delete Legacy Test Case", testCase.getProject()); } testCase.fireElementChangeEvent(ChangeType.ELEMENT_DELETE, null); testCase.removeElementChangeListener(testCase.getProject()); } catch (IOException ex) { PluginMessages.uiError(ex, "Delete Test Case", testCase.getProject()); } } }); } } else if (element instanceof LegacyExpectedResults) { final LegacyExpectedResults expectedResult = (LegacyExpectedResults) element; if (globalConf || MessageDialog.openConfirm(getShell(), "Delete Legacy Expected Result", "Delete " + expectedResult.getLabel() + "?")) { BusyIndicator.showWhile(Display.getCurrent(), new Runnable() { public void run() { File file = expectedResult.getExpectedResultFile(); if (file.delete()) { expectedResult.getTestCase().getLegacyExpectedResults().remove(expectedResult); try { IFolder folder = expectedResult.getProject().getOldTestCasesFolder(); if (folder.exists()) folder.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); } catch (CoreException ex) { PluginMessages.uiError(ex, "Delete Legacy Expected Result", expectedResult.getProject()); } expectedResult.fireElementChangeEvent(ChangeType.ELEMENT_DELETE, null); expectedResult.removeElementChangeListener(expectedResult.getProject()); } else { PluginMessages.uiError("Cannot delete expected result " + expectedResult.getName(), "Delete Result", expectedResult.getProject()); } } }); } } else if (element instanceof com.centurylink.mdw.plugin.designer.model.File) { final com.centurylink.mdw.plugin.designer.model.File file = (com.centurylink.mdw.plugin.designer.model.File) element; if (globalConf || MessageDialog.openConfirm(getShell(), "Delete File", "Delete " + file.getLabel() + "?")) { BusyIndicator.showWhile(Display.getCurrent(), new Runnable() { public void run() { IFile workspaceFile = file.getWorkspaceFile(); try { workspaceFile.delete(true, null); WorkflowElement parent = file.getParent(); if (parent instanceof AutomatedTestCase) { AutomatedTestCase testCase = (AutomatedTestCase) parent; testCase.getFiles().remove(file); } file.fireElementChangeEvent(ChangeType.ELEMENT_DELETE, null); file.removeElementChangeListener(file.getProject()); refresh(file.getProject().getLegacyTestSuite()); } catch (Exception ex) { PluginMessages.uiError("Cannot delete file " + file.getName(), "Delete File", file.getProject()); } } }); } } else { WorkflowProject workflowProject = element.getProject(); DesignerProxy designerProxy = workflowProject.getDesignerProxy(); if (element instanceof WorkflowPackage) { WorkflowPackage packageToDelete = (WorkflowPackage) element; PackageDeleteDialog packageDeleteDialog = new PackageDeleteDialog(getShell(), packageToDelete); if (packageDeleteDialog.open() == Dialog.OK) { designerProxy.deletePackage(packageToDelete); } else { return; } } else if (element instanceof WorkflowProcess) { WorkflowProcess processVersion = (WorkflowProcess) element; if (!processVersion.getProject().isFilePersist() && processVersion.getLockingUser() != null && !processVersion.isLockedToUser()) { MessageDialog.openError(getShell(), "Cannot Delete", "Process '" + processVersion.getLabel() + "' is locked to user '" + processVersion.getLockingUser() + "'.\nPlease have it unlocked before deleting."); return; } ProcessDeleteDialog deleteDialog = new ProcessDeleteDialog(getShell(), processVersion); if (globalConf || deleteDialog.open() == Dialog.OK) { closeOpenEditor(processVersion, false); includeInstances = includeInstances || deleteDialog.isIncludeInstances(); designerProxy.deleteProcess(processVersion, includeInstances); } else { return; } } else if (element instanceof TaskTemplate) { TaskTemplate taskTemplate = (TaskTemplate) element; if (globalConf || MessageDialog.openConfirm(getShell(), "Confirm Delete", "Delete " + taskTemplate.getTitle() + " '" + taskTemplate.getLabel() + "'?")) { designerProxy.deleteTaskTemplate(taskTemplate); } else { return; } } else if (element instanceof WorkflowAsset) { WorkflowAsset asset = (WorkflowAsset) element; if (!asset.getProject().isFilePersist() && asset.getLockingUser() != null && !asset.isLockedToUser()) { MessageDialog.openError(getShell(), "Cannot Delete", asset.getTitle() + " '" + asset.getLabel() + "' is locked to user '" + asset.getLockingUser() + "'.\nPlease have it unlocked before deleting"); return; } if (globalConf || MessageDialog.openConfirm(getShell(), "Confirm Delete", "Delete " + asset.getTitle() + " '" + asset.getLabel() + "'?")) { if (asset.getFileEditor() != null) { IEditorInput editorInput = asset.getFileEditor().getEditorInput(); if (editorInput != null) closeOpenEditor(editorInput, false); } WorkflowAssetFactory.deRegisterAsset(asset); designerProxy.deleteWorkflowAsset(asset); } else { return; } } else if (element instanceof ActivityImpl) { ActivityImpl activityImpl = (ActivityImpl) element; ActivityImplDeleteDialog deleteDialog = new ActivityImplDeleteDialog(getShell(), activityImpl); if (globalConf || deleteDialog.open() == Dialog.OK) { designerProxy.deleteActivityImpl(activityImpl, deleteDialog.isIncludeActivities()); } else { return; } } else if (element instanceof ExternalEvent) { ExternalEvent externalEvent = (ExternalEvent) element; if (globalConf || MessageDialog.openConfirm(getShell(), "Confirm Delete", "Delete Event Handler: " + externalEvent.getLabel() + "?")) { designerProxy.deleteExternalEvent(externalEvent); } else { return; } } else if (element instanceof TaskTemplate) { MessageDialog.openWarning(getShell(), "TODO", "Delete task template not yet implemented"); } if (RunnerStatus.SUCCESS.equals(designerProxy.getRunnerStatus())) { // notify listeners element.fireElementChangeEvent(ChangeType.ELEMENT_DELETE, null); element.removeElementChangeListener(workflowProject); } } } } public void rename(WorkflowElement element) { RenameDialog renameDialog = new RenameDialog(getShell(), element); renameDialog.setTitle("Rename " + element.getTitle()); if (element instanceof WorkflowProcess) { WorkflowProcess processVersion = (WorkflowProcess) element; String lbl = "'" + processVersion.getLabel() + "'"; IEditorPart editor = findOpenEditor(processVersion); if (editor != null) { String message = lbl + " is currently open in an editor.\nPlease save and close before renaming."; MessageDialog.openError(getShell(), "Process Explorer", message); return; } if (processVersion.getLockingUser() != null && !processVersion.isLockedToUser()) { String message = lbl + " is currently locked to " + processVersion.getLockingUser() + ", so it cannot be renamed"; MessageDialog.openError(getShell(), "Process Explorer", message); return; } } else if (element instanceof WorkflowAsset) { WorkflowAsset asset = (WorkflowAsset) element; if (asset.getFileEditor() != null) { IEditorPart assetEditor = findOpenEditor(asset.getFileEditor().getEditorInput()); if (assetEditor != null) { String message = "'" + asset.getName() + "' is currently open in an editor.\nPlease save and close before renaming."; MessageDialog.openError(getShell(), "Process Explorer", message); return; } } } else if (element instanceof WorkflowProject) { WorkflowProject workflowProject = (WorkflowProject) element; if (!workflowProject.isRemote()) { if (workflowProject.isCloudProject()) MessageDialog.openWarning(getShell(), "Cloud Project", "Please rename the underlying Java Project in Package Explorer and then refresh the Process Explorer view."); return; } } int result = renameDialog.open(); if (result == Dialog.OK) { String newName = renameDialog.getNewName(); if (element instanceof WorkflowProject) { WorkflowProject workflowProject = (WorkflowProject) element; if (!workflowProject.isRemote()) return; WorkflowProjectManager.renameRemoteProject(workflowProject, newName); workflowProject.fireElementChangeEvent(ChangeType.RENAME, null); } else { WorkflowProject workflowProject = element.getProject(); DesignerProxy designerProxy = workflowProject.getDesignerProxy(); if (element instanceof WorkflowProcess) { WorkflowProcess processVersion = (WorkflowProcess) element; designerProxy.renameProcess(processVersion, newName); } else if (element instanceof WorkflowPackage) { WorkflowPackage packageVersion = (WorkflowPackage) element; designerProxy.renamePackage(packageVersion, newName); } else if (element instanceof WorkflowAsset) { WorkflowAsset asset = (WorkflowAsset) element; designerProxy.renameWorkflowAsset(asset, newName); } element.fireElementChangeEvent(ChangeType.RENAME, element.getName()); } } } public void showInstances(WorkflowElement element) { if (element instanceof WorkflowProject) { // TODO myTasks is hardcoded WorkflowProject project = (WorkflowProject) element; try { IViewPart viewPart = getPage().showView("mdw.views.designer.list.myTasks"); if (viewPart != null) { MyTasksView myTasksView = (MyTasksView) viewPart; myTasksView.setProject(project); myTasksView.refreshTable(); } } catch (PartInitException ex) { PluginMessages.log(ex); } } else if (element instanceof WorkflowProcess) { try { IViewPart viewPart = getPage().showView("mdw.views.designer.process.instance.list"); if (viewPart != null) { ProcessInstanceListView instancesView = (ProcessInstanceListView) viewPart; instancesView.setProcess((WorkflowProcess) element); } } catch (PartInitException ex) { PluginMessages.log(ex); } } } public void incrementVersion(final WorkflowElement element) { if (element instanceof WorkflowPackage) { BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() { public void run() { WorkflowPackage pkg = (WorkflowPackage) element; try { DesignerProxy dp = pkg.getProject().getDesignerProxy(); pkg.setExported(true); dp.setPackage(pkg); } catch (Exception ex) { PluginMessages.uiError(ex, "Increment Version", element.getProject()); } } }); } } public void setVersion(final WorkflowElement element) { if (element instanceof WorkflowPackage) { BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() { public void run() { WorkflowPackage pkg = (WorkflowPackage) element; SetVersionDialog dlg = new SetVersionDialog(getShell(), pkg); int result = dlg.open(); if (result == Dialog.OK) { try { DesignerProxy dp = pkg.getProject().getDesignerProxy(); pkg.setVersion(dlg.getNewVersion()); pkg.setExported(false); // avoid forcing version // increment on save dp.setPackage(pkg); } catch (Exception ex) { PluginMessages.uiError(ex, "Set Version", element.getProject()); } } } }); } } public void tagVersion(WorkflowElement[] elements) { final List<WorkflowPackage> packages = new ArrayList<WorkflowPackage>(); for (WorkflowElement element : elements) { if (element instanceof WorkflowPackage) packages.add((WorkflowPackage) element); else throw new UnsupportedOperationException( "Invalid type for tagVersion: " + element.getClass().getName()); } MdwListInputDialog dlg = new MdwListInputDialog(getShell(), "Tag Workflow Package(s)", "Enter tag to apply to package versions", packages); if (dlg.open() == Dialog.CANCEL) return; final String tag = dlg.getInput(); if (tag == null) return; BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() { public void run() { for (final WorkflowPackage pkg : packages) { try { DesignerProxy dp = pkg.getProject().getDesignerProxy(); dp.tagPackage(pkg, tag); } catch (Exception ex) { PluginMessages.uiError(ex, "Tag Package", pkg.getProject()); break; } } } }); } public void copy(WorkflowElement[] elements, Clipboard clipboard) { String copyElements = ""; for (int i = 0; i < elements.length; i++) { copyElements += elements[i].toString(); if (i < elements.length - 1) copyElements += "#"; } Transfer[] transfers = new Transfer[] { TextTransfer.getInstance() }; Object[] data = new Object[] { copyElements }; clipboard.setContents(data, transfers); } public void paste(Clipboard clipboard, ProcessExplorerDropTarget dropTarget, WorkflowElement targetElement) { WorkflowPackage destPackage = targetElement.getPackage(); if (destPackage != null && !destPackage.isArchived()) { Object clipboardContents = clipboard.getContents(TextTransfer.getInstance()); if (clipboardContents instanceof String) { String clipString = (String) clipboardContents; if (clipString != null && (clipString.startsWith("Process~") || clipString.startsWith("ExternalEvent~") || clipString.startsWith("ActivityImpl~") || clipString.startsWith("WorkflowAsset~"))) { if (dropTarget.isValidDrop(clipString, destPackage, DND.DROP_COPY)) dropTarget.drop(clipString, destPackage, DND.DROP_COPY); } } } } public void export(Class<? extends WorkflowElement> elementClass, IStructuredSelection selection) { if (elementClass.equals(WorkflowProject.class)) { ExportProjectWizard exportProjectWizard = new ExportProjectWizard(); exportProjectWizard.init(getWorkbench(), selection); new WizardDialog(getShell(), exportProjectWizard).open(); } else if (elementClass.equals(WorkflowPackage.class)) { ExportPackageWizard exportPackageWizard = new ExportPackageWizard(); exportPackageWizard.init(getWorkbench(), selection); new WizardDialog(getShell(), exportPackageWizard).open(); } else if (elementClass.equals(WorkflowProcess.class)) { ExportProcessWizard exportProcessWizard = new ExportProcessWizard(); exportProcessWizard.init(getWorkbench(), selection); new WizardDialog(getShell(), exportProcessWizard).open(); } else if (elementClass.equals(WorkflowAsset.class)) { ExportAssetWizard exportAssetWizard = new ExportAssetWizard(); exportAssetWizard.init(getWorkbench(), selection); new WizardDialog(getShell(), exportAssetWizard).open(); } else if (elementClass.equals(TaskTemplate.class)) { ExportTaskTemplatesWizard exportTemplateWizard = new ExportTaskTemplatesWizard(); exportTemplateWizard.init(getWorkbench(), selection); new WizardDialog(getShell(), exportTemplateWizard).open(); } } public void exportAttributes(String attributePrefix, WorkflowElement element) { if (element instanceof WorkflowPackage || element instanceof WorkflowProcess) { ExportAttributesWizard exportAttributesWizard = new ExportAttributesWizard(); exportAttributesWizard.init(getWorkbench(), element); exportAttributesWizard.setPrefix(attributePrefix); new WizardDialog(getShell(), exportAttributesWizard).open(); } } public void importAttributes(String attributePrefix, WorkflowElement element) { if (element instanceof WorkflowPackage || element instanceof WorkflowProcess) { ImportAttributesWizard importAttributesWizard = new ImportAttributesWizard(); importAttributesWizard.init(getWorkbench(), element); importAttributesWizard.setPrefix(attributePrefix); new WizardDialog(getShell(), importAttributesWizard).open(); } } public void exportAs(WorkflowElement selection) { WorkflowProcess processVersion = (WorkflowProcess) selection; open(processVersion); ProcessEditor procEd = (ProcessEditor) findOpenEditor(processVersion); ExportAsDialog saveImageDialog = new ExportAsDialog(getShell(), processVersion, procEd.getProcessCanvasWrapper().getFlowchartPage()); saveImageDialog.open(); } public void imporT(Class<? extends WorkflowElement> elementClass, WorkflowElement selection) { if (elementClass.equals(WorkflowProject.class)) { ImportProjectWizard importProjectWizard = new ImportProjectWizard(); importProjectWizard.init(getWorkbench(), selection); new WizardDialog(getShell(), importProjectWizard).open(); } else if (elementClass.equals(WorkflowPackage.class)) { ImportPackageWizard importPackageWizard = new ImportPackageWizard(); importPackageWizard.init(getWorkbench(), selection); new WizardDialog(getShell(), importPackageWizard).open(); } else if (elementClass.equals(WorkflowProcess.class)) { ImportProcessWizard importProcessWizard = new ImportProcessWizard(); importProcessWizard.init(getWorkbench(), selection); new WizardDialog(getShell(), importProcessWizard).open(); } else if (elementClass.equals(WorkflowAsset.class)) { ImportAssetWizard importAssetWizard = new ImportAssetWizard(); importAssetWizard.init(getWorkbench(), selection); new WizardDialog(getShell(), importAssetWizard).open(); } else if (elementClass.equals(TaskTemplate.class)) { ImportTaskTemplatesWizard importTemplateWizard = new ImportTaskTemplatesWizard(); importTemplateWizard.init(getWorkbench(), selection); new WizardDialog(getShell(), importTemplateWizard).open(); } } public void remoteImportVcs(final WorkflowProject workflowProject) { VcsRepository repo = workflowProject.getMdwVcsRepository(); String msg = "Pull latest assets into " + workflowProject.getName() + " from Git branch: " + repo.getBranch() + "?"; boolean proceed = MessageDialog.openConfirm(getShell(), "Import from VCS", msg); if (proceed) { ProgressMonitorDialog pmDialog = new MdwProgressMonitorDialog(getShell()); try { pmDialog.run(true, false, new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask("Importing remote project from Git...", IProgressMonitor.UNKNOWN); monitor.worked(20); try { workflowProject.getDesignerProxy().remoteImportVcs(); } catch (Exception ex) { PluginMessages.log(ex); throw new InvocationTargetException(ex); } } }); } catch (Exception ex) { PluginMessages.uiError(getShell(), ex, "Import From VCS", workflowProject); } } } @SuppressWarnings("restriction") public void search(WorkflowElement[] elements) { org.eclipse.search.internal.ui.SearchDialog dialog = new org.eclipse.search.internal.ui.SearchDialog( MdwPlugin.getActiveWorkbenchWindow(), "mdw.search.processSearchPage"); dialog.create(); dialog.setSelectedScope(ISearchPageContainer.SELECTION_SCOPE); dialog.open(); } public void findCallers(WorkflowElement element) { WorkflowProcess processVersion = (WorkflowProcess) element; List<WorkflowProject> projects = new ArrayList<WorkflowProject>(); projects.add(processVersion.getProject()); Shell shell = MdwPlugin.getActiveWorkbenchWindow().getShell(); ProcessSearchQuery searchQuery = new ProcessSearchQuery(projects, SearchQuery.SearchType.INVOKING_ENTITY, "*", true, shell); searchQuery.setInvokedEntityId(processVersion.getId()); try { ProgressMonitorDialog context = new MdwProgressMonitorDialog(shell); NewSearchUI.runQueryInForeground(context, searchQuery); // this shouldn't be necessary according to the Eclipse API docs NewSearchUI.activateSearchResultView(); ISearchResultViewPart part = NewSearchUI.getSearchResultView(); part.updateLabel(); SearchResultsPage page = (SearchResultsPage) part.getActivePage(); page.setSearchQuery(searchQuery); page.setInput(searchQuery.getSearchResult(), null); } catch (OperationCanceledException ex) { MessageDialog.openInformation(shell, "Search Cancelled", "Search for callers cancelled."); } catch (Exception ex) { PluginMessages.uiError(shell, ex, "Search for Callers", processVersion.getProject()); } } public void showHierarchy(final WorkflowElement element) { BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() { public void run() { WorkflowProcess processVersion = (WorkflowProcess) element; try { IViewPart viewPart = getPage().showView(ProcessHierarchyView.VIEW_ID); if (viewPart != null) { ProcessHierarchyView view = (ProcessHierarchyView) viewPart; view.setProcess(processVersion); } } catch (PartInitException ex) { PluginMessages.uiError(getShell(), ex, "Process Hierarchy", processVersion.getProject()); } } }); } public void test(IStructuredSelection selection) { AutomatedTestLaunchShortcut launchShortcut = new AutomatedTestLaunchShortcut(); launchShortcut.launch(selection, ILaunchManager.RUN_MODE); } public void debugTest(IStructuredSelection selection) { AutomatedTestLaunchShortcut launchShortcut = new AutomatedTestLaunchShortcut(); launchShortcut.launch(selection, ILaunchManager.DEBUG_MODE); } public void formatResults(final WorkflowElement workflowElement, final String type) { try { BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() { public void run() { try { TestResultsFormatter formatter = new TestResultsFormatter(workflowElement.getProject()); if (type.equals(AutomatedTestCase.FUNCTION_TEST)) formatter.formatFunctionTestResults(); else if (type.equals(AutomatedTestCase.LOAD_TEST)) formatter.formatLoadTestResults(); } catch (Exception ex) { throw new RuntimeException(ex.getMessage(), ex); } } }); } catch (Exception ex) { PluginMessages.uiError(ex, "Format Test Results", workflowElement.getProject()); } } public void launchSwing(WorkflowProject project, String title) { launchSwing(project, title, null, null); } public void launchSwing(final WorkflowProject project, final String title, final String formName, String dataInit) { try { if (title.equals("Java VisualVM")) { String javaVersion = System.getProperty("java.version"); String badVersionMsg = "Cannot launch Java VisualVM.\nRequires Java version >= 1.6.0_07.\nRunning version: " + javaVersion + "."; if (!javaVersion.startsWith("1.6") && !javaVersion.startsWith("1.7") && !javaVersion.startsWith("1.8")) { MessageDialog.openError(getShell(), "Launch Java VisualVM", badVersionMsg); return; } else if (javaVersion.startsWith("1.6")) { // check minor version String minorVer = javaVersion.substring(javaVersion.indexOf('_') + 1); if (Integer.parseInt(minorVer) < 7) { MessageDialog.openError(getShell(), "Launch Java VisualVM", badVersionMsg); return; } } String jdkBin = PluginUtil.getJdkBin(); File exe = new File(jdkBin + File.separator + "jvisualvm.exe"); if (!exe.exists()) { MessageDialog.openError(getShell(), "Launch Java VisualVM", "Executable not found: '" + exe + "'"); return; } String[] cmdArr = new String[] { exe.getAbsolutePath() }; if (project.isRemote()) { cmdArr = (String[]) PluginUtil.appendArrays(cmdArr, new String[] { "--openjmx", project.getServerSettings().getHost() + ":" + project.getJmxPort() }); } else { cmdArr = (String[]) PluginUtil.appendArrays(cmdArr, new String[] { "--openid", String.valueOf(project.getVisualVmId()) }); } new ProcessConsoleRunner(getShell().getDisplay(), cmdArr).start(); } else if (title.equals("JConsole")) { String jdkBin = PluginUtil.getJdkBin(); File exe = new File(jdkBin + File.separator + "jconsole.exe"); if (!exe.exists()) { MessageDialog.openError(getShell(), "Launch JConsole", "Executable not found: '" + exe + "'"); return; } String[] cmdArr = new String[] { exe.getAbsolutePath() }; if (project.isRemote()) cmdArr = (String[]) PluginUtil.appendArrays(cmdArr, new String[] { project.getServerSettings().getHost() + ":" + project.getJmxPort() }); else { String serverProcId = project.getServerSettings().getServerProcessId(); if (serverProcId != null) cmdArr = (String[]) PluginUtil.appendArrays(cmdArr, new String[] { serverProcId }); } new ProcessConsoleRunner(getShell().getDisplay(), cmdArr).start(); } else { String request = null; if (dataInit != null) { FormDataDocument datadoc = new FormDataDocument(); datadoc.setAttribute(FormDataDocument.ATTR_ACTION, dataInit); request = datadoc.format(); } final String response = dataInit == null ? null : project.getDesignerProxy().getDesignerDataAccess().engineCall(request); EventQueue.invokeLater(new Runnable() { public void run() { try { DesignerProxy designerProxy = project.getDesignerProxy(); JFrame propmgr_frame = new JFrame(title); FormPanel mainform = new FormPanel(propmgr_frame, designerProxy.getDesignerDataAccess(), designerProxy.getPluginDataAccess().getPrivileges()); mainform.setData(formName, response); propmgr_frame.setVisible(true); } catch (final Exception ex) { if (getShell() == null) { PluginMessages.log(ex); } else { getShell().getDisplay().asyncExec(new Runnable() { public void run() { if (ex.getCause() instanceof ConnectException) MessageDialog.openError(getShell(), "Launch " + title, ex.getCause().getMessage()); else PluginMessages.uiError(ex, "Launch " + title, project); } }); } } } }); } } catch (Exception ex) { if (ex.getCause() instanceof ConnectException) MessageDialog.openError(getShell(), "Launch " + title, ex.getCause().getMessage()); else PluginMessages.uiError(ex, "Launch " + title, project); } } public IEditorPart findOpenEditor(IEditorInput workflowElement) { return getPage().findEditor(workflowElement); } private boolean closeOpenEditor(IEditorInput workflowElement, boolean promptForSave) { IEditorPart editor = findOpenEditor(workflowElement); if (editor != null) return getPage().closeEditor(editor, promptForSave); return false; } private Shell getShell() { if (MdwPlugin.getActiveWorkbenchWindow() == null) return null; return MdwPlugin.getActiveWorkbenchWindow().getShell(); } private IWorkbench getWorkbench() { return PlatformUI.getWorkbench(); } private IWorkbenchPage getPage() { return MdwPlugin.getActivePage(); } public IViewPart showPropertiesView() { try { return getPage().showView("org.eclipse.ui.views.PropertySheet"); } catch (PartInitException ex) { PluginMessages.log(ex); return null; } } public List<ProcessEditor> getOpenProcessEditors(WorkflowProject project) { List<ProcessEditor> editors = new ArrayList<ProcessEditor>(); for (IEditorReference edRef : getPage().getEditorReferences()) { IEditorPart edPart = edRef.getEditor(false); if (edPart instanceof ProcessEditor) { // find any open process editors WorkflowProcess pv = (WorkflowProcess) edPart.getEditorInput(); if (pv.getProject().equals(project)) { if (pv.hasInstanceInfo()) getPage().closeEditor(edPart, false); else editors.add((ProcessEditor) edPart); } } } return editors; } public List<IEditorPart> getOpenAssetEditors(WorkflowProject project) { List<IEditorPart> editors = new ArrayList<IEditorPart>(); Map<IFile, AssetWorkbenchListener> assetListeners = WorkflowAssetFactory.getWorkbenchListeners(); for (IEditorReference edRef : getPage().getEditorReferences()) { IEditorPart edPart = edRef.getEditor(false); if (assetListeners != null && edPart.getEditorInput() instanceof FileEditorInput) { // find open workflow asset editors FileEditorInput fileInput = (FileEditorInput) edPart.getEditorInput(); AssetWorkbenchListener wbListener = assetListeners.get(fileInput.getFile()); if (wbListener != null) { WorkflowAsset asset = wbListener.getAsset(); if (asset.getProject().equals(project)) editors.add(edPart); } } } return editors; } public void syncOpenEditors(final WorkflowProject project) { final WorkflowProjectManager projectMgr = WorkflowProjectManager.getInstance(); final List<ProcessEditor> processEditors = getOpenProcessEditors(project); final List<IEditorPart> assetEditors = getOpenAssetEditors(project); if (!processEditors.isEmpty() || !assetEditors.isEmpty()) { // sync open editors IRunnableWithProgress loader = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask("Loading " + project.getLabel(), 100); monitor.worked(25); // sync process editors for (ProcessEditor ed : processEditors) { WorkflowProcess pv = ed.getProcess(); pv.setProject(projectMgr.getWorkflowProject(pv.getProject().getName())); if (pv.getPackage() != null && !pv.getPackage().isDefaultPackage()) { WorkflowPackage pkg = pv.getProject().getPackage(pv.getPackage().getName()); WorkflowProcess oldPv = pkg.getProcess(pv.getName()); if (oldPv != null) pkg.removeProcess(oldPv); pkg.addProcess(pv); pv.setPackage(pkg); } } monitor.worked(50); // sync asset editors Map<IFile, AssetWorkbenchListener> assetListeners = WorkflowAssetFactory .getWorkbenchListeners(); for (IEditorPart assetEd : assetEditors) { FileEditorInput fileInput = (FileEditorInput) assetEd.getEditorInput(); AssetWorkbenchListener wbListener = assetListeners.get(fileInput.getFile()); if (wbListener != null) { WorkflowAsset asset = wbListener.getAsset(); WorkflowProject wfProj = projectMgr.getWorkflowProject(asset.getProject().getName()); WorkflowAsset oldAsset = wfProj.getAsset(asset.getName(), asset.getLanguage(), asset.getVersion()); if (asset.getPackage() != null && !asset.getPackage().isDefaultPackage()) { WorkflowPackage pkg = wfProj.getPackage(asset.getPackage().getName()); if (pkg != null) { pkg.removeAsset(oldAsset); pkg.addAsset(asset); asset.setPackage(pkg); } else { asset.setPackage(wfProj.getDefaultPackage()); } } else { asset.setPackage(wfProj.getDefaultPackage()); } asset.addElementChangeListener(wfProj); if (oldAsset != null) WorkflowAssetFactory.deRegisterAsset(oldAsset); WorkflowAssetFactory.registerAsset(asset); assetEd.addPropertyListener(asset.new AssetEditorPropertyListener(assetEd)); WorkflowAssetFactory.registerWorkbenchListener(fileInput.getFile(), wbListener); } } monitor.worked(25); monitor.done(); } }; ProgressMonitorDialog progMonDlg = new MdwProgressMonitorDialog(Display.getCurrent().getActiveShell()); try { progMonDlg.run(true, false, loader); } catch (Exception ex) { PluginMessages.uiError(ex, "Sync Open Editors", project); } } } }