package gui.image; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Font; import java.awt.SystemColor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JSeparator; import javax.swing.JTextPane; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import javax.swing.event.InternalFrameAdapter; import javax.swing.event.InternalFrameEvent; import javax.swing.filechooser.FileNameExtensionFilter; import models.Image; import models.RightsManagement; import models.SessionData; import models.person; import org.apache.log4j.Logger; import org.apache.thrift.TException; import org.openslx.sat.thrift.iface.TransferInformation; import org.openslx.thrifthelper.ThriftManager; import util.GuiManager; import util.MessageType; import config.Config; import ftp.UploadTask; import gui.intro.MainMenue_GUI; @SuppressWarnings("serial") public class FTPEditUploader_GUI extends JInternalFrame implements PropertyChangeListener { /** * Logger instance for this class. */ private final static Logger LOGGER = Logger.getLogger(FTPEditUploader_GUI.class); private final JPanel contentPanel = new JPanel(); private JLabel lblPath; private JProgressBar progressBar; private String host = SessionData.serverAdress; private File uploadFile; private UploadTask task = null; private JLabel lblUpSpeed; private JLabel lblFertig; private JLabel lblFilesize; private JLabel lblZeit; private JLabel lblVerbleibend; private JFileChooser fc; private long filesize; private double speed; private long bytesread; private int progress = 0; private JButton btnUploadStarten = new JButton("Upload auf Server starten"); private JButton btnSpeicherortAuswhlen = new JButton("Image auswählen"); private JButton btnFinish = new JButton("Fertigstellen"); private JButton btnZurck = new JButton("Zurück"); private JButton btnUploadStoppen = new JButton("Upload abbrechen"); private TransferInformation transferInfo = null; // file private boolean isAborted = false; // down- or upload was manually aborted public static final String HELP_MESSAGE = "
" + "Laden Sie hier Ihre bearbeitete .vmdk-Datei hoch, die dann als virtuelles Labor geladen werden kann.
" + "Wichtig ist, dass Sie zum Schluss auf \"Fertigstellen\" klicken, damit die Daten übernommen werden.
" + "Wenn Sie die Datei hochgeladen haben, dann aber auf \"zurück\" klicken, oder die Anwendung beenden,
" + "werden die Änderungen NICHT übernommen und auch die .vmdk-Datei wird nicht aktiv geschaltet." + "
"; /** * Create the frame. */ public FTPEditUploader_GUI() { final String[] options = { "Beenden", "Abbrechen" }; addInternalFrameListener(new InternalFrameAdapter() { @Override public void internalFrameClosing(InternalFrameEvent arg0) { if (!isCurrentlyLoading()) return; // check if user wants to quit. int choice = JOptionPane.showOptionDialog( null, "Aktuell ist ein Upload aktiv. Wollen Sie diesen Abbrechen und das Programm beenden?", "Upload aktiv", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]); // 0=beenden, 1=abbrechen if (choice == 0) { try { ThriftManager.getSatClient().cancelDownload(transferInfo.token); ThriftManager.getSatClient().setSessionInvalid(SessionData.authToken); } catch (TException e1) { } task.cancel(true); System.exit(0); }// end if choice } }); setResizable(false); // Aktion die beim Schliessen durchgefuehrt werden soll setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); setBackground(Color.WHITE); setTitle("Dozentenmodul - Image bearbeiten - " + person.verantwortlicher.getUserID()); setBounds(0, 0, 603, 722); getContentPane().setLayout(new BorderLayout()); contentPanel.setBackground(SystemColor.menu); contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); getContentPane().add(contentPanel, BorderLayout.CENTER); contentPanel.setLayout(null); { btnSpeicherortAuswhlen.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { fc = new JFileChooser(Config.getLastUploadPath()); fc.setFileSelectionMode(JFileChooser.FILES_ONLY); FileNameExtensionFilter filter = new FileNameExtensionFilter("VMDK-Container", "vmdk"); fc.setFileFilter(filter); fc.showOpenDialog(getParent()); File file = fc.getSelectedFile(); // check if a file is selected and exists if (file != null) { // file selected uploadFile = file; uploadFile.getName(); lblPath.setText(file.getAbsolutePath()); } else { // no file selected lblPath.setText(""); }// end if } }); btnSpeicherortAuswhlen.setBounds(102, 162, 173, 23); btnSpeicherortAuswhlen.setVerticalAlignment(SwingConstants.TOP); contentPanel.add(btnSpeicherortAuswhlen); } lblPath = new JLabel(""); lblPath.setText(Config.getLastUploadPath()); lblPath.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent arg0) { if (lblPath.getText().trim().isEmpty()) { // wenn leer, dann upload button nicht freigeben btnUploadStarten.setEnabled(false); btnUploadStarten.setText("Bitte warten"); } else if (lblPath.getText().trim().endsWith(".vmdk")) { // wenn leer, dann upload button freigeben btnUploadStarten.setEnabled(true); btnUploadStarten.setText("Upload auf Server starten"); } } }); lblPath.setBounds(102, 196, 485, 23); contentPanel.add(lblPath); btnUploadStarten.setEnabled(false); btnUploadStarten.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { buttonUploadActionPerformed(arg0); } }); btnUploadStarten.setBounds(102, 238, 173, 23); contentPanel.add(btnUploadStarten); progressBar = new JProgressBar(0, 100); progressBar.setStringPainted(true); progressBar.setBounds(102, 272, 485, 30); contentPanel.add(progressBar); JLabel lblUploadgeschwindigkeit = new JLabel("Uploadgeschwindigkeit:"); lblUploadgeschwindigkeit.setBounds(102, 313, 141, 14); contentPanel.add(lblUploadgeschwindigkeit); JLabel label_1 = new JLabel("Fertig:"); label_1.setBounds(102, 363, 46, 14); contentPanel.add(label_1); lblFertig = new JLabel("0"); lblFertig.setBounds(183, 363, 108, 14); contentPanel.add(lblFertig); lblUpSpeed = new JLabel("0"); lblUpSpeed.setBounds(374, 313, 117, 14); contentPanel.add(lblUpSpeed); JLabel label_4 = new JLabel("von:"); label_4.setBounds(318, 363, 46, 14); contentPanel.add(label_4); lblFilesize = new JLabel("0"); lblFilesize.setBounds(374, 363, 117, 14); contentPanel.add(lblFilesize); JLabel label_6 = new JLabel("Verbleibend:"); label_6.setBounds(102, 388, 71, 14); contentPanel.add(label_6); JLabel label_7 = new JLabel("Geschätzte Verbleibende Zeit:"); label_7.setBounds(102, 338, 150, 14); contentPanel.add(label_7); lblZeit = new JLabel("0"); lblZeit.setBounds(374, 338, 117, 14); contentPanel.add(lblZeit); lblVerbleibend = new JLabel("0"); lblVerbleibend.setBounds(183, 388, 108, 14); contentPanel.add(lblVerbleibend); JPanel panel = new JPanel(); panel.setLayout(null); panel.setBackground(SystemColor.menu); panel.setBounds(10, 11, 577, 73); contentPanel.add(panel); JLabel lblUploadIhresImage = new JLabel("Upload Ihres Images"); lblUploadIhresImage.setFont(new Font("Tahoma", Font.BOLD, 18)); lblUploadIhresImage.setBounds(10, 11, 509, 22); panel.add(lblUploadIhresImage); JTextPane txtpnFhreSieBitte = new JTextPane(); txtpnFhreSieBitte.setText("Laden Sie optional ein neues Image hoch, oder klicken Sie direkt auf \"Fertigstellen\", um reine Änderungen der Angaben direkt zu übernehmen."); txtpnFhreSieBitte.setEditable(false); txtpnFhreSieBitte.setBackground(SystemColor.menu); txtpnFhreSieBitte.setBounds(10, 36, 509, 42); panel.add(txtpnFhreSieBitte); JSeparator separator = new JSeparator(); separator.setBounds(10, 88, 597, 14); contentPanel.add(separator); JLabel lblNewLabel_1 = new JLabel("Hauptmenü"); lblNewLabel_1.setForeground(Color.BLUE); lblNewLabel_1.setBounds(20, 88, 61, 20); contentPanel.add(lblNewLabel_1); lblNewLabel_1.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent arg0) { GuiManager.show(new MainMenue_GUI()); } }); JLabel label_3 = new JLabel(">"); label_3.setBounds(80, 91, 14, 14); contentPanel.add(label_3); JLabel lblVlimage = new JLabel("Image"); lblVlimage.setForeground(Color.BLUE); lblVlimage.setBounds(91, 88, 46, 20); contentPanel.add(lblVlimage); JLabel label_5 = new JLabel(">"); label_5.setBounds(139, 91, 14, 14); contentPanel.add(label_5); JLabel lblNeubearbeiten = new JLabel("Bearbeiten"); lblNeubearbeiten.setBounds(149, 91, 155, 14); contentPanel.add(lblNeubearbeiten); JSeparator separator_1 = new JSeparator(); separator_1.setBounds(0, 627, 597, 2); contentPanel.add(separator_1); JLabel lblSchritt_1 = new JLabel("Schritt 1:"); lblSchritt_1.setBounds(24, 166, 61, 14); contentPanel.add(lblSchritt_1); JLabel lblSchritt_2 = new JLabel("Schritt 2:"); lblSchritt_2.setBounds(24, 242, 57, 14); contentPanel.add(lblSchritt_2); JLabel label = new JLabel("Schritt 3:"); label.setBounds(20, 461, 57, 14); contentPanel.add(label); JLabel label_2 = new JLabel("Klicken Sie auf \"Fertigstellen\"."); label_2.setBounds(98, 461, 241, 14); contentPanel.add(label_2); btnUploadStoppen.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { isAborted = true; // set flag try { ThriftManager.getSatClient().cancelDownload(transferInfo.token); } catch (TException e1) { } task.cancel(true); resetValues(); // reset buttons resetButtons(); } }); btnUploadStoppen.setEnabled(false); btnUploadStoppen.setBounds(307, 238, 173, 23); contentPanel.add(btnUploadStoppen); JLabel lblNewLabel = new JLabel(" (opt.)"); lblNewLabel.setBounds(20, 179, 46, 14); contentPanel.add(lblNewLabel); JLabel lblopt = new JLabel(" (opt.)"); lblopt.setBounds(20, 257, 46, 14); contentPanel.add(lblopt); { JPanel buttonPane = new JPanel(); buttonPane.setBackground(UIManager.getColor("Button.background")); buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); getContentPane().add(buttonPane, BorderLayout.SOUTH); { // finishButton.setEnabled(false); btnFinish.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // save data boolean success = updateData(); if (!success) return; LOGGER.info("Bearbeitetes Image '" + Image.Imagename + "' erfolgreich gespeichert."); JOptionPane.showMessageDialog(null, "Die Änderungen wurden erfolgreich gespeichert.", "Änderungen gespeichert", JOptionPane.INFORMATION_MESSAGE); if (lblPath.getText().trim().length() > 0) { File f = new File(lblPath.getText().trim()); if (f.isDirectory()) { Config.setLastUploadPath(f.toString()); } else if (f.getParentFile().isDirectory()) { Config.setLastUploadPath(f.getParentFile().toString()); } } Config.store(); GuiManager.show(new MainMenue_GUI()); if (isCurrentlyLoading()) { task.cancel(true); } } }); btnZurck.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { // check if loading file or not if (isCurrentlyLoading() == true) { int choice = JOptionPane.showOptionDialog(null, "Nicht abgeschlossene Uploads werden beendet. Trotzdem zurück gehen?", "Warnung", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]); // 0=beenden, 1=abbrechen if (choice == 0) { try { ThriftManager.getSatClient().cancelDownload(transferInfo.token); } catch (TException e1) { e1.printStackTrace(); } task.cancel(true); // not loading files, go back one page try { if (ThriftManager.getSatClient().userIsImageAdmin(Image.ImageId, SessionData.authToken, person.verantwortlicher.getUserID()) == true || person.verantwortlicher.getRole().equals("Admin")) { //user is admin and may change permissions GuiManager.show(new PermissionEditImage_GUI()); } else { //user may not change permissions GuiManager.show(new EditImageTechnisch_GUI()); } } catch (TException e) { // TODO Auto-generated catch block e.printStackTrace(); } }// end if coice } else { int selectedOption = JOptionPane.showConfirmDialog( null, "Achtung: Alle Änderungen gehen verloren!
Klicken Sie auf fertigstellen, wenn Sie die Änderungen dauerhaft speichern möchten.

Möchten Sie jetzt abbrechen und zurück?", "Abbrechen und zurück", JOptionPane.YES_NO_OPTION); if (selectedOption == JOptionPane.YES_OPTION) { try { System.out.println("userID in editimageuploader is : " + person.verantwortlicher.getUserID()); if (ThriftManager.getSatClient().userIsImageAdmin(Image.ImageId, SessionData.authToken, person.verantwortlicher.getUserID()) == true) { //user is admin and may change permissions GuiManager.show(new PermissionEditImage_GUI()); } else { //user may not change permissions GuiManager.show(new EditImageTechnisch_GUI()); } } catch (TException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { // for actions if "no" is selected. tbd. } }// end else }// end action }); btnZurck.setActionCommand("Cancel"); buttonPane.add(btnZurck); btnFinish.setActionCommand("Cancel"); buttonPane.add(btnFinish); } } } private void buttonUploadActionPerformed(ActionEvent event) { isAborted = false; progressBar.setValue(0); btnUploadStarten.setEnabled(false); // verhindert einen weiteren Klick btnUploadStarten.setText("Bitte warten"); try { transferInfo = ThriftManager.getSatClient().requestUpload(SessionData.authToken, uploadFile.length(), null); } catch (TException e) { transferInfo = null; JOptionPane.showMessageDialog(null, "Konnte vom Satelliten keine FTP-User erhalten!", "Debug-Message", JOptionPane.ERROR_MESSAGE); } task = new UploadTask(host, transferInfo.plainPort, transferInfo.token, uploadFile); task.addPropertyChangeListener(this); task.execute(); } public void propertyChange(PropertyChangeEvent arg0) { if (isAborted == false) { // set progressbar if ("progress".equals(arg0.getPropertyName())) { progress = (Integer) arg0.getNewValue(); progressBar.setValue(progress); } // Fertigstellen erlauben wenn upload abgeschlossen if (isCurrentlyLoading() == false || progressBar.getPercentComplete() == 1.0) { // no upload // LOGGER.info("finished uploading file"); btnUploadStoppen.setEnabled(false); btnFinish.setEnabled(true); } else { // upload btnUploadStoppen.setEnabled(true); btnFinish.setEnabled(false); } if ("speed".equals(arg0.getPropertyName())) { speed = (double) arg0.getNewValue(); // if(speed<=1){ lblUpSpeed.setText(String.format("%.2f", speed) + " MB/s"); } if ("bytesread".equals(arg0.getPropertyName())) { bytesread = (long) arg0.getNewValue(); lblFertig.setText((bytesread / 1024 / 1024) + " MB"); lblVerbleibend.setText(((filesize / 1024 / 1024) - (bytesread / 1024 / 1024)) + " MB"); lblZeit.setText(String.valueOf( ((((filesize / 1024 / 1024) - (bytesread / 1024 / 1024)) / speed) / 60) + 1) .substring( 0, String.valueOf( (((filesize / 1024 / 1024) - (bytesread / 1024 / 1024)) / speed) / 60) .lastIndexOf(".")) + " Minuten"); } if ("filesize".equals(arg0.getPropertyName())) { filesize = (long) arg0.getNewValue(); lblFilesize.setText((filesize / 1024 / 1024) + " MB"); } }// end if }// end propertyChange public boolean updateData() { if (isCurrentlyLoading()) { JOptionPane.showMessageDialog(null, "Vorgang noch nicht abgeschlossen!!", "Fehler", JOptionPane.ERROR_MESSAGE); return false; } boolean ret; Exception ex; //if a new file has been uploaded and new filename is set if (task != null && task.isDone()) { LOGGER.debug("New file uploaded, updating DB entry..."); ret = false; ex = null; try { ret = ThriftManager.getSatClient().updateImageFile(transferInfo.token, Image.ImageId); } catch (Exception e) { ex = e; } if (!ret) { GuiManager.showMessageBox( "Die Metadaten des Images konnten nicht auf das neue Image umgeschrieben werden.", MessageType.ERROR, LOGGER, ex); return false; } } LOGGER.debug("old file should remain"); ret = false; ex = null; try { ret = ThriftManager.getSatClient().updateImageData(SessionData.authToken, Image.ImageId, Image.Imagename, Image.Desc, Image.Licensed, Image.Internet, Image.ShareMode, Image.OS); } catch (TException e) { ex = e; } if (!ret) { GuiManager.showMessageBox("Serverseitiger Fehler beim Aktualisieren der Metadaten", MessageType.ERROR, LOGGER, ex); return false; } // remove all additional user permissions on first stage ret = false; ex = null; try { ThriftManager.getSatClient().deleteAllAdditionalImagePermissions(Image.ImageId, SessionData.authToken, person.verantwortlicher.getUserID()); } catch (TException e) { ex = e; } if (ex != null) { GuiManager.showMessageBox("Konnte alte Permissions nicht aus der Datenbank entfernen.", MessageType.WARNING, LOGGER, ex); } // then, add user permissions as they have been set new ret = true; // (sic) ex = null; for (int i = 0; i < RightsManagement.rightsManagement.getPermittedUserList().size(); i++) { try { ret = ThriftManager.getSatClient().writeAdditionalImageRights(Image.ImageId, RightsManagement.rightsManagement.getPermittedUserList().get(i).getUserID(), RightsManagement.rightsManagement.getPermittedUserList().get(i).isImageRead(), RightsManagement.rightsManagement.getPermittedUserList().get(i).isImageWrite(), RightsManagement.rightsManagement.getPermittedUserList().get(i).isImageLinkAllowed(), RightsManagement.rightsManagement.getPermittedUserList().get(i).isImageAdmin(), SessionData.authToken) && ret; } catch (TException e) { ex = e; } }// end for if (!ret) { GuiManager.showMessageBox("Serverseitiger Fehler beim Schreiben der neuen Berechtigungen.", MessageType.WARNING, LOGGER, ex); } return true; } public boolean isCurrentlyLoading() { return task != null && !task.isDone(); }// end isCurrentlyLoading() public void resetValues() { lblUpSpeed.setText("0"); lblZeit.setText("0"); lblFertig.setText("0"); lblFilesize.setText("0"); lblVerbleibend.setText("0"); progressBar.setValue(0); }// end resetValues public void resetButtons() { btnFinish.setEnabled(false); btnUploadStarten.setEnabled(true); btnUploadStarten.setText("Upload starten"); btnUploadStoppen.setEnabled(false); }// end resetButtons }// end class