de.dal33t.powerfolder.ui.wizard.MultiFileRestorePanel.java Source code

Java tutorial

Introduction

Here is the source code for de.dal33t.powerfolder.ui.wizard.MultiFileRestorePanel.java

Source

/*
 * Copyright 2004 - 2012 Christian Sprajc. All rights reserved.
 *
 * This file is part of PowerFolder.
 *
 * PowerFolder 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.
 *
 * PowerFolder 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 PowerFolder. If not, see <http://www.gnu.org/licenses/>.
 *
 * $Id: MultiFileRestorePanel.java 19932 2012-10-14 06:01:18Z glasgow $
 */
package de.dal33t.powerfolder.ui.wizard;

import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CancellationException;

import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.SwingWorker;

import jwf.WizardPanel;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.clientserver.FolderService;
import de.dal33t.powerfolder.clientserver.ServerClient;
import de.dal33t.powerfolder.disk.FileArchiver;
import de.dal33t.powerfolder.disk.Folder;
import de.dal33t.powerfolder.light.FileInfo;
import de.dal33t.powerfolder.ui.util.UIUtil;
import de.dal33t.powerfolder.ui.wizard.table.MultiFileRestoreTable;
import de.dal33t.powerfolder.ui.wizard.table.MultiFileRestoreTableModel;
import de.dal33t.powerfolder.util.Translation;

/**
 * Call this class via PFWizard.
 */
public class MultiFileRestorePanel extends PFWizardPanel {

    private final List<FileInfo> fileInfosToRestore;
    private final JLabel infoLabel;
    private final JLabel warningLabel;

    private JProgressBar bar;
    private JScrollPane scrollPane;
    private boolean hasNext;
    private SwingWorker<List<FileInfo>, FileInfo> worker;
    private MultiFileRestoreTableModel tableModel = new MultiFileRestoreTableModel(getController());

    public MultiFileRestorePanel(Controller controller, List<FileInfo> fileInfosToRestore) {
        super(controller);
        this.fileInfosToRestore = fileInfosToRestore;
        infoLabel = new JLabel();
        warningLabel = new JLabel();
    }

    protected JComponent buildContent() {
        FormLayout layout = new FormLayout("140dlu, pref:grow", "pref, 3dlu, pref, 3dlu, pref");

        PanelBuilder builder = new PanelBuilder(layout);
        CellConstraints cc = new CellConstraints();

        builder.add(infoLabel, cc.xyw(1, 1, 2));

        // bar and scrollPane share the same row.
        builder.add(scrollPane, cc.xyw(1, 3, 2));
        builder.add(bar, cc.xy(1, 3));

        builder.add(warningLabel, cc.xyw(1, 5, 2));

        return builder.getPanel();
    }

    @Override
    protected void afterDisplay() {
        loadVersions();
    }

    private void loadVersions() {
        infoLabel.setText(Translation.getTranslation("wizard.multi_file_restore.retrieving.text"));
        hasNext = false;
        updateButtons();
        if (worker != null) {
            worker.cancel(false);
        }
        tableModel.setFileInfos(new ArrayList<FileInfo>());
        bar.setVisible(true);
        scrollPane.setVisible(false);

        worker = new VersionLoaderWorker();
        worker.execute();
    }

    protected String getTitle() {
        return Translation.getTranslation("wizard.multi_file_restore.title");
    }

    protected void initComponents() {
        tableModel = new MultiFileRestoreTableModel(getController());
        MultiFileRestoreTable table = new MultiFileRestoreTable(tableModel);
        scrollPane = new JScrollPane(table);
        scrollPane.setPreferredSize(new Dimension(400, 200));
        scrollPane.setVisible(false);
        UIUtil.removeBorder(scrollPane);
        UIUtil.setZeroWidth(scrollPane);

        bar = new JProgressBar(0, 100);
    }

    public boolean hasNext() {
        return hasNext;
    }

    public WizardPanel next() {
        return new FileRestoringPanel(getController(), tableModel.getFileInfos());
    }

