diff options
| author | Stephan Schwär | 2020-10-15 09:45:46 +0200 |
|---|---|---|
| committer | Stephan Schwär | 2020-10-15 09:45:46 +0200 |
| commit | 54e63495db8f13172341661670c3b1e1dee7570a (patch) | |
| tree | c061c87f56ad77d4b46d26f9a5089ca37f37cf99 /dozentenmodul/src/main/java | |
| parent | [client] Enable the next button after ovf conversion is complete (diff) | |
| download | tutor-module-54e63495db8f13172341661670c3b1e1dee7570a.tar.gz tutor-module-54e63495db8f13172341661670c3b1e1dee7570a.tar.xz tutor-module-54e63495db8f13172341661670c3b1e1dee7570a.zip | |
[client] Call ovftool through SwingWorker
The worker also updates the new progressbar and the worker
is interrupted when clicking on the back or abort conversion
button.
Feature: #3771
Diffstat (limited to 'dozentenmodul/src/main/java')
4 files changed, 148 insertions, 42 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/WizardPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/WizardPage.java index fc1da67f..b8be827a 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/WizardPage.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/WizardPage.java @@ -100,7 +100,7 @@ public abstract class WizardPage extends JPanel { * Setters from derived classes */ - protected void setPageComplete(boolean b) { + public void setPageComplete(boolean b) { if (isComplete == b) return; isComplete = b; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageOvfConversionPageLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageOvfConversionPageLayout.java index 18a7ed1d..582d373d 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageOvfConversionPageLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageOvfConversionPageLayout.java @@ -5,10 +5,9 @@ import java.awt.event.KeyEvent; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JButton; +import javax.swing.JProgressBar; import javax.swing.JTextArea; -import javax.swing.JTextField; -import org.openslx.dozmod.gui.control.QLabel; import org.openslx.dozmod.gui.helper.GridManager; import org.openslx.dozmod.gui.wizard.Wizard; import org.openslx.dozmod.gui.wizard.WizardPage; @@ -18,6 +17,7 @@ public abstract class ImageOvfConversionPageLayout extends WizardPage { protected final JButton btnStartConversion; protected final JTextArea txtInfoText; + protected final JProgressBar conversionProgressBar; /** * Page converting an ovf to a vmx image. @@ -25,7 +25,7 @@ public abstract class ImageOvfConversionPageLayout extends WizardPage { public ImageOvfConversionPageLayout(Wizard wizard) { super(wizard, "ovf konvertieren"); setDescription("Ovf zu vmx konvertieren."); - GridManager grid = new GridManager(this, 1, false); + GridManager grid = new GridManager(this, 1); txtInfoText = new JTextArea(); txtInfoText.setBorder(BorderFactory.createTitledBorder("Hinweis")); @@ -41,9 +41,21 @@ public abstract class ImageOvfConversionPageLayout extends WizardPage { + "einige Zeit in Anspruch nehmen."); grid.add(txtInfoText).fill(true, false).expand(true, false); grid.nextRow(); - btnStartConversion = new JButton("Konvertieren"); + btnStartConversion = new JButton("Konvertierung starten"); btnStartConversion.setMnemonic(KeyEvent.VK_B); grid.add(btnStartConversion); + grid.nextRow(); + + grid.add(Box.createVerticalGlue()).expand(true, true); + grid.nextRow(); + + conversionProgressBar = new JProgressBar(); + conversionProgressBar.setMinimum(0); + conversionProgressBar.setMaximum(100); + conversionProgressBar.setStringPainted(true); + grid.add(conversionProgressBar).expand(true, false).fill(true, false); + grid.nextRow(); + grid.finish(false); } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageOvfConversionPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageOvfConversionPage.java index fcac46d1..07a68f1b 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageOvfConversionPage.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageOvfConversionPage.java @@ -2,11 +2,9 @@ package org.openslx.dozmod.gui.wizard.page; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.io.BufferedReader; + import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.nio.file.Files; import javax.swing.JOptionPane; @@ -14,20 +12,22 @@ 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.WizardPage; import org.openslx.dozmod.gui.wizard.layout.ImageOvfConversionPageLayout; import org.openslx.dozmod.state.UploadWizardState; +import org.openslx.dozmod.util.ConversionTaskWorker; @SuppressWarnings("serial") public class ImageOvfConversionPage extends ImageOvfConversionPageLayout { private final static Logger LOGGER = Logger.getLogger(ImageOvfConversionPage.class); private UploadWizardState state; - private WizardPage page; + private ImageOvfConversionPage page; private File vmxFile; + private ConversionTaskWorker worker; public ImageOvfConversionPage(Wizard wizard, UploadWizardState uploadWizardState) { super(wizard); @@ -42,16 +42,32 @@ public class ImageOvfConversionPage extends ImageOvfConversionPageLayout { btnStartConversion.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - try { - convertOvfToVmx(state.descriptionFile); - } catch (Exception error) { - Gui.showMessageBox(page, "Conversion failed:", MessageType.ERROR, LOGGER, error); - } + if (worker == null) { + try { + updateConversionProgressbar(0); + btnStartConversion.setText("Konvertierung abbrechen"); + convertOvfToVmx(state.descriptionFile); + } catch (Exception error) { + btnStartConversion.setEnabled(false); + Gui.showMessageBox(page, "Conversion failed:", MessageType.ERROR, LOGGER, error); + } + } else { + page.cancelConversionWorker(); + } } }); } + public void cancelConversionWorker() { + if (worker != null) { + worker.cancel(true); + btnStartConversion.setText("Konvertierung starten"); + updateConversionProgressbarText("Konvertierung abgebrochen!"); + 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"); @@ -70,40 +86,32 @@ public class ImageOvfConversionPage extends ImageOvfConversionPageLayout { } Files.createDirectories(directoryFile.toPath()); + vmxFile = new File( + directoryFile.getPath() + "/" + FilenameUtils.removeExtension((file.getName())) + ".vmx"); + worker = new ConversionTaskWorker(file, vmxFile, page); - Process process = null; - try { - vmxFile = new File( - directoryFile.getPath() + "/" + FilenameUtils.removeExtension((file.getName())) + ".vmx"); - process = new ProcessBuilder("ovftool", file.getAbsolutePath(), vmxFile.getAbsolutePath()) - .start(); - } catch (IOException e) { - Gui.showMessageBox(page, "Conversion failed:", MessageType.ERROR, LOGGER, e); - return; - } - InputStream is = process.getInputStream(); - InputStreamReader isr = new InputStreamReader(is); - BufferedReader br = new BufferedReader(isr); - String line; + worker.execute(); + state.convertedDescriptionFile = vmxFile; - System.out.println("Running OVFTool"); + } - try { - while ((line = br.readLine()) != null) { - System.out.println(line); - } - } catch (IOException e) { - System.out.println("Error reading output or OVFTool."); - } - state.convertedDescriptionFile = vmxFile; - setPageComplete(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 onPageLeave() { + page.cancelConversionWorker(); + super.onPageLeave(); + } + } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/util/ConversionTaskWorker.java b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ConversionTaskWorker.java new file mode 100644 index 00000000..a5a4fa77 --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ConversionTaskWorker.java @@ -0,0 +1,86 @@ +package org.openslx.dozmod.util; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.List; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import javax.swing.SwingWorker; + +import org.apache.log4j.Logger; +import org.openslx.dozmod.gui.wizard.page.ImageOvfConversionPage; + +public class ConversionTaskWorker extends SwingWorker<Boolean, String> { + private final static Logger LOGGER = Logger.getLogger(ConversionTaskWorker.class); + + private File srcFile; + private File destFile; + private ImageOvfConversionPage page; + Process process = null; + + public ConversionTaskWorker(File srcFile, File destFile, ImageOvfConversionPage page) { + this.srcFile = srcFile; + this.destFile = destFile; + this.page = page; + } + + @Override + protected Boolean doInBackground() throws Exception { + try { + process = new ProcessBuilder("ovftool", srcFile.getAbsolutePath(), destFile.getAbsolutePath()) + .start(); + } catch (IOException e) { + return false; + } + InputStream is = process.getInputStream(); + InputStreamReader isr = new InputStreamReader(is); + BufferedReader br = new BufferedReader(isr); + String line; + LOGGER.info("Running OVFTool"); + try { + while ((line = br.readLine()) != null) { + LOGGER.debug(line); + publish(line); + } + } catch (IOException e) { + LOGGER.error(e); + + } + return true; + } + + @Override + protected void process(List<String> chunks) { + String progressText = chunks.get(chunks.size() - 1); + page.updateConversionProgressbarText(progressText); + progressText = progressText.replaceAll("[^\\d]", ""); + try { + int progressInt = Integer.parseInt(progressText); + if (progressInt < 100) + page.updateConversionProgressbar(progressInt); + } catch (NumberFormatException e) { + // We are only interested in integers for the progressbar + } + } + + @Override + protected void done() { + try { + get(); + page.setPageComplete(true); + page.updateConversionProgressbar(100); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + process.destroy(); + } catch (CancellationException e) { + process.destroy(); + } catch (ExecutionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + super.done(); + } +} |
