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

es.gob.afirma.standalone.AutoFirmaUtil 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;

import java.awt.GraphicsEnvironment;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;

import es.gob.afirma.core.misc.AOUtil;
import es.gob.afirma.core.misc.BoundedBufferedReader;
import es.gob.afirma.core.misc.Platform;

/** Utilidades generales y de control del autoarranque de AutoFirma en el inicio de Windows.
 * @author Tomás García-Merás. */
public final class AutoFirmaUtil {

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

	private static final String REG_CMD = "reg"; //$NON-NLS-1$
	private static final String REG_KEY = "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"; //$NON-NLS-1$
	private static final String REG_VALUE = "AutoFirma"; //$NON-NLS-1$
	private static final String REG_VALUE_OPT = "/v"; //$NON-NLS-1$

	private static final Image ICON = Toolkit.getDefaultToolkit().getImage(
		AutoFirmaUtil.class.getResource("/resources/afirma_ico.png") //$NON-NLS-1$
	);

	/** Obtiene el icono por defecto para los diálogos gráfcos.
	 * @return Icono por defecto para los diálogos gráfcos. */
	public static Image getDefaultDialogsIcon() {
		return ICON;
	}

	/** Indica si AutoFirma está instalado para ejecutarse al inicio de Windows o no.
	 * @return true si AutoFirma está instalado para ejecutarse al inicio de Windows,
	 *         false en caso contrario, si el sistema no es Windows o si no se puede determinar. */
	public static boolean getAutoStartEnabled() {
		if (!Platform.OS.WINDOWS.equals(Platform.getOS())) {
			return false;
		}
		try {
			final Process p = new ProcessBuilder(
				REG_CMD, "QUERY", REG_KEY, REG_VALUE_OPT, REG_VALUE //$NON-NLS-1$
			).start();
			final String res = new String(AOUtil.getDataFromInputStream(p.getInputStream())).trim();
			final String[] tokens = res.split(" "); //$NON-NLS-1$
			for (final String token : tokens) {
				if ("AutoFirma".equals(token)) { //$NON-NLS-1$
					return true;
				}
			}
		}
		catch(final IOException e) {
			LOGGER.severe(
				"No se ha podido leer el registro de Windows para determinar el autoarranque de AutoFirma: " + e //$NON-NLS-1$
			);
		}
		return false;
	}

	/** Establece si AutoFirma debe instalarse para ejecutarse al inicio de Windows o no.
	 * No tiene efecto en sistemas no Windows.
	 * @param enable true para instalar AutoFirma para ejecutarse al inicio de Windows,
	 *         false para desinstalarlo (no tiene efecto si no lo estaba).
	 * @throws IOException En caso de fallo en el proceso. */
	public static void setAutoStartEnabled(final boolean enable) throws IOException {
		if (!Platform.OS.WINDOWS.equals(Platform.getOS())) {
			return;
		}
		if (enable) {
			enableAutoStart();
		}
		else {
			disableAutoStart();
		}
	}


	private static void enableAutoStart() throws IOException {
		if (getAutoStartEnabled()) {
			return;
		}
		final Process p = new ProcessBuilder(
			REG_CMD, "ADD", REG_KEY, REG_VALUE_OPT, REG_VALUE, "/t", "REG_SZ", "/d", "c:\\windows\\system32\\winver.exe" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
		).start();
		if (!getAutoStartEnabled()) {
			throw new IOException(
				"No se ha podido habilitar el autoarranque de AutoFirma: " + new String(AOUtil.getDataFromInputStream(p.getErrorStream())) //$NON-NLS-1$
			);
		}
	}

	private static void disableAutoStart() throws IOException {
		if (!getAutoStartEnabled()) {
			return;
		}
		final Process p = new ProcessBuilder(
			REG_CMD, "DELETE", REG_KEY, REG_VALUE_OPT, REG_VALUE, "/f" //$NON-NLS-1$ //$NON-NLS-2$
		).start();
		if (getAutoStartEnabled()) {
			throw new IOException(
				"No se ha podido deshabilitar el autoarranque de AutoFirma: " + new String(AOUtil.getDataFromInputStream(p.getErrorStream())) //$NON-NLS-1$
			);
		}
	}

	/** Recupera el directorio en el que se encuentra la aplicación.
	 * @return Directorio de ejecución. */
	public static File getApplicationDirectory() {

		if (isJnlpDeployment()) {
			return getJNLPApplicationDirectory();
		}

		// Identificamos el directorio de instalacion
		try {
			return new File(
				AutoFirmaUtil.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()
			).getParentFile();
		}
		catch (final URISyntaxException e) {
			LOGGER.warning("No se pudo localizar el directorio del fichero en ejecucion: " + e); //$NON-NLS-1$
		}

		return null;
	}

