<repo_name>sjm00010/VetUJA<file_sep>/src/main/java/com/vetuja/controladores/ControladorCita.java
package com.vetuja.controladores;

import com.vetuja.DAO.CitaDAO;
import com.vetuja.clases.Cita;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

/**
 *
 * @author juanc
 */
@Named("ctrlCitas")
@ViewScoped
public class ControladorCita implements Serializable {

    private static final Logger logger = Logger.getLogger(ControladorCita.class.getName());
    
    @Inject
    private CitaDAO citasDAO;

    //View-Model
    private Cita cita;
    private Integer id;

    public ControladorCita() {

    }

    @PostConstruct
    private void init() {
        cita = new Cita();
        id = 0;
    }

    public Cita getCita() {
        return cita;
    }

    public Cita getCita(int id) {
        return citasDAO.buscaId(id);
    }

    public void setCita(Cita cita) {
        this.cita = cita;
    }

    public List<Cita> getCitas(String id) {
        final Pattern pattern = Pattern.compile("\\d{8}[A-Z]");
        if (pattern.matcher(id).matches()){
            return citasDAO.buscaCitas(id);
        }
        return citasDAO.buscaTodos();
    }

    public void recupera() {
        cita = citasDAO.buscaId((cita.getId()));
    }

    public String borra(Cita c) {
        if (citasDAO.borra(c.getId())) {
            return "citas.xhtml?faces-redirect=true";
        } else {
            return "inicio.xhtml?faces-redirect=true";
        }
    }

    public String creaCita() {
        
        if (citasDAO.crea(cita)) {
            return "/common_users/citas.xhtml?faces-redirect=true";
        } else {
            return null;
        }
    }

    /**
     * @return the id
     */
    public Integer getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Integer id) {
        this.id = id;
    }
    
    public boolean hayCitas(String id){
        logger.log(Level.INFO, id);
        final Pattern pattern = Pattern.compile("\\d{8}[A-Z]");
        if (pattern.matcher(id).matches()){
            if(citasDAO.buscaCitas(id).isEmpty())
                return false;
        }else{
            if(citasDAO.buscaTodos().isEmpty())
                return false;
        }
        return true;
    }
}
<file_sep>/src/main/webapp/resources/js/visualizaDuenio.js
let el = selector => document.querySelector(selector);
class DuenioCtrl {
    constructor() {
        this.srvUrl = "api/duenio"; //REST service url
        //view-model
    }
    
    init() { }
    
    detalleDuenio(id) {
        let panel = el('#form\\:paneldetalle');
        let enviado = false;
        return fetch(this.srvUrl + "/" + id)
                .then(response => {
                    if (response.ok) {
                        enviado = true; //dueño accepted in server
                    } //else bean-validation errors!
                    return response.json();
                }).then(response => {
            let error = [];
            if (enviado === true) {
                console.log(`Confirmado detalle de dueño: ${response.DNI}`);
                el('#fotoDuenio').innerHTML = `<img src = "${response.foto}" alt="foto cliente" class="card-img" height="100%"/>`;
                el('#detalleNom').innerHTML = `${response.nombre} ${response.apellidos}`;
                el('#detalleDir').innerHTML = `${response.direccion}`;
                panel.style.display = "block";
            } else { //show bean-validation errors
                console.warn(response);
            }
            return enviado;
        }).catch(ex => { //Network error
            panel.style.display = "none";
            console.error("Error en conexión");
            return enviado;
        });
    }
}

window.addEventListener('load', () => {
//Create and initialize controller
    window.ctrl = new DuenioCtrl();
    console.log('Inicializando controlador dueño');
    ctrl.init();
});<file_sep>/src/main/java/com/vetuja/controladores/Preferencias.java
package com.vetuja.controladores;

import com.vetuja.clases.Cliente;
import com.vetuja.clases.Veterinario;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

/**
 *
 * @author sjm00010
 */
@Named(value="prefs")
@SessionScoped
public class Preferencias implements Serializable{
    
    private static final Logger logger = Logger.getLogger(Preferencias.class.getName());
    
    // Variables
    private Cliente cli;
    private Veterinario vet;
    
    public Preferencias() {
        this.cli = null;
        this.vet = null;
    }

    public Preferencias(Cliente cli, Veterinario vet) {
        this.cli = cli;
        this.vet = vet;
    }

