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

es.gob.afirma.standalone.updater.Updater Maven / Gradle / Ivy

There is a newer version: 1.8.2
Show newest version
/* Copyright (C) 2011 [Gobierno de Espana]
 * This file is part of "Cliente @Firma".
 * "Cliente @Firma" 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.
 *   - or The European Software License; either version 1.1 or (at your option) any later version.
 * You may contact the copyright holder at: [email protected]
 */

package es.gob.afirma.standalone.updater;

import java.awt.Desktop;
import java.net.URI;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JOptionPane;

import es.gob.afirma.core.misc.Platform;
import es.gob.afirma.core.misc.http.UrlHttpManagerFactory;
import es.gob.afirma.core.misc.http.UrlHttpMethod;
import es.gob.afirma.core.ui.AOUIFactory;

/** Utilidad para la gestión de actualizaciones de la aplicación.
 * @author Tomás García-Merás */
public final class Updater {

	private static String version = null;
	private static String currentVersion = null;
	private static String updateSite = null;

	private static final String PREFERENCE_UPDATE_URL_VERSION = "url"; //$NON-NLS-1$
	private static final String PREFERENCE_UPDATE_URL_SITE = "updateSite"; //$NON-NLS-1$

	/** Variable de entorno que hay que establecer (a nivel de sistema operativo o como propiedad de Java a
	 * nivel de JVM) a true para evitar la comprobación de disponibilidad de
	 * actualizaciones de la aplicación. */
	public static final String AUTOFIRMA_AVOID_UPDATE_CHECK = "AUTOFIRMA_AVOID_UPDATE_CHECK"; //$NON-NLS-1$

	private static Properties updaterProperties = null;

	static {
		loadProperties();
	}

	private Updater() {
		// No instanciable
	}

	static String getUpdateSite() {
		return updateSite;
	}

	static final Logger LOGGER = Logger.getLogger("es.gob.afirma"); //$NON-NLS-1$

	private static void loadProperties() {
		if (updaterProperties != null) {
			return;
		}
		updaterProperties = new Properties();
		try {
			updaterProperties.load(Updater.class.getResourceAsStream("/properties/updater.properties")); //$NON-NLS-1$
		}
		catch (final Exception e) {
			LOGGER.severe(
				"No se ha podido cargar el archivo de recursos del actualizador: " + e //$NON-NLS-1$
			);
			updaterProperties = new Properties();
		}
	}

	/** Obtiene la versión actual del aplicativo.
	 * @return Versión actual del aplicativo. */
	public static String getCurrentVersion() {
		if (currentVersion == null) {
			currentVersion = updaterProperties.getProperty("currentVersion." + Platform.getOS(), "0"); //$NON-NLS-1$ //$NON-NLS-2$
		}
		return currentVersion;
	}

	/** Obtiene el texto descriptivo de la versión actual del aplicativo.
	 * @return Texto descriptivo de la versión actual del aplicativo. */
	public static String getCurrentVersionText() {
		return updaterProperties.getProperty("currentVersionText." + Platform.getOS(), "0"); //$NON-NLS-1$ //$NON-NLS-2$
	}

	/** Obtiene la última versión disponible del programa.
	 * @return Última versión disponible del programa o null si no
	 *         se ha podido obtener. */
	private static String getLatestVersion() {

		if (updaterProperties == null) {
			return null;
		}

		// Configuramos la URL del fichero de version a partir del fichero interno o,
		// si esta configurada, preferentemente de la variable de registro
		final String url = updaterProperties.getProperty(PREFERENCE_UPDATE_URL_VERSION);

		// Configuramos la URL del sitio de actualizacion a partir del fichero interno o,
		// si esta configurada, preferentemente de la variable de registro
		updateSite = updaterProperties.getProperty(PREFERENCE_UPDATE_URL_SITE);

		if (url == null) {
			LOGGER.warning(
				"El archivo de recursos del actualizador no contiene una URL de comprobacion" //$NON-NLS-1$
			);
			return null;
		}
		try {
			version = new String(UrlHttpManagerFactory.getInstalledManager().readUrl(url, UrlHttpMethod.GET)).trim();
		}
		catch (final Exception e) {
			LOGGER.severe(
				"No se ha podido obtener la ultima version disponible desde " + url + ": " + e //$NON-NLS-1$ //$NON-NLS-2$
			);
		}
		return version;
	}

