diff options
21 files changed, 2619 insertions, 2588 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/delegates/LaunchConfigurationDelegate.java b/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/delegates/LaunchConfigurationDelegate.java index ce100c35c..5612da668 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/delegates/LaunchConfigurationDelegate.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/delegates/LaunchConfigurationDelegate.java @@ -1,328 +1,312 @@ -/*******************************************************************************
- * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.launch.core.delegates;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.tcf.te.launch.core.activator.CoreBundleActivator;
-import org.eclipse.tcf.te.launch.core.bindings.LaunchConfigTypeBindingsManager;
-import org.eclipse.tcf.te.launch.core.interfaces.IReferencedProjectItem;
-import org.eclipse.tcf.te.launch.core.lm.interfaces.ICommonLaunchAttributes;
-import org.eclipse.tcf.te.launch.core.lm.interfaces.ILaunchContextLaunchAttributes;
-import org.eclipse.tcf.te.launch.core.lm.interfaces.ILaunchManagerDelegate;
-import org.eclipse.tcf.te.launch.core.nls.Messages;
-import org.eclipse.tcf.te.launch.core.persistence.launchcontext.LaunchContextsPersistenceDelegate;
-import org.eclipse.tcf.te.launch.core.persistence.projects.ReferencedProjectsPersistenceDelegate;
-import org.eclipse.tcf.te.runtime.concurrent.util.ExecutorsUtil;
-import org.eclipse.tcf.te.runtime.interfaces.ISharedConstants;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode;
-import org.eclipse.tcf.te.runtime.stepper.FullQualifiedId;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepperProperties;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.tracing.ITraceIds;
-import org.eclipse.tcf.te.runtime.stepper.stepper.Stepper;
-
-/**
- * Default launch configuration delegate implementation.
- * <p>
- * The launch configuration delegate implements the bridge between the native Eclipse launch
- * configuration framework and the stepper engine. The delegate is standard for all
- * launch configurations which supports extensible and modularized launching.
- * <p>
- * <b>Implementation Details</b>:<br>
- * <ul>
- * <li>The launch configuration delegate signals the completion of the launch sequence via
- * the custom {@link ILaunch} attribute {@link ICommonLaunchAttributes#ILAUNCH_ATTRIBUTE_LAUNCH_SEQUENCE_COMPLETED}.</li>
- * <li>The launch configuration delegates enforces the removal of the launch from the Eclipse
- * debug platforms launch manager if the progress monitor is set to canceled or an status with
- * severity {@link IStatus#CANCEL} had been thrown by the stepper implementation.</li>
- * <li>The launch configuration delegate creates launches of type {@link Launch}.</li>
- * </ul>
- */
-public class LaunchConfigurationDelegate extends org.eclipse.debug.core.model.LaunchConfigurationDelegate {
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#buildProjects(org.eclipse.core.resources.IProject[], org.eclipse.core.runtime.IProgressMonitor)
- * <p>
- * This method is a copy of the super implementation, except it does not lock the workspace to perform the build.
- * This is required to support "Edit while build is ongoing".
- */
- @Override
- protected void buildProjects(final IProject[] projects, IProgressMonitor monitor) throws CoreException {
- IWorkspaceRunnable build = new IWorkspaceRunnable(){
- @Override
- public void run(IProgressMonitor pm) throws CoreException {
- SubMonitor localmonitor = SubMonitor.convert(pm, Messages.AbstractLaunchConfigurationDelegate_scoped_incremental_build, projects.length);
- try {
- for (IProject project : projects) {
- if (localmonitor.isCanceled()) {
- throw new OperationCanceledException();
- }
- project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, localmonitor.newChild(1));
- }
- } finally {
- localmonitor.done();
- }
- }
- };
- ResourcesPlugin.getWorkspace().run(build, null, IWorkspace.AVOID_UPDATE, monitor);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate#launch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
- */
- @Override
- public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
- Assert.isNotNull(configuration);
- Assert.isNotNull(mode);
- Assert.isNotNull(launch);
-
- // Note: This method is typically called within a worker thread from the launch configuration framework.
-
- long startTime = System.currentTimeMillis();
- ILaunchConfigurationWorkingCopy launchConfig = configuration.getWorkingCopy();
- launchConfig.setAttribute(ICommonLaunchAttributes.ATTR_LAST_LAUNCHED, Long.toString(startTime));
- launchConfig.doSave();
-
- CoreBundleActivator.getTraceHandler().trace("LaunchConfigurationDelegate#launch: *** ENTERED" //$NON-NLS-1$
- + " (" + configuration.getName() + ")", //$NON-NLS-1$ //$NON-NLS-2$
- 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this);
- CoreBundleActivator.getTraceHandler().trace(" [" + ISharedConstants.TIME_FORMAT.format(new Date(startTime)) + "]" //$NON-NLS-1$ //$NON-NLS-2$
- + " ***", //$NON-NLS-1$
- 0, ITraceIds.PROFILE_STEPPING, IStatus.WARNING, this);
-
- // Reset the attribute to tell if the launch sequence has been completed. Clients cannot
- // use ILaunch.isTerminated() as this is passing through to a possibly associated IProcess
- // object. We need to know when the launch itself has finished the job, not when the process
- // might have died.
- launch.setAttribute(ICommonLaunchAttributes.ILAUNCH_ATTRIBUTE_LAUNCH_SEQUENCE_COMPLETED, Boolean.FALSE.toString());
-
- // The stepper instance to be used
- IStepper stepper = new Stepper();
- IStatus status = null;
-
- try {
- // Get the associated stepper for this launch
- IFullQualifiedId fullQualifiedId = new FullQualifiedId(IStepper.ID_TYPE_STEPPER_ID, stepper.getId(), null);
- // Get the launch properties container
- IPropertiesContainer properties = (IPropertiesContainer)launch.getAdapter(IPropertiesContainer.class);
- Assert.isNotNull(properties);
-
- // Add some information to the stepper data
- properties.setProperty(IStepperProperties.PROP_NAME, launchConfig.getName());
- properties.setProperty(IStepperProperties.PROP_STEP_GROUP_ID,
- LaunchConfigTypeBindingsManager.getInstance().getStepGroupId(
- launchConfig.getType().getIdentifier(),
- launch.getLaunchMode()));
-
- IModelNode[] contexts = LaunchContextsPersistenceDelegate.decodeLaunchContexts(
- launchConfig.getAttribute(ILaunchContextLaunchAttributes.ATTR_LAUNCH_CONTEXTS, (String)null));
- properties.setProperty(ILaunchContextLaunchAttributes.ATTR_ACTIVE_LAUNCH_CONTEXT, contexts != null && contexts.length > 0 ? contexts[0] : null);
-
- // Initialize the stepper
- IStepContext context = (IStepContext)launch.getAdapter(IStepContext.class);
- stepper.initialize(context, properties, fullQualifiedId, monitor != null ? monitor : new NullProgressMonitor());
-
- // Execute
- stepper.execute();
-
- // Wait for the stepper to be finished
- ExecutorsUtil.waitAndExecute(0, new IStepper.ExecutionFinishedConditionTester(stepper));
- } catch (CoreException e) {
- // We have to catch the CoreException here as we do want to open the
- // launch configurations dialog on ERROR only.
- status = e.getStatus();
-
- ILaunchManagerDelegate delegate = LaunchConfigTypeBindingsManager.getInstance().getLaunchManagerDelegate(configuration.getType().getIdentifier(), mode);
-
- if (status == null || (status.getSeverity() == IStatus.ERROR && delegate.showLaunchDialog(ILaunchManagerDelegate.SITUATION_AFTER_LAUNCH_FAILED))) {
- // just pass on the exception as is
- throw e;
- }
-
- // Try to get a handler for the status
- IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler(status);
- // If we cannot get a handler, pass on the exception
- if (handler == null) {
- throw e;
- }
-
- // Invoke the handler directly and drop the exception
- handler.handleStatus(status, this);
-
- // Mimic the original launch configuration behavior if an exception occurred
- // by removing the launch, if empty, and setting the progress monitor canceled.
- // @see LaunchConfiguration#launch(String, IProgressMonitor, boolean, boolean), line #768
- if (!launch.hasChildren()) {
- DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch);
- if (monitor != null) {
- monitor.setCanceled(true);
- }
- }
- } finally {
- // Mimic the original launch configuration behavior if monitor is set
- // canceled and make sure that the launch get's removed.
- if (monitor == null || monitor.isCanceled()) {
- DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch);
- }
-
- // Cleanup the stepper
- stepper.cleanup();
-
- // Set the launch completed here. Doesn't matter if the launch might completed with error or not.
- launch.setAttribute(ICommonLaunchAttributes.ILAUNCH_ATTRIBUTE_LAUNCH_SEQUENCE_COMPLETED, Boolean.TRUE.toString());
-
- long endTime = System.currentTimeMillis();
- CoreBundleActivator.getTraceHandler().trace("LaunchConfigurationDelegate#launch: *** DONE" //$NON-NLS-1$
- + " (" + configuration.getName() + ")", //$NON-NLS-1$ //$NON-NLS-2$
- 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this);
- CoreBundleActivator.getTraceHandler().trace(" [" + ISharedConstants.TIME_FORMAT.format(new Date(endTime)) //$NON-NLS-1$
- + " , delay = " + (endTime - startTime) + " ms]" //$NON-NLS-1$ //$NON-NLS-2$
- + " ***", //$NON-NLS-1$
- 0, ITraceIds.PROFILE_STEPPING, IStatus.WARNING, this);
-
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getLaunch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String)
- */
- @Override
- public ILaunch getLaunch(ILaunchConfiguration configuration, String mode) throws CoreException {
- return new Launch(configuration, mode, null);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getProjectsForProblemSearch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String)
- */
- @Override
- protected IProject[] getProjectsForProblemSearch(ILaunchConfiguration configuration, String mode) throws CoreException {
- // Return the same list of projects as we have to build
- return getBuildOrder(configuration, mode);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getBuildOrder(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String)
- */
- @Override
- protected IProject[] getBuildOrder(ILaunchConfiguration configuration, String mode) throws CoreException {
- // The result list. Return always an empty list at least. If returning null,
- // the super implementation will perform a incremental workspace build.
- List<IProject> projects = new ArrayList<IProject>();
-
- // Return the projects to build within the order the user configured within
- // the corresponding UI launch tab.
- IReferencedProjectItem[] items = ReferencedProjectsPersistenceDelegate.getReferencedProjects(configuration);
- for (IReferencedProjectItem item : items) {
- if (item.isProperty(IReferencedProjectItem.PROPERTY_ENABLED, true) && item.getStringProperty(IReferencedProjectItem.PROPERTY_PROJECT_NAME) != null) {
- IProject project = findProjectResource(item.getStringProperty(IReferencedProjectItem.PROPERTY_PROJECT_NAME));
- projects.add(project);
- }
- }
-
- // If the list of projects is not empty, we have to check for duplicates
- // and possible sub projects. As we cannot pre check if a project must
- // be build, we have to avoid building the same project again and again.
- checkForDuplicatesAndSubProjects(projects);
-
- return projects.toArray(new IProject[projects.size()]);
- }
-
- /**
- * Lookup the corresponding project resource for the given project name.
- * If the referenced project cannot be found or is closed, a {@link CoreException} will be thrown.
- *
- * @param projectName The project name. Must not be <code>null</code>.
- * @return The project resource or <code>null</code>.
- */
- protected IProject findProjectResource(String projectName) throws CoreException {
- Assert.isNotNull(projectName);
-
- // Project resources are stored with the workspace root
- IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
- IProject project = root.getProject(projectName);
- if (project != null && !project.isAccessible()) {
- // Not accessible -> means the project does either not exist or
- // is closed.
- throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(),
- NLS.bind(Messages.LaunchConfigurationDelegate_error_inaccessibleReferencedProject, projectName)
- ));
- }
-
- return project;
- }
-
- /**
- * Check for duplicates and sub projects in the given list of project
- * resources.
- *
- * @param projects The list of project resources. Must not be <code>null</code>.
- */
- protected void checkForDuplicatesAndSubProjects(List<IProject> projects) {
- Assert.isNotNull(projects);
-
- // The list of already processed project names
- List<String> processedProjectNames = new ArrayList<String>();
-
- // Loop the project list and determine the duplicates. Use an
- // iterator here as we manipulate the list directly.
- ListIterator<IProject> iterator = projects.listIterator();
- while (iterator.hasNext()) {
- IProject project = iterator.next();
- // If the project name is within the list of already processed
- // projects, the project will be deleted from the list.
- if (processedProjectNames.contains(project.getName())) {
- iterator.remove();
- continue;
- }
-
- // Add the project name to the list of processed project names
- processedProjectNames.add(project.getName());
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getBreakpoints(org.eclipse.debug.core.ILaunchConfiguration)
- *
- * Note: Redefined to be public accessible. Needed to access the breakpoints without
- * duplicating the super implementation.
- */
- @Override
- public IBreakpoint[] getBreakpoints(ILaunchConfiguration configuration) {
- return super.getBreakpoints(configuration);
- }
-}
+/******************************************************************************* + * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.launch.core.delegates; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.ListIterator; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.IWorkspaceRunnable; +import org.eclipse.core.resources.IncrementalProjectBuilder; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubMonitor; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.core.ILaunch; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.debug.core.IStatusHandler; +import org.eclipse.debug.core.model.IBreakpoint; +import org.eclipse.osgi.util.NLS; +import org.eclipse.tcf.te.launch.core.activator.CoreBundleActivator; +import org.eclipse.tcf.te.launch.core.bindings.LaunchConfigTypeBindingsManager; +import org.eclipse.tcf.te.launch.core.interfaces.IReferencedProjectItem; +import org.eclipse.tcf.te.launch.core.lm.interfaces.ICommonLaunchAttributes; +import org.eclipse.tcf.te.launch.core.lm.interfaces.ILaunchManagerDelegate; +import org.eclipse.tcf.te.launch.core.nls.Messages; +import org.eclipse.tcf.te.launch.core.persistence.projects.ReferencedProjectsPersistenceDelegate; +import org.eclipse.tcf.te.runtime.concurrent.util.ExecutorsUtil; +import org.eclipse.tcf.te.runtime.interfaces.ISharedConstants; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper; +import org.eclipse.tcf.te.runtime.stepper.interfaces.tracing.ITraceIds; +import org.eclipse.tcf.te.runtime.stepper.stepper.Stepper; + +/** + * Default launch configuration delegate implementation. + * <p> + * The launch configuration delegate implements the bridge between the native Eclipse launch + * configuration framework and the stepper engine. The delegate is standard for all + * launch configurations which supports extensible and modularized launching. + * <p> + * <b>Implementation Details</b>:<br> + * <ul> + * <li>The launch configuration delegate signals the completion of the launch sequence via + * the custom {@link ILaunch} attribute {@link ICommonLaunchAttributes#ILAUNCH_ATTRIBUTE_LAUNCH_SEQUENCE_COMPLETED}.</li> + * <li>The launch configuration delegates enforces the removal of the launch from the Eclipse + * debug platforms launch manager if the progress monitor is set to canceled or an status with + * severity {@link IStatus#CANCEL} had been thrown by the stepper implementation.</li> + * <li>The launch configuration delegate creates launches of type {@link Launch}.</li> + * </ul> + */ +public class LaunchConfigurationDelegate extends org.eclipse.debug.core.model.LaunchConfigurationDelegate { + + /* (non-Javadoc) + * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#buildProjects(org.eclipse.core.resources.IProject[], org.eclipse.core.runtime.IProgressMonitor) + * <p> + * This method is a copy of the super implementation, except it does not lock the workspace to perform the build. + * This is required to support "Edit while build is ongoing". + */ + @Override + protected void buildProjects(final IProject[] projects, IProgressMonitor monitor) throws CoreException { + IWorkspaceRunnable build = new IWorkspaceRunnable(){ + @Override + public void run(IProgressMonitor pm) throws CoreException { + SubMonitor localmonitor = SubMonitor.convert(pm, Messages.AbstractLaunchConfigurationDelegate_scoped_incremental_build, projects.length); + try { + for (IProject project : projects) { + if (localmonitor.isCanceled()) { + throw new OperationCanceledException(); + } + project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, localmonitor.newChild(1)); + } + } finally { + localmonitor.done(); + } + } + }; + ResourcesPlugin.getWorkspace().run(build, null, IWorkspace.AVOID_UPDATE, monitor); + } + + /* (non-Javadoc) + * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate#launch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { + Assert.isNotNull(configuration); + Assert.isNotNull(mode); + Assert.isNotNull(launch); + + // Note: This method is typically called within a worker thread from the launch configuration framework. + + long startTime = System.currentTimeMillis(); + ILaunchConfigurationWorkingCopy launchConfig = configuration.getWorkingCopy(); + launchConfig.setAttribute(ICommonLaunchAttributes.ATTR_LAST_LAUNCHED, Long.toString(startTime)); + launchConfig.doSave(); + + CoreBundleActivator.getTraceHandler().trace("LaunchConfigurationDelegate#launch: *** ENTERED" //$NON-NLS-1$ + + " (" + configuration.getName() + ")", //$NON-NLS-1$ //$NON-NLS-2$ + 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this); + CoreBundleActivator.getTraceHandler().trace(" [" + ISharedConstants.TIME_FORMAT.format(new Date(startTime)) + "]" //$NON-NLS-1$ //$NON-NLS-2$ + + " ***", //$NON-NLS-1$ + 0, ITraceIds.PROFILE_STEPPING, IStatus.WARNING, this); + + // Reset the attribute to tell if the launch sequence has been completed. Clients cannot + // use ILaunch.isTerminated() as this is passing through to a possibly associated IProcess + // object. We need to know when the launch itself has finished the job, not when the process + // might have died. + launch.setAttribute(ICommonLaunchAttributes.ILAUNCH_ATTRIBUTE_LAUNCH_SEQUENCE_COMPLETED, Boolean.FALSE.toString()); + + // The stepper instance to be used + IStepper stepper = new Stepper(launchConfig.getName()); + IStatus status = null; + + try { + // Get the launch properties container + IPropertiesContainer properties = (IPropertiesContainer)launch.getAdapter(IPropertiesContainer.class); + Assert.isNotNull(properties); + + // Initialize the stepper + String stepGroupId = LaunchConfigTypeBindingsManager.getInstance().getStepGroupId( + launchConfig.getType().getIdentifier(), + launch.getLaunchMode()); + + IStepContext context = (IStepContext)launch.getAdapter(IStepContext.class); + stepper.initialize(context, stepGroupId, properties, monitor); + + // Execute + stepper.execute(); + + // Wait for the stepper to be finished + ExecutorsUtil.waitAndExecute(0, new IStepper.ExecutionFinishedConditionTester(stepper)); + } catch (CoreException e) { + // We have to catch the CoreException here as we do want to open the + // launch configurations dialog on ERROR only. + status = e.getStatus(); + + ILaunchManagerDelegate delegate = LaunchConfigTypeBindingsManager.getInstance().getLaunchManagerDelegate(configuration.getType().getIdentifier(), mode); + + if (status == null || (status.getSeverity() == IStatus.ERROR && delegate.showLaunchDialog(ILaunchManagerDelegate.SITUATION_AFTER_LAUNCH_FAILED))) { + // just pass on the exception as is + throw e; + } + + // Try to get a handler for the status + IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler(status); + // If we cannot get a handler, pass on the exception + if (handler == null) { + throw e; + } + + // Invoke the handler directly and drop the exception + handler.handleStatus(status, this); + + // Mimic the original launch configuration behavior if an exception occurred + // by removing the launch, if empty, and setting the progress monitor canceled. + // @see LaunchConfiguration#launch(String, IProgressMonitor, boolean, boolean), line #768 + if (!launch.hasChildren()) { + DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch); + if (monitor != null) { + monitor.setCanceled(true); + } + } + } finally { + // Mimic the original launch configuration behavior if monitor is set + // canceled and make sure that the launch get's removed. + if (monitor == null || monitor.isCanceled()) { + DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch); + } + + // Cleanup the stepper + stepper.cleanup(); + + // Set the launch completed here. Doesn't matter if the launch might completed with error or not. + launch.setAttribute(ICommonLaunchAttributes.ILAUNCH_ATTRIBUTE_LAUNCH_SEQUENCE_COMPLETED, Boolean.TRUE.toString()); + + long endTime = System.currentTimeMillis(); + CoreBundleActivator.getTraceHandler().trace("LaunchConfigurationDelegate#launch: *** DONE" //$NON-NLS-1$ + + " (" + configuration.getName() + ")", //$NON-NLS-1$ //$NON-NLS-2$ + 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this); + CoreBundleActivator.getTraceHandler().trace(" [" + ISharedConstants.TIME_FORMAT.format(new Date(endTime)) //$NON-NLS-1$ + + " , delay = " + (endTime - startTime) + " ms]" //$NON-NLS-1$ //$NON-NLS-2$ + + " ***", //$NON-NLS-1$ + 0, ITraceIds.PROFILE_STEPPING, IStatus.WARNING, this); + + } + } + + /* (non-Javadoc) + * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getLaunch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String) + */ + @Override + public ILaunch getLaunch(ILaunchConfiguration configuration, String mode) throws CoreException { + return new Launch(configuration, mode, null); + } + + /* (non-Javadoc) + * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getProjectsForProblemSearch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String) + */ + @Override + protected IProject[] getProjectsForProblemSearch(ILaunchConfiguration configuration, String mode) throws CoreException { + // Return the same list of projects as we have to build + return getBuildOrder(configuration, mode); + } + + /* (non-Javadoc) + * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getBuildOrder(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String) + */ + @Override + protected IProject[] getBuildOrder(ILaunchConfiguration configuration, String mode) throws CoreException { + // The result list. Return always an empty list at least. If returning null, + // the super implementation will perform a incremental workspace build. + List<IProject> projects = new ArrayList<IProject>(); + + // Return the projects to build within the order the user configured within + // the corresponding UI launch tab. + IReferencedProjectItem[] items = ReferencedProjectsPersistenceDelegate.getReferencedProjects(configuration); + for (IReferencedProjectItem item : items) { + if (item.isProperty(IReferencedProjectItem.PROPERTY_ENABLED, true) && item.getStringProperty(IReferencedProjectItem.PROPERTY_PROJECT_NAME) != null) { + IProject project = findProjectResource(item.getStringProperty(IReferencedProjectItem.PROPERTY_PROJECT_NAME)); + projects.add(project); + } + } + + // If the list of projects is not empty, we have to check for duplicates + // and possible sub projects. As we cannot pre check if a project must + // be build, we have to avoid building the same project again and again. + checkForDuplicatesAndSubProjects(projects); + + return projects.toArray(new IProject[projects.size()]); + } + + /** + * Lookup the corresponding project resource for the given project name. + * If the referenced project cannot be found or is closed, a {@link CoreException} will be thrown. + * + * @param projectName The project name. Must not be <code>null</code>. + * @return The project resource or <code>null</code>. + */ + protected IProject findProjectResource(String projectName) throws CoreException { + Assert.isNotNull(projectName); + + // Project resources are stored with the workspace root + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + IProject project = root.getProject(projectName); + if (project != null && !project.isAccessible()) { + // Not accessible -> means the project does either not exist or + // is closed. + throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), + NLS.bind(Messages.LaunchConfigurationDelegate_error_inaccessibleReferencedProject, projectName) + )); + } + + return project; + } + + /** + * Check for duplicates and sub projects in the given list of project + * resources. + * + * @param projects The list of project resources. Must not be <code>null</code>. + */ + protected void checkForDuplicatesAndSubProjects(List<IProject> projects) { + Assert.isNotNull(projects); + + // The list of already processed project names + List<String> processedProjectNames = new ArrayList<String>(); + + // Loop the project list and determine the duplicates. Use an + // iterator here as we manipulate the list directly. + ListIterator<IProject> iterator = projects.listIterator(); + while (iterator.hasNext()) { + IProject project = iterator.next(); + // If the project name is within the list of already processed + // projects, the project will be deleted from the list. + if (processedProjectNames.contains(project.getName())) { + iterator.remove(); + continue; + } + + // Add the project name to the list of processed project names + processedProjectNames.add(project.getName()); + } + } + + /* (non-Javadoc) + * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getBreakpoints(org.eclipse.debug.core.ILaunchConfiguration) + * + * Note: Redefined to be public accessible. Needed to access the breakpoints without + * duplicating the super implementation. + */ + @Override + public IBreakpoint[] getBreakpoints(ILaunchConfiguration configuration) { + return super.getBreakpoints(configuration); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/steps/AbstractLaunchStep.java b/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/steps/AbstractLaunchStep.java index 18c1c5d7f..c3a2b3cf4 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/steps/AbstractLaunchStep.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/steps/AbstractLaunchStep.java @@ -1,72 +1,75 @@ -/*******************************************************************************
- * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.launch.core.steps;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.tcf.te.launch.core.lm.interfaces.ILaunchContextLaunchAttributes;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode;
-import org.eclipse.tcf.te.runtime.stepper.extensions.AbstractStep;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext;
-
-/**
- * Abstract launch step implementation.
- */
-public abstract class AbstractLaunchStep extends AbstractStep {
-
- /**
- * Returns the launch object for the given step context.
- *
- * @param context The step context.
- * @return The launch or <code>null</code>.
- */
- protected ILaunch getLaunch(IStepContext context) {
- Assert.isNotNull(context);
- return (ILaunch)context.getAdapter(ILaunch.class);
- }
-
- /**
- * Returns the current launch mode.
- *
- * @param context The step context.
- * @return The launch mode or <code>null</code>.
- */
- protected String getLaunchMode(IStepContext context) {
- ILaunch launch = getLaunch(context);
- return launch != null ? launch.getLaunchMode() : null;
- }
-
- /**
- * Returns the active launch context model node that is currently used.
- *
- * @param data The data giving object. Must not be <code>null</code>.
- * @return The active launch context model node.
- */
- protected IModelNode getActiveLaunchContext(IPropertiesContainer data) {
- Assert.isNotNull(data);
- Object context = data.getProperty(ILaunchContextLaunchAttributes.ATTR_ACTIVE_LAUNCH_CONTEXT);
- Assert.isTrue(context instanceof IModelNode);
- return (IModelNode)context;
- }
-
- /**
- * Returns the uses launch configuration.
- *
- * @param context The step context.
- * @return
- */
- protected ILaunchConfiguration getLaunchConfiguration(IStepContext context) {
- ILaunch launch = getLaunch(context);
- Assert.isNotNull(launch);
- return launch.getLaunchConfiguration();
- }
-}
+/******************************************************************************* + * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.launch.core.steps; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.debug.core.ILaunch; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.tcf.te.launch.core.lm.interfaces.ILaunchContextLaunchAttributes; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode; +import org.eclipse.tcf.te.runtime.stepper.StepperAttributeUtil; +import org.eclipse.tcf.te.runtime.stepper.extensions.AbstractStep; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; + +/** + * Abstract launch step implementation. + */ +public abstract class AbstractLaunchStep extends AbstractStep { + + /** + * Returns the launch object for the given step context. + * + * @param context The step context. + * @return The launch or <code>null</code>. + */ + protected ILaunch getLaunch(IStepContext context) { + Assert.isNotNull(context); + return (ILaunch)context.getAdapter(ILaunch.class); + } + + /** + * Returns the current launch mode. + * + * @param context The step context. + * @return The launch mode or <code>null</code>. + */ + protected String getLaunchMode(IStepContext context) { + ILaunch launch = getLaunch(context); + return launch != null ? launch.getLaunchMode() : null; + } + + /** + * Returns the active launch context model node that is currently used. + * + * @param data The data giving object. Must not be <code>null</code>. + * @return The active launch context model node. + */ + protected IModelNode getActiveLaunchContext(IFullQualifiedId fullQualifiedId, IPropertiesContainer data) { + Assert.isNotNull(data); + Assert.isNotNull(fullQualifiedId); + Object context = StepperAttributeUtil.getProperty(ILaunchContextLaunchAttributes.ATTR_ACTIVE_LAUNCH_CONTEXT, fullQualifiedId, data); + Assert.isTrue(context instanceof IModelNode); + return (IModelNode)context; + } + + /** + * Returns the uses launch configuration. + * + * @param context The step context. + * @return + */ + protected ILaunchConfiguration getLaunchConfiguration(IStepContext context) { + ILaunch launch = getLaunch(context); + Assert.isNotNull(launch); + return launch.getLaunchConfiguration(); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/steps/iterators/AbstractLaunchStepGroupIterator.java b/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/steps/iterators/AbstractLaunchStepGroupIterator.java index 7e8033802..37d5c8860 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/steps/iterators/AbstractLaunchStepGroupIterator.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/steps/iterators/AbstractLaunchStepGroupIterator.java @@ -1,63 +1,66 @@ -/*******************************************************************************
- * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.tcf.te.launch.core.steps.iterators;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.tcf.te.launch.core.lm.interfaces.ILaunchContextLaunchAttributes;
-import org.eclipse.tcf.te.runtime.extensions.ExecutableExtension;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupIterator;
-
-/**
- * Abstract launch stepgroup iterator.
- */
-public abstract class AbstractLaunchStepGroupIterator extends ExecutableExtension implements IStepGroupIterator {
-
- /**
- * Returns the launch object for the given step context.
- *
- * @param context The step context.
- * @return The launch or <code>null</code>.
- */
- protected ILaunch getLaunch(IStepContext context) {
- Assert.isNotNull(context);
- return (ILaunch)context.getAdapter(ILaunch.class);
- }
-
- /**
- * Returns the active launch context model node that is currently used.
- *
- * @param data The data giving object. Must not be <code>null</code>.
- * @return The active launch context model node.
- */
- protected IModelNode getActiveLaunchContext(IPropertiesContainer data) {
- Assert.isNotNull(data);
- Object context = data.getProperty(ILaunchContextLaunchAttributes.ATTR_ACTIVE_LAUNCH_CONTEXT);
- Assert.isTrue(context instanceof IModelNode);
- return (IModelNode)context;
- }
-
- /**
- * Returns the uses launch configuration.
- *
- * @param context The step context.
- * @return
- */
- protected ILaunchConfiguration getLaunchConfiguration(IStepContext context) {
- ILaunch launch = getLaunch(context);
- Assert.isNotNull(launch);
- return launch.getLaunchConfiguration();
- }
-}
+/******************************************************************************* + * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.tcf.te.launch.core.steps.iterators; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.debug.core.ILaunch; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.tcf.te.launch.core.lm.interfaces.ILaunchContextLaunchAttributes; +import org.eclipse.tcf.te.runtime.extensions.ExecutableExtension; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode; +import org.eclipse.tcf.te.runtime.stepper.StepperAttributeUtil; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupIterator; + +/** + * Abstract launch stepgroup iterator. + */ +public abstract class AbstractLaunchStepGroupIterator extends ExecutableExtension implements IStepGroupIterator { + + /** + * Returns the launch object for the given step context. + * + * @param context The step context. + * @return The launch or <code>null</code>. + */ + protected ILaunch getLaunch(IStepContext context) { + Assert.isNotNull(context); + return (ILaunch)context.getAdapter(ILaunch.class); + } + + /** + * Returns the active launch context model node that is currently used. + * + * @param data The data giving object. Must not be <code>null</code>. + * @return The active launch context model node. + */ + protected IModelNode getActiveLaunchContext(IFullQualifiedId fullQualifiedId, IPropertiesContainer data) { + Assert.isNotNull(data); + Assert.isNotNull(fullQualifiedId); + Object context = StepperAttributeUtil.getProperty(ILaunchContextLaunchAttributes.ATTR_ACTIVE_LAUNCH_CONTEXT, fullQualifiedId, data); + Assert.isTrue(context instanceof IModelNode); + return (IModelNode)context; + } + + /** + * Returns the uses launch configuration. + * + * @param context The step context. + * @return + */ + protected ILaunchConfiguration getLaunchConfiguration(IStepContext context) { + ILaunch launch = getLaunch(context); + Assert.isNotNull(launch); + return launch.getLaunchConfiguration(); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/steps/iterators/LaunchContextIterator.java b/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/steps/iterators/LaunchContextIterator.java new file mode 100644 index 000000000..9f046984d --- /dev/null +++ b/target_explorer/plugins/org.eclipse.tcf.te.launch.core/src/org/eclipse/tcf/te/launch/core/steps/iterators/LaunchContextIterator.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.tcf.te.launch.core.steps.iterators; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.tcf.te.launch.core.activator.CoreBundleActivator; +import org.eclipse.tcf.te.launch.core.lm.interfaces.ILaunchContextLaunchAttributes; +import org.eclipse.tcf.te.launch.core.persistence.launchcontext.LaunchContextsPersistenceDelegate; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode; +import org.eclipse.tcf.te.runtime.stepper.StepperAttributeUtil; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; + +/** + * LaunchContextIterator + */ +public class LaunchContextIterator extends AbstractLaunchStepGroupIterator { + + private IModelNode[] contexts = null; + private int iteration = -1; + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupIterator#initialize(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + public void initialize(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) { + contexts = LaunchContextsPersistenceDelegate.getLaunchContexts(getLaunchConfiguration(context)); + iteration = 0; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupIterator#getNumIterations() + */ + @Override + public int getNumIterations() { + return contexts != null ? contexts.length : 0; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupIterator#hasNext(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + public boolean hasNext(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) { + return iteration < getNumIterations(); + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupIterator#next(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + public void next(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) throws CoreException { + if (iteration < 0) { + throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "iterator not initialized")); //$NON-NLS-1$ + } + if (iteration >= getNumIterations()) { + throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "no more iterations")); //$NON-NLS-1$ + } + StepperAttributeUtil.setProperty(ILaunchContextLaunchAttributes.ATTR_ACTIVE_LAUNCH_CONTEXT, fullQualifiedId, data, contexts[iteration++]); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/FullQualifiedId.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/FullQualifiedId.java index fb7fb052c..c176ad28a 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/FullQualifiedId.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/FullQualifiedId.java @@ -60,16 +60,12 @@ public class FullQualifiedId implements IFullQualifiedId { toString.append(secondaryId.trim()); toString.append('"'); } + toString.append("/>"); //$NON-NLS-1$ + if (children != null && children.trim().length() > 0) { - toString.append('>'); toString.append(children); - toString.append("</"); //$NON-NLS-1$ - toString.append(type); - toString.append('>'); - } - else { - toString.append("/>"); //$NON-NLS-1$ } + return toString.toString(); } @@ -141,7 +137,7 @@ public class FullQualifiedId implements IFullQualifiedId { public IFullQualifiedId getParentId() { if (ids.size() > 1) { return new FullQualifiedId(ids.subList(0, ids.size() - 1) - .toArray(new IdData[ids.size() - 1]), null, null, null); + .toArray(new IdData[ids.size() - 1]), null, null, null); } return null; } diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/StepperAttributeUtil.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/StepperAttributeUtil.java index 9c3cfc189..b7a5cfb11 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/StepperAttributeUtil.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/StepperAttributeUtil.java @@ -1,233 +1,233 @@ -/*******************************************************************************
- * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.runtime.stepper;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId;
-
-/**
- * A stepper attributes utility provides a set of static methods
- * to access the attributes of a step.
- */
-public class StepperAttributeUtil {
- /**
- * Get the full qualified key to get or set data in the data.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @return The full qualified key.
- */
- protected final static String getFullQualifiedKey(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) {
- Assert.isNotNull(key);
- Assert.isNotNull(data);
-
- return (fullQualifiedId != null ? fullQualifiedId.toString() : "") + key; //$NON-NLS-1$
- }
-
- /**
- * Get a property from the data. If the value is not stored within the full qualified id, the
- * value stored within the parent id will be returned.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @return The property value or <code>null</code> if either the data has no property container
- * or the property is not set.
- */
- public final static Object getProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) {
- Assert.isNotNull(key);
- Assert.isNotNull(data);
-
- if (fullQualifiedId == null || data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data)) != null) {
- return data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data));
- }
- return getProperty(key, fullQualifiedId.getParentId(), data);
- }
-
- /**
- * Get a string property from the data. If the value is not stored within the full qualified id,
- * the value stored within the parent id will be returned.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @return The string property value or <code>null</code> if either the data has no property
- * container or the property is not set.
- */
- public final static String getStringProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) {
- Assert.isNotNull(key);
- Assert.isNotNull(data);
-
- if (fullQualifiedId == null || data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data)) != null) {
- return data.getStringProperty(getFullQualifiedKey(key, fullQualifiedId, data));
- }
- return getStringProperty(key, fullQualifiedId.getParentId(), data);
- }
-
- /**
- * Get a boolean property from the data. If the value is not stored within the full qualified
- * id, the value stored within the parent id will be returned.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @return The boolean property value or <code>false</code> if either the data has no property
- * container or the property is not set.
- */
- public final static boolean getBooleanProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) {
- Assert.isNotNull(key);
- Assert.isNotNull(data);
-
- if (fullQualifiedId == null || data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data)) != null) {
- return data.getBooleanProperty(getFullQualifiedKey(key, fullQualifiedId, data));
- }
- return getBooleanProperty(key, fullQualifiedId.getParentId(), data);
- }
-
- /**
- * Get a int property from the data.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @return The int property value or <code>-1</code> if either the data has no property
- * container or the property is not set.
- */
- public final static int getIntProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) {
- Assert.isNotNull(key);
- Assert.isNotNull(data);
-
- if (fullQualifiedId == null || data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data)) != null) {
- return data.getIntProperty(getFullQualifiedKey(key, fullQualifiedId, data));
- }
- return getIntProperty(key, fullQualifiedId.getParentId(), data);
- }
-
- /**
- * Check if a property is set.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @return <code>true</code> if a property value is set.
- */
- public final static boolean isPropertySet(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) {
- Assert.isNotNull(key);
- Assert.isNotNull(data);
-
- return data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data)) != null;
- }
-
- /**
- * Set a property value to the data.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @param value The new value.
- * @return <code>true</code> if the value was set.
- */
- public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, Object value) {
- return setProperty(key, fullQualifiedId, data, value, false);
- }
-
- /**
- * Set a property value to the data and optional share it through the parent full qualified id.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @param value The new value.
- * @param share When <code>true</code>, the value is also stored within the parent full
- * qualified id to share the value with other steps within the same parent (group).
- * @return <code>true</code> if the value was set.
- */
- public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, Object value, boolean share) {
- Assert.isNotNull(key);
- Assert.isNotNull(data);
-
- if (share && fullQualifiedId != null) {
- data.setProperty(getFullQualifiedKey(key, fullQualifiedId.getParentId(), data), value);
- }
- return data.setProperty(getFullQualifiedKey(key, fullQualifiedId, data), value);
- }
-
- /**
- * Set a boolean property value to the data.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @param value The new boolean value.
- * @return <code>true</code> if the value was set.
- */
- public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, boolean value) {
- return setProperty(key, fullQualifiedId, data, value, false);
- }
-
- /**
- * Set a boolean property value to the data and optional share it through the parent full
- * qualified id.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @param value The new boolean value.
- * @param share When <code>true</code>, the value is also stored within the parent full
- * qualified id to share the value with other steps within the same parent (group).
- * @return <code>true</code> if the value was set.
- */
- public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, boolean value, boolean share) {
- Assert.isNotNull(key);
- Assert.isNotNull(data);
-
- if (share && fullQualifiedId != null) {
- data.setProperty(getFullQualifiedKey(key, fullQualifiedId.getParentId(), data), value);
- }
- return data.setProperty(getFullQualifiedKey(key, fullQualifiedId, data), value);
- }
-
- /**
- * Set a int property value to the data.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @param value The new int value.
- * @return <code>true</code> if the value was set.
- */
- public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, int value) {
- return setProperty(key, fullQualifiedId, data, value, false);
- }
-
- /**
- * Set an int property value to the data and optional share it through the parent full qualified
- * id.
- *
- * @param key The key for the value.
- * @param fullQualifiedId The full qualified id for this step.
- * @param data The data.
- * @param value The new int value.
- * @param share When <code>true</code>, the value is also stored within the parent full
- * qualified id to share the value with other steps within the same parent (group).
- * @return <code>true</code> if the value was set.
- */
- public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, int value, boolean share) {
- Assert.isNotNull(key);
- Assert.isNotNull(data);
-
- if (share && fullQualifiedId != null) {
- data.setProperty(getFullQualifiedKey(key, fullQualifiedId.getParentId(), data), value);
- }
- return data.setProperty(getFullQualifiedKey(key, fullQualifiedId, data), value);
- }
-}
+/******************************************************************************* + * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.runtime.stepper; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId; + +/** + * A stepper attributes utility provides a set of static methods + * to access the attributes of a step. + */ +public class StepperAttributeUtil { + /** + * Get the full qualified key to get or set data in the data. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @return The full qualified key. + */ + protected final static String getFullQualifiedKey(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) { + Assert.isNotNull(key); + Assert.isNotNull(data); + + return (fullQualifiedId != null ? fullQualifiedId.toString() + "." : "") + key; //$NON-NLS-1$ //$NON-NLS-2$ + } + + /** + * Get a property from the data. If the value is not stored within the full qualified id, the + * value stored within the parent id will be returned. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @return The property value or <code>null</code> if either the data has no property container + * or the property is not set. + */ + public final static Object getProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) { + Assert.isNotNull(key); + Assert.isNotNull(data); + + if (fullQualifiedId == null || data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data)) != null) { + return data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data)); + } + return getProperty(key, fullQualifiedId.getParentId(), data); + } + + /** + * Get a string property from the data. If the value is not stored within the full qualified id, + * the value stored within the parent id will be returned. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @return The string property value or <code>null</code> if either the data has no property + * container or the property is not set. + */ + public final static String getStringProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) { + Assert.isNotNull(key); + Assert.isNotNull(data); + + if (fullQualifiedId == null || data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data)) != null) { + return data.getStringProperty(getFullQualifiedKey(key, fullQualifiedId, data)); + } + return getStringProperty(key, fullQualifiedId.getParentId(), data); + } + + /** + * Get a boolean property from the data. If the value is not stored within the full qualified + * id, the value stored within the parent id will be returned. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @return The boolean property value or <code>false</code> if either the data has no property + * container or the property is not set. + */ + public final static boolean getBooleanProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) { + Assert.isNotNull(key); + Assert.isNotNull(data); + + if (fullQualifiedId == null || data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data)) != null) { + return data.getBooleanProperty(getFullQualifiedKey(key, fullQualifiedId, data)); + } + return getBooleanProperty(key, fullQualifiedId.getParentId(), data); + } + + /** + * Get a int property from the data. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @return The int property value or <code>-1</code> if either the data has no property + * container or the property is not set. + */ + public final static int getIntProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) { + Assert.isNotNull(key); + Assert.isNotNull(data); + + if (fullQualifiedId == null || data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data)) != null) { + return data.getIntProperty(getFullQualifiedKey(key, fullQualifiedId, data)); + } + return getIntProperty(key, fullQualifiedId.getParentId(), data); + } + + /** + * Check if a property is set. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @return <code>true</code> if a property value is set. + */ + public final static boolean isPropertySet(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data) { + Assert.isNotNull(key); + Assert.isNotNull(data); + + return data.getProperty(getFullQualifiedKey(key, fullQualifiedId, data)) != null; + } + + /** + * Set a property value to the data. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @param value The new value. + * @return <code>true</code> if the value was set. + */ + public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, Object value) { + return setProperty(key, fullQualifiedId, data, value, false); + } + + /** + * Set a property value to the data and optional share it through the parent full qualified id. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @param value The new value. + * @param share When <code>true</code>, the value is also stored within the parent full + * qualified id to share the value with other steps within the same parent (group). + * @return <code>true</code> if the value was set. + */ + public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, Object value, boolean share) { + Assert.isNotNull(key); + Assert.isNotNull(data); + + if (share && fullQualifiedId != null) { + data.setProperty(getFullQualifiedKey(key, fullQualifiedId.getParentId(), data), value); + } + return data.setProperty(getFullQualifiedKey(key, fullQualifiedId, data), value); + } + + /** + * Set a boolean property value to the data. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @param value The new boolean value. + * @return <code>true</code> if the value was set. + */ + public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, boolean value) { + return setProperty(key, fullQualifiedId, data, value, false); + } + + /** + * Set a boolean property value to the data and optional share it through the parent full + * qualified id. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @param value The new boolean value. + * @param share When <code>true</code>, the value is also stored within the parent full + * qualified id to share the value with other steps within the same parent (group). + * @return <code>true</code> if the value was set. + */ + public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, boolean value, boolean share) { + Assert.isNotNull(key); + Assert.isNotNull(data); + + if (share && fullQualifiedId != null) { + data.setProperty(getFullQualifiedKey(key, fullQualifiedId.getParentId(), data), value); + } + return data.setProperty(getFullQualifiedKey(key, fullQualifiedId, data), value); + } + + /** + * Set a int property value to the data. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @param value The new int value. + * @return <code>true</code> if the value was set. + */ + public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, int value) { + return setProperty(key, fullQualifiedId, data, value, false); + } + + /** + * Set an int property value to the data and optional share it through the parent full qualified + * id. + * + * @param key The key for the value. + * @param fullQualifiedId The full qualified id for this step. + * @param data The data. + * @param value The new int value. + * @param share When <code>true</code>, the value is also stored within the parent full + * qualified id to share the value with other steps within the same parent (group). + * @return <code>true</code> if the value was set. + */ + public final static boolean setProperty(String key, IFullQualifiedId fullQualifiedId, IPropertiesContainer data, int value, boolean share) { + Assert.isNotNull(key); + Assert.isNotNull(data); + + if (share && fullQualifiedId != null) { + data.setProperty(getFullQualifiedKey(key, fullQualifiedId.getParentId(), data), value); + } + return data.setProperty(getFullQualifiedKey(key, fullQualifiedId, data), value); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/extensions/AbstractStep.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/extensions/AbstractStep.java index b6b7b1968..c408b3f8c 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/extensions/AbstractStep.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/extensions/AbstractStep.java @@ -46,12 +46,6 @@ public abstract class AbstractStep extends ExecutableExtension implements IExten /** * The suffix to append to the full qualified step id to - * get the step target event listener. - */ - public final static String SUFFIX_EVENT_LISTENER = "eventListener"; //$NON-NLS-1$ - - /** - * The suffix to append to the full qualified step id to * get the operational flag. */ public final static String SUFFIX_OPERATIONAL = "operational"; //$NON-NLS-1$ @@ -60,7 +54,7 @@ public abstract class AbstractStep extends ExecutableExtension implements IExten * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#isSingleton() */ @Override - public boolean isSingleton() { + public boolean isSingleton() { return false; } @@ -69,7 +63,7 @@ public abstract class AbstractStep extends ExecutableExtension implements IExten */ @Override public void doSetInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException { - super.doSetInitializationData(config, propertyName, data); + super.doSetInitializationData(config, propertyName, data); // Read in the list of required step or step id's if specified. dependencies.clear(); @@ -78,10 +72,10 @@ public abstract class AbstractStep extends ExecutableExtension implements IExten String value = require.getAttribute("id"); //$NON-NLS-1$ if (value == null || value.trim().length() == 0) { throw new CoreException(new Status(IStatus.ERROR, - CoreBundleActivator.getUniqueIdentifier(), - 0, - NLS.bind(Messages.AbstractStep_error_missingRequiredAttribute, "dependency id (requires)", getLabel()), //$NON-NLS-1$ - null)); + CoreBundleActivator.getUniqueIdentifier(), + 0, + NLS.bind(Messages.AbstractStep_error_missingRequiredAttribute, "dependency id (requires)", getLabel()), //$NON-NLS-1$ + null)); } if (!dependencies.contains(value.trim())) { dependencies.add(value.trim()); @@ -93,7 +87,7 @@ public abstract class AbstractStep extends ExecutableExtension implements IExten * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#initializeFrom(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor) */ @Override - public void initializeFrom(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) { + public void initializeFrom(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) { Assert.isNotNull(context); Assert.isNotNull(data); Assert.isNotNull(fullQualifiedId); @@ -107,7 +101,7 @@ public abstract class AbstractStep extends ExecutableExtension implements IExten * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#cleanup(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor) */ @Override - public void cleanup(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) { + public void cleanup(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) { StepperAttributeUtil.setProperty(SUFFIX_DELAYED_STATUS, fullQualifiedId, data, false); StepperAttributeUtil.setProperty(SUFFIX_OPERATIONAL, fullQualifiedId, data, false); } @@ -116,15 +110,17 @@ public abstract class AbstractStep extends ExecutableExtension implements IExten * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#rollback(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.core.runtime.IStatus, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.tcf.te.runtime.interfaces.callback.ICallback) */ @Override - public void rollback(IStepContext context, IPropertiesContainer data, IStatus status, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor, ICallback callback) { - if (callback != null) callback.done(this, Status.OK_STATUS); + public void rollback(IStepContext context, IPropertiesContainer data, IStatus status, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor, ICallback callback) { + if (callback != null) { + callback.done(this, Status.OK_STATUS); + } } /* (non-Javadoc) * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStep#getTotalWork(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer) */ @Override - public int getTotalWork(IStepContext context, IPropertiesContainer data) { + public int getTotalWork(IStepContext context, IPropertiesContainer data) { return 10; } @@ -132,7 +128,7 @@ public abstract class AbstractStep extends ExecutableExtension implements IExten * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStep#getDependencies() */ @Override - public String[] getDependencies() { + public String[] getDependencies() { return dependencies.toArray(new String[dependencies.size()]); } @@ -163,8 +159,8 @@ public abstract class AbstractStep extends ExecutableExtension implements IExten if (delayedStati.length > 0) { if (!(status instanceof MultiStatus)) { status = new MultiStatus(CoreBundleActivator.getUniqueIdentifier(), 0, - NLS.bind(Messages.AbstractStep_warning_stepFinishedWithWarnings, getLabel()), - null); + NLS.bind(Messages.AbstractStep_warning_stepFinishedWithWarnings, getLabel()), + null); } // At this point the status must be a MultiStatus @@ -200,9 +196,9 @@ public abstract class AbstractStep extends ExecutableExtension implements IExten ((MultiStatus)delayedStatus).merge(status); } else { MultiStatus multiStatus = new MultiStatus(CoreBundleActivator.getUniqueIdentifier(), 0, - new IStatus[] { delayedStatus, status }, - "", //$NON-NLS-1$ - null); + new IStatus[] { delayedStatus, status }, + "", //$NON-NLS-1$ + null); StepperAttributeUtil.setProperty(SUFFIX_DELAYED_STATUS, fullQualifiedId, data, multiStatus); } } diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepContext.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepContext.java index 0c3e3290b..287533ab2 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepContext.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepContext.java @@ -1,50 +1,57 @@ -/*******************************************************************************
- * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.runtime.stepper.interfaces;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-
-/**
- * Interface to be implemented by objects representing a context for a step.
- */
-public interface IStepContext extends IAdaptable {
-
- /**
- * Returns the context id.
- *
- * @return The context id or <code>null</code>.
- */
- public String getId();
-
- /**
- * Returns a name/label to be used within the UI to represent this context
- * to the user.
- *
- * @return The name or <code>null</code>.
- */
- public String getName();
-
- /**
- * Returns the context object.
- *
- * @return The context Object. Must not be <code>null</code>.
- */
- public Object getContextObject();
-
- /**
- * Returns a possible multi-line string providing detail information
- * about the context which shall be included in failure messages.
- *
- * @param data The step data. Must not be <code>null</code>.
- * @return The context information or <code>null</code>.
- */
- public String getInfo(IPropertiesContainer data);
-}
+/******************************************************************************* + * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.runtime.stepper.interfaces; + +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; + +/** + * Interface to be implemented by objects representing a context for a step. + */ +public interface IStepContext extends IAdaptable { + + /** + * Returns the context id. + * + * @return The context id or <code>null</code>. + */ + public String getId(); + + /** + * Returns the context secondary id. + * + * @return The context secondary id or <code>null</code>. + */ + public String getSecondaryId(); + + /** + * Returns a name/label to be used within the UI to represent this context + * to the user. + * + * @return The name or <code>null</code>. + */ + public String getName(); + + /** + * Returns the context object. + * + * @return The context Object. Must not be <code>null</code>. + */ + public Object getContextObject(); + + /** + * Returns a possible multi-line string providing detail information + * about the context which shall be included in failure messages. + * + * @param data The step data. Must not be <code>null</code>. + * @return The context information or <code>null</code>. + */ + public String getInfo(IPropertiesContainer data); +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepper.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepper.java index 3df1ee516..66e2a93eb 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepper.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepper.java @@ -1,141 +1,134 @@ -/*******************************************************************************
- * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.runtime.stepper.interfaces;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.tcf.te.runtime.interfaces.IConditionTester;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-
-
-/**
- * A stepper.
- * <p>
- * Stepper are executing a set of steps and/or step groups for the given context(s). The stepper is
- * responsible for handling any exceptions which occurred during step execution.
- * <p>
- * <b>Note:</b> Stepper are synchronous where steps are asynchronous.
- * <p>
- * Stepper must run in worker threads.
- */
-public interface IStepper {
-
- public static final String ID_TYPE_STEPPER_ID = "Stepper"; //$NON-NLS-1$
- public static final String ID_TYPE_CONTEXT_ID = "Context"; //$NON-NLS-1$
- public static final String ID_TYPE_STEP_GROUP_ID = "StepGroup"; //$NON-NLS-1$
- public static final String ID_TYPE_STEP_GROUP_ITERATION_ID = "StepGroupIteration"; //$NON-NLS-1$
- public static final String ID_TYPE_STEP_ID = "Step"; //$NON-NLS-1$
-
- /**
- * Condition Tester to test for finished execution of the associated stepper.
- */
- public static class ExecutionFinishedConditionTester implements IConditionTester {
- private final IStepper stepper;
-
- /**
- * Constructor.
- *
- * @param stepper The stepper. Must not be <code>null</code>.
- */
- public ExecutionFinishedConditionTester(IStepper stepper) {
- Assert.isNotNull(stepper);
- this.stepper = stepper;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.interfaces.IConditionTester#cleanup()
- */
- @Override
- public void cleanup() {
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.interfaces.IConditionTester#isConditionFulfilled()
- */
- @Override
- public boolean isConditionFulfilled() {
- return stepper.isFinished();
- }
- }
-
- /**
- * Returns the unique id of the extension. The returned
- * id must be never <code>null</code> or an empty string.
- *
- * @return The unique id.
- */
- public String getId();
-
- /**
- * Returns the label or UI name of the extension.
- *
- * @return The label or UI name. An empty string if not set.
- */
- public String getLabel();
-
- /**
- * Returns the description of the extension.
- *
- * @return The description or an empty string.
- */
- public String getDescription();
-
- /**
- * Initialize the stepper for a run. This method must be called before <i><code>execute()</code>
- * </i>. Once the stepper finished the execution, the initialization is reseted and must be
- * renewed before <i><code>execute()</code></i> can be called again.
- *
- * @param context The step context. Must not be <code>null</code>.
- * @param data The data. Must not be <code>null</code>.
- * @param fullQualifiedId The full qualified id of this stepper.
- * @param monitor The progress monitor. Must not be <code>null</code>.
- *
- * @throws IllegalStateException If called if the stepper is in initialized state already.
- */
- public void initialize(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) throws IllegalStateException;
-
- /**
- * Returns if or if not the stepper got initialized for a new run.
- * <p>
- * The <i><code>execute()</code></i> method cannot be called if the stepper is not correctly
- * initialized for each run. The initialized state can be set only by calling the <i>
- * <code>initialize(...)</code></i> method. <i> <code>cleanup()</code></i> will reset the
- * initialized state back to uninitialized.
- *
- * @return <code>True</code> if initialized, <code>false</code> otherwise.
- */
- public boolean isInitialized();
-
- /**
- * Executes the configured steps. The method is synchronous and must return only if all steps
- * finished or an exception occurred.
- * <p>
- * Steps are assumed to be asynchronous. The stepper implementor must wait for callback(s) to be
- * invoked by the step implementor(s) before the sequence can continue.
- * <p>
- * <b>Note:</b> Waiting for the step callback must not block the UI thread.
- *
- * @throws CoreException In case the execution fails or is canceled.
- */
- public void execute() throws CoreException;
-
- /**
- * Returns if or if not the stepper finished the execution.
- *
- * @return <code>True</code> if the execution is finished, <code>false</code> otherwise.
- */
- public boolean isFinished();
-
- /**
- * Cleanup and reset the stepper into a defined state.
- */
- public void cleanup();
-}
+/******************************************************************************* + * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.runtime.stepper.interfaces; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.tcf.te.runtime.interfaces.IConditionTester; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; + + +/** + * A stepper. + * <p> + * Stepper are executing a set of steps and/or step groups for the given context(s). The stepper is + * responsible for handling any exceptions which occurred during step execution. + * <p> + * <b>Note:</b> Stepper are synchronous where steps are asynchronous. + * <p> + * Stepper must run in worker threads. + */ +public interface IStepper { + + public static final String ID_TYPE_STEP_CONTEXT_ID = "StepContext"; //$NON-NLS-1$ + public static final String ID_TYPE_STEPPER_ID = "Stepper"; //$NON-NLS-1$ + public static final String ID_TYPE_STEP_GROUP_ID = "StepGroup"; //$NON-NLS-1$ + public static final String ID_TYPE_STEP_ID = "Step"; //$NON-NLS-1$ + + /** + * Condition Tester to test for finished execution of the associated stepper. + */ + public static class ExecutionFinishedConditionTester implements IConditionTester { + private final IStepper stepper; + + /** + * Constructor. + * + * @param stepper The stepper. Must not be <code>null</code>. + */ + public ExecutionFinishedConditionTester(IStepper stepper) { + Assert.isNotNull(stepper); + this.stepper = stepper; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.interfaces.IConditionTester#cleanup() + */ + @Override + public void cleanup() { + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.interfaces.IConditionTester#isConditionFulfilled() + */ + @Override + public boolean isConditionFulfilled() { + return stepper.isFinished(); + } + } + + /** + * Returns the unique id of the extension. The returned + * id must be never <code>null</code> or an empty string. + * + * @return The unique id. + */ + public String getId(); + + /** + * Returns the label or UI name of the extension. + * + * @return The label or UI name. An empty string if not set. + */ + public String getLabel(); + + /** + * Initialize the stepper for a run. This method must be called before <i><code>execute()</code> + * </i>. Once the stepper finished the execution, the initialization is reseted and must be + * renewed before <i><code>execute()</code></i> can be called again. + * + * @param context The step context. Must not be <code>null</code>. + * @param stepGroupId The step group to execute. Must not be <code>null</code>. + * @param data The data to transfer data between steps. Must not be <code>null</code>. + * Can also be used to get data from the launch after it has finished. + * @param monitor The progress monitor or <code>null</code>. + * + * @throws IllegalStateException If called if the stepper is in initialized state already. + */ + public void initialize(IStepContext context, String stepGroupId, IPropertiesContainer data, IProgressMonitor monitor) throws IllegalStateException; + + /** + * Returns if or if not the stepper got initialized for a new run. + * <p> + * The <i><code>execute()</code></i> method cannot be called if the stepper is not correctly + * initialized for each run. The initialized state can be set only by calling the <i> + * <code>initialize(...)</code></i> method. <i> <code>cleanup()</code></i> will reset the + * initialized state back to uninitialized. + * + * @return <code>True</code> if initialized, <code>false</code> otherwise. + */ + public boolean isInitialized(); + + /** + * Executes the configured steps. The method is synchronous and must return only if all steps + * finished or an exception occurred. + * <p> + * Steps are assumed to be asynchronous. The stepper implementor must wait for callback(s) to be + * invoked by the step implementor(s) before the sequence can continue. + * <p> + * <b>Note:</b> Waiting for the step callback must not block the UI thread. + * + * @throws CoreException In case the execution fails or is canceled. + */ + public void execute() throws CoreException; + + /** + * Returns if or if not the stepper finished the execution. + * + * @return <code>True</code> if the execution is finished, <code>false</code> otherwise. + */ + public boolean isFinished(); + + /** + * Cleanup and reset the stepper into a defined state. + */ + public void cleanup(); +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepperProperties.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepperProperties.java deleted file mode 100644 index e834644a4..000000000 --- a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepperProperties.java +++ /dev/null @@ -1,34 +0,0 @@ -/*******************************************************************************
- * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.runtime.stepper.interfaces;
-
-/**
- * Common stepper configuration property definitions.
- * <p>
- * Stepper are configured by setting properties within the properties container passed to the stepper via the
- * {@link IStepper#initialize(org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor)}
- * call.
- */
-public interface IStepperProperties {
-
- /**
- * The id of the step group to execute by the stepper.
- * <p>
- * Type: String
- */
- public static final String PROP_STEP_GROUP_ID = "stepGroupID"; //$NON-NLS-1$
-
- /**
- * A name describing to the user what the stepper is executing.
- * <p>
- * Type: String
- */
- public static final String PROP_NAME = "name"; //$NON-NLS-1$
-}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/stepper/Stepper.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/stepper/Stepper.java index 58f1d2d1b..e8a91e33a 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/stepper/Stepper.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/stepper/Stepper.java @@ -1,755 +1,759 @@ -/*******************************************************************************
- * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.runtime.stepper.stepper;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.tcf.te.runtime.callback.Callback;
-import org.eclipse.tcf.te.runtime.concurrent.util.ExecutorsUtil;
-import org.eclipse.tcf.te.runtime.interfaces.ISharedConstants;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.stepper.StepperManager;
-import org.eclipse.tcf.te.runtime.stepper.activator.CoreBundleActivator;
-import org.eclipse.tcf.te.runtime.stepper.extensions.StepExecutor;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStep;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepExecutor;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroup;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupIterator;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupable;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepperProperties;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.tracing.ITraceIds;
-import org.eclipse.tcf.te.runtime.stepper.nls.Messages;
-import org.eclipse.tcf.te.runtime.utils.ProgressHelper;
-import org.eclipse.tcf.te.runtime.utils.StatusHelper;
-
-/**
- * An abstract stepper implementation.
- */
-public class Stepper implements IStepper {
-
- private boolean initialized = false;
- private boolean finished = false;
- private IPropertiesContainer data = null;
- private IFullQualifiedId fullQualifiedId = null;
- private IProgressMonitor monitor = null;
- private IStepContext context = null;
- private boolean cancelable = true;
-
- /**
- * Internal helper describing a fully executed step.
- */
- protected final class ExecutedContextStep {
- final IFullQualifiedId id;
- final IStep step;
-
- public ExecutedContextStep(IFullQualifiedId id, IStep step) {
- this.id = id;
- this.step = step;
- }
- }
-
- /**
- * Constructor.
- */
- public Stepper() {
- super();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#getId()
- */
- @Override
- public String getId() {
- return getClass().getName();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#getLabel()
- */
- @Override
- public String getLabel() {
- return getClass().getName();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#getDescription()
- */
- @Override
- public String getDescription() {
- return null;
- }
-
- /**
- * Returns the id of the step group to execute by the stepper.
- *
- * @return The step group id.
- */
- protected String getStepGroupId() {
- return getData() != null ? getData().getStringProperty(IStepperProperties.PROP_STEP_GROUP_ID) : null;
- }
-
- /**
- * Returns the step group for the given step group id.
- *
- * @param The step group id. Must not be <code>null</code>:
- * @return The step group or <code>null</code>.
- */
- protected IStepGroup getStepGroup(String id) {
- Assert.isNotNull(id);
-
- CoreBundleActivator.getTraceHandler().trace("SingleContextStepper#getStepGroup:" //$NON-NLS-1$
- + " id = '" + id + "'", //$NON-NLS-1$ //$NON-NLS-2$
- 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this);
-
- return StepperManager.getInstance().getStepGroupExtManager().getStepGroup(id, false);
- }
-
- /**
- * Creates a new instance of the step executor to use for executing a step.
- *
- * @param step The step. Must not be <code>null</code>.
- * @param secondaryId The secondary id or <code>null</code>.
- * @param fullQualifiedStepId The fully qualified step id. Must not be <code>null</code>.
- *
- * @return The step executor instance.
- */
- protected IStepExecutor doCreateStepExecutor(IStep step, String secondaryId, IFullQualifiedId fullQualifiedStepId) {
- Assert.isNotNull(step);
- Assert.isNotNull(fullQualifiedStepId);
- return new StepExecutor();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#initialize(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor)
- */
- @Override
- public final void initialize(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) throws IllegalStateException {
- Assert.isNotNull(context);
- Assert.isNotNull(data);
- Assert.isNotNull(fullQualifiedId);
- Assert.isNotNull(monitor);
-
- // Assert stepper is not in use
- if (isInitialized()) {
- throw new IllegalStateException("Stepper instance already initialized!"); //$NON-NLS-1$
- }
-
- // set the initial stepper attributes
- this.context = context;
- this.data = data;
- this.monitor = monitor;
- this.fullQualifiedId = fullQualifiedId;
-
- // but not finished yet
- this.finished = false;
-
- // call the hook for the subclasses to initialize themselves
- onInitialize(data, fullQualifiedId, monitor);
-
- setInitialized();
-
- CoreBundleActivator.getTraceHandler().trace("Stepper#initialize:" //$NON-NLS-1$
- + " data = " + data, //$NON-NLS-1$
- 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this);
- }
-
- /**
- * Hook for subclasses to overwrite if subclasses wants to initialize their own state.
- *
- * @param data The data. Must not be <code>null</code>.
- * @param fullQualifiedId The full qualified id of this stepper.
- * @param monitor The progress monitor. Must not be <code>null</code>.
- */
- protected void onInitialize(IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) {
- Assert.isNotNull(data);
- Assert.isNotNull(fullQualifiedId);
- Assert.isNotNull(monitor);
- }
-
- /**
- * Marks the stepper to be fully initialized.
- */
- protected final void setInitialized() {
- initialized = true;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#isInitialized()
- */
- @Override
- public final boolean isInitialized() {
- return initialized;
- }
-
- /**
- * Sets the cancelable state of the stepper.
- *
- * @param cancelable <code>True</code> if the stepper shall be cancelable, <code>false</code> if
- * not.
- */
- protected final void setCancelable(boolean cancelable) {
- this.cancelable = cancelable;
- }
-
- /**
- * Returns the cancelable state of the stepper.
- *
- * @return <code>True</code> if the stepper is cancelable, <code>false</code> if not.
- */
- protected final boolean isCancelable() {
- return cancelable;
- }
-
- /**
- * Get the active context.
- *
- * @return The active context or <code>null</code>.
- */
- protected IStepContext getContext() {
- return context;
- }
-
- /**
- * Get the context id.
- *
- * @return The context id or <code>null</code>.
- */
- protected String getContextId() {
- return context != null ? context.getId() : null;
- }
-
- /**
- * Returns the currently associated data. The method returns <code>null</code> if the stepper is
- * not in initialized state.
- *
- * @return The data or <code>null</code>
- */
- protected final IPropertiesContainer getData() {
- return isInitialized() ? data : null;
- }
-
- /**
- * Returns the full qualified id for this stepper.
- *
- * @return The full qualified stepper id.
- */
- protected final IFullQualifiedId getFullQualifiedId() {
- return fullQualifiedId;
- }
-
- /**
- * Returns the currently associated progress monitor. The method returns <code>null</code> if
- * the stepper is not in initialized state.
- *
- * @return The progress monitor or <code>null</code>
- */
- protected final IProgressMonitor getMonitor() {
- return isInitialized() ? monitor : null;
- }
-
- /**
- * Marks the stepper to be finished.
- */
- protected final void setFinished() {
- finished = true;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#isFinished()
- */
- @Override
- public final boolean isFinished() {
- return finished;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#cleanup()
- */
- @Override
- public void cleanup() {
- // Set the progress monitor done here in any case
- if (getMonitor() != null) {
- getMonitor().done();
- }
-
- // Reset the initial stepper attributes
- context = null;
- data = null;
- monitor = null;
- fullQualifiedId = null;
- finished = false;
- initialized = false;
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- StringBuilder buffer = new StringBuilder(getClass().getSimpleName());
- buffer.append(" (" + getLabel() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
- buffer.append(": "); //$NON-NLS-1$
- buffer.append("id = " + getId()); //$NON-NLS-1$
- return buffer.toString();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#execute()
- */
- @Override
- public final void execute() throws CoreException {
- long startTime = System.currentTimeMillis();
-
- CoreBundleActivator.getTraceHandler().trace("Stepper#execute: *** ENTERED", //$NON-NLS-1$
- 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this);
- CoreBundleActivator.getTraceHandler().trace(" [" + ISharedConstants.TIME_FORMAT.format(new Date(startTime)) + "]" //$NON-NLS-1$ //$NON-NLS-2$
- + " ***", //$NON-NLS-1$
- 0, ITraceIds.PROFILE_STEPPING, IStatus.WARNING, this);
-
- try {
- // stepper must be initialized before executing
- if (!isInitialized()) {
- throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), Messages.Stepper_error_initializeNotCalled));
- }
-
- // Create a container for collecting the non-severe status objects
- // during the step execution. Non-severe status objects will
- // be hold back till the execution completed or stopped with an error.
- // Severe status objects are errors or cancellation.
- List<IStatus> statusContainer = new ArrayList<IStatus>();
-
- // start execution
- internalExecute(statusContainer);
-
- // If the warnings container is not empty, create a new status and
- // throw a core exception
- if (!statusContainer.isEmpty()) {
- IStatus status = null;
-
- // Check if we need a multi status
- if (statusContainer.size() > 1) {
- MultiStatus multiStatus = new MultiStatus(CoreBundleActivator.getUniqueIdentifier(), 0,
- NLS.bind(Messages.Stepper_multiStatus_finishedWithWarnings, getLabel()), null);
- for (IStatus subStatus : statusContainer) {
- multiStatus.merge(subStatus);
- }
- status = multiStatus;
- }
- else {
- status = statusContainer.get(0);
- }
-
- throw new CoreException(status);
- }
- }
- finally {
- // Mark the stepper finished
- setFinished();
-
- long endTime = System.currentTimeMillis();
- CoreBundleActivator.getTraceHandler().trace("Stepper#execute: *** DONE", //$NON-NLS-1$
- 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this);
- CoreBundleActivator.getTraceHandler().trace(" [" + ISharedConstants.TIME_FORMAT.format(new Date(endTime)) //$NON-NLS-1$
- + " , delay = " + (endTime - startTime) + " ms]" //$NON-NLS-1$ //$NON-NLS-2$
- + " ***", //$NON-NLS-1$
- 0, ITraceIds.PROFILE_STEPPING, IStatus.WARNING, this);
- }
- }
-
- /**
- * Executes a step or step group.
- *
- * @param statusContainer The status container. Must not be <code>null</code>.
- * @throws CoreException If the execution fails.
- */
- protected void internalExecute(List<IStatus> statusContainer) throws CoreException {
- Assert.isNotNull(statusContainer);
-
- // Get the step group id
- String stepGroupId = getStepGroupId();
-
- // If no step group id is available, throw an exception
- if (stepGroupId == null) {
- throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(),
- NLS.bind(Messages.Stepper_error_missingStepGroupId, getLabel())));
- }
-
- // Get the step group
- IStepGroup stepGroup = getStepGroup(stepGroupId);
-
- // If no step group could be found, throw an exception
- if (stepGroup == null) {
- throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(),
- NLS.bind(Messages.Stepper_error_missingStepGroup, stepGroupId)));
- }
-
- // Initialize the progress monitor
- getMonitor().beginTask(stepGroup.getLabel(), calculateTotalWork(stepGroup));
-
- IFullQualifiedId fullQualifiedId = getFullQualifiedId().createChildId(ID_TYPE_CONTEXT_ID, getContextId(), null);
- fullQualifiedId = fullQualifiedId.createChildId(ID_TYPE_STEP_GROUP_ID, stepGroup.getId(), null);
- // Execute the step group
- executeStepGroup(stepGroup, statusContainer, new ArrayList<ExecutedContextStep>(), fullQualifiedId);
- }
-
- /**
- * Executes a step group.
- *
- * @param stepGroup The step group. Must not be <code>null</code>.
- * @param statusContainer A list holding the warnings occurred during the execution. Must not be
- * <code>null</code>.
- * @param executedSteps A list holding the id's of the steps executed before. Must not be
- * <code>null</code>.
- * @param fullQualifiedGroupId The hierarchy of all parent step group id's separated by "::".
- * Must not be <code>null</code>.
- *
- * @throws CoreException If the execution fails.
- */
- private void executeStepGroup(IStepGroup stepGroup, List<IStatus> statusContainer, List<ExecutedContextStep> executedSteps, IFullQualifiedId fullQualifiedGroupId) throws CoreException {
- Assert.isNotNull(stepGroup);
- Assert.isNotNull(statusContainer);
- Assert.isNotNull(executedSteps);
- Assert.isNotNull(fullQualifiedGroupId);
-
- // Return immediately if the user canceled the monitor in the meanwhile
- if (isCancelable() && getMonitor().isCanceled()) {
- rollback(executedSteps, Status.CANCEL_STATUS, getMonitor());
- throw new CoreException(StatusHelper.getStatus(new OperationCanceledException()));
- }
-
- CoreBundleActivator
- .getTraceHandler()
- .trace("Stepper#executeStepGroup: step group: '" + stepGroup.getLabel() + "'", //$NON-NLS-1$ //$NON-NLS-2$
- 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this);
-
- // Resolve the steps to execute
- IStepGroupable[] groupables = stepGroup.getSteps(getContext());
-
- IStepGroupIterator iterator = stepGroup.getStepGroupIterator();
- IFullQualifiedId fullQualifiedIterationId = fullQualifiedGroupId;
- int iteration = 0;
-
- if (iterator != null) {
- iterator.initialize(getContext(), getData(), fullQualifiedGroupId, getMonitor());
- }
- boolean next = iterator == null || iterator.hasNext(getContext(), getData(), fullQualifiedGroupId, getMonitor());
-
- while (next) {
- if (iterator != null) {
- fullQualifiedIterationId = fullQualifiedGroupId.createChildId(ID_TYPE_STEP_GROUP_ITERATION_ID, iterator.getId(), "" + iteration); //$NON-NLS-1$
- iterator.next(getContext(), getData(), fullQualifiedIterationId, getMonitor());
- }
- // Execute the steps or step groups.
- for (IStepGroupable groupable : groupables) {
- executeGroupable(groupable, statusContainer, executedSteps, fullQualifiedIterationId);
- }
- iteration++;
- next = iterator != null && iterator.hasNext(getContext(), getData(), fullQualifiedGroupId, getMonitor());
- }
- }
-
- /**
- * Executes a step groupable. The groupable might encapsulate a step or a step group.
- *
- * @param step The step groupable. Must not be <code>null</code>.
- * @param statusContainer A list holding the warnings occurred during the execution. Must not be
- * <code>null</code>.
- * @param executedSteps A list holding the id's of the steps executed before. Must not be
- * <code>null</code>.
- * @param fullQualifiedParentId The hierarchy of all parent step group id's separated by "::".
- * Must not be <code>null</code>.
- *
- * @throws CoreException If the execution failed.
- */
- private void executeGroupable(IStepGroupable groupable, List<IStatus> statusContainer, List<ExecutedContextStep> executedSteps, IFullQualifiedId fullQualifiedParentId) throws CoreException {
- Assert.isNotNull(groupable);
- Assert.isNotNull(statusContainer);
- Assert.isNotNull(executedSteps);
- Assert.isNotNull(fullQualifiedParentId);
-
- // Return immediately if the user canceled the monitor in the meanwhile
- if (isCancelable() && getMonitor() != null && getMonitor().isCanceled()) {
- rollback(executedSteps, Status.CANCEL_STATUS, getMonitor());
- throw new CoreException(StatusHelper.getStatus(new OperationCanceledException()));
- }
-
- // If the passed in groupable is disabled -> we are done immediately
- if (groupable.isDisabled()) {
- CoreBundleActivator.getTraceHandler().trace("Stepper#executeGroupable: DROPPED DISABLED groupable: id = '" + groupable.getExtension().getId() + "'" //$NON-NLS-1$ //$NON-NLS-2$
- + ", secondaryId = '" + groupable.getSecondaryId() + "'", //$NON-NLS-1$ //$NON-NLS-2$
- 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this);
- return;
- }
-
- // Check if all dependencies of the groupable have been executed before
- checkForDependenciesExecuted(groupable, executedSteps);
-
- if (groupable.getExtension() instanceof IStepGroup) {
- IFullQualifiedId id = fullQualifiedParentId.createChildId(ID_TYPE_STEP_GROUP_ID, groupable.getExtension().getId(), groupable.getSecondaryId());
- // If the passed in groupable is associated with a step group
- // -> get the groupable from that group and execute them
- executeStepGroup((IStepGroup) groupable.getExtension(), statusContainer, executedSteps, id);
- }
- else if (groupable.getExtension() instanceof IStep) {
- // If the passed in groupable is associated with a step
- // -> check if the required steps have been executed before,
- // create a step executor and invoke the executor.
- IStep step = (IStep) groupable.getExtension();
-
- IFullQualifiedId id = fullQualifiedParentId.createChildId(ID_TYPE_STEP_ID, step.getId(), groupable.getSecondaryId());
-
- // Create the step executor now
- IStepExecutor executor = doCreateStepExecutor(step, groupable.getSecondaryId(), id);
- Assert.isNotNull(executor);
-
- try {
- executedSteps.add(new ExecutedContextStep(id, step));
- // Invoke the executor now
- executor.execute(step, id, getContext(), getData(), getMonitor());
- }
- catch (Exception e) {
- // Catch the CoreException first hand as we need to continue the
- // stepping if the step returned with warnings or information only.
- CoreException coreException = normalizeStatus(e, statusContainer);
- // If the exception has been not eaten, rollback previously executed
- // steps and re-throw the exception.
- if (coreException != null) {
- // Rollback everything, if the step(s) are supporting this and
- // the cleanup hasn't been done already.
- if (isInitialized()) {
- rollback(executedSteps, coreException.getStatus(), getMonitor());
- }
-
- // Re-throw the exception
- throw coreException;
- }
- }
- }
- }
-
- /**
- * Checks if all required dependencies have been executed before. If not, the method will throw
- * an error status.
- *
- * @param groupable The groupable. Must not be <code>null</code>.
- * @param executedSteps A list holding the id's of the steps executed before. Must not be
- * <code>null</code>.
- *
- * @throws CoreException If a dependency has not been executed before.
- */
- protected void checkForDependenciesExecuted(IStepGroupable groupable, List<ExecutedContextStep> executedSteps) throws CoreException {
- Assert.isNotNull(groupable);
- Assert.isNotNull(executedSteps);
-
- // Build up the complete list of dependencies.
- List<String> dependencies = new ArrayList<String>(Arrays.asList(groupable.getDependencies()));
- // If the groupable wraps a step, the step can have additional dependencies to check
- if (groupable.getExtension() instanceof IStep) {
- dependencies.addAll(Arrays.asList(((IStep) groupable.getExtension()).getDependencies()));
- }
-
- // Check each dependency now.
- for (String dependency : dependencies) {
- // The dependencies might be fully qualified. Split out the primary id.
- String[] splitted = dependency.split("##", 2); //$NON-NLS-1$
- String primaryId = splitted.length == 2 ? splitted[0] : dependency;
-
- // Check if the id is in the list of executed steps. As the list contains
- // the fully qualified id's, we cannot just check for contained
- boolean requiredStepExecuted = false;
- for (ExecutedContextStep step : executedSteps) {
- if (step.step.getId().equals(primaryId)) {
- requiredStepExecuted = true;
- break;
- }
- }
-
- if (!requiredStepExecuted) {
- throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(),
- MessageFormat.format(Messages.Stepper_error_requiredStepNotExecuted,
- NLS.bind(groupable.getExtension() instanceof IStep ? Messages.Stepper_error_step : Messages.Stepper_error_stepGroup,
- groupable.getExtension().getId()),
- NLS.bind(Messages.Stepper_error_requiredStepOrGroup, dependency), ""))); //$NON-NLS-1$
- }
-
- // Recursive checking is not necessary here as the step or step group
- // id's would have made it the executed steps list of they missed required
- // steps or step groups.
- }
-
- }
-
- /**
- * Rollback the steps previously executed to the failed step. The rollback is executed in
- * reverse order and the step must be of type {@link IExtendedStep} to participate in the
- * rollback.
- *
- * @param executedSteps
- * @param progress
- */
- protected final void rollback(final List<ExecutedContextStep> executedSteps, final IStatus rollBackStatus, IProgressMonitor progress) {
- Assert.isNotNull(executedSteps);
-
- final IProgressMonitor rollbackProgress = ProgressHelper.getProgressMonitor(progress, 1);
- ProgressHelper.beginTask(rollbackProgress, "Cancel", executedSteps.size()); //$NON-NLS-1$
- final Callback finalCallback = new Callback();
- final Callback rollbackCallback = new Callback() {
- @Override
- protected void internalDone(Object caller, IStatus status) {
- if (!executedSteps.isEmpty()) {
- setProperty(PROPERTY_IS_DONE, false);
- ExecutedContextStep executedStep = executedSteps
- .remove(executedSteps.size() - 1);
- if (executedStep.step instanceof IExtendedStep) {
- IExtendedStep step = (IExtendedStep) executedStep.step;
- step.rollback(getContext(), getData(), rollBackStatus, executedStep.id, rollbackProgress, this);
- }
- else {
- this.done(this, status);
- }
- }
- else {
- finalCallback.done(this, Status.OK_STATUS);
- }
- }
- };
-
- rollbackCallback.done(this, rollBackStatus);
- ExecutorsUtil.waitAndExecute(0, finalCallback.getDoneConditionTester(null));
- }
-
- /**
- * Calculates the total work required for the step group. The total work is the sum of the total
- * work of each sub step. If one of the steps returns {@link IProgressMonitor#UNKNOWN}, the
- * total work will be unknown for the whole step group.
- *
- * @param stepGroup The step group. Must not be <code>null</code>.
- * @return The total work required or {@link IProgressMonitor#UNKNOWN}.
- *
- * @throws CoreException If the total work of the step group cannot be determined.
- */
- protected int calculateTotalWork(IStepGroup stepGroup) throws CoreException {
- Assert.isNotNull(stepGroup);
-
- int totalWork = 0;
-
- // Loop the group steps and summarize the returned total work
- IStepGroupable[] groupables = stepGroup.getSteps(getContext());
- for (IStepGroupable groupable : groupables) {
- int work = groupable.getExtension() instanceof IStep ? ((IStep) groupable
- .getExtension()).getTotalWork(getContext(), getData()) : groupable
- .getExtension() instanceof IStepGroup ? calculateTotalWork((IStepGroup) groupable
- .getExtension()) : IProgressMonitor.UNKNOWN;
-
- if (work == IProgressMonitor.UNKNOWN) {
- totalWork = IProgressMonitor.UNKNOWN;
- break;
- }
-
- totalWork += work;
- }
-
- return totalWork;
- }
-
- /**
- * Normalize the associated status object of the given {@link CoreException}.
- * <p>
- * If the associated status contains only WARNING or INFORMATION status objects, the objects are
- * added to the passed in status container. The passed in exception is dropped and the method
- * will return <code>null</code>.
- * <p>
- * If the associated status contains only OK status objects, the passed in exception and the
- * associated status are dropped and the method will return <code>null</code>.
- * <p>
- * If the associated status contain ERROR status objects, the passed in exception and the
- * associated status objects are returned if the passed in status container is empty. If the
- * status container is not empty, a new exception and multi status object is created and
- * returned. The multi status object will contain all status objects from the status container
- * and all objects of the originally associated status.
- * <p>
- * If the associated status contains a CANCEL status object, the passed in exception and the
- * associated status objects are returned unmodified.
- *
- * @param e The core exception. Must not be <code>null</code>.
- * @param statusContainer The list of non-severe status objects. Must not be <code>null</code>.
- * @return The exception to re-throw or <code>null</code>.
- */
- private CoreException normalizeStatus(Exception e, List<IStatus> statusContainer) {
- Assert.isNotNull(statusContainer);
-
- CoreException coreException = null;
-
- IStatus status = Status.OK_STATUS;
- // Get the associated status from the exception
- if (e instanceof CoreException) {
- status = ((CoreException) e).getStatus();
- coreException = (CoreException) e;
- }
- else if (e instanceof OperationCanceledException) {
- status = new Status(IStatus.CANCEL, CoreBundleActivator.getUniqueIdentifier(), e.getLocalizedMessage(), e);
- coreException = new CoreException(status);
- }
- else if (e != null) {
- status = new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), e.getLocalizedMessage(), e);
- coreException = new CoreException(status);
- }
-
- // Check the severity
- // PS: MultiStatus.getSeverity() returns always the highest severity.
- if (status.getSeverity() == IStatus.OK) {
- // OK -> drop completely and return null
- coreException = null;
- }
- else if (status.getSeverity() == IStatus.CANCEL) {
- // CANCEL -> Check monitor to be canceled.
- if (isCancelable()) {
- if (getMonitor() != null && !getMonitor().isCanceled()) {
- getMonitor().setCanceled(true);
- }
- }
- }
- else if (status.getSeverity() == IStatus.WARNING || status.getSeverity() == IStatus.INFO) {
- // WARNING or INFORMATION -> add to the list and return null
- statusContainer.add(status);
- coreException = null;
- }
- else if (status.getSeverity() == IStatus.ERROR) {
- // Error -> If the warnings container not empty, create
- // a new MultiStatus.
- if (!statusContainer.isEmpty()) {
- MultiStatus multiStatus = new MultiStatus(status.getPlugin(), status.getCode(), NLS.bind(Messages.Stepper_multiStatus_finishedWithErrors, getLabel()), null);
- for (IStatus stat : statusContainer) {
- multiStatus.merge(stat);
- }
- // Re-throw via a new CoreException
- coreException = new CoreException(multiStatus);
- }
- }
-
- return coreException;
- }
-}
+/******************************************************************************* + * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.runtime.stepper.stepper; + +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Status; +import org.eclipse.osgi.util.NLS; +import org.eclipse.tcf.te.runtime.callback.Callback; +import org.eclipse.tcf.te.runtime.concurrent.util.ExecutorsUtil; +import org.eclipse.tcf.te.runtime.interfaces.ISharedConstants; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.stepper.FullQualifiedId; +import org.eclipse.tcf.te.runtime.stepper.StepperManager; +import org.eclipse.tcf.te.runtime.stepper.activator.CoreBundleActivator; +import org.eclipse.tcf.te.runtime.stepper.extensions.StepExecutor; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStep; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepExecutor; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroup; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupIterator; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupable; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper; +import org.eclipse.tcf.te.runtime.stepper.interfaces.tracing.ITraceIds; +import org.eclipse.tcf.te.runtime.stepper.nls.Messages; +import org.eclipse.tcf.te.runtime.utils.ProgressHelper; +import org.eclipse.tcf.te.runtime.utils.StatusHelper; + +/** + * An abstract stepper implementation. + */ +public class Stepper implements IStepper { + + private boolean initialized = false; + private boolean finished = false; + private IPropertiesContainer data = null; + private IFullQualifiedId fullQualifiedId = null; + private IProgressMonitor monitor = null; + private IStepContext context = null; + private boolean cancelable = true; + private String stepGroupId = null; + private String name = null; + + /** + * Internal helper describing a fully executed step. + */ + protected final class ExecutedContextStep { + final IFullQualifiedId id; + final IStep step; + + public ExecutedContextStep(IFullQualifiedId id, IStep step) { + this.id = id; + this.step = step; + } + } + + /** + * Constructor. + */ + public Stepper() { + super(); + } + + /** + * Constructor. + * + * @param name The name of this stepper. + */ + public Stepper(String name) { + super(); + this.name = name; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#getId() + */ + @Override + public String getId() { + return getClass().getName(); + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#getLabel() + */ + @Override + public String getLabel() { + return name != null && name.trim().length() > 0 ? name.trim() : getId(); + } + + /** + * Returns the id of the step group to execute by the stepper. + * + * @return The step group id. + */ + protected String getStepGroupId() { + return stepGroupId; + } + + /** + * Returns the step group for the given step group id. + * + * @param The step group id. Must not be <code>null</code>: + * @return The step group or <code>null</code>. + */ + protected IStepGroup getStepGroup(String id) { + Assert.isNotNull(id); + + CoreBundleActivator.getTraceHandler().trace("SingleContextStepper#getStepGroup:" //$NON-NLS-1$ + + " id = '" + id + "'", //$NON-NLS-1$ //$NON-NLS-2$ + 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this); + + return StepperManager.getInstance().getStepGroupExtManager().getStepGroup(id, false); + } + + /** + * Creates a new instance of the step executor to use for executing a step. + * + * @param step The step. Must not be <code>null</code>. + * @param secondaryId The secondary id or <code>null</code>. + * @param fullQualifiedStepId The fully qualified step id. Must not be <code>null</code>. + * + * @return The step executor instance. + */ + protected IStepExecutor doCreateStepExecutor(IStep step, String secondaryId, IFullQualifiedId fullQualifiedStepId) { + Assert.isNotNull(step); + Assert.isNotNull(fullQualifiedStepId); + return new StepExecutor(); + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#initialize(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, java.lang.String, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + public final void initialize(IStepContext context, String stepGroupId, IPropertiesContainer data, IProgressMonitor monitor) throws IllegalStateException { + Assert.isNotNull(context); + Assert.isNotNull(stepGroupId); + Assert.isNotNull(data); + + // Assert stepper is not in use + if (isInitialized()) { + throw new IllegalStateException("Stepper instance already initialized!"); //$NON-NLS-1$ + } + + // set the initial stepper attributes + this.context = context; + this.stepGroupId = stepGroupId; + this.data = data; + this.monitor = monitor != null ? monitor : new NullProgressMonitor(); + this.fullQualifiedId = new FullQualifiedId(IStepper.ID_TYPE_STEP_CONTEXT_ID, context.getId(), context.getSecondaryId()); + + // but not finished yet + this.finished = false; + + // call the hook for the subclasses to initialize themselves + onInitialize(this.data, fullQualifiedId, this.monitor); + + setInitialized(); + + CoreBundleActivator.getTraceHandler().trace("Stepper#initialize:" //$NON-NLS-1$ + + " data = " + data, //$NON-NLS-1$ + 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this); + } + + /** + * Hook for subclasses to overwrite if subclasses wants to initialize their own state. + * + * @param data The data. Must not be <code>null</code>. + * @param fullQualifiedId The full qualified id of this stepper. + * @param monitor The progress monitor. Must not be <code>null</code>. + */ + protected void onInitialize(IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) { + Assert.isNotNull(data); + Assert.isNotNull(monitor); + } + + /** + * Marks the stepper to be fully initialized. + */ + protected final void setInitialized() { + initialized = true; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#isInitialized() + */ + @Override + public final boolean isInitialized() { + return initialized; + } + + /** + * Sets the cancelable state of the stepper. + * + * @param cancelable <code>True</code> if the stepper shall be cancelable, <code>false</code> if + * not. + */ + protected final void setCancelable(boolean cancelable) { + this.cancelable = cancelable; + } + + /** + * Returns the cancelable state of the stepper. + * + * @return <code>True</code> if the stepper is cancelable, <code>false</code> if not. + */ + protected final boolean isCancelable() { + return cancelable; + } + + /** + * Get the active context. + * + * @return The active context or <code>null</code>. + */ + protected IStepContext getContext() { + return context; + } + + /** + * Get the context id. + * + * @return The context id or <code>null</code>. + */ + protected String getContextId() { + return context != null ? context.getId() : null; + } + + /** + * Returns the currently associated data. The method returns <code>null</code> if the stepper is + * not in initialized state. + * + * @return The data or <code>null</code> + */ + protected final IPropertiesContainer getData() { + return isInitialized() ? data : null; + } + + /** + * Returns the full qualified id for this stepper. + * + * @return The full qualified stepper id. + */ + protected final IFullQualifiedId getFullQualifiedId() { + return fullQualifiedId; + } + + /** + * Returns the currently associated progress monitor. The method returns <code>null</code> if + * the stepper is not in initialized state. + * + * @return The progress monitor or <code>null</code> + */ + protected final IProgressMonitor getMonitor() { + return isInitialized() ? monitor : null; + } + + /** + * Marks the stepper to be finished. + */ + protected final void setFinished() { + finished = true; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#isFinished() + */ + @Override + public final boolean isFinished() { + return finished; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#cleanup() + */ + @Override + public void cleanup() { + // Set the progress monitor done here in any case + if (getMonitor() != null) { + getMonitor().done(); + } + + // Reset the initial stepper attributes + context = null; + data = null; + monitor = null; + fullQualifiedId = null; + finished = false; + initialized = false; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(getClass().getSimpleName()); + buffer.append(" (" + getLabel() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ + buffer.append(": "); //$NON-NLS-1$ + buffer.append("id = " + getId()); //$NON-NLS-1$ + return buffer.toString(); + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper#execute() + */ + @Override + public final void execute() throws CoreException { + long startTime = System.currentTimeMillis(); + + CoreBundleActivator.getTraceHandler().trace("Stepper#execute: *** ENTERED", //$NON-NLS-1$ + 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this); + CoreBundleActivator.getTraceHandler().trace(" [" + ISharedConstants.TIME_FORMAT.format(new Date(startTime)) + "]" //$NON-NLS-1$ //$NON-NLS-2$ + + " ***", //$NON-NLS-1$ + 0, ITraceIds.PROFILE_STEPPING, IStatus.WARNING, this); + + try { + // stepper must be initialized before executing + if (!isInitialized()) { + throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), Messages.Stepper_error_initializeNotCalled)); + } + + // Create a container for collecting the non-severe status objects + // during the step execution. Non-severe status objects will + // be hold back till the execution completed or stopped with an error. + // Severe status objects are errors or cancellation. + List<IStatus> statusContainer = new ArrayList<IStatus>(); + + // start execution + internalExecute(statusContainer); + + // If the warnings container is not empty, create a new status and + // throw a core exception + if (!statusContainer.isEmpty()) { + IStatus status = null; + + // Check if we need a multi status + if (statusContainer.size() > 1) { + MultiStatus multiStatus = new MultiStatus(CoreBundleActivator.getUniqueIdentifier(), 0, + NLS.bind(Messages.Stepper_multiStatus_finishedWithWarnings, getLabel()), null); + for (IStatus subStatus : statusContainer) { + multiStatus.merge(subStatus); + } + status = multiStatus; + } + else { + status = statusContainer.get(0); + } + + throw new CoreException(status); + } + } + finally { + // Mark the stepper finished + setFinished(); + + long endTime = System.currentTimeMillis(); + CoreBundleActivator.getTraceHandler().trace("Stepper#execute: *** DONE", //$NON-NLS-1$ + 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this); + CoreBundleActivator.getTraceHandler().trace(" [" + ISharedConstants.TIME_FORMAT.format(new Date(endTime)) //$NON-NLS-1$ + + " , delay = " + (endTime - startTime) + " ms]" //$NON-NLS-1$ //$NON-NLS-2$ + + " ***", //$NON-NLS-1$ + 0, ITraceIds.PROFILE_STEPPING, IStatus.WARNING, this); + } + } + + /** + * Executes a step or step group. + * + * @param statusContainer The status container. Must not be <code>null</code>. + * @throws CoreException If the execution fails. + */ + protected void internalExecute(List<IStatus> statusContainer) throws CoreException { + Assert.isNotNull(statusContainer); + + // Get the step group id + String stepGroupId = getStepGroupId(); + + // If no step group id is available, throw an exception + if (stepGroupId == null) { + throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), + NLS.bind(Messages.Stepper_error_missingStepGroupId, getLabel()))); + } + + // Get the step group + IStepGroup stepGroup = getStepGroup(stepGroupId); + + // If no step group could be found, throw an exception + if (stepGroup == null) { + throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), + NLS.bind(Messages.Stepper_error_missingStepGroup, stepGroupId))); + } + + // Initialize the progress monitor + getMonitor().beginTask(stepGroup.getLabel(), calculateTotalWork(stepGroup)); + + IFullQualifiedId fullQualifiedId = getFullQualifiedId().createChildId(ID_TYPE_STEPPER_ID, getId(), null); + fullQualifiedId = fullQualifiedId.createChildId(ID_TYPE_STEP_GROUP_ID, stepGroup.getId(), null); + // Execute the step group + executeStepGroup(stepGroup, statusContainer, new ArrayList<ExecutedContextStep>(), fullQualifiedId); + } + + /** + * Executes a step group. + * + * @param stepGroupId The step group. Must not be <code>null</code>. + * @param statusContainer A list holding the warnings occurred during the execution. Must not be + * <code>null</code>. + * @param executedSteps A list holding the id's of the steps executed before. Must not be + * <code>null</code>. + * @param fullQualifiedGroupId The hierarchy of all parent step group id's separated by "::". + * Must not be <code>null</code>. + * + * @throws CoreException If the execution fails. + */ + private void executeStepGroup(IStepGroup stepGroup, List<IStatus> statusContainer, List<ExecutedContextStep> executedSteps, IFullQualifiedId fullQualifiedGroupId) throws CoreException { + Assert.isNotNull(stepGroup); + Assert.isNotNull(statusContainer); + Assert.isNotNull(executedSteps); + Assert.isNotNull(fullQualifiedGroupId); + + // Return immediately if the user canceled the monitor in the meanwhile + if (isCancelable() && getMonitor().isCanceled()) { + rollback(executedSteps, Status.CANCEL_STATUS, getMonitor()); + throw new CoreException(StatusHelper.getStatus(new OperationCanceledException())); + } + + CoreBundleActivator + .getTraceHandler() + .trace("Stepper#executeStepGroup: step group: '" + stepGroup.getLabel() + "'", //$NON-NLS-1$ //$NON-NLS-2$ + 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this); + + // Resolve the steps to execute + IStepGroupable[] groupables = stepGroup.getSteps(getContext()); + + IStepGroupIterator iterator = stepGroup.getStepGroupIterator(); + IFullQualifiedId fullQualifiedIterationId = fullQualifiedGroupId; + int iteration = 0; + + if (iterator != null) { + iterator.initialize(getContext(), getData(), fullQualifiedGroupId, getMonitor()); + } + boolean next = iterator == null || iterator.hasNext(getContext(), getData(), fullQualifiedGroupId, getMonitor()); + + while (next) { + if (iterator != null) { + fullQualifiedIterationId = fullQualifiedGroupId.getParentId().createChildId(ID_TYPE_STEP_GROUP_ID, stepGroup.getId(), "" + iteration); //$NON-NLS-1$ + iterator.next(getContext(), getData(), fullQualifiedIterationId, getMonitor()); + } + // Execute the steps or step groups. + for (IStepGroupable groupable : groupables) { + executeGroupable(groupable, statusContainer, executedSteps, fullQualifiedIterationId); + } + iteration++; + next = iterator != null && iterator.hasNext(getContext(), getData(), fullQualifiedGroupId, getMonitor()); + } + } + + /** + * Executes a step groupable. The groupable might encapsulate a step or a step group. + * + * @param step The step groupable. Must not be <code>null</code>. + * @param statusContainer A list holding the warnings occurred during the execution. Must not be + * <code>null</code>. + * @param executedSteps A list holding the id's of the steps executed before. Must not be + * <code>null</code>. + * @param fullQualifiedParentId The hierarchy of all parent step group id's separated by "::". + * Must not be <code>null</code>. + * + * @throws CoreException If the execution failed. + */ + private void executeGroupable(IStepGroupable groupable, List<IStatus> statusContainer, List<ExecutedContextStep> executedSteps, IFullQualifiedId fullQualifiedParentId) throws CoreException { + Assert.isNotNull(groupable); + Assert.isNotNull(statusContainer); + Assert.isNotNull(executedSteps); + Assert.isNotNull(fullQualifiedParentId); + + // Return immediately if the user canceled the monitor in the meanwhile + if (isCancelable() && getMonitor() != null && getMonitor().isCanceled()) { + rollback(executedSteps, Status.CANCEL_STATUS, getMonitor()); + throw new CoreException(StatusHelper.getStatus(new OperationCanceledException())); + } + + // If the passed in groupable is disabled -> we are done immediately + if (groupable.isDisabled()) { + CoreBundleActivator.getTraceHandler().trace("Stepper#executeGroupable: DROPPED DISABLED groupable: id = '" + groupable.getExtension().getId() + "'" //$NON-NLS-1$ //$NON-NLS-2$ + + ", secondaryId = '" + groupable.getSecondaryId() + "'", //$NON-NLS-1$ //$NON-NLS-2$ + 0, ITraceIds.TRACE_STEPPING, IStatus.WARNING, this); + return; + } + + // Check if all dependencies of the groupable have been executed before + checkForDependenciesExecuted(groupable, executedSteps); + + if (groupable.getExtension() instanceof IStepGroup) { + IFullQualifiedId id = fullQualifiedParentId.createChildId(ID_TYPE_STEP_GROUP_ID, groupable.getExtension().getId(), groupable.getSecondaryId()); + // If the passed in groupable is associated with a step group + // -> get the groupable from that group and execute them + executeStepGroup((IStepGroup) groupable.getExtension(), statusContainer, executedSteps, id); + } + else if (groupable.getExtension() instanceof IStep) { + // If the passed in groupable is associated with a step + // -> check if the required steps have been executed before, + // create a step executor and invoke the executor. + IStep step = (IStep) groupable.getExtension(); + + IFullQualifiedId id = fullQualifiedParentId.createChildId(ID_TYPE_STEP_ID, step.getId(), groupable.getSecondaryId()); + + // Create the step executor now + IStepExecutor executor = doCreateStepExecutor(step, groupable.getSecondaryId(), id); + Assert.isNotNull(executor); + + try { + executedSteps.add(new ExecutedContextStep(id, step)); + // Invoke the executor now + executor.execute(step, id, getContext(), getData(), getMonitor()); + } + catch (Exception e) { + // Catch the CoreException first hand as we need to continue the + // stepping if the step returned with warnings or information only. + CoreException coreException = normalizeStatus(e, statusContainer); + // If the exception has been not eaten, rollback previously executed + // steps and re-throw the exception. + if (coreException != null) { + // Rollback everything, if the step(s) are supporting this and + // the cleanup hasn't been done already. + if (isInitialized()) { + rollback(executedSteps, coreException.getStatus(), getMonitor()); + } + + // Re-throw the exception + throw coreException; + } + } + } + } + + /** + * Checks if all required dependencies have been executed before. If not, the method will throw + * an error status. + * + * @param groupable The groupable. Must not be <code>null</code>. + * @param executedSteps A list holding the id's of the steps executed before. Must not be + * <code>null</code>. + * + * @throws CoreException If a dependency has not been executed before. + */ + protected void checkForDependenciesExecuted(IStepGroupable groupable, List<ExecutedContextStep> executedSteps) throws CoreException { + Assert.isNotNull(groupable); + Assert.isNotNull(executedSteps); + + // Build up the complete list of dependencies. + List<String> dependencies = new ArrayList<String>(Arrays.asList(groupable.getDependencies())); + // If the groupable wraps a step, the step can have additional dependencies to check + if (groupable.getExtension() instanceof IStep) { + dependencies.addAll(Arrays.asList(((IStep) groupable.getExtension()).getDependencies())); + } + + // Check each dependency now. + for (String dependency : dependencies) { + // The dependencies might be fully qualified. Split out the primary id. + String[] splitted = dependency.split("##", 2); //$NON-NLS-1$ + String primaryId = splitted.length == 2 ? splitted[0] : dependency; + + // Check if the id is in the list of executed steps. As the list contains + // the fully qualified id's, we cannot just check for contained + boolean requiredStepExecuted = false; + for (ExecutedContextStep step : executedSteps) { + if (step.step.getId().equals(primaryId)) { + requiredStepExecuted = true; + break; + } + } + + if (!requiredStepExecuted) { + throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), + MessageFormat.format(Messages.Stepper_error_requiredStepNotExecuted, + NLS.bind(groupable.getExtension() instanceof IStep ? Messages.Stepper_error_step : Messages.Stepper_error_stepGroup, + groupable.getExtension().getId()), + NLS.bind(Messages.Stepper_error_requiredStepOrGroup, dependency), ""))); //$NON-NLS-1$ + } + + // Recursive checking is not necessary here as the step or step group + // id's would have made it the executed steps list of they missed required + // steps or step groups. + } + + } + + /** + * Rollback the steps previously executed to the failed step. The rollback is executed in + * reverse order and the step must be of type {@link IExtendedStep} to participate in the + * rollback. + * + * @param executedSteps + * @param progress + */ + protected final void rollback(final List<ExecutedContextStep> executedSteps, final IStatus rollBackStatus, IProgressMonitor progress) { + Assert.isNotNull(executedSteps); + + final IProgressMonitor rollbackProgress = ProgressHelper.getProgressMonitor(progress, 1); + ProgressHelper.beginTask(rollbackProgress, "Cancel", executedSteps.size()); //$NON-NLS-1$ + final Callback finalCallback = new Callback(); + final Callback rollbackCallback = new Callback() { + @Override + protected void internalDone(Object caller, IStatus status) { + if (!executedSteps.isEmpty()) { + setProperty(PROPERTY_IS_DONE, false); + ExecutedContextStep executedStep = executedSteps + .remove(executedSteps.size() - 1); + if (executedStep.step instanceof IExtendedStep) { + IExtendedStep step = (IExtendedStep) executedStep.step; + step.rollback(getContext(), getData(), rollBackStatus, executedStep.id, rollbackProgress, this); + } + else { + this.done(this, status); + } + } + else { + finalCallback.done(this, Status.OK_STATUS); + } + } + }; + + rollbackCallback.done(this, rollBackStatus); + ExecutorsUtil.waitAndExecute(0, finalCallback.getDoneConditionTester(null)); + } + + /** + * Calculates the total work required for the step group. The total work is the sum of the total + * work of each sub step. If one of the steps returns {@link IProgressMonitor#UNKNOWN}, the + * total work will be unknown for the whole step group. + * + * @param stepGroupId The step group. Must not be <code>null</code>. + * @return The total work required or {@link IProgressMonitor#UNKNOWN}. + * + * @throws CoreException If the total work of the step group cannot be determined. + */ + protected int calculateTotalWork(IStepGroup stepGroup) throws CoreException { + Assert.isNotNull(stepGroup); + + int totalWork = 0; + + // Loop the group steps and summarize the returned total work + IStepGroupable[] groupables = stepGroup.getSteps(getContext()); + for (IStepGroupable groupable : groupables) { + int work = groupable.getExtension() instanceof IStep ? ((IStep) groupable + .getExtension()).getTotalWork(getContext(), getData()) : groupable + .getExtension() instanceof IStepGroup ? calculateTotalWork((IStepGroup) groupable + .getExtension()) : IProgressMonitor.UNKNOWN; + + if (work == IProgressMonitor.UNKNOWN) { + totalWork = IProgressMonitor.UNKNOWN; + break; + } + + totalWork += work; + } + + return totalWork; + } + + /** + * Normalize the associated status object of the given {@link CoreException}. + * <p> + * If the associated status contains only WARNING or INFORMATION status objects, the objects are + * added to the passed in status container. The passed in exception is dropped and the method + * will return <code>null</code>. + * <p> + * If the associated status contains only OK status objects, the passed in exception and the + * associated status are dropped and the method will return <code>null</code>. + * <p> + * If the associated status contain ERROR status objects, the passed in exception and the + * associated status objects are returned if the passed in status container is empty. If the + * status container is not empty, a new exception and multi status object is created and + * returned. The multi status object will contain all status objects from the status container + * and all objects of the originally associated status. + * <p> + * If the associated status contains a CANCEL status object, the passed in exception and the + * associated status objects are returned unmodified. + * + * @param e The core exception. Must not be <code>null</code>. + * @param statusContainer The list of non-severe status objects. Must not be <code>null</code>. + * @return The exception to re-throw or <code>null</code>. + */ + private CoreException normalizeStatus(Exception e, List<IStatus> statusContainer) { + Assert.isNotNull(statusContainer); + + CoreException coreException = null; + + IStatus status = Status.OK_STATUS; + // Get the associated status from the exception + if (e instanceof CoreException) { + status = ((CoreException) e).getStatus(); + coreException = (CoreException) e; + } + else if (e instanceof OperationCanceledException) { + status = new Status(IStatus.CANCEL, CoreBundleActivator.getUniqueIdentifier(), e.getLocalizedMessage(), e); + coreException = new CoreException(status); + } + else if (e != null) { + status = new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), e.getLocalizedMessage(), e); + coreException = new CoreException(status); + } + + // Check the severity + // PS: MultiStatus.getSeverity() returns always the highest severity. + if (status.getSeverity() == IStatus.OK) { + // OK -> drop completely and return null + coreException = null; + } + else if (status.getSeverity() == IStatus.CANCEL) { + // CANCEL -> Check monitor to be canceled. + if (isCancelable()) { + if (getMonitor() != null && !getMonitor().isCanceled()) { + getMonitor().setCanceled(true); + } + } + } + else if (status.getSeverity() == IStatus.WARNING || status.getSeverity() == IStatus.INFO) { + // WARNING or INFORMATION -> add to the list and return null + statusContainer.add(status); + coreException = null; + } + else if (status.getSeverity() == IStatus.ERROR) { + // Error -> If the warnings container not empty, create + // a new MultiStatus. + if (!statusContainer.isEmpty()) { + MultiStatus multiStatus = new MultiStatus(status.getPlugin(), status.getCode(), NLS.bind(Messages.Stepper_multiStatus_finishedWithErrors, getLabel()), null); + for (IStatus stat : statusContainer) { + multiStatus.merge(stat); + } + // Re-throw via a new CoreException + coreException = new CoreException(multiStatus); + } + } + + return coreException; + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/plugin.xml b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/plugin.xml index a38edc29f..385a0c26e 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/plugin.xml +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/plugin.xml @@ -107,7 +107,7 @@ <stepGroup id="org.eclipse.tcf.te.tcf.launch.type.remote.app.stepGroup" label="%LaunchStepGroup.Remote.App.name" - locked="false"> + iterator="org.eclipse.tcf.te.launch.core.steps.iterators.LaunchContextIterator"> <references> <reference id="org.eclipse.tcf.te.tcf.launch.core.openChannelStep"/> <reference id="org.eclipse.tcf.te.tcf.launch.core.fileTransferStepGroup"/> @@ -141,8 +141,7 @@ <stepGroup id="org.eclipse.tcf.te.tcf.launch.core.fileTransferStepGroup" label="%LaunchStepGroup.FileTransfer.name" - iterator="org.eclipse.tcf.te.tcf.launch.core.steps.iterators.FileTransferIterator" - locked="false"> + iterator="org.eclipse.tcf.te.tcf.launch.core.steps.iterators.FileTransferIterator"> <references> <reference id="org.eclipse.tcf.te.tcf.launch.core.fileTransferStep"/> </references> @@ -150,7 +149,7 @@ <stepGroup id="org.eclipse.tcf.te.tcf.launch.type.attach.stepGroup" label="%LaunchStepGroup.Attach.name" - locked="false"> + iterator="org.eclipse.tcf.te.launch.core.steps.iterators.LaunchContextIterator"> <references> <reference id="org.eclipse.tcf.te.tcf.launch.core.attachDebuggerStep"> <enablement> diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/internal/adapters/StepContextAdapter.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/internal/adapters/StepContextAdapter.java index b077a9f2b..fe207d802 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/internal/adapters/StepContextAdapter.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/internal/adapters/StepContextAdapter.java @@ -1,159 +1,167 @@ -/*******************************************************************************
- * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.tcf.launch.core.internal.adapters;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.tcf.protocol.Protocol;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext;
-
-/**
- * Peer model step context adapter implementation.
- */
-public class StepContextAdapter extends PlatformObject implements IStepContext {
- // Reference to the launch
- private final ILaunch launch;
-
- /**
- * Constructor.
- *
- * @param launch The launch. Must not be <code>null</code>.
- */
- public StepContextAdapter(ILaunch launch) {
- super();
- Assert.isNotNull(launch);
- this.launch = launch;
- }
-
- /**
- * Returns the launch.
- * @return The launch.
- */
- public ILaunch getLaunch() {
- return launch;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext#getId()
- */
- @Override
- public String getId() {
- return launch != null && launch.getLaunchConfiguration() != null ? launch.getLaunchConfiguration().getName() : null;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext#getName()
- */
- @Override
- public String getName() {
- final AtomicReference<String> name = new AtomicReference<String>();
-
- if (launch != null) {
- Runnable runnable = new Runnable() {
- @Override
- public void run() {
- name.set(getId());
- }
- };
-
- if (Protocol.isDispatchThread()) {
- runnable.run();
- }
- else {
- Protocol.invokeAndWait(runnable);
- }
- }
-
- return name.get();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext#getContextObject()
- */
- @Override
- public Object getContextObject() {
- return launch;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext#getInfo(org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer)
- */
- @Override
- public String getInfo(IPropertiesContainer data) {
- try {
- return getName() + "(" + launch.getLaunchMode() + ") - " + launch.getLaunchConfiguration().getType().getName(); //$NON-NLS-1$ //$NON-NLS-2$
- }
- catch (CoreException e) {
- }
- return getName() + "(" + launch.getLaunchMode() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.core.runtime.PlatformObject#getAdapter(java.lang.Class)
- */
- @Override
- public Object getAdapter(final Class adapter) {
- // NOTE: The getAdapter(...) method can be invoked from many place and
- // many threads where we cannot control the calls. Therefore, this
- // method is allowed be called from any thread.
- final AtomicReference<Object> object = new AtomicReference<Object>();
- Runnable runnable = new Runnable() {
- @Override
- public void run() {
- object.set(doGetAdapter(adapter));
- }
- };
-
- if (Protocol.isDispatchThread()) {
- runnable.run();
- }
- else {
- Protocol.invokeAndWait(runnable);
- }
-
- return object.get() != null ? object.get() : super.getAdapter(adapter);
- }
-
- /**
- * Returns an object which is an instance of the given class associated with this object.
- * Returns <code>null</code> if no such object can be found.
- * <p>
- * This method must be called within the TCF dispatch thread!
- *
- * @param adapter The adapter class to look up.
- * @return The adapter or <code>null</code>.
- */
- protected Object doGetAdapter(Class<?> adapter) {
- if (ILaunch.class.equals(adapter)) {
- return launch;
- }
-
- if (ILaunchConfiguration.class.equals(adapter)) {
- return launch.getLaunchConfiguration();
- }
-
- if (ILaunchConfigurationType.class.equals(adapter)) {
- try {
- return launch.getLaunchConfiguration().getType();
- }
- catch (CoreException e) {
- }
- }
-
- return null;
- }
-}
+/******************************************************************************* + * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.launch.core.internal.adapters; + +import java.util.concurrent.atomic.AtomicReference; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.PlatformObject; +import org.eclipse.debug.core.ILaunch; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationType; +import org.eclipse.tcf.protocol.Protocol; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; + +/** + * Peer model step context adapter implementation. + */ +public class StepContextAdapter extends PlatformObject implements IStepContext { + // Reference to the launch + private final ILaunch launch; + + /** + * Constructor. + * + * @param launch The launch. Must not be <code>null</code>. + */ + public StepContextAdapter(ILaunch launch) { + super(); + Assert.isNotNull(launch); + this.launch = launch; + } + + /** + * Returns the launch. + * @return The launch. + */ + public ILaunch getLaunch() { + return launch; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext#getId() + */ + @Override + public String getId() { + return launch != null && launch.getLaunchConfiguration() != null ? launch.getLaunchConfiguration().getName() : null; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext#getSecondaryId() + */ + @Override + public String getSecondaryId() { + return launch != null ? launch.getLaunchMode() : null; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext#getName() + */ + @Override + public String getName() { + final AtomicReference<String> name = new AtomicReference<String>(); + + if (launch != null) { + Runnable runnable = new Runnable() { + @Override + public void run() { + name.set(getId()); + } + }; + + if (Protocol.isDispatchThread()) { + runnable.run(); + } + else { + Protocol.invokeAndWait(runnable); + } + } + + return name.get(); + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext#getContextObject() + */ + @Override + public Object getContextObject() { + return launch; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext#getInfo(org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer) + */ + @Override + public String getInfo(IPropertiesContainer data) { + try { + return getName() + "(" + launch.getLaunchMode() + ") - " + launch.getLaunchConfiguration().getType().getName(); //$NON-NLS-1$ //$NON-NLS-2$ + } + catch (CoreException e) { + } + return getName() + "(" + launch.getLaunchMode() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ + } + + /* (non-Javadoc) + * @see org.eclipse.core.runtime.PlatformObject#getAdapter(java.lang.Class) + */ + @Override + public Object getAdapter(final Class adapter) { + // NOTE: The getAdapter(...) method can be invoked from many place and + // many threads where we cannot control the calls. Therefore, this + // method is allowed be called from any thread. + final AtomicReference<Object> object = new AtomicReference<Object>(); + Runnable runnable = new Runnable() { + @Override + public void run() { + object.set(doGetAdapter(adapter)); + } + }; + + if (Protocol.isDispatchThread()) { + runnable.run(); + } + else { + Protocol.invokeAndWait(runnable); + } + + return object.get() != null ? object.get() : super.getAdapter(adapter); + } + + /** + * Returns an object which is an instance of the given class associated with this object. + * Returns <code>null</code> if no such object can be found. + * <p> + * This method must be called within the TCF dispatch thread! + * + * @param adapter The adapter class to look up. + * @return The adapter or <code>null</code>. + */ + protected Object doGetAdapter(Class<?> adapter) { + if (ILaunch.class.equals(adapter)) { + return launch; + } + + if (ILaunchConfiguration.class.equals(adapter)) { + return launch.getLaunchConfiguration(); + } + + if (ILaunchConfigurationType.class.equals(adapter)) { + try { + return launch.getLaunchConfiguration().getType(); + } + catch (CoreException e) { + } + } + + return null; + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/AbstractTcfLaunchStep.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/AbstractTcfLaunchStep.java index 4031c9d6a..48f1b0892 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/AbstractTcfLaunchStep.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/AbstractTcfLaunchStep.java @@ -1,34 +1,35 @@ -/*******************************************************************************
- * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.tcf.launch.core.steps;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.tcf.te.launch.core.steps.AbstractLaunchStep;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode;
-import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
-
-/**
- * Abstract TCF launch step implementation.
- */
-public abstract class AbstractTcfLaunchStep extends AbstractLaunchStep {
-
- /**
- * Returns the active peer model that is currently used.
- *
- * @param data The data giving object. Must not be <code>null</code>.
- * @return The active peer model.
- */
- protected IPeerModel getActivePeerModel(IPropertiesContainer data) {
- IModelNode node = getActiveLaunchContext(data);
- Assert.isTrue(node instanceof IPeerModel);
- return (IPeerModel)node;
- }
-}
+/******************************************************************************* + * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.launch.core.steps; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.tcf.te.launch.core.steps.AbstractLaunchStep; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId; +import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel; + +/** + * Abstract TCF launch step implementation. + */ +public abstract class AbstractTcfLaunchStep extends AbstractLaunchStep { + + /** + * Returns the active peer model that is currently used. + * + * @param data The data giving object. Must not be <code>null</code>. + * @return The active peer model. + */ + protected IPeerModel getActivePeerModel(IFullQualifiedId fullQualifiedId, IPropertiesContainer data) { + IModelNode node = getActiveLaunchContext(fullQualifiedId, data); + Assert.isTrue(node instanceof IPeerModel); + return (IPeerModel)node; + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/AttachDebuggerStep.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/AttachDebuggerStep.java index b5eae0bb1..5c96a5d2b 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/AttachDebuggerStep.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/AttachDebuggerStep.java @@ -1,73 +1,73 @@ -/*******************************************************************************
- * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.tcf.launch.core.steps;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.tcf.protocol.Protocol;
-import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext;
-import org.eclipse.tcf.te.runtime.utils.StatusHelper;
-import org.eclipse.tcf.te.tcf.launch.core.delegates.Launch;
-
-/**
- * Attach debugger step implementation.
- */
-public class AttachDebuggerStep extends AbstractTcfLaunchStep {
-
- /**
- * Constructor.
- */
- public AttachDebuggerStep() {
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#validateExecute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor)
- */
- @Override
- public void validateExecute(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) throws CoreException {
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStep#execute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.tcf.te.runtime.interfaces.callback.ICallback)
- */
- @Override
- public void execute(final IStepContext context, final IPropertiesContainer data, final IFullQualifiedId fullQualifiedId, final IProgressMonitor monitor, final ICallback callback) {
- if (Protocol.isDispatchThread()) {
- internalExecute(context, data, fullQualifiedId, monitor, callback);
- }
- else {
- Protocol.invokeLater(new Runnable() {
- @Override
- public void run() {
- internalExecute(context, data, fullQualifiedId, monitor, callback);
- }
- });
- }
- }
-
- protected void internalExecute(IStepContext context, final IPropertiesContainer data, final IFullQualifiedId fullQualifiedId, final IProgressMonitor monitor, final ICallback callback) {
- ILaunch launch = getLaunch(context);
- if (launch instanceof Launch) {
- Launch tcfLaunch = (Launch)launch;
- try {
- tcfLaunch.attachDebugger(getActivePeerModel(data).getPeerId());
- callback.done(this, Status.OK_STATUS);
- }
- catch (Exception e) {
- callback.done(this, StatusHelper.getStatus(e));
- }
- }
- }
-}
+/******************************************************************************* + * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.launch.core.steps; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Status; +import org.eclipse.debug.core.ILaunch; +import org.eclipse.tcf.protocol.Protocol; +import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; +import org.eclipse.tcf.te.runtime.utils.StatusHelper; +import org.eclipse.tcf.te.tcf.launch.core.delegates.Launch; + +/** + * Attach debugger step implementation. + */ +public class AttachDebuggerStep extends AbstractTcfLaunchStep { + + /** + * Constructor. + */ + public AttachDebuggerStep() { + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#validateExecute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + public void validateExecute(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) throws CoreException { + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStep#execute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.tcf.te.runtime.interfaces.callback.ICallback) + */ + @Override + public void execute(final IStepContext context, final IPropertiesContainer data, final IFullQualifiedId fullQualifiedId, final IProgressMonitor monitor, final ICallback callback) { + if (Protocol.isDispatchThread()) { + internalExecute(context, data, fullQualifiedId, monitor, callback); + } + else { + Protocol.invokeLater(new Runnable() { + @Override + public void run() { + internalExecute(context, data, fullQualifiedId, monitor, callback); + } + }); + } + } + + protected void internalExecute(IStepContext context, final IPropertiesContainer data, final IFullQualifiedId fullQualifiedId, final IProgressMonitor monitor, final ICallback callback) { + ILaunch launch = getLaunch(context); + if (launch instanceof Launch) { + Launch tcfLaunch = (Launch)launch; + try { + tcfLaunch.attachDebugger(getActivePeerModel(fullQualifiedId, data).getPeerId()); + callback.done(this, Status.OK_STATUS); + } + catch (Exception e) { + callback.done(this, StatusHelper.getStatus(e)); + } + } + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/FileTransferStep.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/FileTransferStep.java index 44c77e502..6b3a997de 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/FileTransferStep.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/FileTransferStep.java @@ -1,78 +1,78 @@ -/*******************************************************************************
- * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.tcf.launch.core.steps;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.tcf.protocol.IChannel;
-import org.eclipse.tcf.te.launch.core.lm.interfaces.IFileTransferLaunchAttributes;
-import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.services.interfaces.filetransfer.IFileTransferItem;
-import org.eclipse.tcf.te.runtime.stepper.StepperAttributeUtil;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext;
-import org.eclipse.tcf.te.tcf.filesystem.core.services.FileTransferService;
-import org.eclipse.tcf.te.tcf.launch.core.activator.CoreBundleActivator;
-import org.eclipse.tcf.te.tcf.launch.core.interfaces.ICommonTCFLaunchAttributes;
-
-/**
- * Launch process step implementation.
- */
-public class FileTransferStep extends AbstractTcfLaunchStep {
-
- /**
- * Constructor.
- */
- public FileTransferStep() {
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#validateExecute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor)
- */
- @Override
- public void validateExecute(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) throws CoreException {
- IChannel channel = (IChannel)StepperAttributeUtil.getProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId, data);
- if (channel == null || channel.getState() != IChannel.STATE_OPEN) {
- throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "missing or closed channel")); //$NON-NLS-1$
- }
-
- Object item = StepperAttributeUtil.getProperty(IFileTransferLaunchAttributes.ATTR_ACTIVE_FILE_TRANSFER, fullQualifiedId, data);
- if (!(item instanceof IFileTransferItem)) {
- throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "missing file transfer item")); //$NON-NLS-1$
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStep#execute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.tcf.te.runtime.interfaces.callback.ICallback)
- */
- @Override
- public void execute(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor, final ICallback callback) {
- final IChannel channel = (IChannel)StepperAttributeUtil.getProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId, data);
- final IFileTransferItem item = (IFileTransferItem)StepperAttributeUtil.getProperty(IFileTransferLaunchAttributes.ATTR_ACTIVE_FILE_TRANSFER, fullQualifiedId, data);
-
- if (item.isEnabled()) {
- FileTransferService.transfer(getActivePeerModel(data).getPeer(), channel, item, monitor, callback);
- }
- else {
- callback.done(this, Status.OK_STATUS);
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.extensions.AbstractStep#getTotalWork(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer)
- */
- @Override
- public int getTotalWork(IStepContext context, IPropertiesContainer data) {
- return 1000;
- }
-}
+/******************************************************************************* + * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.launch.core.steps; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.tcf.protocol.IChannel; +import org.eclipse.tcf.te.launch.core.lm.interfaces.IFileTransferLaunchAttributes; +import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.services.interfaces.filetransfer.IFileTransferItem; +import org.eclipse.tcf.te.runtime.stepper.StepperAttributeUtil; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; +import org.eclipse.tcf.te.tcf.filesystem.core.services.FileTransferService; +import org.eclipse.tcf.te.tcf.launch.core.activator.CoreBundleActivator; +import org.eclipse.tcf.te.tcf.launch.core.interfaces.ICommonTCFLaunchAttributes; + +/** + * Launch process step implementation. + */ +public class FileTransferStep extends AbstractTcfLaunchStep { + + /** + * Constructor. + */ + public FileTransferStep() { + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#validateExecute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + public void validateExecute(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) throws CoreException { + IChannel channel = (IChannel)StepperAttributeUtil.getProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId, data); + if (channel == null || channel.getState() != IChannel.STATE_OPEN) { + throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "missing or closed channel")); //$NON-NLS-1$ + } + + Object item = StepperAttributeUtil.getProperty(IFileTransferLaunchAttributes.ATTR_ACTIVE_FILE_TRANSFER, fullQualifiedId, data); + if (!(item instanceof IFileTransferItem)) { + throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "missing file transfer item")); //$NON-NLS-1$ + } + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStep#execute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.tcf.te.runtime.interfaces.callback.ICallback) + */ + @Override + public void execute(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor, final ICallback callback) { + final IChannel channel = (IChannel)StepperAttributeUtil.getProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId, data); + final IFileTransferItem item = (IFileTransferItem)StepperAttributeUtil.getProperty(IFileTransferLaunchAttributes.ATTR_ACTIVE_FILE_TRANSFER, fullQualifiedId, data); + + if (item.isEnabled()) { + FileTransferService.transfer(getActivePeerModel(fullQualifiedId, data).getPeer(), channel, item, monitor, callback); + } + else { + callback.done(this, Status.OK_STATUS); + } + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.extensions.AbstractStep#getTotalWork(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer) + */ + @Override + public int getTotalWork(IStepContext context, IPropertiesContainer data) { + return 1000; + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/LaunchProcessStep.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/LaunchProcessStep.java index fe75075a9..b7454f9e8 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/LaunchProcessStep.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/LaunchProcessStep.java @@ -1,120 +1,120 @@ -/*******************************************************************************
- * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.tcf.launch.core.steps;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.tcf.protocol.IChannel;
-import org.eclipse.tcf.services.IProcesses;
-import org.eclipse.tcf.te.core.utils.text.StringUtil;
-import org.eclipse.tcf.te.launch.core.persistence.DefaultPersistenceDelegate;
-import org.eclipse.tcf.te.runtime.callback.Callback;
-import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.properties.PropertiesContainer;
-import org.eclipse.tcf.te.runtime.services.interfaces.constants.ITerminalsConnectorConstants;
-import org.eclipse.tcf.te.runtime.stepper.StepperAttributeUtil;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext;
-import org.eclipse.tcf.te.tcf.launch.core.activator.CoreBundleActivator;
-import org.eclipse.tcf.te.tcf.launch.core.interfaces.ICommonTCFLaunchAttributes;
-import org.eclipse.tcf.te.tcf.launch.core.interfaces.IRemoteAppLaunchAttributes;
-import org.eclipse.tcf.te.tcf.processes.core.interfaces.launcher.IProcessLauncher;
-import org.eclipse.tcf.te.tcf.processes.core.launcher.ProcessLauncher;
-
-/**
- * Launch process step implementation.
- */
-public class LaunchProcessStep extends AbstractTcfLaunchStep {
-
- /**
- * Constructor.
- */
- public LaunchProcessStep() {
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#validateExecute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor)
- */
- @Override
- public void validateExecute(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) throws CoreException {
- String processImage = DefaultPersistenceDelegate.getAttribute(getLaunchConfiguration(context), IRemoteAppLaunchAttributes.ATTR_PROCESS_IMAGE, (String)null);
- if (processImage != null && processImage.trim().length() > 0) {
- StepperAttributeUtil.setProperty(IRemoteAppLaunchAttributes.ATTR_PROCESS_IMAGE, fullQualifiedId, data, processImage);
- }
- else {
- throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "missing process image name")); //$NON-NLS-1$
- }
-
- IChannel channel = (IChannel)StepperAttributeUtil.getProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId, data);
- if (channel == null || channel.getState() != IChannel.STATE_OPEN) {
- throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "missing or closed channel")); //$NON-NLS-1$
- }
-
- String processArguments = DefaultPersistenceDelegate.getAttribute(getLaunchConfiguration(context), IRemoteAppLaunchAttributes.ATTR_PROCESS_ARGUMENTS, (String)null);
- StepperAttributeUtil.setProperty(IRemoteAppLaunchAttributes.ATTR_PROCESS_ARGUMENTS, fullQualifiedId, data, processArguments);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStep#execute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.tcf.te.runtime.interfaces.callback.ICallback)
- */
- @Override
- public void execute(IStepContext context, final IPropertiesContainer data, final IFullQualifiedId fullQualifiedId, IProgressMonitor monitor, final ICallback callback) {
- final IChannel channel = (IChannel)StepperAttributeUtil.getProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId, data);
- Assert.isTrue(channel != null && channel.getState() == IChannel.STATE_OPEN, "channel is missing or closed"); //$NON-NLS-1$
- // Construct the launcher object
- ProcessLauncher launcher = new ProcessLauncher();
-
- Map<String, Object> launchAttributes = new HashMap<String, Object>();
-
- launchAttributes.put(IProcessLauncher.PROP_PROCESS_PATH, StepperAttributeUtil.getStringProperty(IRemoteAppLaunchAttributes.ATTR_PROCESS_IMAGE, fullQualifiedId, data));
-
- String arguments = StepperAttributeUtil.getStringProperty(IRemoteAppLaunchAttributes.ATTR_PROCESS_ARGUMENTS, fullQualifiedId, data);
- String[] args = arguments != null && !"".equals(arguments.trim()) ? StringUtil.tokenize(arguments, 0, true) : null; //$NON-NLS-1$
- launchAttributes.put(IProcessLauncher.PROP_PROCESS_ARGS, args);
-
- launchAttributes.put(ITerminalsConnectorConstants.PROP_LOCAL_ECHO, Boolean.FALSE);
-
- boolean outputConsole = DefaultPersistenceDelegate.getAttribute(getLaunchConfiguration(context), "org.eclipse.debug.ui.ATTR_CONSOLE_OUTPUT_ON", true); //$NON-NLS-1$
- if (outputConsole) {
- launchAttributes.put(IProcessLauncher.PROP_PROCESS_ASSOCIATE_CONSOLE, Boolean.TRUE);
- }
- String outputFile = DefaultPersistenceDelegate.getAttribute(getLaunchConfiguration(context), "org.eclipse.debug.ui.ATTR_CAPTURE_IN_FILE", (String)null); //$NON-NLS-1$
- if (outputFile != null) {
- launchAttributes.put(IProcessLauncher.PROP_PROCESS_OUTPUT_REDIRECT_TO_FILE, outputFile);
- }
-
- if (ILaunchManager.DEBUG_MODE.equals(getLaunchMode(context))) {
- launchAttributes.put(IProcessLauncher.PROP_PROCESS_ATTACH, Boolean.TRUE);
- }
-
- // Launch the process
- IPropertiesContainer container = new PropertiesContainer();
- container.setProperties(launchAttributes);
- launcher.launch(getActivePeerModel(data).getPeer(), container, new Callback(callback) {
- @Override
- protected void internalDone(Object caller, IStatus status) {
- Object result = getResult();
- if (status.isOK() && result instanceof IProcesses.ProcessContext) {
- StepperAttributeUtil.setProperty(IRemoteAppLaunchAttributes.ATTR_PROCESS_CONTEXT, fullQualifiedId.getParentId(), data, result);
- }
- Assert.isTrue(channel.getState() == IChannel.STATE_OPEN, "channel is closed"); //$NON-NLS-1$
- super.internalDone(caller, status);
- }
- });
- }
-}
+/******************************************************************************* + * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.launch.core.steps; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.debug.core.ILaunchManager; +import org.eclipse.tcf.protocol.IChannel; +import org.eclipse.tcf.services.IProcesses; +import org.eclipse.tcf.te.core.utils.text.StringUtil; +import org.eclipse.tcf.te.launch.core.persistence.DefaultPersistenceDelegate; +import org.eclipse.tcf.te.runtime.callback.Callback; +import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.properties.PropertiesContainer; +import org.eclipse.tcf.te.runtime.services.interfaces.constants.ITerminalsConnectorConstants; +import org.eclipse.tcf.te.runtime.stepper.StepperAttributeUtil; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; +import org.eclipse.tcf.te.tcf.launch.core.activator.CoreBundleActivator; +import org.eclipse.tcf.te.tcf.launch.core.interfaces.ICommonTCFLaunchAttributes; +import org.eclipse.tcf.te.tcf.launch.core.interfaces.IRemoteAppLaunchAttributes; +import org.eclipse.tcf.te.tcf.processes.core.interfaces.launcher.IProcessLauncher; +import org.eclipse.tcf.te.tcf.processes.core.launcher.ProcessLauncher; + +/** + * Launch process step implementation. + */ +public class LaunchProcessStep extends AbstractTcfLaunchStep { + + /** + * Constructor. + */ + public LaunchProcessStep() { + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#validateExecute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + public void validateExecute(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) throws CoreException { + String processImage = DefaultPersistenceDelegate.getAttribute(getLaunchConfiguration(context), IRemoteAppLaunchAttributes.ATTR_PROCESS_IMAGE, (String)null); + if (processImage != null && processImage.trim().length() > 0) { + StepperAttributeUtil.setProperty(IRemoteAppLaunchAttributes.ATTR_PROCESS_IMAGE, fullQualifiedId, data, processImage); + } + else { + throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "missing process image name")); //$NON-NLS-1$ + } + + IChannel channel = (IChannel)StepperAttributeUtil.getProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId, data); + if (channel == null || channel.getState() != IChannel.STATE_OPEN) { + throw new CoreException(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "missing or closed channel")); //$NON-NLS-1$ + } + + String processArguments = DefaultPersistenceDelegate.getAttribute(getLaunchConfiguration(context), IRemoteAppLaunchAttributes.ATTR_PROCESS_ARGUMENTS, (String)null); + StepperAttributeUtil.setProperty(IRemoteAppLaunchAttributes.ATTR_PROCESS_ARGUMENTS, fullQualifiedId, data, processArguments); + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStep#execute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.tcf.te.runtime.interfaces.callback.ICallback) + */ + @Override + public void execute(IStepContext context, final IPropertiesContainer data, final IFullQualifiedId fullQualifiedId, IProgressMonitor monitor, final ICallback callback) { + final IChannel channel = (IChannel)StepperAttributeUtil.getProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId, data); + Assert.isTrue(channel != null && channel.getState() == IChannel.STATE_OPEN, "channel is missing or closed"); //$NON-NLS-1$ + // Construct the launcher object + ProcessLauncher launcher = new ProcessLauncher(); + + Map<String, Object> launchAttributes = new HashMap<String, Object>(); + + launchAttributes.put(IProcessLauncher.PROP_PROCESS_PATH, StepperAttributeUtil.getStringProperty(IRemoteAppLaunchAttributes.ATTR_PROCESS_IMAGE, fullQualifiedId, data)); + + String arguments = StepperAttributeUtil.getStringProperty(IRemoteAppLaunchAttributes.ATTR_PROCESS_ARGUMENTS, fullQualifiedId, data); + String[] args = arguments != null && !"".equals(arguments.trim()) ? StringUtil.tokenize(arguments, 0, true) : null; //$NON-NLS-1$ + launchAttributes.put(IProcessLauncher.PROP_PROCESS_ARGS, args); + + launchAttributes.put(ITerminalsConnectorConstants.PROP_LOCAL_ECHO, Boolean.FALSE); + + boolean outputConsole = DefaultPersistenceDelegate.getAttribute(getLaunchConfiguration(context), "org.eclipse.debug.ui.ATTR_CONSOLE_OUTPUT_ON", true); //$NON-NLS-1$ + if (outputConsole) { + launchAttributes.put(IProcessLauncher.PROP_PROCESS_ASSOCIATE_CONSOLE, Boolean.TRUE); + } + String outputFile = DefaultPersistenceDelegate.getAttribute(getLaunchConfiguration(context), "org.eclipse.debug.ui.ATTR_CAPTURE_IN_FILE", (String)null); //$NON-NLS-1$ + if (outputFile != null) { + launchAttributes.put(IProcessLauncher.PROP_PROCESS_OUTPUT_REDIRECT_TO_FILE, outputFile); + } + + if (ILaunchManager.DEBUG_MODE.equals(getLaunchMode(context))) { + launchAttributes.put(IProcessLauncher.PROP_PROCESS_ATTACH, Boolean.TRUE); + } + + // Launch the process + IPropertiesContainer container = new PropertiesContainer(); + container.setProperties(launchAttributes); + launcher.launch(getActivePeerModel(fullQualifiedId, data).getPeer(), container, new Callback(callback) { + @Override + protected void internalDone(Object caller, IStatus status) { + Object result = getResult(); + if (status.isOK() && result instanceof IProcesses.ProcessContext) { + StepperAttributeUtil.setProperty(IRemoteAppLaunchAttributes.ATTR_PROCESS_CONTEXT, fullQualifiedId.getParentId(), data, result); + } + Assert.isTrue(channel.getState() == IChannel.STATE_OPEN, "channel is closed"); //$NON-NLS-1$ + super.internalDone(caller, status); + } + }); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/OpenChannelStep.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/OpenChannelStep.java index 995aaab70..10702102a 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/OpenChannelStep.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/OpenChannelStep.java @@ -1,66 +1,66 @@ -/*******************************************************************************
- * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.tcf.launch.core.steps;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.tcf.protocol.IChannel;
-import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.stepper.StepperAttributeUtil;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext;
-import org.eclipse.tcf.te.runtime.utils.StatusHelper;
-import org.eclipse.tcf.te.tcf.core.Tcf;
-import org.eclipse.tcf.te.tcf.core.interfaces.IChannelManager;
-import org.eclipse.tcf.te.tcf.launch.core.interfaces.ICommonTCFLaunchAttributes;
-
-/**
- * Open channel step implementation.
- */
-public class OpenChannelStep extends AbstractTcfLaunchStep {
-
- /**
- * Constructor.
- */
- public OpenChannelStep() {
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#validateExecute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor)
- */
- @Override
- public void validateExecute(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) throws CoreException {
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStep#execute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.tcf.te.runtime.interfaces.callback.ICallback)
- */
- @Override
- public void execute(IStepContext context, final IPropertiesContainer data, final IFullQualifiedId fullQualifiedId, IProgressMonitor monitor, final ICallback callback) {
- Tcf.getChannelManager().openChannel(getActivePeerModel(data).getPeer(), null, new IChannelManager.DoneOpenChannel() {
- @Override
- public void doneOpenChannel(final Throwable error, final IChannel channel) {
- StepperAttributeUtil.setProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId.getParentId(), data, channel);
- callback.done(OpenChannelStep.this, StatusHelper.getStatus(error));
- }
- });
- }
-
- @Override
- public void rollback(IStepContext context, IPropertiesContainer data, IStatus status, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor, ICallback callback) {
- IChannel channel = (IChannel)StepperAttributeUtil.getProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId, data);
- if (channel != null && channel.getState() != IChannel.STATE_CLOSED) {
- Tcf.getChannelManager().closeChannel(channel);
- }
- super.rollback(context, data, status, fullQualifiedId, monitor, callback);
- }
-}
+/******************************************************************************* + * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tcf.launch.core.steps; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.tcf.protocol.IChannel; +import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.stepper.StepperAttributeUtil; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; +import org.eclipse.tcf.te.runtime.utils.StatusHelper; +import org.eclipse.tcf.te.tcf.core.Tcf; +import org.eclipse.tcf.te.tcf.core.interfaces.IChannelManager; +import org.eclipse.tcf.te.tcf.launch.core.interfaces.ICommonTCFLaunchAttributes; + +/** + * Open channel step implementation. + */ +public class OpenChannelStep extends AbstractTcfLaunchStep { + + /** + * Constructor. + */ + public OpenChannelStep() { + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IExtendedStep#validateExecute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor) + */ + @Override + public void validateExecute(IStepContext context, IPropertiesContainer data, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor) throws CoreException { + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStep#execute(org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.tcf.te.runtime.interfaces.callback.ICallback) + */ + @Override + public void execute(IStepContext context, final IPropertiesContainer data, final IFullQualifiedId fullQualifiedId, IProgressMonitor monitor, final ICallback callback) { + Tcf.getChannelManager().openChannel(getActivePeerModel(fullQualifiedId, data).getPeer(), null, new IChannelManager.DoneOpenChannel() { + @Override + public void doneOpenChannel(final Throwable error, final IChannel channel) { + StepperAttributeUtil.setProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId.getParentId(), data, channel); + callback.done(OpenChannelStep.this, StatusHelper.getStatus(error)); + } + }); + } + + @Override + public void rollback(IStepContext context, IPropertiesContainer data, IStatus status, IFullQualifiedId fullQualifiedId, IProgressMonitor monitor, ICallback callback) { + IChannel channel = (IChannel)StepperAttributeUtil.getProperty(ICommonTCFLaunchAttributes.ATTR_CHANNEL, fullQualifiedId, data); + if (channel != null && channel.getState() != IChannel.STATE_CLOSED) { + Tcf.getChannelManager().closeChannel(channel); + } + super.rollback(context, data, status, fullQualifiedId, monitor, callback); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/iterators/AbstractTcfLaunchStepGroupIterator.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/iterators/AbstractTcfLaunchStepGroupIterator.java index 0660b2575..0f20eb626 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/iterators/AbstractTcfLaunchStepGroupIterator.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.core/src/org/eclipse/tcf/te/tcf/launch/core/steps/iterators/AbstractTcfLaunchStepGroupIterator.java @@ -1,36 +1,37 @@ -/*******************************************************************************
- * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.tcf.te.tcf.launch.core.steps.iterators;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.tcf.te.launch.core.steps.iterators.AbstractLaunchStepGroupIterator;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode;
-import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
-
-
-/**
- * AbstractTcfLaunchStepGroupIterator
- */
-public abstract class AbstractTcfLaunchStepGroupIterator extends AbstractLaunchStepGroupIterator {
-
- /**
- * Returns the active peer model that is currently used.
- *
- * @param data The data giving object. Must not be <code>null</code>.
- * @return The active peer model.
- */
- protected IPeerModel getActivePeerModel(IPropertiesContainer data) {
- IModelNode node = getActiveLaunchContext(data);
- Assert.isTrue(node instanceof IPeerModel);
- return (IPeerModel)node;
- }
-}
+/******************************************************************************* + * Copyright (c) 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.tcf.te.tcf.launch.core.steps.iterators; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.tcf.te.launch.core.steps.iterators.AbstractLaunchStepGroupIterator; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId; +import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel; + + +/** + * AbstractTcfLaunchStepGroupIterator + */ +public abstract class AbstractTcfLaunchStepGroupIterator extends AbstractLaunchStepGroupIterator { + + /** + * Returns the active peer model that is currently used. + * + * @param data The data giving object. Must not be <code>null</code>. + * @return The active peer model. + */ + protected IPeerModel getActivePeerModel(IFullQualifiedId fullQualifiedId, IPropertiesContainer data) { + IModelNode node = getActiveLaunchContext(fullQualifiedId, data); + Assert.isTrue(node instanceof IPeerModel); + return (IPeerModel)node; + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.ui/META-INF/MANIFEST.MF b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.ui/META-INF/MANIFEST.MF index 53eafd74c..a1f1a920a 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.ui/META-INF/MANIFEST.MF +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.launch.ui/META-INF/MANIFEST.MF @@ -34,6 +34,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Bundle-Localization: plugin Export-Package: org.eclipse.tcf.te.tcf.launch.ui.activator;x-internal:=true, + org.eclipse.tcf.te.tcf.launch.ui.attach, org.eclipse.tcf.te.tcf.launch.ui.help, org.eclipse.tcf.te.tcf.launch.ui.nls;x-internal:=true, org.eclipse.tcf.te.tcf.launch.ui.remote.app, diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tests/src/org/eclipse/tcf/te/tests/stepper/StepperTests.java b/target_explorer/plugins/org.eclipse.tcf.te.tests/src/org/eclipse/tcf/te/tests/stepper/StepperTests.java index 1cae1a0b5..a74021554 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tests/src/org/eclipse/tcf/te/tests/stepper/StepperTests.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tests/src/org/eclipse/tcf/te/tests/stepper/StepperTests.java @@ -1,311 +1,308 @@ -/*******************************************************************************
- * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. All rights reserved.
- * This program and the accompanying materials are made available under the terms
- * of the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.tests.stepper;
-
-import java.util.Map;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.tcf.te.runtime.concurrent.util.ExecutorsUtil;
-import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
-import org.eclipse.tcf.te.runtime.properties.PropertiesContainer;
-import org.eclipse.tcf.te.runtime.stepper.FullQualifiedId;
-import org.eclipse.tcf.te.runtime.stepper.StepperManager;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IFullQualifiedId;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStep;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroup;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupable;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper;
-import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepperProperties;
-import org.eclipse.tcf.te.runtime.stepper.stepper.Stepper;
-import org.eclipse.tcf.te.tests.CoreTestCase;
-
-/**
- * Stepper engine test cases.
- */
-public class StepperTests extends CoreTestCase {
-
- protected static class TestStepContext implements IStepContext {
-
- @Override
- public Object getAdapter(Class adapter) {
- return null;
- }
-
- @Override
- public String getId() {
- return "org.eclipse.tcf.te.tests.stepper.TestStepContext"; //$NON-NLS-1$
- }
-
- @Override
- public String getName() {
- return "TestStepContext"; //$NON-NLS-1$
- }
-
- @Override
- public Object getContextObject() {
- return this;
- }
-
- @Override
- public String getInfo(IPropertiesContainer data) {
- return getName();
- }
-
- }
-
- /**
- * Provides a test suite to the caller which combines all single
- * test bundled within this category.
- *
- * @return Test suite containing all test for this test category.
- */
- public static Test getTestSuite() {
- TestSuite testSuite = new TestSuite("Test stepper engine"); //$NON-NLS-1$
-
- // add ourself to the test suite
- testSuite.addTestSuite(StepperTests.class);
-
- return testSuite;
- }
-
- /**
- * Test the stepper extension point mechanism.
- */
- public void testStepperContributions() {
- assertNotNull("Unexpected return value 'null'.", StepperManager.getInstance()); //$NON-NLS-1$
- }
-
- /**
- * Test the steps extension point mechanism.
- */
- public void testStepContributions() {
- assertNotNull("Unexpected return value 'null'.", StepperManager.getInstance()); //$NON-NLS-1$
- assertNotNull("Unexpected return value 'null'.", StepperManager.getInstance().getStepExtManager()); //$NON-NLS-1$
-
- IStep[] steps = StepperManager.getInstance().getStepExtManager().getSteps(false);
- int testStepCount = 0;
-
- for (IStep step : steps) {
- if (step.getId().startsWith("org.eclipse.tcf.te.tests.stepper.step")) { //$NON-NLS-1$
- testStepCount++;
- } else {
- continue;
- }
-
- if (step.getId().endsWith(".step1")) { //$NON-NLS-1$
- assertEquals("Unexpected step label found.", "Test Step 1", step.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step description found.", "", step.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$
- assertTrue("Unexpected step class type found.", step instanceof TestStep); //$NON-NLS-1$
- assertEquals("Unexpected number of dependencies found.", 0, step.getDependencies().length); //$NON-NLS-1$
- }
-
- if (step.getId().endsWith(".step2")) { //$NON-NLS-1$
- assertEquals("Unexpected step label found.", "Test Step 2", step.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step description found.", "", step.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$
- assertTrue("Unexpected step class type found.", step instanceof ParameterizedTestStep); //$NON-NLS-1$
-
- Map<?,?> params = ((ParameterizedTestStep)step).params;
- assertNotNull("Unexpected value 'null'.", params); //$NON-NLS-1$
- assertEquals("Unexpected number of parameter found.", 1, params.keySet().size()); //$NON-NLS-1$
- assertTrue("Missing expected key 'param1'.", params.containsKey("param1")); //$NON-NLS-1$ //$NON-NLS-2$
- assertTrue("Missing expected value 'value1'.", params.containsValue("value1")); //$NON-NLS-1$ //$NON-NLS-2$
-
- assertEquals("Unexpected number of dependencies found.", 0, step.getDependencies().length); //$NON-NLS-1$
- }
-
- if (step.getId().endsWith(".step3")) { //$NON-NLS-1$
- assertEquals("Unexpected step label found.", "Test Step 3", step.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step description found.", "Just another test step", step.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$
- assertTrue("Unexpected step class type found.", step instanceof TestStep); //$NON-NLS-1$
- assertEquals("Unexpected number of dependencies found.", 0, step.getDependencies().length); //$NON-NLS-1$
- }
-
- if (step.getId().endsWith(".step4")) { //$NON-NLS-1$
- assertEquals("Unexpected step label found.", "Test Step 4", step.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step description found.", "", step.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$
- assertTrue("Unexpected step class type found.", step instanceof TestStep); //$NON-NLS-1$
- assertEquals("Unexpected number of dependencies found.", 1, step.getDependencies().length); //$NON-NLS-1$
- }
-
- if (step.getId().endsWith(".step5")) { //$NON-NLS-1$
- assertEquals("Unexpected step label found.", "Test Step 5", step.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step description found.", "", step.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$
- assertTrue("Unexpected step class type found.", step instanceof TestStep); //$NON-NLS-1$
- assertEquals("Unexpected number of dependencies found.", 0, step.getDependencies().length); //$NON-NLS-1$
- }
- }
-
- assertEquals("Unexpected number of test steps found.", 5, testStepCount); //$NON-NLS-1$
- }
-
- /**
- * Test the step group extension point mechanism.
- */
- public void testStepGroupContributions() {
- assertNotNull("Unexpected return value 'null'.", StepperManager.getInstance()); //$NON-NLS-1$
- assertNotNull("Unexpected return value 'null'.", StepperManager.getInstance().getStepGroupExtManager()); //$NON-NLS-1$
-
- IStepGroup[] stepGroups = StepperManager.getInstance().getStepGroupExtManager().getStepGroups(false);
- int testStepGroupCount = 0;
-
- for (IStepGroup stepGroup : stepGroups) {
- if (stepGroup.getId().startsWith("org.eclipse.tcf.te.tests.stepper.stepGroup")) { //$NON-NLS-1$
- testStepGroupCount++;
- } else {
- continue;
- }
-
- Throwable error = null;
- String message = null;
- IStepGroupable[] steps = null;
-
- if (stepGroup.getId().endsWith(".stepGroup1")) { //$NON-NLS-1$
- assertEquals("Unexpected step group label found.", "Test Step Group 1", stepGroup.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step description found.", "", stepGroup.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$
- assertFalse("Step group is locked but should not.", stepGroup.isLocked()); //$NON-NLS-1$
- assertNull("Unexpected non-null value.", stepGroup.getStepGroupIterator()); //$NON-NLS-1$
-
- try {
- steps = stepGroup.getSteps(new TestStepContext());
- } catch (CoreException e) {
- error = e;
- message = e.getLocalizedMessage();
- }
- assertNull("Failed to determine steps from step group. Possible cause: " + message, error); //$NON-NLS-1$
- assertNotNull("Unexpected return value 'null'.", steps); //$NON-NLS-1$
- assertEquals("Unexpected number of steps returned.", 0, steps.length); //$NON-NLS-1$
- }
-
- if (stepGroup.getId().endsWith(".stepGroup2")) { //$NON-NLS-1$
- assertEquals("Unexpected step group label found.", "Test Step Group 2", stepGroup.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step description found.", "Just a step group description", stepGroup.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$
- assertTrue("Step group is not locked but should.", stepGroup.isLocked()); //$NON-NLS-1$
- assertNull("Unexpected non-null value.", stepGroup.getStepGroupIterator()); //$NON-NLS-1$
-
- error = null; message = null; steps = null;
- try {
- steps = stepGroup.getSteps(new TestStepContext());
- } catch (CoreException e) {
- error = e;
- message = e.getLocalizedMessage();
- }
- assertNull("Failed to determine steps from step group. Possible cause: " + message, error); //$NON-NLS-1$
- assertNotNull("Unexpected return value 'null'.", steps); //$NON-NLS-1$
- assertEquals("Unexpected number of steps returned.", 0, steps.length); //$NON-NLS-1$
- }
-
- if (stepGroup.getId().endsWith(".stepGroup3")) { //$NON-NLS-1$
- assertEquals("Unexpected step group label found.", "Test Step Group 3", stepGroup.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step description found.", "", stepGroup.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$
- assertFalse("Step group is locked but should not.", stepGroup.isLocked()); //$NON-NLS-1$
- assertNull("Unexpected non-null value.", stepGroup.getStepGroupIterator()); //$NON-NLS-1$
-
- error = null; message = null; steps = null;
- try {
- steps = stepGroup.getSteps(new TestStepContext());
- } catch (CoreException e) {
- error = e;
- message = e.getLocalizedMessage();
- }
- assertNull("Failed to determine steps from step group. Possible cause: " + message, error); //$NON-NLS-1$
- assertNotNull("Unexpected return value 'null'.", steps); //$NON-NLS-1$
- assertEquals("Unexpected number of steps returned.", 4, steps.length); //$NON-NLS-1$
-
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step1", steps[0].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step2", steps[1].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step3", steps[2].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step4", steps[3].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
-
- if (stepGroup.getId().endsWith(".stepGroup4")) { //$NON-NLS-1$
- assertEquals("Unexpected step group label found.", "Test Step Group 4", stepGroup.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step description found.", "", stepGroup.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$
- assertFalse("Step group is locked but should not.", stepGroup.isLocked()); //$NON-NLS-1$
- assertNull("Unexpected non-null value.", stepGroup.getStepGroupIterator()); //$NON-NLS-1$
-
- error = null; message = null; steps = null;
- try {
- steps = stepGroup.getSteps(new TestStepContext());
- } catch (CoreException e) {
- error = e;
- message = e.getLocalizedMessage();
- }
- assertNull("Failed to determine steps from step group. Possible cause: " + message, error); //$NON-NLS-1$
- assertNotNull("Unexpected return value 'null'.", steps); //$NON-NLS-1$
- assertEquals("Unexpected number of steps returned.", 5, steps.length); //$NON-NLS-1$
-
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step1", steps[0].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step2", steps[1].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step3", steps[2].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step4", steps[3].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
-
- error = null; message = null; steps = null;
- try {
- steps = stepGroup.getSteps(new TestStepContext());
- } catch (CoreException e) {
- error = e;
- message = e.getLocalizedMessage();
- }
- assertNull("Failed to determine steps from step group. Possible cause: " + message, error); //$NON-NLS-1$
- assertNotNull("Unexpected return value 'null'.", steps); //$NON-NLS-1$
- assertEquals("Unexpected number of steps returned.", 5, steps.length); //$NON-NLS-1$
-
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step1", steps[0].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step2", steps[1].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step3", steps[2].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step4", steps[3].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step5", steps[4].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$
- }
- }
-
- assertEquals("Unexpected number of test step groups found.", 4, testStepGroupCount); //$NON-NLS-1$
- }
-
- public void testExecuteStepGroup() {
- final IStepper stepper = new Stepper();
-
- IPropertiesContainer properties = new PropertiesContainer();
- properties.setProperty(IStepperProperties.PROP_NAME, "testExecuteStepGroup"); //$NON-NLS-1$
- properties.setProperty(IStepperProperties.PROP_STEP_GROUP_ID, "org.eclipse.tcf.te.tests.stepper.stepGroup4"); //$NON-NLS-1$
-
- // Initialize the stepper
- IStepContext context = new TestStepContext();
- IFullQualifiedId fullQualifiedId = new FullQualifiedId(IStepper.ID_TYPE_STEPPER_ID, stepper.getId(), null);
- stepper.initialize(context, properties, fullQualifiedId, new NullProgressMonitor());
-
- ExecutorsUtil.execute(new Runnable() {
- @Override
- public void run() {
- // Execute
- try {
- stepper.execute();
- }
- catch (Exception e) {
- assertNull("Unexpected exception when executing step group", e); //$NON-NLS-1$
- }
- }
- });
-
- // Wait for the stepper to be finished
- assertFalse("Timeout executing step group", ExecutorsUtil.waitAndExecute(10000, new IStepper.ExecutionFinishedConditionTester(stepper))); //$NON-NLS-1$
-
- assertNotNull("Missing executed step 1", properties.getProperty("org.eclipse.tcf.te.tests.stepper.step1")); //$NON-NLS-1$ //$NON-NLS-2$
- assertNotNull("Missing executed step 2", properties.getProperty("org.eclipse.tcf.te.tests.stepper.step2")); //$NON-NLS-1$ //$NON-NLS-2$
- assertNotNull("Missing executed step 3", properties.getProperty("org.eclipse.tcf.te.tests.stepper.step3")); //$NON-NLS-1$ //$NON-NLS-2$
- assertNotNull("Missing executed step 4", properties.getProperty("org.eclipse.tcf.te.tests.stepper.step4")); //$NON-NLS-1$ //$NON-NLS-2$
- assertNotNull("Missing executed step 5", properties.getProperty("org.eclipse.tcf.te.tests.stepper.step5")); //$NON-NLS-1$ //$NON-NLS-2$
- }
-}
+/******************************************************************************* + * Copyright (c) 2011, 2012 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.tests.stepper; + +import java.util.Map; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.tcf.te.runtime.concurrent.util.ExecutorsUtil; +import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; +import org.eclipse.tcf.te.runtime.properties.PropertiesContainer; +import org.eclipse.tcf.te.runtime.stepper.StepperManager; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStep; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroup; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepGroupable; +import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepper; +import org.eclipse.tcf.te.runtime.stepper.stepper.Stepper; +import org.eclipse.tcf.te.tests.CoreTestCase; + +/** + * Stepper engine test cases. + */ +public class StepperTests extends CoreTestCase { + + protected static class TestStepContext implements IStepContext { + + @Override + public Object getAdapter(Class adapter) { + return null; + } + + @Override + public String getId() { + return "org.eclipse.tcf.te.tests.stepper.TestStepContext"; //$NON-NLS-1$ + } + + @Override + public String getSecondaryId() { + return null; + } + + @Override + public String getName() { + return "TestStepContext"; //$NON-NLS-1$ + } + + @Override + public Object getContextObject() { + return this; + } + + @Override + public String getInfo(IPropertiesContainer data) { + return getName(); + } + + } + + /** + * Provides a test suite to the caller which combines all single + * test bundled within this category. + * + * @return Test suite containing all test for this test category. + */ + public static Test getTestSuite() { + TestSuite testSuite = new TestSuite("Test stepper engine"); //$NON-NLS-1$ + + // add ourself to the test suite + testSuite.addTestSuite(StepperTests.class); + + return testSuite; + } + + /** + * Test the stepper extension point mechanism. + */ + public void testStepperContributions() { + assertNotNull("Unexpected return value 'null'.", StepperManager.getInstance()); //$NON-NLS-1$ + } + + /** + * Test the steps extension point mechanism. + */ + public void testStepContributions() { + assertNotNull("Unexpected return value 'null'.", StepperManager.getInstance()); //$NON-NLS-1$ + assertNotNull("Unexpected return value 'null'.", StepperManager.getInstance().getStepExtManager()); //$NON-NLS-1$ + + IStep[] steps = StepperManager.getInstance().getStepExtManager().getSteps(false); + int testStepCount = 0; + + for (IStep step : steps) { + if (step.getId().startsWith("org.eclipse.tcf.te.tests.stepper.step")) { //$NON-NLS-1$ + testStepCount++; + } else { + continue; + } + + if (step.getId().endsWith(".step1")) { //$NON-NLS-1$ + assertEquals("Unexpected step label found.", "Test Step 1", step.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step description found.", "", step.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$ + assertTrue("Unexpected step class type found.", step instanceof TestStep); //$NON-NLS-1$ + assertEquals("Unexpected number of dependencies found.", 0, step.getDependencies().length); //$NON-NLS-1$ + } + + if (step.getId().endsWith(".step2")) { //$NON-NLS-1$ + assertEquals("Unexpected step label found.", "Test Step 2", step.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step description found.", "", step.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$ + assertTrue("Unexpected step class type found.", step instanceof ParameterizedTestStep); //$NON-NLS-1$ + + Map<?,?> params = ((ParameterizedTestStep)step).params; + assertNotNull("Unexpected value 'null'.", params); //$NON-NLS-1$ + assertEquals("Unexpected number of parameter found.", 1, params.keySet().size()); //$NON-NLS-1$ + assertTrue("Missing expected key 'param1'.", params.containsKey("param1")); //$NON-NLS-1$ //$NON-NLS-2$ + assertTrue("Missing expected value 'value1'.", params.containsValue("value1")); //$NON-NLS-1$ //$NON-NLS-2$ + + assertEquals("Unexpected number of dependencies found.", 0, step.getDependencies().length); //$NON-NLS-1$ + } + + if (step.getId().endsWith(".step3")) { //$NON-NLS-1$ + assertEquals("Unexpected step label found.", "Test Step 3", step.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step description found.", "Just another test step", step.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$ + assertTrue("Unexpected step class type found.", step instanceof TestStep); //$NON-NLS-1$ + assertEquals("Unexpected number of dependencies found.", 0, step.getDependencies().length); //$NON-NLS-1$ + } + + if (step.getId().endsWith(".step4")) { //$NON-NLS-1$ + assertEquals("Unexpected step label found.", "Test Step 4", step.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step description found.", "", step.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$ + assertTrue("Unexpected step class type found.", step instanceof TestStep); //$NON-NLS-1$ + assertEquals("Unexpected number of dependencies found.", 1, step.getDependencies().length); //$NON-NLS-1$ + } + + if (step.getId().endsWith(".step5")) { //$NON-NLS-1$ + assertEquals("Unexpected step label found.", "Test Step 5", step.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step description found.", "", step.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$ + assertTrue("Unexpected step class type found.", step instanceof TestStep); //$NON-NLS-1$ + assertEquals("Unexpected number of dependencies found.", 0, step.getDependencies().length); //$NON-NLS-1$ + } + } + + assertEquals("Unexpected number of test steps found.", 5, testStepCount); //$NON-NLS-1$ + } + + /** + * Test the step group extension point mechanism. + */ + public void testStepGroupContributions() { + assertNotNull("Unexpected return value 'null'.", StepperManager.getInstance()); //$NON-NLS-1$ + assertNotNull("Unexpected return value 'null'.", StepperManager.getInstance().getStepGroupExtManager()); //$NON-NLS-1$ + + IStepGroup[] stepGroups = StepperManager.getInstance().getStepGroupExtManager().getStepGroups(false); + int testStepGroupCount = 0; + + for (IStepGroup stepGroup : stepGroups) { + if (stepGroup.getId().startsWith("org.eclipse.tcf.te.tests.stepper.stepGroup")) { //$NON-NLS-1$ + testStepGroupCount++; + } else { + continue; + } + + Throwable error = null; + String message = null; + IStepGroupable[] steps = null; + + if (stepGroup.getId().endsWith(".stepGroup1")) { //$NON-NLS-1$ + assertEquals("Unexpected step group label found.", "Test Step Group 1", stepGroup.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step description found.", "", stepGroup.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$ + assertFalse("Step group is locked but should not.", stepGroup.isLocked()); //$NON-NLS-1$ + assertNull("Unexpected non-null value.", stepGroup.getStepGroupIterator()); //$NON-NLS-1$ + + try { + steps = stepGroup.getSteps(new TestStepContext()); + } catch (CoreException e) { + error = e; + message = e.getLocalizedMessage(); + } + assertNull("Failed to determine steps from step group. Possible cause: " + message, error); //$NON-NLS-1$ + assertNotNull("Unexpected return value 'null'.", steps); //$NON-NLS-1$ + assertEquals("Unexpected number of steps returned.", 0, steps.length); //$NON-NLS-1$ + } + + if (stepGroup.getId().endsWith(".stepGroup2")) { //$NON-NLS-1$ + assertEquals("Unexpected step group label found.", "Test Step Group 2", stepGroup.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step description found.", "Just a step group description", stepGroup.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$ + assertTrue("Step group is not locked but should.", stepGroup.isLocked()); //$NON-NLS-1$ + assertNull("Unexpected non-null value.", stepGroup.getStepGroupIterator()); //$NON-NLS-1$ + + error = null; message = null; steps = null; + try { + steps = stepGroup.getSteps(new TestStepContext()); + } catch (CoreException e) { + error = e; + message = e.getLocalizedMessage(); + } + assertNull("Failed to determine steps from step group. Possible cause: " + message, error); //$NON-NLS-1$ + assertNotNull("Unexpected return value 'null'.", steps); //$NON-NLS-1$ + assertEquals("Unexpected number of steps returned.", 0, steps.length); //$NON-NLS-1$ + } + + if (stepGroup.getId().endsWith(".stepGroup3")) { //$NON-NLS-1$ + assertEquals("Unexpected step group label found.", "Test Step Group 3", stepGroup.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step description found.", "", stepGroup.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$ + assertFalse("Step group is locked but should not.", stepGroup.isLocked()); //$NON-NLS-1$ + assertNull("Unexpected non-null value.", stepGroup.getStepGroupIterator()); //$NON-NLS-1$ + + error = null; message = null; steps = null; + try { + steps = stepGroup.getSteps(new TestStepContext()); + } catch (CoreException e) { + error = e; + message = e.getLocalizedMessage(); + } + assertNull("Failed to determine steps from step group. Possible cause: " + message, error); //$NON-NLS-1$ + assertNotNull("Unexpected return value 'null'.", steps); //$NON-NLS-1$ + assertEquals("Unexpected number of steps returned.", 4, steps.length); //$NON-NLS-1$ + + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step1", steps[0].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step2", steps[1].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step3", steps[2].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step4", steps[3].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + } + + + if (stepGroup.getId().endsWith(".stepGroup4")) { //$NON-NLS-1$ + assertEquals("Unexpected step group label found.", "Test Step Group 4", stepGroup.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step description found.", "", stepGroup.getDescription()); //$NON-NLS-1$ //$NON-NLS-2$ + assertFalse("Step group is locked but should not.", stepGroup.isLocked()); //$NON-NLS-1$ + assertNull("Unexpected non-null value.", stepGroup.getStepGroupIterator()); //$NON-NLS-1$ + + error = null; message = null; steps = null; + try { + steps = stepGroup.getSteps(new TestStepContext()); + } catch (CoreException e) { + error = e; + message = e.getLocalizedMessage(); + } + assertNull("Failed to determine steps from step group. Possible cause: " + message, error); //$NON-NLS-1$ + assertNotNull("Unexpected return value 'null'.", steps); //$NON-NLS-1$ + assertEquals("Unexpected number of steps returned.", 5, steps.length); //$NON-NLS-1$ + + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step1", steps[0].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step2", steps[1].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step3", steps[2].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step4", steps[3].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + + error = null; message = null; steps = null; + try { + steps = stepGroup.getSteps(new TestStepContext()); + } catch (CoreException e) { + error = e; + message = e.getLocalizedMessage(); + } + assertNull("Failed to determine steps from step group. Possible cause: " + message, error); //$NON-NLS-1$ + assertNotNull("Unexpected return value 'null'.", steps); //$NON-NLS-1$ + assertEquals("Unexpected number of steps returned.", 5, steps.length); //$NON-NLS-1$ + + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step1", steps[0].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step2", steps[1].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step3", steps[2].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step4", steps[3].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("Unexpected step order.", "org.eclipse.tcf.te.tests.stepper.step5", steps[4].getExtension().getId()); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + assertEquals("Unexpected number of test step groups found.", 4, testStepGroupCount); //$NON-NLS-1$ + } + + public void testExecuteStepGroup() { + final IStepper stepper = new Stepper("testExecuteStepGroup"); //$NON-NLS-1$ + + IPropertiesContainer properties = new PropertiesContainer(); + + // Initialize the stepper + stepper.initialize(new TestStepContext(), "org.eclipse.tcf.te.tests.stepper.stepGroup4", new PropertiesContainer(), null); //$NON-NLS-1$ + + ExecutorsUtil.execute(new Runnable() { + @Override + public void run() { + // Execute + try { + stepper.execute(); + } + catch (Exception e) { + assertNull("Unexpected exception when executing step group", e); //$NON-NLS-1$ + } + } + }); + + // Wait for the stepper to be finished + assertFalse("Timeout executing step group", ExecutorsUtil.waitAndExecute(10000, new IStepper.ExecutionFinishedConditionTester(stepper))); //$NON-NLS-1$ + + assertNotNull("Missing executed step 1", properties.getProperty("org.eclipse.tcf.te.tests.stepper.step1")); //$NON-NLS-1$ //$NON-NLS-2$ + assertNotNull("Missing executed step 2", properties.getProperty("org.eclipse.tcf.te.tests.stepper.step2")); //$NON-NLS-1$ //$NON-NLS-2$ + assertNotNull("Missing executed step 3", properties.getProperty("org.eclipse.tcf.te.tests.stepper.step3")); //$NON-NLS-1$ //$NON-NLS-2$ + assertNotNull("Missing executed step 4", properties.getProperty("org.eclipse.tcf.te.tests.stepper.step4")); //$NON-NLS-1$ //$NON-NLS-2$ + assertNotNull("Missing executed step 5", properties.getProperty("org.eclipse.tcf.te.tests.stepper.step5")); //$NON-NLS-1$ //$NON-NLS-2$ + } +} |