    /**
     * @return the cli
     */
    public Cliente getCli() {
        return cli;
    }

    /**
     * @param cli the cli to set
     */
    public void setCli(Cliente cli) {
        this.cli = cli;
    }

    /**
     * @return the vet
     */
    public Veterinario getVet() {
        return vet;
    }

    /**
     * @param vet the vet to set
     */
    public void setVet(Veterinario vet) {
        this.vet = vet;
    }

    /**
     * Funcion para obtener la foto del usuario.
     * @return Foto
     */
    public String getFoto(){
        if (vet != null){
            return vet.getFoto();
        }else if(cli != null){
            return cli.getFoto();
        }
        return null;
    }
    
    /**
     * Funcion para obtener el nombre del usuario.
     * @return Nombre
     */
    public String getNombre(){
        if (vet != null){
            return vet.getNombre();
        }else if(cli != null){
            return cli.getNombre();
        }
        return null;
    }
    
    /**
     * Funcion para saber que tipo de usuario hay conectado.
     * @return Tipo de usuario USER, ADMIN, NULL(sin identificar)
     */
    public String isLogin(){
        if (vet != null){
//            logger.log(Level.INFO, "ADMIN");
            return "ADMIN";
        }else if(cli != null){
//            logger.log(Level.INFO, "USER");
            return "USER";
        }
//        logger.log(Level.INFO, "NULL");
        return null;
    }
    
    /**
     * Devuelve el ID del usuario registrado
     * @return ID
     */
    public String getID(){
//        logger.log(Level.INFO, cli.getDNI());
        if (cli != null){
            return cli.getDNI();
        }
        return null;
    }
}
<file_sep>/src/main/java/com/vetuja/controladores/ControladorUsuario.java
package com.vetuja.controladores;

import com.vetuja.DAO.CitaDAO;
import com.vetuja.DAO.ClienteDAO;
import com.vetuja.DAO.MascotaDAO;
import com.vetuja.DAO.VeterinarioDAO;
import com.vetuja.clases.Cliente;
import com.vetuja.clases.Veterinario;
import java.io.Serializable;
import java.text.ParseException;
import java.util.List;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

/**
 *
 * @author sjm00010
 */
@Named("ctrlUser")
@ViewScoped
public class ControladorUsuario implements Serializable {
    
    private static final Logger logger = Logger.getLogger(ControladorUsuario.class.getName());

    @Inject
    FacesContext fc;
    
    @Inject
    private ClienteDAO clientesDAO;

    @Inject
    private VeterinarioDAO veterinariosDAO;


    /*  Para cuando se modifiquen los identificadores hacer los cambios en las 
        clases que tienen referencias a clientes o veterinarios
     */
    @Inject
    private MascotaDAO mascotasDAO;

    @Inject
    private CitaDAO citasDAO;

    //View-Model
    private Cliente cliente;
    private Veterinario veterinario;
    private String aux;

    public ControladorUsuario() {
    }

    @PostConstruct
    private void init() {
        cliente = new Cliente();
        veterinario = new Veterinario();
        aux=null;
    }

    /****************************************
     *          Getters y Setters           * 
     ****************************************/
    public Cliente getCliente() {
        return cliente;
    }

