summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java
diff options
context:
space:
mode:
authorSimon Rettberg2015-07-31 18:09:31 +0200
committerSimon Rettberg2015-07-31 18:09:31 +0200
commitd54ec5d58f657d5529c47bc5fafa38ca7f2283e3 (patch)
treec60c3dce4efc091e749d08eca8b916320f2807dd /dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java
parent[client] Continued implementation of Wizard (diff)
downloadtutor-module-d54ec5d58f657d5529c47bc5fafa38ca7f2283e3.tar.gz
tutor-module-d54ec5d58f657d5529c47bc5fafa38ca7f2283e3.tar.xz
tutor-module-d54ec5d58f657d5529c47bc5fafa38ca7f2283e3.zip
[client] Mostly finished Wizard implementation
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java260
1 files changed, 116 insertions, 144 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java
index 33f15f40..cbe2f8fa 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java
@@ -1,5 +1,6 @@
package org.openslx.dozmod.gui.wizard.page;
+import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
@@ -10,10 +11,10 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
+import javax.swing.JComponent;
import javax.swing.JFileChooser;
-import javax.swing.SwingUtilities;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
+import javax.swing.LookAndFeel;
+import javax.swing.UIManager;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.apache.log4j.Logger;
@@ -23,7 +24,6 @@ import org.openslx.dozmod.filetransfer.TransferEventListener;
import org.openslx.dozmod.filetransfer.UploadTask;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.helper.MessageType;
-import org.openslx.dozmod.gui.wizard.ImageWizard;
import org.openslx.dozmod.gui.wizard.Wizard;
import org.openslx.dozmod.gui.wizard.layout.ImageUploadPageLayout;
import org.openslx.dozmod.state.UploadWizardState;
@@ -32,9 +32,11 @@ import org.openslx.dozmod.thrift.Session;
import org.openslx.thrifthelper.ThriftManager;
import org.openslx.util.QuickTimer;
import org.openslx.util.QuickTimer.Task;
+import org.openslx.util.Util;
import org.openslx.util.vm.VmMetaData.HardDisk;
import org.openslx.util.vm.VmwareMetaData;
+@SuppressWarnings("serial")
public class ImageUploadPage extends ImageUploadPageLayout {
private final static Logger LOGGER = Logger.getLogger(ImageUploadPage.class);
@@ -48,28 +50,6 @@ public class ImageUploadPage extends ImageUploadPageLayout {
this.canComeBack = false;
this.state = uploadWizardState;
- imageNameTextField.getDocument().addDocumentListener(new DocumentListener() {
- @Override
- public void removeUpdate(DocumentEvent e) {
- changedUpdate(e);
- }
-
- @Override
- public void insertUpdate(DocumentEvent e) {
- changedUpdate(e);
- }
-
- @Override
- public void changedUpdate(DocumentEvent e) {
- if (!imageNameTextField.getText().isEmpty()) {
- setPageComplete(state.descriptionFile != null && state.uuid != null
- && state.transferInformation != null);
- } else {
- setPageComplete(false);
- }
- }
- });
-
// Browse for *.vmx
imageFileBrowseButton.addActionListener(new ActionListener() {
@Override
@@ -86,34 +66,55 @@ public class ImageUploadPage extends ImageUploadPageLayout {
}
});
- // Start upload
- startUploadButton.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- createAndUploadImage();
- }
- });
- startUploadButton.setEnabled(false);
-
blockProgressBar.setVisible(false);
imageFileBrowseButton.requestFocus();
}
private void browseForVm() {
- JFileChooser dialog = new JFileChooser(Config.getUploadPath());
- FileNameExtensionFilter filter = new FileNameExtensionFilter("Virtuelle Maschine", "vmx");
- dialog.setFileFilter(filter);
- dialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
+ // Ugly hack to get a prettier file chooser with GTK - should be moved to helper/util class
+ LookAndFeel old = UIManager.getLookAndFeel();
+ if (!old.getName().toLowerCase().contains("gtk")) {
+ old = null;
+ } else {
+ try {
+ UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ JFileChooser fc = new JFileChooser(Config.getUploadPath());
+ if (old != null) {
+ fc.updateUI();
+ try {
+ UIManager.setLookAndFeel(old);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ refreshUI(fc, false);
+ }
+ FileNameExtensionFilter filter = new FileNameExtensionFilter("VMware Virtual Machine", "vmx");
+ fc.setFileFilter(filter);
+ fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
- int ret = dialog.showOpenDialog(SwingUtilities.windowForComponent(this));
- if (ret != JFileChooser.APPROVE_OPTION)
- return;
- File file = dialog.getSelectedFile();
- if (file == null)
+ int action = fc.showOpenDialog(getDialog());
+ File file = fc.getSelectedFile();
+ if (action != JFileChooser.APPROVE_OPTION || file == null)
return;
vmxSelected(file.getAbsoluteFile());
}
+ private static void refreshUI(JComponent c, boolean includeParent) {
+ if (includeParent)
+ c.updateUI();
+
+ for (int i = 0; i < c.getComponentCount(); i++) {
+ Component child = c.getComponent(i);
+ if (child instanceof JComponent) {
+ refreshUI((JComponent) child, true);
+ }
+ }
+ }
+
private void vmxSelected(File file) {
Config.setUploadPath(file.getParent());
try {
@@ -173,13 +174,12 @@ public class ImageUploadPage extends ImageUploadPageLayout {
// let the user know the upload is ready
setErrorMessage(null);
setDescription("Sie können jetzt den Upload starten!");
- startUploadButton.setEnabled(true);
- startUploadButton.requestFocus();
+ setPageComplete(true);
}
/**
* This function starts the image creation process. It is triggered by the
- * "Upload" button.
+ * "Next" button.
*
* Depending on the state, it will first try to get a UUID for the new image
* by calling
@@ -193,106 +193,81 @@ public class ImageUploadPage extends ImageUploadPageLayout {
* user feedback about it.
*
*/
- private void createAndUploadImage() {
+ @Override
+ protected boolean wantNextOrFinish() {
// first get the image name from the field
// (either auto filled by VmwareMetaData or by user)
state.name = imageNameTextField.getText();
+ // and to request the upload once we received that UUID.
- // schedule task to create the image if we have no UUID
- // and to request the upload once we received that UUID.
- QuickTimer.scheduleOnce(new Task() {
- @Override
- public void fire() {
- // -- create image --
- if (state.uuid == null) {
- LOGGER.debug("Creating image...");
- try {
- state.uuid = ThriftManager.getSatClient().createImage(Session.getSatelliteToken(),
- state.name);
- } catch (Exception e) {
- LOGGER.error("Error while creating image: ", e);
- }
- }
- if (state.transferInformation == null && state.uuid != null) {
- // -- request upload --
- LOGGER.debug("Requesting upload...");
- try {
- state.transferInformation = ThriftManager.getSatClient().requestImageVersionUpload(
- Session.getSatelliteToken(), state.uuid, state.diskFile.length(), null,
- state.meta.getFilteredDefinition());
- } catch (Exception e) {
- LOGGER.error("Error while requesting download for: " + state.uuid, e);
- }
- }
- if (state.uploadTask == null && state.transferInformation != null && state.uuid != null) {
- // do actually start the upload now
- LOGGER.debug("Starting upload for : " + state.diskFile.toPath());
- try {
- state.uploadTask = new UploadTask(Session.getSatelliteAddress(),
- state.transferInformation.getPlainPort(),
- state.transferInformation.getToken(), state.diskFile);
- } catch (FileNotFoundException e) {
- Gui.showMessageBox(getTopLevelAncestor(), "Cannot upload file: Not found",
- MessageType.ERROR, LOGGER, e);
- return;
- }
- // -- add listener for upload status/progress --
- state.uploadTask.addListener(new TransferEventListener() {
+ // -- create image --
+ if (state.uuid == null) {
+ LOGGER.debug("Creating image...");
+ try {
+ state.uuid = ThriftManager.getSatClient()
+ .createImage(Session.getSatelliteToken(), state.name);
+ } catch (Exception e) {
+ setErrorMessage("Konnte das Image nicht auf dem Satelliten erstellen");
+ LOGGER.error("Error while creating image: ", e);
+ return false;
+ }
+ imageNameTextField.setEnabled(false);
+ imageFileBrowseButton.setEnabled(false);
+ imageFileTextField.setEnabled(false);
+ }
+ // -- request upload --
+ if (state.transferInformation == null) {
+ LOGGER.debug("Requesting upload...");
+ try {
+ state.transferInformation = ThriftManager.getSatClient().requestImageVersionUpload(
+ Session.getSatelliteToken(), state.uuid, state.diskFile.length(), null,
+ state.meta.getFilteredDefinition());
+ } catch (Exception e) {
+ setErrorMessage("Fehler beim Aushandeln des Uploads");
+ LOGGER.error("Error while requesting download for: " + state.uuid, e);
+ return false;
+ }
+ }
+ if (state.uploadTask == null) {
+ // do actually start the upload now
+ LOGGER.debug("Starting upload for: " + state.diskFile.toPath());
+ try {
+ state.uploadTask = new UploadTask(Session.getSatelliteAddress(),
+ state.transferInformation.getPlainPort(), state.transferInformation.getToken(),
+ state.diskFile);
+ } catch (FileNotFoundException e) {
+ Gui.showMessageBox(getTopLevelAncestor(), "Cannot upload file: Not found\n\n"
+ + state.diskFile.getAbsolutePath(), MessageType.ERROR, LOGGER, e);
+ return false;
+ }
+ // -- add listener for upload status/progress --
+ state.uploadTask.addListener(new TransferEventListener() {
+ @Override
+ public void update(final TransferEvent event) {
+ final TransferEventListener listener = this;
+ Gui.asyncExec(new Runnable() {
@Override
- public void update(final TransferEvent event) {
- final TransferEventListener listener = this;
- Gui.asyncExec(new Runnable() {
- @Override
- public void run() {
- // always callback to gui
- processTransferStatus(listener, event);
- }
- });
+ public void run() {
+ // always callback to gui
+ processTransferStatus(listener, event);
}
});
- new Thread(state.uploadTask).start();
}
- Gui.asyncExec(new Runnable() {
- @Override
- public void run() {
- createAndUploadImageCallback();
- }
- });
- }
- });
- }
+ });
+ new Thread(state.uploadTask).start();
+ do {
+ Util.sleep(5);
+ } while (state.uploadTask.getConnectFailCount() == 0 && state.uploadTask.getTransferCount() == 0);
+ }
- /**
- * Callback for the QuickTimer executing the thrift calls (see
- * createAndUploadImage())
- *
- * createAndUploadImage() starts the image upload process by creating the
- * image,
- * requesting upload transfer, starting the upload task and finally query
- * the upload
- * status to check if the upload is actually running.
- *
- * Each step will update the UploadWizardState which we will evaluate here
- * to
- * know which step failed and handle the error accordingly.
- */
- public void createAndUploadImageCallback() {
- // always disable "Browse" and "Image Name" field
- imageNameTextField.setEnabled(false);
- imageFileBrowseButton.setEnabled(false);
- imageFileTextField.setEnabled(false);
- // -- check image creation --
- if (state.uuid == null) {
- LOGGER.debug("No UUID in upload state!");
- setErrorMessage("Konnte das Image nicht auf dem Satelliten erstellen!");
- } else if (state.transferInformation == null) {
- LOGGER.debug("No transfer information in upload state!");
- setErrorMessage("Fehler bei der Upload-Anfrage!");
- } else if (state.uploadTask != null) {
- blockProgressBar.setVisible(true);
- setDescription("Der Upload wurde gestartet");
+ if (state.uploadTask.getTransferCount() == 0) {
+ Gui.showMessageBox(this, "Error connecting to Satellite for upload!", MessageType.ERROR, LOGGER,
+ null);
+ return false;
}
- setPageComplete(state.uploadTask != null);
+ // -- check image creation --
+ blockProgressBar.setVisible(true);
+ return true;
}
/**
@@ -325,13 +300,10 @@ public class ImageUploadPage extends ImageUploadPageLayout {
case ERROR:
if (state.uploadTask != null && state.uploadTask.isCanceled())
return;
- if (Gui.showMessageBox(this, "Fehler beim Upload: " + event.errorMessage
- + "\nNochmal versuchen?", MessageType.ERROR_RETRY, LOGGER, null)) {
- // user wants to try again, just reset transferInformation ...
- state.uploadTask = null;
- // ... since this function will then do the upload process again.
- createAndUploadImage();
- }
+ Gui.showMessageBox(this, "Fehler beim Upload: " + event.errorMessage, MessageType.ERROR, LOGGER,
+ null);
+ // user wants to try again, just reset transferInformation ...
+ state.uploadTask = null;
break;
case WORKING:
case IDLE: