All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sourceforge.squirrel_sql.client.update.autocheck.UpdateCheckTimerImpl Maven / Gradle / Ivy

/*
 * Copyright (C) 2008 Rob Manning
 * [email protected]
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
package net.sourceforge.squirrel_sql.client.update.autocheck;

import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.preferences.IUpdateSettings;
import net.sourceforge.squirrel_sql.client.update.UpdateCheckFrequency;
import net.sourceforge.squirrel_sql.client.update.UpdateController;
import net.sourceforge.squirrel_sql.client.update.UpdateControllerFactory;
import net.sourceforge.squirrel_sql.client.update.UpdateControllerFactoryImpl;
import net.sourceforge.squirrel_sql.client.update.UpdateUtil;
import net.sourceforge.squirrel_sql.client.update.UpdateUtilImpl;
import net.sourceforge.squirrel_sql.client.update.async.ReleaseFileUpdateCheckTask;
import net.sourceforge.squirrel_sql.client.update.downloader.ArtifactDownloaderFactoryImpl;
import net.sourceforge.squirrel_sql.fw.gui.JOptionPaneService;
import net.sourceforge.squirrel_sql.fw.util.FileWrapperFactory;
import net.sourceforge.squirrel_sql.fw.util.FileWrapperFactoryImpl;
import net.sourceforge.squirrel_sql.fw.util.Utilities;
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;

/**
 * This class maintains it's own Thread so that it can periodically check for updates, and notify the user
 * when updates are detected.
 */
public class UpdateCheckTimerImpl implements UpdateCheckTimer
{

	private UpdateCheckRunnable runnable = new UpdateCheckRunnable();

	private UpdateControllerFactory updateControllerFactory = new UpdateControllerFactoryImpl();

	private UpdateController updateController = null;

	private IApplication _app = null;

	private IUpdateSettings _updateSettings = null;

	/** Logger for this class. */
	private static final ILogger s_log = LoggerController.createLogger(UpdateCheckTimerImpl.class);

	private UpdateUtil _util = new UpdateUtilImpl();

	private JOptionPaneService _JOptionPaneService = new JOptionPaneService();

	private FileWrapperFactory _fileWrapperFactory = new FileWrapperFactoryImpl();
	
	public UpdateCheckTimerImpl(IApplication app)
	{
		this._app = app;
		_updateSettings = _app.getSquirrelPreferences().getUpdateSettings();

	}

	public void start()
	{
		if (!_updateSettings.isEnableAutomaticUpdates()) { return; }
		updateController =
			updateControllerFactory.createUpdateController(_app, new ArtifactDownloaderFactoryImpl(), _util,
				_JOptionPaneService, _fileWrapperFactory);
		Thread t = new Thread(runnable);
		t.setName("Update Check Timer Thread");
		t.start();
	}

	public void stop()
	{
		if (!_updateSettings.isEnableAutomaticUpdates()) { return; }
		runnable.stop();
	}

	/**
	 * Class that implements the timer functionality.
	 */
	private class UpdateCheckRunnable implements Runnable
	{

		private boolean stopped = false;

		private boolean firstCheck = true;

		/**
		 * After making an initial check This loops indefinitely
		 * 
		 * @see java.lang.Runnable#run()
		 */
		public void run()
		{
			// Since this timer must be started when SQuirreL is launched, wait a couple of minutes for
			// SQuirreL to get done initializing the UI.
			Utilities.sleep(120 * 1000L);

			while (!stopped)
			{
				if (firstCheck)
				{
					firstCheck = false;
					if (isUpdateCheckFrequencyAtStartup() && !isUpToDate())
					{
						logDebug("run: update check configured for startup and software is not up-to-date");
						updateController.promptUserToDownloadAvailableUpdates();

						// Since the user only wants to be notified of updates at startup, return here, thereby
						// freeing up the thread.
						return;
					}
				}
				else
				{
					logDebug("run: not the first check; sleeping for an hour.");
					sleepForAnHour();
				}

				if (!isUpdateCheckFrequencyAtStartup() && updateController.isTimeToCheckForUpdates())
				{
					logDebug("run: not configured to check at startup and it's now time to check again.");
					if (!isUpToDate())
					{
						logDebug("run: software is not up-to-date, so prompting user to download updates.");
						updateController.promptUserToDownloadAvailableUpdates();
					}
				}
			}

		}

		private void logDebug(String msg)
		{
			if (s_log.isDebugEnabled())
			{
				s_log.debug(msg);
			}
		}

		private boolean isUpToDate()
		{
			boolean result = true;
			try
			{
				logDebug("isUpToDate: checking to see if software is up-to-date; currentTimeMillis = "
					+ System.currentTimeMillis());

				ReleaseFileUpdateCheckTask task =
					new ReleaseFileUpdateCheckTask(null, _updateSettings, _util, _app);

				// Since this thread is not a UI thread, it is ok to run the task synchronously.
				task.run();
				result = task.isUpToDate();
			}
			catch (Exception e)
			{
				s_log.error("isUpToDate: Unable to determine up-to-date status: " + e.getMessage(), e);
			}
			return result;
		}

		private boolean isUpdateCheckFrequencyAtStartup()
		{
			String freqStr = _updateSettings.getUpdateCheckFrequency();
			UpdateCheckFrequency updateCheckFrequency = UpdateCheckFrequency.getEnumForString(freqStr);

			return updateCheckFrequency == UpdateCheckFrequency.STARTUP;
		}

		public void stop()
		{
			stopped = true;
		}

		private void sleepForAnHour()
		{
			Utilities.sleep(1000 * 60 * 60);
		}

	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy