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