/******************************************************************************* * Copyright (c) 2010, 2015 Tasktop Technologies 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 * * Contributors: * Tasktop Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.internal.builds.ui.console; import java.io.BufferedReader; import java.io.IOException; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.mylyn.builds.core.IBuild; import org.eclipse.mylyn.builds.internal.core.BuildModel; import org.eclipse.mylyn.builds.internal.core.operations.GetBuildOutputOperation; import org.eclipse.mylyn.builds.internal.core.operations.GetBuildOutputOperation.BuildOutputEvent; import org.eclipse.mylyn.builds.internal.core.operations.GetBuildOutputOperation.BuildOutputReader; import org.eclipse.mylyn.commons.core.operations.IOperationMonitor; import org.eclipse.mylyn.internal.builds.ui.BuildImages; import org.eclipse.mylyn.internal.builds.ui.BuildsUiInternal; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.IConsoleManager; import org.eclipse.ui.console.MessageConsole; import org.eclipse.ui.console.MessageConsoleStream; /** * @author Steffen Pingel */ public class BuildConsole { private final IBuild build; private final IConsoleManager consoleManager; private MessageConsole console; private GetBuildOutputOperation operation; private MessageConsoleStream stream; final static String CONSOLE_TYPE = "org.eclipse.mylyn.builds.ui.console.BuildConsole"; //$NON-NLS-1$ final static String ATTRIBUTE_BUILD = "org.eclipse.mylyn.builds.ui.console.build"; //$NON-NLS-1$ public BuildConsole(IConsoleManager consoleManager, BuildModel model, IBuild build) { Assert.isNotNull(consoleManager); Assert.isNotNull(model); Assert.isNotNull(build); this.consoleManager = consoleManager; this.build = build; } public MessageConsole show() { if (console == null) { console = new MessageConsole(NLS.bind("Output for Build {0}#{1}", build.getPlan() == null ? "Unknown" : build.getPlan().getLabel(), build.getLabel()), CONSOLE_TYPE, BuildImages.CONSOLE, true); consoleManager.addConsoles(new IConsole[] { console }); console.setAttribute(ATTRIBUTE_BUILD, build); stream = console.newMessageStream(); } doGetOutput(); consoleManager.showConsoleView(console); return console; } public void close() { if (operation != null) { operation.cancel(); } } private void doGetOutput() { if (operation == null) { operation = new GetBuildOutputOperation(BuildsUiInternal.getOperationService(), build, new BuildOutputReader() { @Override public void handle(BuildOutputEvent event, IOperationMonitor monitor) throws IOException, CoreException { BufferedReader reader = event.getInput(); String line; while ((line = reader.readLine()) != null) { if (stream.isClosed()) { throw new OperationCanceledException(); } stream.println(line); } } @Override public void done() { operation = null; } }); operation.execute(); } } }