blob: 44e9c44f053cb66f4d4a1b2a5e1891a378d87c79 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2018 Red Hat Inc. and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat - Initial Contribution
*******************************************************************************/
package org.eclipse.linuxtools.internal.docker.ui.commands;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.linuxtools.docker.core.DockerConnectionManager;
import org.eclipse.linuxtools.docker.core.IDockerConnection;
import org.eclipse.linuxtools.internal.docker.ui.jobs.BuildDockerImageJob;
import org.eclipse.linuxtools.internal.docker.ui.views.DVMessages;
import org.eclipse.linuxtools.internal.docker.ui.wizards.ImageBuild;
import org.eclipse.linuxtools.internal.docker.ui.wizards.WizardMessages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
/**
* Command handler to build a Docker Image from a Dockerfile.
*/
public class BuildImageCommandHandler extends AbstractHandler {
private final static String BUILD_IMAGE_JOB_TITLE = "ImageBuild.msg"; //$NON-NLS-1$
private static final String IMAGE_DIRECTORY_VALIDATE = "ImageDirectoryValidate.msg"; //$NON-NLS-1$
@Override
public Object execute(final ExecutionEvent event) {
final ImageBuild wizard = new ImageBuild();
final WizardDialog wizardDialog = new NonModalWizardDialog(HandlerUtil.getActiveShell(event), wizard);
wizardDialog.create();
IWorkbenchWindow window = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
IWorkbenchPage activePage = null;
IWorkbenchPart activePart = null;
if (window != null)
activePage = window.getActivePage();
if (activePage != null)
activePart = activePage.getActivePart();
IDockerConnection connection = CommandUtils
.getCurrentConnection(activePart);
// if no current connection, try the first connection in the list of
// connections
if (connection == null) {
connection = DockerConnectionManager.getInstance()
.getFirstConnection();
}
if (connection == null || !connection.isOpen()) {
// if no active connection, issue error message dialog and return
Display.getDefault().syncExec(() -> MessageDialog.openError(
PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getShell(),
WizardMessages.getString("ErrorNoActiveConnection.msg"), //$NON-NLS-1$
WizardMessages.getString("ErrorNoActiveConnection.desc"))); //$NON-NLS-1$
return null;
}
final boolean buildImage = wizardDialog.open() == Window.OK;
if (buildImage) {
performBuildImage(wizard, connection);
}
return null;
}
private void performBuildImage(final ImageBuild wizard,
final IDockerConnection connection) {
final Job buildImageJob = new Job(
DVMessages.getString(BUILD_IMAGE_JOB_TITLE)) {
@Override
protected IStatus run(final IProgressMonitor monitor) {
final String id = wizard.getImageName();
@SuppressWarnings("unused")
final int lines = wizard.getNumberOfLines();
final IPath path = wizard.getDirectory();
final String dockerfileName = "Dockerfile"; //$NON-NLS-1$
monitor.beginTask(DVMessages.getString(BUILD_IMAGE_JOB_TITLE),
2);
monitor.subTask(
WizardMessages.getString(IMAGE_DIRECTORY_VALIDATE));
try {
Files.walkFileTree(Paths.get(path.toString()),
new FileVisitor<java.nio.file.Path>() {
@Override
public FileVisitResult preVisitDirectory(
java.nio.file.Path dir,
BasicFileAttributes attrs) {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(
java.nio.file.Path file,
BasicFileAttributes attrs) throws IOException {
if (!file.toFile().canRead()) {
throw new IOException();
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(
java.nio.file.Path file, IOException exc)
throws IOException {
throw exc;
}
@Override
public FileVisitResult postVisitDirectory(
java.nio.file.Path dir, IOException exc) {
return FileVisitResult.CONTINUE;
}
});
} catch (final IOException e) {
Display.getDefault().syncExec(() -> MessageDialog.openError(
PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getShell(),
WizardMessages
.getString("ErrorInvalidDirectory.msg"), //$NON-NLS-1$
WizardMessages.getFormattedString(
"ErrorInvalidPermissions.msg", //$NON-NLS-1$
path.toString())));
return Status.OK_STATUS;
}
monitor.worked(1);
// build the image and let the progress
// handler refresh the images when done
try {
monitor.subTask(
DVMessages.getString(BUILD_IMAGE_JOB_TITLE));
final Job buildImageJob = new BuildDockerImageJob(
connection, path, dockerfileName, id, null);
buildImageJob.schedule();
monitor.worked(1);
} finally {
monitor.done();
}
return Status.OK_STATUS;
}
};
buildImageJob.schedule();
}
/**
* We need a non-modal (omitting SWT.APPLICATION_MODAL) wizard dialog to
* ensure that any detatched editor windows are brought up can be accessed.
*/
private static class NonModalWizardDialog extends WizardDialog {
public NonModalWizardDialog(Shell parentShell, IWizard newWizard) {
super(parentShell, newWizard);
setShellStyle(SWT.CLOSE | SWT.MAX | SWT.TITLE | SWT.BORDER
| SWT.RESIZE | getDefaultOrientation());
}
}
}