summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java
diff options
context:
space:
mode:
authorStephan Schwär2020-10-15 09:45:46 +0200
committerStephan Schwär2020-10-15 09:45:46 +0200
commit54e63495db8f13172341661670c3b1e1dee7570a (patch)
treec061c87f56ad77d4b46d26f9a5089ca37f37cf99 /dozentenmodul/src/main/java
parent[client] Enable the next button after ovf conversion is complete (diff)
downloadtutor-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')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/WizardPage.java2
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageOvfConversionPageLayout.java20
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageOvfConversionPage.java82
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/util/ConversionTaskWorker.java86
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();
+ }
+}