    public Cliente getCliente(String dni) {
        return clientesDAO.buscaId(dni);
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public List<Cliente> getClientes() {
        return clientesDAO.buscaTodos();
    }

    public Veterinario getVeterinario() {
        return veterinario;
    }

    public Veterinario getVeterinario(String id) {
        return veterinariosDAO.buscaId(id);
    }

    public void setVeterinario(Veterinario veterinario) {
        this.veterinario = veterinario;
    }

    public List<Veterinario> getVeterinarios() {
        return veterinariosDAO.buscaTodos();
    }
    
    /**
     * @return the aux
     */
    public String getAux() {
        return aux;
    }

    /**
     * @param aux the aux to set
     */
    public void setAux(String aux) {
        this.aux = aux;
    }

    public void recuperaVet() {
        veterinario = veterinariosDAO.buscaId(veterinario.getCodCol());
    }

    public String getNombreCli(String DNI) {
        Cliente cli = clientesDAO.buscaId(DNI);
        return cli.getNombre();
    }

    public String getNombreVet(String CC) {
        Veterinario vet = veterinariosDAO.buscaId(CC);
        return vet.getNombre();
    }

    public void recupera() {
        cliente = clientesDAO.buscaId(cliente.getDNI());
        this.aux = cliente.getDNI();
    }

    /**
     * Función para obtener los datos para el detalle de las mascotas
     */
    public void recuperaAll() {
        cliente = clientesDAO.buscaId(cliente.getDNI());
        veterinario = veterinariosDAO.buscaId(veterinario.getCodCol());
    }

    /****************************************
     *          Funciones CRUD              * 
     ****************************************/
    public String creaCliente() {
        if (cliente.getPass().equals(getAux())) {
            if (clientesDAO.crea(cliente)) {
                return "/inicio/inicio.jsf?faces-redirect=true";
            }
        }
        return null;
    }

    public String modificaCliente() throws ParseException {
        if (!clientesDAO.guarda(cliente)) {
            clientesDAO.crea(cliente);
            clientesDAO.borra(aux);
        }
        return "/admin/clientes.xhtml?faces-redirect=true";
    }

    public String borraCliente(String id) {
        clientesDAO.borra(id);
        citasDAO.borraCli(id);
        mascotasDAO.borraCli(id);
        return null;
    }
}
<file_sep>/src/main/webapp/common_users/js/app-cita.module.js

class ControladorCitas {
    constructor($http) {
        console.log("Controlador cargado");
        this.$http = $http;
        this.serviceUrl = 'api/cita';

        //init view-model
        this.cc="";
        this.selec=false;
        this.veterinarios = [];
        this.horas = [];
        this.cargaVeterinarios();
    }
    
    cargaVeterinarios() {
        this.$http({
            method: 'GET',
            url: this.serviceUrl
        }).then(response => {
            console.log("Veterinarios cargados");
            this.veterinarios = response.data;
        });
    }
    
    muestraHorario(cc){
        this.cc=cc;
        this.$http.get(this.serviceUrl + '/' + cc)
                .then(response => {
                    this.horas = response.data;
                    this.errorMsgs = [];
                }).then(() => this.visualiza()
        ).catch(response => { //bean validation errors
            this.errorMsgs = response.data;
        });
    }
    
    visualiza(){
        this.selec = true;
    }
}

ControladorCitas.$inject = ['$http'];

const appCitasComponent = {
    templateUrl: "./js/app-citas.template.html",
    controller: ControladorCitas
};

export const AppLibrosModule = angular
        .module("citas.app", [])
        .component("appCitas", appCitasComponent)
        .name;
<file_sep>/src/main/java/com/vetuja/clases/Mascota.java
/*
 * 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 com.vetuja.clases;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Logger;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.*;

/**
 *
 * @author dgl00018
 */
@Entity
public class Mascota implements Serializable {

    @Id
    @Pattern(regexp = "\\d{15}", message = "Código identificación incorrecto, debe tener 15 números.")
    private String ci;

    @Size(min = 3, max = 12, message = "El nombre debe tener una longitud entre {min} y {max} caracteres.")
    private String nombre;

    @Size(min = 2, max = 12, message = "La raza debe tener una longitud entre {min} y {max} caracteres.")
    private String raza;
    
    @Size(min = 2, max = 12, message = "La especie debe tener una longitud entre {min} y {max} caracteres.")
    private String especie;

    @Pattern(regexp = "(Macho|Hembra)", message = "El sexo debe ser Macho o Hembra.")
    private String sexo;
    
    @Positive(message = "La altura tiene que ser mayor a 0 cm.")
    private Integer altura;
    
    @Positive(message = "El peso tiene que ser mayor a 0 g.")
    private Integer peso;
    
    @Past(message = "Tu mascota debe haber nacido, revisa la fecha de nacimiento.")
    @NotNull(message = "La fecha de nacimiento es requerida.")
    @Temporal(TemporalType.DATE)
    private Date fechanac;

    @NotEmpty(message = "Debe introducir una foto de la mascota")
    private String foto;
    
    @Pattern(regexp = "\\d{8}[A-Z]", message = "DNI incorrecto, debe tener 8 números y la letra debe estar en mayúscula.")
    @NotNull(message = "Se debe seleccionar un cliente.")
    private String cliDNI;
    
