/*******************************************************************************
* Copyright (c) 2015 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.core;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.linuxtools.docker.core.DockerException;
import org.eclipse.linuxtools.docker.core.DockerImageBuildFailedException;
import org.eclipse.linuxtools.docker.core.IDockerConnection;
import org.eclipse.linuxtools.docker.core.IDockerProgressHandler;
import org.eclipse.linuxtools.docker.core.IDockerProgressMessage;
public class DefaultImageBuildProgressHandler implements IDockerProgressHandler {
private final static String IMAGE_BUILD_COMPLETE = "ImageBuildComplete.msg"; //$NON-NLS-1$
private final static String IMAGE_BUILDING_JOBNAME = "ImageBuildingJobName.msg"; //$NON-NLS-1$
private final static String IMAGE_BUILDING = "ImageBuilding.msg"; //$NON-NLS-1$
private final static String IMAGE_BUILD_STEP = "ImageBuildStep.msg"; //$NON-NLS-1$
private String image;
private DockerConnection connection;
private int lines;
ProgressJob progressJob;
/**
* Create a progress handler to watch the progress of building an image
*
* @param connection
* - docker connection
* @param image
* - image being built
* @param lines
* - number of lines in the Dockerfile
*/
public DefaultImageBuildProgressHandler(IDockerConnection connection,
String image, int lines) {
this.image = image;
this.connection = (DockerConnection) connection;
this.lines = lines;
}
@Override
public void processMessage(IDockerProgressMessage message)
throws DockerException {
if (message.error() != null) {
stopAllJobs();
throw new DockerImageBuildFailedException(image, message.error());
}
if (progressJob == null) {
// For image build, all the data is in the stream.
String status = message.stream();
if (status != null
&& status.startsWith(DockerMessages
.getString(IMAGE_BUILD_COMPLETE))) {
// refresh images
connection.getImages(true);
} else {
ProgressJob newJob = new ProgressJob(
DockerMessages.getFormattedString(
IMAGE_BUILDING_JOBNAME,
image),
DockerMessages.getString(IMAGE_BUILDING));
newJob.setUser(true);
newJob.setPriority(Job.LONG);
newJob.schedule();
progressJob = newJob;
}
} else {
String status = message.stream();
if (status != null
&& status.startsWith(DockerMessages
.getString(IMAGE_BUILD_COMPLETE))) {
progressJob.setPercentageDone(100);
// refresh images
connection.getImages(true);
} else if (status != null
&& status
.startsWith(DockerMessages
.getString(IMAGE_BUILD_STEP))) {
// Step number follows
String stepNumber = status.substring(
DockerMessages.getString(
IMAGE_BUILD_STEP).length());
// Need to separate step # from actual message.
String[] tokens = stepNumber.split(" ");
if (lines > 0) {
long percentage = (Long.valueOf(tokens[0]) + 1) / lines;
progressJob.setPercentageDone((int) percentage);
}
}
}
}
private void stopAllJobs() {
progressJob.cancel();
}
}