package bndtools.launch; import java.util.HashSet; import java.util.Set; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IProcess; /** * Utility for executing code after the termination of all the processes created by a launch. It should be created and * registered with {@link DebugPlugin#addDebugEventListener(IDebugEventSetListener)}. On termination of all processes, * the {@link Runnable} supplied in the constructor will be invoked, and then this listener will unregister itself from * the {@link DebugPlugin}. It must not be reused for another launch. * * @author Neil Bartlett */ public class TerminationListener implements IDebugEventSetListener { private final ILaunch launch; private final Runnable onTerminate; private final Set<IProcess> terminatedProcesses = new HashSet<IProcess>(); public TerminationListener(ILaunch launch, Runnable onTerminate) { this.launch = launch; this.onTerminate = onTerminate; } public void handleDebugEvents(DebugEvent[] events) { for (DebugEvent event : events) { Object source = event.getSource(); if (event.getKind() == DebugEvent.TERMINATE && (source instanceof IProcess) && ((IProcess) source).getLaunch() == launch) { terminatedProcesses.add((IProcess) source); boolean isTerminated = true; IProcess[] createdProcesses = launch.getProcesses(); for (IProcess process : createdProcesses) { if (!terminatedProcesses.contains(process)) { isTerminated = false; break; } } if (isTerminated) { DebugPlugin.getDefault().removeDebugEventListener(this); onTerminate.run(); } } } } }