    @Pattern(regexp = "[A-Z]{2}[0-9]{4}", message = "Código de colegiado incorrecto, debe tener 2 letras y 4 números.")
    @NotNull(message = "Se debe seleccionar un veterinario.")
    private String vetCC;

    private static final Logger logger = Logger.getLogger(Mascota.class.getName());

    public Mascota() {
        ci = "";
        nombre = "";
        raza = "";
        especie = "";
        sexo = "";
        fechanac = null;
        foto = "";
        altura = null;
        peso = null;
    }

    /**
     * @param ci Código de identificación
     * @param nombre Nombre de la mascota
     * @param raza Raza de la mascota
     * @param especie Especie de la mascota
     * @param sexo Sexo de la mascota
     * @param altura Altura de la mascota
     * @param peso Peso de la mascota
     * @param fechanac Fecha de nacimiento
     * @param foto Foto de la mascota
     * @param cliDNI DNI del dueño
     * @param vetCC Códogo de colegiado del veterinario que lo registro
     */
    public Mascota(String ci, String nombre, String raza, String especie, String sexo, Integer altura, Integer peso, Date fechanac, String foto, String cliDNI, String vetCC) {
        this.ci = ci;
        this.nombre = nombre;
        this.raza = raza;
        this.especie = especie;
        this.sexo = sexo;
        this.altura = altura;
        this.peso = peso;
        this.fechanac = fechanac;
        this.foto = foto;
        this.cliDNI = cliDNI;
        this.vetCC = vetCC;
    }

    /**
     * @return El codigo identificacion
     */
    public String getCi() {
        return ci;
    }

    /**
     * @param ci El codigo identificacion a cambiar
     */
    public void setCi(String ci) {
        this.ci = ci;
    }

    /**
     * @return El nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre El nombre a cambiar
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return La raza
     */
    public String getRaza() {
        return raza;
    }

    /**
     * @param raza La raza a cambiar
     */
    public void setRaza(String raza) {
        this.raza = raza;
    }

    /**
     * @return El sexo
     */
    public String getSexo() {
        return sexo;
    }

    /**
     * @param sexo El sexo a cambiar
     */
    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    /**
     * @return La fecha de nacimiento
     */
    public Date getFechanac() {
        return fechanac;
    }

    /**
     * @param fnac La fecha de nacimiento a cambiar
     */
    public void setFechanac(Date fechanac) {
        this.fechanac = fechanac;
    }

    /**
     * @return Nombre de la foto de mascota, dentro de la carpeta 'mascotas'
     */
    public String getFoto() {
        return foto;
    }

    /**
     * @param foto Nombre de la foto de mascota, dentro de la carpeta 'mascotas'
     */
    public void setFoto(String foto) {
        this.foto = foto;
    }

    /**
     * @return the cliDNI
     */
    public String getCliDNI() {
        return cliDNI;
    }

    /**
     * @param cliDNI the cliDNI to set
     */
    public void setCliDNI(String cliDNI) {
        this.cliDNI = cliDNI;
    }

    /**
     * @return the vetCC
     */
    public String getVetCC() {
        return vetCC;
    }

    /**
     * @param vetCC the vetCC to set
     */
    public void setVetCC(String vetCC) {
        this.vetCC = vetCC;
    }

    /**
     * @return the altura
     */
    public Integer getAltura() {
        return altura;
    }

    /**
     * @param altura the altura to set
     */
    public void setAltura(Integer altura) {
        this.altura = altura;
    }

    /**
     * @return the peso
     */
    public Integer getPeso() {
        return peso;
    }

    /**
     * @param peso the peso to set
     */
    public void setPeso(Integer peso) {
        this.peso = peso;
    }

    /**
     * @return the especie
     */
    public String getEspecie() {
        return especie;
    }

    /**
     * @param especie the especie to set
     */
    public void setEspecie(String especie) {
        this.especie = especie;
    }
    
    public String leerFecha(){
        DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
        return dateFormat.format(this.fechanac);
    }
}
<file_sep>/src/main/java/com/vetuja/resources/DuenioResource.java
package com.vetuja.resources;

import com.vetuja.DAO.ClienteDAO;
import com.vetuja.clases.Cliente;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

/**
 *
 * @author sjm00010
 */
@Path("/duenio") //Acceso /api/duenio
@Produces(MediaType.APPLICATION_JSON)
public class DuenioResource {

