/* * Copyright 2004 - 2008 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$ */ package de.dal33t.powerfolder.ui.wizard; import java.io.File; import java.io.IOException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JProgressBar; 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.SwingWorker; import de.dal33t.powerfolder.util.Format; import de.dal33t.powerfolder.util.Translation; /** * Dialog for restoring file versions. */ public class MultiFileRestoringPanel extends PFWizardPanel { private static final Logger log = Logger .getLogger(MultiFileRestoringPanel.class.getName()); private final List<FileInfo> fileInfosToRestore; private final Folder folder; /** If no archive is available, redownload from peers. */ private final boolean redownloadIfMissing; private JLabel statusLabel; private long successCount; private long totalCount; public MultiFileRestoringPanel(Controller controller, Folder folder, List<FileInfo> fileInfosToRestore, boolean redownloadIfMissing) { super(controller); this.fileInfosToRestore = fileInfosToRestore; this.folder = folder; this.redownloadIfMissing = redownloadIfMissing; } protected JComponent buildContent() { FormLayout layout = new FormLayout("140dlu, 3dlu, pref:grow", "pref, 3dlu, pref, 3dlu, pref"); PanelBuilder builder = new PanelBuilder(layout); builder.setBorder(createFewContentBorder()); CellConstraints cc = new CellConstraints(); int row = 1; builder.add(statusLabel, cc.xy(1, row)); row += 2; JProgressBar bar = new JProgressBar(); bar.setIndeterminate(true); builder.add(bar, cc.xy(1, row)); return builder.getPanel(); } protected void afterDisplay() { SwingWorker worker = new RestoreWorker(); worker.start(); } protected String getTitle() { return Translation .getTranslation("wizard.multi_file_restore_panel.title"); } protected void initComponents() { statusLabel = new JLabel("..."); } public boolean hasNext() { return false; } public WizardPanel next() { if (successCount == totalCount) { return new TextPanelPanel( getController(), Translation .getTranslation("wizard.multi_file_restoring_panel.success_title"), Translation .getTranslation("wizard.multi_file_restoring_panel.success_text"), true); } else if (successCount > 0) { return new TextPanelPanel( getController(), Translation .getTranslation("wizard.multi_file_restoring_panel.success_title"), Translation.getTranslation( "wizard.multi_file_restoring_panel.partial_text", Format .formatLong(successCount), Format .formatLong(totalCount))); } else { return new TextPanelPanel( getController(), Translation .getTranslation("wizard.multi_file_restoring_panel.fail_title"), Translation .getTranslation("wizard.multi_file_restoring_panel.fail_text")); } } private class RestoreWorker extends de.dal33t.powerfolder.ui.util.SwingWorker { public Object construct() { int i = 1; for (FileInfo fileInfoToRestore : fileInfosToRestore) { statusLabel.setText(Translation.getTranslation( "wizard.multi_file_restoring_panel.working", Format .formatLong(i++), Format.formatLong(fileInfosToRestore .size()))); restore0(folder, fileInfoToRestore); } return null; } /** * Restore from the archiver, or failing that from online storage. * * @param folder * @param fileInfoToRestore */ private void restore0(Folder folder, FileInfo fileInfoToRestore) { try { File restoreTo = fileInfoToRestore.getDiskFile(getController().getFolderRepository()); FileArchiver fileArchiver = folder.getFileArchiver(); boolean restored = false; FileInfo onlineRestoredFileInfo = null; if (fileArchiver.restore(fileInfoToRestore, restoreTo)) { log.info("Restored " + fileInfoToRestore.getFilenameOnly() + " from local archive"); folder.scanChangedFile(fileInfoToRestore); folder.scanAllParentDirectories(fileInfoToRestore); restored = true; } else if (folder.hasMember(getController().getOSClient() .getServer())) { ServerClient client = getController().getOSClient(); if (client.isConnected() && client.isLoggedIn()) { FolderService service = client.getFolderService(); onlineRestoredFileInfo = service.restore( fileInfoToRestore, true); log.info("Restored " + onlineRestoredFileInfo.toDetailString() + " from OS archive"); restored = true; } } // If no archive available, just redownload from best source. if (redownloadIfMissing && !restored) { // Delete from db, then request from peers. folder.removeDeletedFileInfo(fileInfoToRestore); getController().getTransferManager().downloadNewestVersion( fileInfoToRestore, false); // Backup request getController().getFolderRepository().getFileRequestor() .triggerFileRequesting(folder.getInfo()); log.info("Redownloading " + fileInfoToRestore.getFilenameOnly()); restored = true; } // If restored online download file now. if (onlineRestoredFileInfo != null) { getController().getTransferManager().downloadNewestVersion( onlineRestoredFileInfo, false); } if (!restored) { throw new IOException("Restore of " + fileInfoToRestore.getFilenameOnly() + " failed"); } successCount++; } catch (Exception e) { log.log(Level.WARNING, "Exception: " + e); log.log(Level.FINE, e.getMessage(), e); } finally { totalCount++; } } protected void afterConstruct() { getWizard().next(); } } }