package org.openslx.dozmod.gui.wizard.page; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.nio.file.Files; import javax.swing.JOptionPane; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.log4j.Logger; import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.wizard.Wizard; import org.openslx.dozmod.gui.wizard.layout.ImageOvfConversionPageLayout; import org.openslx.dozmod.state.UploadWizardState; import org.openslx.dozmod.util.ConversionTaskWorker; /** * Page for converting an ovf image into an vmx image. Creates a directory * for the new vmx image, starts the conversion SwingWorker and shows the progress. * Replaces the image description file in state after conversion. */ @SuppressWarnings("serial") public class ImageOvfConversionPage extends ImageOvfConversionPageLayout { private final static Logger LOGGER = Logger.getLogger(ImageOvfConversionPage.class); private UploadWizardState state; private ImageOvfConversionPage page; private File vmxFile; private ConversionTaskWorker worker; private String startConversionButtonString = "Konvertierung starten"; public boolean danglingConversion = false; public ImageOvfConversionPage(Wizard wizard, UploadWizardState uploadWizardState) { super(wizard); setPageComplete(false); this.canComeBack = false; this.state = uploadWizardState; page = this; txtInfoText.setVisible(true); // Start the conversion btnStartConversion.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (worker == null) { try { updateConversionProgressbar(0); btnStartConversion.setText("Konvertierung abbrechen"); convertOvfToVmx(state.descriptionFile); } catch (Exception error) { btnStartConversion.setEnabled(false); Gui.showMessageBox(page, "Konvertierung fehlgeschlagen:", MessageType.ERROR, LOGGER, error); } } else { page.cancelConversionWorker(); } } }); } public void cancelConversionWorker() { if (worker != null) { worker.cancel(true); btnStartConversion.setText(startConversionButtonString); worker = null; } } // Check if the directory we want to create for the converted virtual machine // exists and create it private void convertOvfToVmx(File file) throws IOException { File directoryFile = new File(file.getParent() + "/converted_vm"); LOGGER.debug("Directory for converted VM:" + directoryFile.getAbsolutePath()); // Cancel if user clicks cancel if (directoryFile.exists() && !askDeleteDirAndContinue(directoryFile)) { btnStartConversion.setText(startConversionButtonString); return; } danglingConversion = true; Files.createDirectories(directoryFile.toPath()); vmxFile = new File(directoryFile.getPath() + "/" + FilenameUtils.removeExtension((file.getName())) + ".vmx"); worker = new ConversionTaskWorker(file, vmxFile, page, null); worker.execute(); state.convertedDescriptionFile = vmxFile; } private boolean askDeleteDirAndContinue(File directoryFile) throws IOException { if (directoryFile.exists()) { int dialogButton = JOptionPane.YES_NO_OPTION; int dialogResult; if (danglingConversion) { dialogResult = JOptionPane .showConfirmDialog(this, "Für die abgebrochene Konvertierung wurde ein Verzeichnis erstellt.\n" + "Soll dieses und dessen Inhalt wieder entfernt werden?", "Teststring", dialogButton); } else { dialogResult = JOptionPane.showConfirmDialog(this, "Das Verzeichnis, in welcher das konvertierte Image gespeichert werden soll existiert bereits. \n" + "Soll dieses ersetzt und die darin enthaltenen Dateien gelöscht werden?", "Teststring", dialogButton); } if (dialogResult == 0) { FileUtils.deleteDirectory(directoryFile); return true; } else { return false; } } // Nothing to delete. Should be OK to continue return true; } public void updateConversionProgressbar(int percent) { conversionProgressBar.setValue(percent); } public void updateConversionProgressbarText(String text) { conversionProgressBar.setString(text); } @Override protected boolean wantNextOrFinish() { return false; } @Override protected void onPageEnter() { updateConversionProgressbar(0); updateConversionProgressbarText(""); btnStartConversion.setText(startConversionButtonString); } @Override protected void onPageLeave() { // Make sure the worker is stopped when leaving the page. if (wizard.isCancelled() || danglingConversion) { page.cancelConversionWorker(); if (state.convertedDescriptionFile != null) { try { askDeleteDirAndContinue(state.convertedDescriptionFile.getParentFile()); } catch (IOException e) { LOGGER.debug(e); } } state.convertedDescriptionFile = null; danglingConversion = false; } super.onPageLeave(); } }