    @Inject
    private ClienteDAO clientesDAO;

    
    @GET
    @Path("/{id}")
    public Response getDuenio(@PathParam("id") String id) {
        Response response;
        Cliente l = clientesDAO.buscaId(id);
        if( l != null) {
            response= Response.ok(l).build();
        } else {
            //Error messages
            List<Map<String,Object>> errores=new ArrayList<>();
            Map<String,Object> err=new HashMap<>(); 
            err.put("message", "El dueño no existe");
            errores.add(err);
            response=Response.status(Response.Status.BAD_REQUEST)
                             .entity(errores).build();            
        }
        return response;
    }

}
<file_sep>/README.md
# VetUJA
## Proyecto DAW
### Descripción
VetUJA es una aplicación web para gestionar una clínica veterinaria. Permite a los clientes llevar un control sobre sus mascotas y sobre las citas con los veterinarios. Y a los veterinarios tener organizado todo de forma fácil y cómoda.

### Tecnologías usadas
- **Maven** : Gestor de dependencias
- **Payara Server** : Servidor para lanzar la página
- **JSF** : Paginas *.xhtml* procesadas en el servidor
- **JPA** : Para el almacenamiento de los datos en SQL, haciendo uso de H2 para la base de datos
- **JS** : Para la validación de los formularios desde el cliente
- **REST** : Para ciertos servicios asíncronos
- **AngularJS** : Uso de los componentes para la página citas
<file_sep>/src/main/webapp/resources/js/validaModificaCliente.js
$(() => {
    window.ctrl = new modifClienteCtrl(); //Register global var
    ctrl.init(); //Attach view event Handlers
});

class modifClienteCtrl {
    constructor() {
        this.config = {
            formulario: "#fModifClienteMC",
            nombre: "#fModifCliente\\:nombreMC",
            apellidos: "#fModifCliente\\:apellidosMC",
            fecha: "#fModifCliente\\:fnacMC",
            direccion: "#fModifCliente\\:direccionMC",
            email: "#fModifCliente\\:emailMC",
            foto: "#fModifCliente\\:fotoMC",
            contrasena: "#fModifCliente\\:passMC"
        };
    }

    init() {
        $(this.config.formulario)
                .on('submit', event => { //ev. handler
                    if (this.validarFormulario() === false) {
                        //Stop submission
                        event.preventDefault();
                    }
                    ;
                });
        console.log("Iniciando controlador JS");

    }

