// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2006 by R. Pito Salas
//
// 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id: UpdatesDownloader.java,v 1.9 2006/12/13 18:06:55 spyromus Exp $
//
package com.salas.bb.updates;
import com.jgoodies.uif.application.Application;
import com.salas.bb.core.ApplicationLauncher;
import com.salas.bb.updates.ui.DownloadsProgressDialog;
import com.salas.bb.utils.net.Downloader;
import com.salas.bb.utils.net.IStreamProgressListener;
import com.salas.bb.utils.OSSettings;
import com.salas.bb.utils.i18n.Strings;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.text.MessageFormat;
/**
* Updates downloader class accepts the list of locations to download and
* performs the downloading operation for the one by one. User can cancel the
* process at any moment.
*/
public class UpdatesDownloader
{
private static final Logger LOG = Logger.getLogger(UpdatesDownloader.class.getName());
private static final String UPDATES_PATH = "updates";
/**
* Downloads all given locations to updates folder.
*
* @param locations locations to download.
*/
public void download(Location[] locations)
{
if (locations == null || locations.length == 0) return;
final DownloadsProgressDialog dialog;
// Create progress dialog
JFrame frame = Application.getDefaultParentFrame();
dialog = new DownloadsProgressDialog(frame, locations);
// Create downloader component
IStreamProgressListener progressListener = dialog.getProgressListener();
Downloader downloader = new Downloader(progressListener);
// Initialize target directory
File targetDirectory = getTargetDirectory();
List successful = new ArrayList();
List failed = new ArrayList();
// Open progress dialog and start downloading packages
openProgressDialog(dialog, downloader, locations, targetDirectory);
try
{
for (int i = 0; i < locations.length; i++)
{
Location location = locations[i];
try
{
URL locationURL = new URL(location.getLink());
downloader.download(locationURL, targetDirectory);
successful.add(location);
} catch (IOException e)
{
LOG.log(Level.SEVERE, MessageFormat.format(
Strings.error("invalid.url"),
new Object[] { location.getLink() }), e);
failed.add(location);
} finally
{
dialog.nextDownload();
}
}
dialog.allDone(successful, failed);
} catch (InterruptedException e)
{
LOG.info("Downloading canceled...");
}
}
/**
* Creates directory if it doesn't exist.
*
* @return target directory for updates.
*/
private File getTargetDirectory()
{
File targetDirectory = OSSettings.getDesktopDirectory();
if (targetDirectory == null)
{
targetDirectory = new File(ApplicationLauncher.getContextPath() + UPDATES_PATH);
if (!targetDirectory.exists()) targetDirectory.mkdir();
}
return targetDirectory;
}
/**
* Opens progress dialog.
*
* @param aDialog dialog.
* @param aDownloader downloader to cancel when user cancels the dialog.
* @param aLocations locations we are going to download.
* @param aDirectory directory, where the packages are downloaded to.
*/
private void openProgressDialog(final DownloadsProgressDialog aDialog,
final Downloader aDownloader, final Location[] aLocations,
final File aDirectory)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
aDialog.open(
new InstallAction(aLocations, aDirectory),
new CancelAction(aDownloader),
new ExitAction());
}
});
}
private class ExitAction implements Runnable
{
public void run()
{
Application.close();
}
}
private class InstallAction implements Runnable
{
private final Location[] locations;
private final File directory;
public InstallAction(Location[] locations, File directory)
{
this.directory = directory;
this.locations = locations;
}
public void run()
{
Location mainPackage = Location.getMainPackage(Arrays.asList(locations));
try
{
PackageInstaller.startInstaller(mainPackage, directory);
} catch (IOException e)
{
LOG.log(Level.WARNING, Strings.error("updates.failed.to.start.package.installation"), e);
}
}
}
private class CancelAction implements Runnable
{
private final Downloader downloader;
public CancelAction(Downloader downloader)
{
this.downloader = downloader;
}
public void run()
{
downloader.cancel();
}
}
}