/*******************************************************************************
* Copyright (c) 2013 Cloud Bees, Inc.
* All rights reserved.
* This program is 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:
* Cloud Bees, Inc. - initial API and implementation
*******************************************************************************/
package com.cloudbees.eclipse.dev.ui.views.jobs;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
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;
import com.cloudbees.eclipse.core.JenkinsService;
import com.cloudbees.eclipse.core.jenkins.api.JenkinsConsoleLogResponse;
import com.cloudbees.eclipse.dev.ui.CBDEVImages;
import com.cloudbees.eclipse.dev.ui.CloudBeesDevUiPlugin;
import com.cloudbees.eclipse.ui.CloudBeesUIPlugin;
public class JobConsole {
final static String CONSOLE_TYPE = "com.cloudbees.eclipse.dev.ui.views.jobs.JobConsole";
final static String ATTRIBUTE_URL = "com.cloudbees.eclipse.dev.ui.views.jobs.JobConsole.build";
private final IConsoleManager consoleManager;
private volatile MessageConsoleStream stream;
protected String name;
protected String url;
public JobConsole(final IConsoleManager consoleManager, final String name, final String url) {
Assert.isNotNull(consoleManager);
Assert.isNotNull(name);
Assert.isNotNull(url);
this.consoleManager = consoleManager;
this.name = name;
this.url = url;
}
public MessageConsole show() {
MessageConsole console = null;
if (this.stream == null) {
console = new MessageConsole(NLS.bind("Output for Build \"{0}\"", this.name), CONSOLE_TYPE,
CloudBeesDevUiPlugin.getImageDescription(CBDEVImages.IMG_CONSOLE), true);
this.consoleManager.addConsoles(new IConsole[] { console });
console.setAttribute(ATTRIBUTE_URL, this.url);
this.stream = console.newMessageStream();
}
retrieveLog();
this.consoleManager.showConsoleView(console);
return console;
}
public void dispose() {
try {
this.stream.close();
} catch (Exception e) {
e.printStackTrace(); // TODO log
} finally {
this.stream = null;
}
}
private void retrieveLog() {
org.eclipse.core.runtime.jobs.Job job = new org.eclipse.core.runtime.jobs.Job("Loading console output for \""
+ this.name + "\"") {
@Override
protected IStatus run(final IProgressMonitor monitor) {
try {
JenkinsService service = CloudBeesUIPlugin.getDefault().getJenkinsServiceForUrl(JobConsole.this.url);
JenkinsConsoleLogResponse requestResponse = new JenkinsConsoleLogResponse();
requestResponse.viewUrl = JobConsole.this.url;
long safety = 60 * 60;
do {
if (requestResponse.hasMore) {
try {
Thread.sleep(1000);
} catch (Exception e) {
// ignore
}
}
if (JobConsole.this.stream == null || JobConsole.this.stream.isClosed()) {
break;
}
requestResponse = service.getBuildLog(requestResponse, monitor);
if (requestResponse.logPart != null) {
BufferedReader in = new BufferedReader(new InputStreamReader(requestResponse.logPart));
String data = null;
while ((data = in.readLine()) != null) {
if (JobConsole.this.stream.isClosed()) {
throw new OperationCanceledException();
}
JobConsole.this.stream.println(data);
}
}
} while (requestResponse.hasMore && --safety > 0);
return Status.OK_STATUS;
} catch (OperationCanceledException e) {
return Status.CANCEL_STATUS;
} catch (Exception e) {
e.printStackTrace(); // TODO
return new Status(IStatus.ERROR, CloudBeesDevUiPlugin.PLUGIN_ID, e.getMessage(), e);
} finally {
monitor.done();
}
}
};
job.setUser(false);
job.schedule();
}
}