	/**
	 * Obtiene el directorio de aplicación que corresponde cuando se
	 * ejecuta la aplicación mediante un despliegue es JNLP.
	 * @return Directorio de aplicación.
	 */
	public static File getJNLPApplicationDirectory() {
		if (Platform.getOS() == Platform.OS.WINDOWS) {
			final File appDir = getWindowsAlternativeAppDir();
			if (appDir.isDirectory() || appDir.mkdirs()) {
				return appDir;
			}
		}
		else if (Platform.getOS() == Platform.OS.MACOSX) {
			final File appDir = getMacOsXAlternativeAppDir();
			if (appDir.isDirectory() || appDir.mkdirs()) {
				return appDir;
			}
		}
		return new File(System.getProperty("java.io.tmpdir")); //$NON-NLS-1$
	}

	/**
	 * Recupera el directorio de instalación alternativo en los sistemas Windows.
	 * @return Directorio de instalación.
	 */
	public static File getWindowsAlternativeAppDir() {
		final String commonDir = System.getenv("ALLUSERSPROFILE"); //$NON-NLS-1$
		return new File (commonDir, "AutoFirma"); //$NON-NLS-1$
	}

	/**
	 * Recupera el directorio de instalación alternativo en los sistemas Linux.
	 * @return Directorio de instalación.
	 */
	public static File getLinuxAlternativeAppDir() {
		final String userHome = System.getProperty("user.home"); //$NON-NLS-1$
		return new File(userHome, ".afirma/AutoFirma"); //$NON-NLS-1$
	}

	/**
	 * Recupera el directorio de instalación alternativo en los sistemas macOS.
	 * @return Directorio de instalación.
	 */
	public static File getMacOsXAlternativeAppDir() {
		final String userDir = System.getenv("HOME"); //$NON-NLS-1$
		return new File (userDir, "Library/Application Support/AutoFirma"); //$NON-NLS-1$
	}

	/**
	 * Comprueba si estamos en un despliegue JNLP de la aplicación.
	 * @return {@code true} si estamos en un despliegue JNLP, {@code false}
	 * en caso contrario.
	 */
	private static boolean isJnlpDeployment() {

		// Para comprobar si estamos en un despliegue JNLP sin crear una dependencia
		// con javaws, hacemos una llamada equivalente a:
		//     javax.jnlp.ServiceManager.lookup("javax.jnlp.ExtendedService");
		// Si falla la llamda, no estamos en un despliegue JNLP
		try {
			final Class serviceManagerClass = Class.forName("javax.jnlp.ServiceManager"); //$NON-NLS-1$
			final Method lookupMethod = serviceManagerClass.getMethod("lookup", String.class); //$NON-NLS-1$
			lookupMethod.invoke(null, "javax.jnlp.ExtendedService"); //$NON-NLS-1$
		}
		catch (final Throwable e) {
			return false;
		}
		return true;
	}

	/** Recupera el DPI de la pantalla principal.
	 * @return DPI de la pantalla principal. */
	public static int getDPI() {
		if (Platform.OS.WINDOWS.equals(Platform.getOS())) {
			final String[] cmd = {"wmic", "desktopmonitor", "get", "PixelsPerXLogicalInch"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
			final ProcessBuilder builder = new ProcessBuilder(cmd);
			try {
				final Process process = builder.start();
				process.waitFor();
				try (
					final BufferedReader bufferedReader = new BoundedBufferedReader(
						new InputStreamReader(process.getInputStream())
					);
				) {
					String line;
					int dpi = 0;
					while ((line = bufferedReader.readLine()) != null) {
						try {
							dpi = Integer.parseInt(line.trim());
							break;
						}
						catch (final Exception e) {
							continue;
						}
		            }
		            return dpi;
				}
			}
			catch (final Exception e) {
				LOGGER.log(	Level.SEVERE, "Error obteniendo DPI: " + e); //$NON-NLS-1$
				return 0;
			}
		}
		return 0;
	}

	/** Recupera el número de pantallas que tiene habilitadas el usuario.
	 * @return Número de pantallas.
	 * @throws HeadlessException Si el equipo no tiene pantalla. */
	public static int getDisplaysNumber() throws HeadlessException {
		return GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices().length;
	}

	/** Devuelve el fichero en su forma canónica.
	 * @param file Fichero del cual obtener su forma canónica.
	 * @return Fichero en su forma canónica o el fichero de entrada si hay error.*/
	public static File getCanonicalFile(final File file) {
		try {
			return file.getCanonicalFile();
		}
		catch(final IOException e) {
			LOGGER.severe(
				"No se ha podido obtener el fichero canonico: " + e //$NON-NLS-1$
			);
			return file;
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy