diff options
author | Simon Rettberg | 2015-07-31 18:09:31 +0200 |
---|---|---|
committer | Simon Rettberg | 2015-07-31 18:09:31 +0200 |
commit | d54ec5d58f657d5529c47bc5fafa38ca7f2283e3 (patch) | |
tree | c60c3dce4efc091e749d08eca8b916320f2807dd /dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java | |
parent | [client] Continued implementation of Wizard (diff) | |
download | tutor-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.java | 260 |
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: |