    // ////////////////
    // Inner Classes //
    // ////////////////

    private class VersionLoaderWorker extends SwingWorker<List<FileInfo>, FileInfo> {

        private int fileInfosProcessed;

        public List<FileInfo> doInBackground() {
            bar.setIndeterminate(true);
            bar.setValue(0);
            warningLabel.setText("");

            List<FileInfo> versions = new ArrayList<FileInfo>(fileInfosToRestore.size());
            try {

                List<FileInfo> fileInfos = new ArrayList<FileInfo>();
                fileInfos.addAll(fileInfosToRestore);

                for (FileInfo fileInfo : fileInfos) {
                    Folder fo = fileInfo.getFolder(getController().getFolderRepository());
                    if (fo == null) {
                        continue;
                    }
                    // Also try getting versions from OnlineStorage.
                    boolean online = fo.hasMember(getController().getOSClient().getServer());
                    FolderService folderService = null;
                    if (online) {
                        ServerClient client = getController().getOSClient();
                        if (client != null && client.isConnected() && client.isLoggedIn()) {
                            folderService = client.getFolderService();
                        }
                    }

                    FileArchiver fileArchiver = fo.getFileArchiver();

                    if (isCancelled()) {
                        return Collections.emptyList();
                    }

                    List<FileInfo> infoList = fileArchiver.getArchivedFilesInfos(fileInfo);
                    FileInfo mostRecent = null;
                    for (FileInfo info : infoList) {
                        if (isBetterVersion(mostRecent, info)) {
                            mostRecent = info;
                        }
                    }

                    if (folderService != null) {
                        try {
                            List<FileInfo> serviceList = folderService.getArchivedFilesInfos(fileInfo);
                            for (FileInfo info : serviceList) {
                                if (isBetterVersion(mostRecent, info)) {
                                    mostRecent = info;
                                }
                            }
                        } catch (Exception e) {
                            // Maybe gone offline. No worries.
                        }
                    }

                    if (mostRecent != null) {
                        versions.add(mostRecent);
                        publish(mostRecent);
                    }
                }
            } catch (Exception e) {
                // Hmmmmm.
            }
            Collections.reverse(versions);
            return versions;
        }

        private boolean isBetterVersion(FileInfo mostRecent, FileInfo info) {
            return mostRecent == null || mostRecent.getVersion() < info.getVersion();
        }

        /**
         * Intermediate results. Tap the progress bar on.
         *
         * @param chunks
         */
        protected void process(List<FileInfo> chunks) {
            fileInfosProcessed += chunks.size();
            if (fileInfosToRestore.isEmpty()) {
                bar.setIndeterminate(true);
            } else {
                bar.setIndeterminate(false);
                bar.setValue(100 * fileInfosProcessed / fileInfosToRestore.size());
                infoLabel.setText(Translation.getTranslation("general.processed",
                        String.valueOf(fileInfosProcessed), String.valueOf(fileInfosToRestore.size())));
            }
        }

        protected void done() {
            scrollPane.setVisible(true);
            bar.setVisible(false);
            hasNext = false;
            try {
                tableModel.setFileInfos(get());
                if (get().isEmpty()) {
                    infoLabel.setText(Translation.getTranslation("wizard.multi_file_restore.retrieved_none.text"));
                } else {
                    infoLabel.setText(Translation.getTranslation("wizard.multi_file_restore.retrieved.text"));
                    hasNext = true;
                    if (fileInfosProcessed < fileInfosToRestore.size()) {
                        warningLabel.setText(Translation.getTranslation("wizard.multi_file_restore.some.text"));
                    }
                }
            } catch (CancellationException e) {
                infoLabel.setText(Translation.getTranslation("wizard.multi_file_restore.retrieve_cancelled.text"));
            } catch (Exception e) {
                infoLabel.setText(Translation.getTranslation("wizard.multi_file_restore.retrieve_exception.text",
                        e.getMessage()));
            }

            updateButtons();
        }
    }
}