org.panbox.desktop.common.gui.RestoreRevisionDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.panbox.desktop.common.gui.RestoreRevisionDialog.java

Source

/*
 * 
 *               Panbox - encryption for cloud storage 
 *      Copyright (C) 2014-2015 by Fraunhofer SIT and Sirrix AG 
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * Additonally, third party code may be provided with notices and open source
 * licenses from communities and third parties that govern the use of those
 * portions, and any licenses granted hereunder do not alter any rights and
 * obligations you may have under such open source licenses, however, the
 * disclaimer of warranty and limitation of liability provisions of the GPLv3 
 * will apply to all the product.
 * 
 */
package org.panbox.desktop.common.gui;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileView;

import org.apache.commons.io.FilenameUtils;
import org.apache.log4j.Logger;
import org.panbox.OS;
import org.panbox.Settings;
import org.panbox.core.csp.ICSPAPIIntegration;
import org.panbox.core.csp.Revision;
import org.panbox.desktop.common.PanboxClient;

/**
 * Created by Timo Nolle on 12.09.14.
 */
public class RestoreRevisionDialog extends javax.swing.JDialog {

    /**
     *
     */
    private static final long serialVersionUID = 8511137183519416650L;
    private static final File PANBOX_DIR = new File(Settings.getInstance().getMountDir());
    private final ICSPAPIIntegration apiInt;
    private final String shareName;
    private String filePath;

    private final PanboxClient client;

    private final static Logger logger = Logger.getLogger(RestoreRevisionDialog.class);

    private final static java.util.ResourceBundle bundle = java.util.ResourceBundle
            .getBundle("org/panbox/desktop/common/gui/Messages", Settings.getInstance().getLocale()); // NOI18N

    /**
     * Creates new form RestoreRevisionGui
     */
    public RestoreRevisionDialog(PanboxClient client, ICSPAPIIntegration apiInt, String shareName) {
        initComponents();
        this.client = client;
        this.apiInt = apiInt;
        this.shareName = shareName;
    }

    /**
     * Creates the gui for an already chosen file
     * 
     * @param pathInsideShare
     */
    public RestoreRevisionDialog(PanboxClient client, ICSPAPIIntegration apiInt, String shareName,
            String pathInsideShare) {
        initComponents();
        this.client = client;
        this.apiInt = apiInt;
        this.shareName = shareName;

        // Preset the fields
        fileTextField.setText(File.separator + shareName + pathInsideShare);

        fillRevisionsForFileName(pathInsideShare);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed"
    // desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        fileLabel = new javax.swing.JLabel();
        revisionLabel = new javax.swing.JLabel();
        fileTextField = new javax.swing.JTextField();
        browseButton = new javax.swing.JButton();
        cancelButton = new javax.swing.JButton();
        restoreButton = new javax.swing.JButton();
        revisionComboBox = new javax.swing.JComboBox<Revision>();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        setTitle(bundle.getString("client.restorerevisiondialog.title")); // NOI18N
        setAlwaysOnTop(true);
        setModal(true);
        setResizable(false);

        fileLabel.setText(bundle.getString("client.restorerevisiondialog.file")); // NOI18N

        revisionLabel.setText(bundle.getString("client.restorerevisiondialog.revisions")); // NOI18N

        fileTextField.setMinimumSize(new java.awt.Dimension(4, 24));
        fileTextField.setPreferredSize(new java.awt.Dimension(70, 24));
        fileTextField.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fileTextFieldActionPerformed(evt);
            }
        });

        browseButton.setText(bundle.getString("client.restorerevisiondialog.browsebutton")); // NOI18N
        browseButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                browseButtonActionPerformed(evt);
            }
        });

        cancelButton.setText(bundle.getString("client.restorerevisiondialog.cancelbutton")); // NOI18N
        cancelButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelButtonActionPerformed(evt);
            }
        });

        restoreButton.setText(bundle.getString("client.restorerevisiondialog.restorebutton")); // NOI18N
        restoreButton.setEnabled(false);
        restoreButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                restoreButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(fileLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 59,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(revisionLabel, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(layout.createSequentialGroup()
                                                .addComponent(fileTextField, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        223, Short.MAX_VALUE)
                                                .addGap(18, 18, 18).addComponent(browseButton))
                                        .addComponent(revisionComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                Short.MAX_VALUE)))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                                layout.createSequentialGroup().addGap(0, 0, Short.MAX_VALUE)
                                        .addComponent(restoreButton)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(cancelButton)))
                        .addContainerGap()));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(
                javax.swing.GroupLayout.Alignment.TRAILING,
                layout.createSequentialGroup().addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(fileLabel).addComponent(browseButton).addComponent(fileTextField,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(revisionLabel).addComponent(revisionComboBox,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(cancelButton).addComponent(restoreButton))
                        .addContainerGap()));

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void fileTextFieldActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_fileTextFieldActionPerformed
        String path = fileTextField.getText();
        if (!path.equals("")) {
            fillRevisionsForFileName(path);
        }
    }// GEN-LAST:event_fileTextFieldActionPerformed

    private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_cancelButtonActionPerformed
        this.dispose();
    }// GEN-LAST:event_cancelButtonActionPerformed

    private void restoreButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_restoreButtonActionPerformed
        String selectedRev = ((Revision) revisionComboBox.getSelectedItem()).getRevision();
        boolean restoreSuccessful;
        try {
            restoreSuccessful = apiInt.restoreToRevision(filePath, selectedRev);
        } catch (Exception e) {
            logger.error("Error trying to restore old file version!", e);
            restoreSuccessful = false;
        }
        if (!restoreSuccessful) {
            JOptionPane.showMessageDialog(this,
                    "Restoring file failed. Please make sure the file has been fully synchronized with the cloud storage provider.",
                    "Restore failed", JOptionPane.ERROR_MESSAGE);
        } else {
            this.dispose();
        }

    }// GEN-LAST:event_restoreButtonActionPerformed

    private String getCSPSupportedPath(String path) {
        return path.replace(PANBOX_DIR.getAbsolutePath(), "");
    }

    private void fillRevisionsForFileName(String path) {
        if (OS.getOperatingSystem().isWindows()) {
            // Windows
            path = path.replaceFirst(File.separator + File.separator + shareName, "");
        } else {
            // Linux
            path = path.replaceFirst(File.separator + shareName, "");
        }

        String obfFilePath = client.getOnlineFilename(shareName, path);
        filePath = obfFilePath;

        // check if file is actually available at the given location
        try {
            if (apiInt.exists(obfFilePath)) {
                List<Revision> revs = apiInt.getRevisions(obfFilePath);
                revisionComboBox.setModel(new DefaultComboBoxModel<Revision>());
                if (revs != null) {
                    for (Revision r : revs) {
                        revisionComboBox.addItem(r);
                    }
                    restoreButton.setEnabled(true);
                }
            } else {
                JOptionPane.showMessageDialog(this,
                        bundle.getString("PublishIdentitiesDialog.fileNotFoundInCloudStorage"),
                        bundle.getString("PublishIdentitiesDialog.fileNotFound"), JOptionPane.INFORMATION_MESSAGE);
            }
        } catch (Exception e) {
            logger.error("Unable to determine if file exists in cloud storage!", e);
        }
    }

    private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_browseButtonActionPerformed
        JFileChooser fileChooser = new JFileChooser(PANBOX_DIR + "/" + shareName);
        fileChooser.setFileView(new FileView() {
            @Override
            public Boolean isTraversable(File f) {
                try {
                    return f.isDirectory()
                            && FilenameUtils.directoryContains(PANBOX_DIR.getAbsolutePath(), f.getAbsolutePath());
                } catch (IOException e) {
                    logger.error("Error determining folder parent status!");
                    return true;
                }
            }
        });
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int ret = fileChooser.showOpenDialog(this);
        if (ret == JFileChooser.APPROVE_OPTION && fileChooser.getSelectedFile().getParentFile().getAbsolutePath()
                .startsWith(PANBOX_DIR.getAbsolutePath())) {
            String path = getCSPSupportedPath(fileChooser.getSelectedFile().getPath());
            fileTextField.setText(path);
            fillRevisionsForFileName(path);
        }
    }// GEN-LAST:event_browseButtonActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton browseButton;
    private javax.swing.JButton cancelButton;
    private javax.swing.JLabel fileLabel;
    private javax.swing.JTextField fileTextField;
    private javax.swing.JButton restoreButton;
    private javax.swing.JComboBox<Revision> revisionComboBox;
    private javax.swing.JLabel revisionLabel;
    // End of variables declaration//GEN-END:variables
}