    validarFormulario() {
        console.log("Validación modificación cliente con JS");
        let el = selector => document.querySelector(selector);
        let nombre = $(this.config.nombre).val();
        let apellidos = $(this.config.apellidos).val();
        let fnac = $(this.config.fecha).val();
        let dir = $(this.config.direccion).val();
        let email = $(this.config.email).val();
        let foto = $(this.config.foto).val();
        let contrasena = $(this.config.contrasena).val();

        let valido = true;
        //Validación
        if (nombre.length < 3 || nombre.length > 12) {
            el('#errNombreMC').innerHTML = `<p class= "alert alert-danger"> La longitud del nombre debe estar entre 3 y 12 caracteres. </p>`;
            valido = false;
        } else {
            el('#errNombreMC').innerHTML = "";
        }
        if (apellidos.length < 6 || apellidos.length > 20) {
            el('#errApellMC').innerHTML = `<p class="alert alert-danger"> La longitud de los apellidos debe estar entre 6 y 20 caracteres. </p>`;
            valido = false;
        } else {
            el('#errApellMC').innerHTML = "";
        }
        if (fnac.length === 0) {
            el('#errFechaMC').innerHTML = `<p class="alert alert-danger"> Debe introducir una fecha. </p>`;
            valido = false;
        } else {
            el('#errFechaMC').innerHTML = "";
        }
        if (dir.length < 6 || dir.length > 30) {
            el('#errDirMC').innerHTML = `<p class="alert alert-danger"> La longitud de la dirección debe estar entre 6 y 30 caracteres. </p>`;
            valido = false;
        } else {
            el('#errDirMC').innerHTML = "";
        }

        if (email.search(/[a-zA-Z0-9._+-]+@[a-zA-Z]+\.[a-zA-Z.]{2,}/) === -1) {
            el('#errEmailMC').innerHTML = `<p class="alert alert-danger"> El correo debe tener el formato <EMAIL> </p>`;
            valido = false;
        } else {
            el('#errEmailMC').innerHTML = "";
        }
        if (foto.length === 0) {
            el('#errFotoMC').innerHTML = `<p class="alert alert-danger"> Debe introducir una foto. </p>`;
            valido = false;
        } else {
            el('#errFotoMC').innerHTML = "";
        }
        if (contrasena.length < 6 || contrasena.length > 10) {
            el('#errContrasenaMC').innerHTML = `<p class="alert alert-danger"> La longitud de la contraseña debe estar entre 6 y 10 caracteres. </p>`;
            valido = false;
        } else {
            el('#errContrasenaMC').innerHTML = "";
        }
        return valido;
    }
}

//Ventana emergente borrado cliente
function borrar(event) {
    console.log("Confirma borrado");
    let opcion = confirm("¿Estás seguro de borrar el cliente?");
    console.log(opcion);
    if (opcion === false) {
        console.log("Cancelado");
        event.preventDefault();
    }
}
//Ventana emergente modificado cliente
function modifica(event) {
console.log("Confirma modificado cliente");
let opcion = confirm("¿Estás seguro de modificar el cliente?");
console.log(opcion);
if (opcion === false) {
    console.log("Cancelado");
    event.preventDefault();
}
}<file_sep>/src/main/webapp/resources/js/validaModificaMascota.js
/* 
 * 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.
 */

class modifMascotaCtrl {
    constructor() {
        this.config = {
            formulario: "#form",
            nombre: "#form\\:nombreMM",
            raza: "#form\\:razaMM",
            especie: "#form\\:especieMM",
            sexo: "#form\\:sexoMM",
            fecha: "#form\\:fechanacMM",
            altura: "#form\\:alturaMM",
            peso: "#form\\:pesoMM",
            foto: "#form\\:fotoMM",
            cliDNI: "#form\\:cliDNIMM",
            vetCC: "#form\\:vetCCMM"

        };
    }

    init() {
        $(this.config.formulario)
                .on('submit', event => { //ev. handler
                    if (this.validarFormulario() === false) {
                        //Stop submission
                        event.preventDefault();
                    }
                    ;
                });
        console.log("Iniciando controlador JS");
    }

