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

es.gob.afirma.standalone.HelpResourceManager 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.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.logging.Logger;

import es.gob.afirma.core.misc.AOUtil;
import es.gob.afirma.standalone.updater.Updater;

/** Gestor de los recursos de las diferentes formas de ayuda de la aplicación,
 * @author Tomás García-Merás */
public final class HelpResourceManager {

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

	/** Longitud máxima del texto de versión que se procesará. */
	private static final int MAX_VERSION_LENGTH = 30;

	private HelpResourceManager() {
		// No permitimos instanciar
	}

    /** Crea el directorio de usuario del programa si no existe, */
    private static void createApplicationDataDir() {
    	final File apDir = new File(SimpleAfirma.APPLICATION_HOME);
    	if (!apDir.exists()) {
    		apDir.mkdirs();
    	}
    }

	static void createWindowsHelpResources(final File helpFile, final File helpVersionFile) throws IOException {
		extractResource(
			"help/WinHelp/AutoFirmaV2.chm", //$NON-NLS-1$
			helpFile
		);

		// Creamos un fichero que marca la version del fichero de ayuda utilizando la version de la aplicacion
		try (FileOutputStream fos = new FileOutputStream(helpVersionFile)) {
			fos.write(Updater.getCurrentVersionText().getBytes());
		}
	}

	/** Crea los recursos necesarios para mostrar la ayuda de la aplicación en formato Apple OS X.
	 * En concreto, copia una biblioteca JNI nativa de OS X que hace de puente entre Java y el subsistema
	 * de ayuda de OS X. Esta biblioteca, llamada libJavaHelpHook.jnilib se crea a partir del
	 * siguiente código fuente Objective-C (JavaHelpHook.m):
	 * 
	 * #import <JavaVM/jni.h>
     * #import <Cocoa/Cocoa.h>
     *
     * JNIEXPORT void JNICALL Java_es_gob_afirma_standalone_ui_MacHelpHooker_showHelp(JNIEnv *env, jclass clazz)
     * {
	 *   [[NSApplication sharedApplication] performSelectorOnMainThread:@selector(showHelp:) withObject:NULL waitUntilDone:NO];
     * }
	 * 
* @throws IOException Si no se pueden crear los recursos de ayuda. */ public static void createOsxHelpResources() throws IOException { final File appleHelpFile = new File(SimpleAfirma.APPLICATION_HOME + "/libJavaHelpHook.jnilib"); //$NON-NLS-1$ if (!appleHelpFile.exists()) { extractResource( "help/AppleHelp/libJavaHelpHook.jnilib", //$NON-NLS-1$ appleHelpFile ); } } private static void extractResource(final String source, final File destination) throws IOException { // Creamos el directorio de la aplicacion createApplicationDataDir(); // Copiamos el recurso desde el JAR hasta el destino especificado final byte[] helpDocument = AOUtil.getDataFromInputStream( ClassLoader.getSystemResourceAsStream(source) ); if (helpDocument == null || helpDocument.length == 0) { throw new IOException( "No se ha encontrado la biblioteca JNI de carga de la ayuda de OS X (JavaHelpHook.jnilib)" //$NON-NLS-1$ ); } try (final FileOutputStream fos = new FileOutputStream(destination); ) { fos.write(helpDocument); } } /** * Indica si un fichero con la versión de la ayuda de la aplicación * tiene una versión que no se corresponde con la actual. * @param helpVersionFile Fichero con la versión de la ayuda. * @return {@code true} si el fichero de version indicado no se corresponde con el * de la versión actual. {@code false} en caso contrario. */ public static boolean isDifferentHelpFile(File helpVersionFile) { if (!helpVersionFile.exists()) { return true; } final byte[] fileContent = new byte[(int) Math.min(helpVersionFile.length(), MAX_VERSION_LENGTH)]; try (FileInputStream fis = new FileInputStream(helpVersionFile);) { fis.read(fileContent); } catch (final Exception e) { LOGGER.warning("No se pudo leer el fichero con la version de la ayuda. Se generara la nueva ayuda: " + e); //$NON-NLS-1$ return true; } final String trimFileVersion = new String(fileContent, StandardCharsets.UTF_8); final String currentAppVersion = Updater.getCurrentVersion(); final String trimAppVersion = currentAppVersion.substring(0, Math.min(currentAppVersion.length(), MAX_VERSION_LENGTH)); return !trimFileVersion.equals(trimAppVersion); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy