controlador.ControlEmpleados.java Source code

Java tutorial

Introduction

Here is the source code for controlador.ControlEmpleados.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 controlador;

import dao.Configuration;
import dao.EmpleadosDAO;
import dao.SessionContext;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Security;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import modelo.personas.Empleado;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import utils.Info;

/**
 * Se encarga de instanciar el DAO de empleados y llamar a sus mtodos, facilitando los objetos a la Vista.
 * @author JosMara
 */
public class ControlEmpleados {

    /**
     * Solicita al server la SecretKey para cifrar/descifrar el resto de la comunicacin. Primero, hace una
     * peticin http de cuya respuesta abre un InputStream y almacena el stream de bytes en un fichero binario.
     * Este fichero es la clave pblica del servidor y se utilizar para descifrar asimtricamente la segunda
     * peticin, la cual contiene un objeto SecretKey que ser el utilizado para cifrar/descifrar de manera simtrica.
     */
    public void solicitarClave() {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            HttpGet httpGet = new HttpGet(Configuration.getInstance().getServerUrl() + "/secretKey?opcion=public");
            CloseableHttpResponse response1 = httpclient.execute(httpGet,
                    SessionContext.getInstance().getContext());
            try {
                HttpEntity entity1 = response1.getEntity();
                File f = new File("./server1024.publica");
                if (f.exists()) {
                    f.delete();
                }
                IOUtils.copy(entity1.getContent(), new FileOutputStream(f));
            } finally {
                response1.close();
            }

            httpGet = new HttpGet(Configuration.getInstance().getServerUrl() + "/secretKey?opcion=secret");
            response1 = httpclient.execute(httpGet, SessionContext.getInstance().getContext());
            try {
                HttpEntity entity1 = response1.getEntity();
                String respuesta = EntityUtils.toString(entity1);
                byte[] clave = Base64.decodeBase64(respuesta);
                //descifro
                byte[] bufferPub = new byte[5000];
                File f = new File("server1024.publica");
                System.out.println(f.getAbsolutePath());
                FileInputStream in = new FileInputStream(f);
                int chars = in.read(bufferPub, 0, 5000);
                in.close();

                byte[] bufferPub2 = new byte[chars];
                System.arraycopy(bufferPub, 0, bufferPub2, 0, chars);

                Security.addProvider(new BouncyCastleProvider()); // Cargar el provider BC
                Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
                Cipher cifrador = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");

                KeyFactory keyFactoryRSA = KeyFactory.getInstance("RSA", "BC"); // Hace uso del provider BC
                // 4.2 Recuperar clave publica desde datos codificados en formato X509
                X509EncodedKeySpec clavePublicaSpec = new X509EncodedKeySpec(bufferPub2);
                PublicKey clavePublica2 = keyFactoryRSA.generatePublic(clavePublicaSpec);

                cifrador.init(Cipher.DECRYPT_MODE, clavePublica2); // Descrifra con la clave privada

                byte[] claveAES = cifrador.doFinal(clave);
                SecretKey originalKey = new SecretKeySpec(claveAES, 0, claveAES.length, "AES");
                SessionContext.getInstance().setSecretKey(originalKey);

            } finally {
                response1.close();
            }

        } catch (IOException ex) {
            Logger.getLogger(ControlEmpleados.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(ControlEmpleados.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                httpclient.close();
            } catch (IOException ex) {
                Logger.getLogger(ControlEmpleados.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * Solicita al DAO que valide un empleado.
     * @param dni String dni del empleado.
     * @param pass String clave introducida por el empleado.
     * @return Info con el resultado de la peticin.
     */
    public Info validate(String dni, String pass) {
        Empleado e = new Empleado();
        e.setDni(dni);
        e.setPass(pass);
        EmpleadosDAO dao = new EmpleadosDAO();
        return dao.validate(e);
    }

    /**
     * Solicita al DAO todos los empleados almacenados.
     * @return ArrayList de empleados.
     */
    public ArrayList<Empleado> getAllEmpleados() {
        EmpleadosDAO dao = new EmpleadosDAO();
        return dao.getAllEmpleados();
    }

    /**
     * Solicita al DAO que inserte un nuevo empleado. 
     * @param e Empleado a aadir.
     * @return Info con el resultado de la peticin.
     */
    public Info addEmpleado(Empleado e) {
        EmpleadosDAO dao = new EmpleadosDAO();
        return dao.addEmpleado(e);
    }

    /**
     * Solicita al DAO que borre un empleado. 
     * @param e Empleado a borrar.
     * @return Info con el resultado de la peticin.
     */
    public Info deleteEmpleado(Empleado e) {
        EmpleadosDAO dao = new EmpleadosDAO();
        return dao.deleteEmpleado(e);
    }

    /**
     * Solicita al DAO que anote un nuevo cliente captado a un empleado.
     * @param dniEmpleado String dni del empleado que ha captado el cliente.
     */
    public void anotarClienteCaptado(String dniEmpleado) {
        Empleado e = new Empleado();
        e.setDni(dniEmpleado);
        EmpleadosDAO dao = new EmpleadosDAO();
        dao.anotarClienteCaptado(e);
    }

    /**
     * Solicita al dao que anote un nuevo producto vendido a un empleado.
     * @param dniEmpleado String dni del empleado que ha realizado la venta.
     */
    public void anotarProductoVendido(String dniEmpleado) {
        Empleado e = new Empleado();
        e.setDni(dniEmpleado);
        EmpleadosDAO dao = new EmpleadosDAO();
        dao.anotarProductoVendido(e);
    }

    /**
     * Solicita al dao que ascienda un empleado a Jefe. 
     * @param e Empleado a ascender.
     * @return Info con el resultado de la peticin.
     */
    public Info ascenderEmpleado(Empleado e) {
        EmpleadosDAO dao = new EmpleadosDAO();
        return dao.ascenderEmpleado(e);
    }
}