summaryrefslogblamecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageOvfConversionPage.java
blob: 9417e62d63f07e0ceb44f81206e53e6299000b58 (plain) (tree)
1
2
3
4
5
6
7
8
9



                                           
 
                    
                           
                           
 


                                       
                                           
                               
 

                                                 


                                                                         
                                                    
 




                                                                                   




                                                                                        
                                        
                         
                                        

                                                                         





                                                                                       
                    






                                                                   






                                                                              
                                                                                                                    


                                                  
 
                 

             

     


                                          
                                                                    



                          

                                                                                 


                                                                                      







                                                                                                                     
                                                                     




                                                                                    

                                                         

                                     




                                                                                                       





                                                                                                                          

                                                         
                            
                    
                             
             
         

                                                      
     
 





                                                              
     
 

                                          

                     

             






                                                                
                                  












                                                                                            


                            
 
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();
    }

}