    validarFormulario() {
        console.log("Validación modificación cliente con JS");
        let el = selector => document.querySelector(selector);
        let nombre = $(this.config.nombre).val();
        let raza = $(this.config.raza).val();
        let especie = $(this.config.especie).val();
        let sexo = $(this.config.sexo).val();
        let fechanac = $(this.config.fecha).val();
        let foto = $(this.config.foto).val();
        let altura = $(this.config.altura).val();
        let peso = $(this.config.peso).val();
        let cliDNI = $(this.config.cliDNI).val();
        let vetCC = $(this.config.vetCC).val();
        let valido = true;
        //Validación mascotas



        if (nombre.length < 3 || nombre.length > 12) {
            el('#errNombreMM').innerHTML = `<p class= "alert alert-danger"> La longitud del nombre debe estar entre 3 y 12 caracteres. </p>`;
            valido = false;
        } else {
            el('#errNombreMM').innerHTML = "";
        }


        if (raza.length < 2 || raza.length > 12) {
            el('#errRazaMM').innerHTML = `<p class="alert alert-danger"> La raza debe tener una longitud entre 2 y 12 caracteres. </p>`;
            valido = false;
        } else {
            el('#errRazaMM').innerHTML = "";
        }

        if (especie.length < 2 || especie.length > 12) {
            el('#errEspecieMM').innerHTML = `<p class="alert alert-danger"> La especie debe tener una longitud entre 2 y 12 caracteres. </p>`;
            valido = false;
        } else {
            el('#errEspecieMM').innerHTML = "";
        }

        if (sexo !== "Macho" || sexo !== "Hembra") {
            el('#errSexoMM').innerHTML = `<p class="alert alert-danger"> El sexo debe ser Macho o Hembra </p>`;
            valido = false;
        } else {
            el('#errSexoMM').innerHTML = "";
        }

        if (altura.length <= 0) {
            el('#errAlturaMM').innerHTML = `<p class="alert alert-danger"> La altura debe ser mayor que 0. </p>`;
            valido = false;
        } else {
            el('#errAlturaMM').innerHTML = "";
        }

        if (peso.length <= 0) {
            el('#errPesoMM').innerHTML = `<p class="alert alert-danger"> El peso tiene que ser mayor a 0 g </p>`;
            valido = false;
        } else {
            el('#errPesoMM').innerHTML = "";
        }

        if (fechanac.length > 0) {
            el('#errFechanacMM').innerHTML = `<p class="alert alert-danger"> Debe introducir una fecha. </p>`;
            valido = false;
        } else {
            el('#errFechanacMM').innerHTML = "";
        }


        if (foto.length === 0) {
            el('#errFotoMM').innerHTML = `<p class="alert alert-danger"> Debe introducir una foto. </p>`;
            valido = false;
        } else {
            el('#errFotoMM').innerHTML = "";
        }

        if (cliDNI.length <= 0) {
            el('#errCliDNIMM').innerHTML = `<p class="alert alert-danger"> El DNI debe tener 8 números y la letra debe estar en mayúscula. </p>`;
            valido = false;
        } else {
            el('#errCliDNIMM').innerHTML = "";
        }

        if (vetCC.length <= 0) {
            el('#errVetCCMM').innerHTML = `<p class="alert alert-danger"> El código de colegiado debe tener longitud mayor a 0 </p>`;
            valido = false;
        } else {
            el('#errvetCCMM').innerHTML = "";
        }





        return valido;
    }

}

//Ventana emergente borrado cliente
function borrar_m(event) {
    console.log("Confirma borrado");
    let opcion = confirm("¿Estás seguro de borrar la mascota?");
    console.log(opcion);
    if (opcion === false) {
        console.log("Cancelado");
        event.preventDefault();
    }
}
//Ventana emergente modificado cliente
function modifica_m(event) {
    console.log("Confirma modificar mascota");
    let opcion = confirm("¿Estás seguro de modificar la mascota?");
    console.log(opcion);
    if (opcion === false) {
        console.log("Cancelado");
        event.preventDefault();
    }
}
<file_sep>/src/main/java/com/vetuja/controladores/IdentificadorUsuario.java
package com.vetuja.controladores;

import com.vetuja.DAO.ClienteDAO;
import com.vetuja.DAO.VeterinarioDAO;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.security.enterprise.credential.UsernamePasswordCredential;
import javax.security.enterprise.identitystore.CredentialValidationResult;
import static javax.security.enterprise.identitystore.CredentialValidationResult.INVALID_RESULT;
import javax.security.enterprise.identitystore.IdentityStore;

/**
 * Clase temporal para realizar pruebas, en la version con JPA se eliminará.
 *
 * @author sjm00010
 */
@ApplicationScoped
public class IdentificadorUsuario implements IdentityStore {

    // Datos de usuarios, Clientes y Veterinarios
    @Inject
    private ClienteDAO clientesDAO;

    @Inject
    private VeterinarioDAO veterinariosDAO;

    public IdentificadorUsuario() {
    }

    public CredentialValidationResult validate(
            UsernamePasswordCredential usernamePasswordCredential) {

        //Recuperar credenciales proporcionadas por el servidor
        String username = usernamePasswordCredential.getCaller();
        String password = usernamePasswordCredential.getPasswordAsString();

        //Ejemplo simple de verificación de credenciales
        String validPassword = clientesDAO.getPass(username);
        if (validPassword != null && validPassword.equals(password)) {
            
            //Autenticación completada, obtener los roles del usuario...
            Set<String> roles = new HashSet<>(Arrays.asList("USUARIOS"));
            
            //Pasar datos del usuario al servidor
            return new CredentialValidationResult(username, roles);
        }

        if (validPassword == null) {
            
            //Ejemplo simple de verificación de credenciales
            validPassword = veterinariosDAO.getPass(username);
            if (validPassword != null && validPassword.equals(password)) {
                
                //Autenticación completada, obtener los roles del usuario...
                Set<String> roles = new HashSet<>(Arrays.asList("ADMINISTRADORES"));
                
                //Pasar datos del usuario al servidor
                return new CredentialValidationResult(username, roles);
            }
        }

        return INVALID_RESULT; //Autenticación inválida
    }

}
<file_sep>/src/main/java/com/vetuja/clases/Cliente.java
/*
 * 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 com.vetuja.clases;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Logger;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.*;

/**
 *
 * @author sjm00010
 */
@Entity
public class Cliente implements Serializable {

