/******************************************************************************* * Copyright (c) 2015 Pivotal Software, Inc. * 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: * Pivotal Software, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.boot.util; import static org.eclipse.debug.core.DebugEvent.CREATE; import static org.eclipse.debug.core.DebugEvent.TERMINATE; 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.IDebugTarget; import org.eclipse.debug.core.model.IProcess; import org.springsource.ide.eclipse.commons.livexp.ui.Disposable; /** * @author Kris De Volder */ public class ProcessTracker implements Disposable { public interface ProcessListener { void debugTargetCreated(ProcessTracker tracker, IDebugTarget target); void debugTargetTerminated(ProcessTracker tracker, IDebugTarget target); void processTerminated(ProcessTracker tracker, IProcess process); void processCreated(ProcessTracker tracker, IProcess process); } private IDebugEventSetListener debugListener; private ProcessListener listener; public ProcessTracker(ProcessListener listener) { this.listener = listener; //Pick up any processes already running DebugPlugin.getDefault().addDebugEventListener(debugListener = new IDebugEventSetListener() { @Override public void handleDebugEvents(DebugEvent[] events) { if (events!=null) { for (DebugEvent debugEvent : events) { handleDebugEvent(debugEvent); } } }; }); //What if processes got started before we attached the listener? ILaunch[] launches = DebugPlugin.getDefault().getLaunchManager().getLaunches(); if (launches!=null) { for (ILaunch launch : launches) { for (IProcess process : launch.getProcesses()) { processCreated(process); } } } } protected final void handleDebugEvent(DebugEvent debugEvent) { int kind = debugEvent.getKind(); Object source = debugEvent.getSource(); switch (kind) { case CREATE: if (source instanceof IProcess) { processCreated((IProcess)source); } else if (source instanceof IDebugTarget) { debugTargetCreated((IDebugTarget)source); } break; case TERMINATE: if (source instanceof IProcess) { processTerminated((IProcess)source); } else if (source instanceof IDebugTarget) { debugTargetTerminated((IDebugTarget)source); } break; default: break; } } private void debugTargetCreated(IDebugTarget source) { listener.debugTargetCreated(this, source); } private void debugTargetTerminated(IDebugTarget source) { listener.debugTargetTerminated(this, source); } private void processCreated(IProcess process) { listener.processCreated(this, process); } private void processTerminated(IProcess process) { listener.processTerminated(this, process); } /** * Call to free up or deregister stuff if we don't need it any more. (e.g disconnect debug event listeners) */ public void dispose() { if (debugListener!=null) { DebugPlugin.getDefault().removeDebugEventListener(debugListener); debugListener = null; listener = null; } } }