/******************************************************************************* * Copyright (c) 2000, 2017 IBM Corporation 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 ******************************************************************************/ package org.eclipse.dltk.internal.debug.ui.log; 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.ILaunchListener; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.dltk.dbgp.IDbgpRawListener; import org.eclipse.dltk.dbgp.IDbgpRawPacket; import org.eclipse.dltk.dbgp.internal.IDbgpDebugingEngine; import org.eclipse.dltk.debug.core.ExtendedDebugEventDetails; import org.eclipse.dltk.debug.core.model.IScriptDebugTarget; import org.eclipse.dltk.debug.core.model.IScriptThread; import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin; import org.eclipse.dltk.internal.launching.LaunchConfigurationUtils; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; public class ScriptDebugLogManager implements ILaunchListener, IDebugEventSetListener, IDbgpRawListener { private static ScriptDebugLogManager instance; private ScriptDebugLogView view; private ScriptDebugLogManager() { // empty constructor } public static synchronized ScriptDebugLogManager getInstance() { if (instance == null) { instance = new ScriptDebugLogManager(); } return instance; } @Override public void dbgpPacketReceived(int sessionId, IDbgpRawPacket content) { append(new ScriptDebugLogItem(Messages.ItemType_Input, sessionId, content)); } @Override public void dbgpPacketSent(int sessionId, IDbgpRawPacket content) { append(new ScriptDebugLogItem(Messages.ItemType_Output, sessionId, content)); } @Override public void handleDebugEvents(DebugEvent[] events) { if (view == null) { return; } for (int i = 0; i < events.length; ++i) { DebugEvent event = events[i]; append(new ScriptDebugLogItem(Messages.ItemType_Event, getDebugEventKind(event) + " from " //$NON-NLS-1$ + event.getSource().getClass().getName())); if (event.getKind() == DebugEvent.CREATE) { handleCreateEvent(event); } else if (event.getKind() == DebugEvent.MODEL_SPECIFIC && event .getDetail() == ExtendedDebugEventDetails.DGBP_NEW_CONNECTION) { if (event.getSource() instanceof IDbgpDebugingEngine) { ((IDbgpDebugingEngine) event.getSource()) .addRawListener(this); } } else if (event.getKind() == DebugEvent.TERMINATE) { handleTerminateEvent(event); } } } @Override public void launchAdded(ILaunch launch) { // empty implementation } @Override public void launchChanged(ILaunch launch) { IDebugTarget target = launch.getDebugTarget(); boolean loggingEnabled = LaunchConfigurationUtils .isDbgpLoggingEnabled(launch.getLaunchConfiguration()); // bail if we're not a ScriptDebugTarget or logging isn't enabled if (!((target instanceof IScriptDebugTarget) && loggingEnabled)) { return; } Display.getDefault().asyncExec(() -> { IWorkbenchPage page = DLTKDebugUIPlugin.getActivePage(); if (page != null) { try { view = (ScriptDebugLogView) page .showView(ScriptDebugLogView.VIEW_ID); DebugPlugin.getDefault() .addDebugEventListener(ScriptDebugLogManager.this); } catch (PartInitException e) { DLTKDebugUIPlugin.log(e); } } }); } @Override public void launchRemoved(ILaunch launch) { // empty implementation } protected void append(final ScriptDebugLogItem item) { view.append(item); } private static String getDebugEventKind(DebugEvent event) { switch (event.getKind()) { case DebugEvent.CREATE: return Messages.EventKind_Create; case DebugEvent.TERMINATE: return Messages.EventKind_Terminate; case DebugEvent.CHANGE: return Messages.EventKind_Change; case DebugEvent.SUSPEND: return Messages.EventKind_Suspend; case DebugEvent.RESUME: return Messages.EventKind_Resume; case DebugEvent.MODEL_SPECIFIC: return Messages.EventKind_ModelSpecific + '/' + event.getDetail(); } return Messages.EventKind_Unknown + '(' + event.getKind() + ')'; } private void handleCreateEvent(DebugEvent event) { if (event.getSource() instanceof IScriptThread) { ((IScriptThread) event.getSource()).getDbgpSession() .addRawListener(this); } } private void handleTerminateEvent(DebugEvent event) { if (event.getSource() instanceof IScriptThread) { ((IScriptThread) event.getSource()).getDbgpSession() .removeRawListenr(this); DebugPlugin.getDefault().removeDebugEventListener(this); } } }