    @Id
    @Pattern(regexp = "\\d{8}[A-Z]", message = "DNI incorrecto, debe tener 8 números y la letra debe estar en mayúscula.")
    private String DNI;

    @Size(min = 3, max = 12, message = "El nombre debe tener una longitud entre {min} y {max} caracteres.")
    private String nombre;

    @Size(min = 6, max = 20, message = "Los apellidos deben tener una longitud entre {min} y {max} caracteres.")
    private String apellidos;

    @Size(min = 6, max = 30, message = "La direción debe tener una longitud entre {min} y {max} caracteres.")
    private String direccion;

    @Past(message = "Si no has nacido, ¿que haces registrandote? Revisa la fecha de nacimiento.")
    @Temporal(TemporalType.DATE)
    @NotNull(message = "La fecha de nacimiento es requerida.")
    private Date fnac;

    @NotEmpty(message = "Introduce una foto para que podamos conocerte.")
    private String foto;

    @Pattern(regexp = "[a-zA-Z0-9._+-]+@[a-zA-Z]+\\.[a-zA-Z.]{2,}", message = "El correo introducido no es valido, debe tener el formato <EMAIL>")
    private String email;

    @Size(min = 6, max = 10, message = "La contraseña debe tener una longitud entre {min} y {max} caracteres.")
    private String pass;

    //Loger para errores
    private static final Logger logger = Logger.getLogger(Cliente.class.getName());

    /**
     *
     */
    public Cliente() {
        DNI = null;
        nombre = "";
        apellidos = "";
        direccion = "";
        fnac = null;
        foto = "";
        email = "";
        pass = "";
    }

    /**
     * @param DNI DNI del usuario. Solo los 8 números
     * @param nombre Nombre del usuario, sin apellidos
     * @param apellidos Apellidos del usuario
     * @param direccion Direccion del usuario, local sin provincia y demas
     * @param fnac Fecha de nacimiento
     * @param foto Nombre de la foto de usuario, dentro de la carpeta 'usuarios'
     * @param email Correo electronico
     * @param pass Contraseña
     */
    public Cliente(String DNI, String nombre, String apellidos, String direccion,
            Date fnac, String foto, String email, String pass) {
        this.DNI = DNI;
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.direccion = direccion;
        this.fnac = fnac;
        this.foto = foto;
        this.email = email;
        this.pass = pass;
    }

    public Cliente(Cliente c) {
        this.DNI = c.DNI;
        this.nombre = c.nombre;
        this.apellidos = c.apellidos;
        this.direccion = c.direccion;
        this.fnac = c.fnac;
        this.foto = c.foto;
        this.email = c.email;
        this.pass = c.pass;
    }

    /**
     * @return El DNI
     */
    public String getDNI() {
        return DNI;
    }

    /**
     * @param DNI El DNI a cambiar
     */
    public void setDNI(String DNI) {
        this.DNI = DNI;
    }

    /**
     * @return El nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre El nombre a cambiar
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return Los apellidos
     */
    public String getApellidos() {
        return apellidos;
    }

    /**
     * @param apellidos Los apellidos a cambiar
     */
    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    /**
     * @return La dirección
     */
    public String getDireccion() {
        return direccion;
    }

    /**
     * @param direccion La dirección a cambiar
     */
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    /**
     * @return La fecha de nacimiento
     */
    public Date getFnac() {
        return fnac;
    }

    /**
     * @param fnac La fecha de nacimiento a cambiar
     */
    public void setFnac(Date fnac) {
        this.fnac = fnac;
    }

    /**
     * @return La contraseña
     */
    public String getPass() {
        return pass;
    }

    /**
     * @param pass La contraseña a cambiar
     */
    public void setPass(String pass) {
        this.pass = pass;
    }

    /**
     * @return El correo electronico
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email El correo electronico a cambiar
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return Nombre de la foto de usuario, dentro de la carpeta 'usuarios'
     */
    public String getFoto() {
        return foto;
    }

    /**
     * @param foto Nombre de la foto de usuario, dentro de la carpeta 'usuarios'
     */
    public void setFoto(String foto) {
        this.foto = foto;
    }

    public String leerFecha() {
        DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
        return dateFormat.format(this.fnac);
    }

}
