/*******************************************************************************
* Copyright (c) 2016 Red Hat.
* 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:
* Red Hat - Initial Contribution
*******************************************************************************/
package org.eclipse.linuxtools.internal.docker.ui.consoles;
import java.io.IOException;
import java.util.stream.Stream;
import org.eclipse.debug.core.IStreamListener;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.core.model.IStreamMonitor;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.linuxtools.docker.core.IDockerConnection;
import org.eclipse.linuxtools.docker.ui.Activator;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.console.IOConsole;
import org.eclipse.ui.console.IOConsoleOutputStream;
/**
* An {@link IOConsole} for the {@code docker-compose} dockerComposeProcess.
*/
public class DockerComposeConsole extends IOConsole {
public static final String CONSOLE_TYPE = "org.eclipse.linuxtools.internal.docker.ui.consoles.DockerComposeConsole";
private final IDockerConnection connection;
private final String workingDir;
private IProcess dockerComposeProcess;
public DockerComposeConsole(
final IDockerConnection connection, final String workingDir) {
super(ConsoleMessages.getFormattedString("DockerComposeConsole.title", //$NON-NLS-1$
workingDir), null);
this.workingDir = workingDir;
this.connection = connection;
setType(CONSOLE_TYPE);
}
public IDockerConnection getConnection() {
return this.connection;
}
public String getWorkingDir() {
return this.workingDir;
}
public IProcess getDockerComposeProcess() {
return this.dockerComposeProcess;
}
public void setDockerComposeProcess(final IProcess dockerComposeProcess) {
this.dockerComposeProcess = dockerComposeProcess;
// activate and clear the console if it has previous content
activate();
clearConsole();
// catch up with the content that was already output by the Java Process
writeContentInConsole(dockerComposeProcess.getStreamsProxy()
.getOutputStreamMonitor().getContents());
// then follow the streams
dockerComposeProcess.getStreamsProxy().getOutputStreamMonitor()
.addListener(new IStreamListener() {
@Override
public void streamAppended(final String text,
final IStreamMonitor monitor) {
writeContentInConsole(text);
}
});
dockerComposeProcess.getStreamsProxy().getErrorStreamMonitor()
.addListener(new IStreamListener() {
@Override
public void streamAppended(final String text,
final IStreamMonitor monitor) {
writeContentInConsole(text);
}
});
}
private void writeContentInConsole(final String text) {
Display.getDefault().asyncExec(() -> {
final StyledString styledString = StyledTextBuilder.parse(text);
final StyleRange[] styleRanges = styledString.getStyleRanges();
Stream.of(styleRanges).forEach(range -> {
try (final IOConsoleOutputStream consoleStream = newOutputStream()) {
consoleStream.setColor(range.foreground);
consoleStream.write(styledString.getString()
.substring(range.start, range.start + range.length)
.getBytes());
} catch (IOException e) {
Activator.log(e);
}
});
});
}
}