	/** Comprueba si hay disponible una versión más actualizada del aplicativo.
	 * @return true si hay disponible una versión más actualizada del aplicativo,
	 *         false en caso contrario.
	 * @throws RuntimeException Cuando no se ha podido comprobar la versión actual con la versión remota configurada. */
	static boolean isNewVersionAvailable() {
		final String newVersion = getLatestVersion();
		if (newVersion == null) {
			LOGGER.severe("No se puede comprobar si hay versiones nuevas del aplicativo"); //$NON-NLS-1$
			throw new RuntimeException();
		}
		if (getCurrentVersion() == null) {
			LOGGER.severe("No ha podido comprobar la version actual del aplicativo"); //$NON-NLS-1$
			throw new RuntimeException();
		}
		try {
			return Integer.parseInt(newVersion) > Integer.parseInt(getCurrentVersion());
		}
		catch(final Exception e) {
			LOGGER.warning(
				"No ha podido comparar la version actual del aplicativo con la ultima disponible: " + e //$NON-NLS-1$
			);
			throw new RuntimeException();
		}
	}

	/** Indica la versión actual del aplicativo es menor que la requerida.
	 * @param neededVersion Versión requerida.
	 * @return true si la versión actual del aplicativo es menor que la requerida,
	 *         false en caso contrario. */
	public static boolean isOldVersion(final String neededVersion) {
		try {
			if (Integer.parseInt(neededVersion) > Integer.parseInt(getCurrentVersion())) {
				return true;
			}
		}
		catch(final Exception e) {
			LOGGER.severe("No se ha podido comprobar si la version actual es menor que la requerida: " + e); //$NON-NLS-1$
		}
		return false;
	}

	/** Comprueba si hay actualizaciones del aplicativo, y en caso afirmativo lo notifica al usuario.
	 * @param parent Componente padre para la modalidad. */
	public static void checkForUpdates(final Object parent) {

		// Primero miramos si directamente la comprobacion de actualizaciones esta deshabilitada a nivel interno de
		// aplicacion
		boolean omitCheck = Boolean.parseBoolean(updaterProperties.getProperty("avoidUpdateCheck")); //$NON-NLS-1$
		if (omitCheck) {
			LOGGER.info("La configuracion interna de la aplicacion solicita que no se busquen actualizaciones"); //$NON-NLS-1$
		}

		// Despues, miramos en la configuracion de la aplicacion que el usuario ha establecido mediante el UI.
		// Si se ha deshabilitado la comprobacion de actualizaciones en la aplicacion, no se buscan actualizaciones,
		// pero si la aplicacion si permite la busqueda de actualizaciones, miramos antes de hacerlo si se ha
		// pedido que no se haga mediante variables de entorno
		if (!omitCheck) {
			omitCheck = Boolean.getBoolean(AUTOFIRMA_AVOID_UPDATE_CHECK) ||
	                    Boolean.parseBoolean(System.getenv(AUTOFIRMA_AVOID_UPDATE_CHECK));
			if (omitCheck) {
				LOGGER.info(
					"Se ha configurado en el sistema que se omita la busqueda de actualizaciones de AutoFirma" //$NON-NLS-1$
				);
			}
		}

		if (!omitCheck) {
			new Thread(() ->  {

				final boolean newVersionAvailable;
				try {
					newVersionAvailable = isNewVersionAvailable();
				}
				catch (final Exception e) {
					LOGGER.info(
						"No se ha podido comprobar la disponibilidad de nueva version: " + e //$NON-NLS-1$
					);
					return;
				}
				if (newVersionAvailable) {
					if (
						JOptionPane.YES_OPTION == AOUIFactory.showConfirmDialog(
							parent,
							UpdaterMessages.getString("Updater.1"), //$NON-NLS-1$
							UpdaterMessages.getString("Updater.2"), //$NON-NLS-1$
							JOptionPane.YES_NO_OPTION,
							JOptionPane.INFORMATION_MESSAGE
						)
					) {
						try {
							Desktop.getDesktop().browse(new URI(getUpdateSite()));
						}
						catch (final Exception e) {
							LOGGER.log(
								Level.SEVERE,
								"No se ha podido abrir el sitio Web de actualizaciones del Cliente @firma: " + e, //$NON-NLS-1$
								e
							);
							AOUIFactory.showErrorMessage(
								parent,
								UpdaterMessages.getString("Updater.3"), //$NON-NLS-1$
								UpdaterMessages.getString("Updater.4"), //$NON-NLS-1$
								JOptionPane.ERROR_MESSAGE
							);
						}
					}
				}
				else {
					LOGGER.info("Se ha encontrado instalada la ultima version disponible de AutoFirma"); //$NON-NLS-1$
				}
			}).start();
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy