Methods.ManageKey.java Source code

Java tutorial

Introduction

Here is the source code for Methods.ManageKey.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Methods;

import Imprimir.ErrorDialog;
import Imprimir.InfoDialog;
import Imprimir.SaveKey;
import Model.ComponentesRSA;
import Model.Constantes;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javafx.application.Platform;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressIndicator;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import org.apache.commons.lang3.StringUtils;

/**
 *
 * @author rdiazarr
 * 
 * Clase empleada para gestionar las claves RSA (guardar claves y recuperarlas) 
 * y para generar el Log de NNC.
 */
public class ManageKey {

    private final FileChooser fileChooser;

    private final ErrorDialog errorDialog;

    private final InfoDialog infoDialog;
    //decimal = 10, hexadecimal = 16
    private int radix;

    /**
     * Constructor de la clase
     */
    public ManageKey() {
        ExtensionFilter extensionFilter = new ExtensionFilter("HTML files", "*.html");

        this.fileChooser = new FileChooser();
        this.fileChooser.setInitialDirectory(new File(System.getProperty("user.dir")));
        fileChooser.getExtensionFilters().add(extensionFilter);

        this.errorDialog = new ErrorDialog();
        this.infoDialog = new InfoDialog();
        this.radix = 10;
    }

    /**
     * Mtodo encargado de abrir una clave guardada 
     * y devolver una lista con los primos p, q y la clave pblica.
     * @param label nodo cualquiera de la escena que 
     * se usa para ir escalando y obtener la ventana.
     * @return 
     */
    public String[] open(Label label) {
        //Pos0: primo P, Pos1: primo Q, Pos2: clave e, Pos3: unidades
        String[] keys = null;
        File keyFile;

        this.fileChooser.setTitle("Seleccionar clave guardada");
        keyFile = this.fileChooser.showOpenDialog(label.getScene().getWindow());

        if (keyFile != null) {
            //para que la primera vez que se elija una ruta se acuerde 
            //de cual es esa ruta para las siguientes busquedas
            this.fileChooser.setInitialDirectory(keyFile.getParentFile());
            keys = processFile(keyFile);

        } else {
            this.errorDialog.FileToOpen();
        }

        return keys;
    }

    /**
     * Mtodo que procesa el fichero obtenido en el metodo Open
     * @param keyFile
     * @return 
     */
    private String[] processFile(File keyFile) {
        String[] keys = new String[4];
        String line;
        // dentro de las primeras 20 lineas han de estar todos los componentes necesarios
        int numLines = 0;

        try {
            Scanner file = new Scanner(keyFile);

            while (file.hasNextLine() && numLines < 20) {

                line = file.nextLine();
                numLines++;

                if (StringUtils.contains(line, "P generado")) {
                    line = file.nextLine();
                    //para dejar solo los nmeros
                    keys[0] = StringUtils.replaceAll(line, "[^0-9]", "");

                    numLines++;
                }

                if (StringUtils.contains(line, "Q generado")) {
                    line = file.nextLine();

                    keys[1] = StringUtils.replaceAll(line, "[^0-9]", "");

                    numLines++;
                }

                if (StringUtils.contains(line, "e generada")) {
                    line = file.nextLine();

                    keys[2] = StringUtils.replaceAll(line, "[^0-9]", "");

                    numLines++;
                }

                if (StringUtils.contains(line, "Unidades:")) {

                    if (StringUtils.contains(line, "Decimal")) {
                        keys[3] = "Decimal";
                    } else {
                        keys[3] = "Hexadecimal";
                    }

                    numLines++;
                }
            }

        } catch (FileNotFoundException e) {
            this.errorDialog.readingFile();
            return null;
        }

        if (this.keysNotOk(keys)) {
            this.errorDialog.missingComponents();
            keys = null;
        }

        return keys;

    }

    /**
    * Mtodo encargado de guardar la clave generada
    * @param label nodo cualquiera de la escena que se usa para ir escalando y obtener la ventana. 
    * @param RSA 
    */
    public void saveKey(Label label, ComponentesRSA RSA) {
        File keyFile;
        SaveKey saveKey;

        if (RSA == null) {
            this.errorDialog.RSAnotGenerated();
            return;
        }

        this.fileChooser.setTitle("Seleccionar directorio donde guardar la clave");
        this.fileChooser.setInitialFileName("Clave genRSA");
        keyFile = this.fileChooser.showSaveDialog(label.getScene().getWindow());

        if (keyFile != null) {
            this.fileChooser.setInitialDirectory(keyFile.getParentFile());

            saveKey = new SaveKey(keyFile);
            saveKey.generateHTML(RSA, this.radix);
            this.infoDialog.KeySaved();

        } else {
            this.errorDialog.FileToSave();
        }
    }

    /**
     * Mtodo encargado de guardar el log de Nmero No Cifrables
     * @param progressInd --> nodo cualquiera de la escena que se usa para ir escalando y obtener la ventana. 
     * @param RSA 
     * @param logNNCFile 
     * @throws InterruptedException
     */
    public void saveLogNNC(ProgressIndicator progressInd, ComponentesRSA RSA, File logNNCFile)
            throws InterruptedException {
        CalculateNNC NNC;

        if (RSA != null) {
            if (RSA.getD().bitLength() > Constantes.MAX_KeySize && logNNCFile != null) {
                Platform.runLater(() -> this.infoDialog.bigKeySize());
            }
        } else {
            //no se puede dar, no estaria activo el boton del log
            Platform.runLater(() -> this.errorDialog.RSAnotGenerated());
            return;
        }

        if (logNNCFile != null) {
            this.fileChooser.setInitialDirectory(logNNCFile.getParentFile());

            NNC = new CalculateNNC(this.radix, RSA, logNNCFile, progressInd);

            if ((RSA.getNumNNC().compareTo(Constantes.MAX_NNC_BI) == -1) && !(RSA.getP().equals(RSA.getQ()))) {
                NNC.quickCalculate();
            } else {
                NNC.calculate();
            }

            if (CalculateNNC.isCancelled) {
                Platform.runLater(() -> this.infoDialog.LogNNCStopped());
            } else {
                Platform.runLater(() -> this.infoDialog.LogNNCSaved());
            }

        } else {
            Platform.runLater(() -> this.errorDialog.FileToSave());
        }
    }

    /**
     * Mtodo para parar el clculo del log de Num No Cifrables
     */
    public void setLogCancelled() {
        CalculateNNC.isCancelled = true;
    }

    /**
     * Mtodo que comprueba que se hayan recuperado todos los 
     * numeros necesarios del archivo procesado
     * @param keys
     * @return 
     */
    private boolean keysNotOk(final String[] keys) {
        boolean existsP;
        boolean existsQ;
        boolean existsE;
        boolean existsUnits;

        existsP = keys[0] == null;
        existsQ = keys[1] == null;
        existsE = keys[2] == null;
        existsUnits = keys[3] == null;

        return (existsP || existsQ || existsE || existsUnits);
    }

    /**
     * @param radix 
     */
    public void setUnits(int radix) {
        this.radix = radix;
    }

}