/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.python.pydev.debug.model;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.ui.DebugUITools;
import org.python.pydev.core.ExtensionHelper;
import org.python.pydev.core.docutils.StringUtils;
import org.python.pydev.debug.core.IConsoleInputListener;
import org.python.pydev.debug.model.AbstractDebugTarget;
/**
* This is the output stream for the remote debugger.
*
* When a new line is entered in the console for the remote debugger, it will pass that for the
* debug console input listeners.
*/
public final class ProcessServerOutputStream extends ByteArrayOutputStream {
final List<IConsoleInputListener> participants;
@SuppressWarnings("unchecked")
public ProcessServerOutputStream() {
participants = ExtensionHelper.getParticipants(ExtensionHelper.PYDEV_DEBUG_CONSOLE_INPUT_LISTENER);
}
@Override
public synchronized void write(int b) {
super.write(b);
this.checkFinishedLine();
}
@Override
public synchronized void write(byte b[], int off, int len) {
super.write(b, off, len);
this.checkFinishedLine();
}
@Override
public void write(byte b[]) throws IOException {
super.write(b);
this.checkFinishedLine();
}
/**
* Checks if the last thing entered was a new line, and if it was, notifies clients about it.
*/
private void checkFinishedLine() {
String s = this.toString();
this.reset();
char c;
if (s.length() > 0 && ((c = s.charAt(s.length() - 1)) == '\n' || c == '\r')) {
IAdaptable context = DebugUITools.getDebugContext();
if (context != null) {
s = StringUtils.rightTrim(s);
Object adapter = context.getAdapter(IDebugTarget.class);
if (adapter instanceof AbstractDebugTarget) {
AbstractDebugTarget target = (AbstractDebugTarget) adapter;
for (IConsoleInputListener listener : participants) {
listener.newLineReceived(s, target);
}
}
}
}
}
}