Saturday, January 12, 2019

ejbjmoordb 0.12 , soporte para instrucciones sql

Soporte de SQL en ejbjmoordb a partir de la versiòn 0.11
 <dependency>
            <groupId>com.github.avbravo</groupId>
            <artifactId>ejbjmoordb</artifactId>
            <version>0.12</version>

        </dependency>



 <repositories>
        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>

    </repositories>


El soporte básico de SQL se ha incluido dentro del framework, mediante de la integración de una interesante librería que convierte las instrucciones sql a consultas Mongodb. Se ha realizado la integración para permitir que sea fácil su uso con ejbmoordb mediante la clase repository.
Los métodos que la implementan son
  • public Optional <T> findById(String sql)
  • public List< T> findPagination(String sql, Integer pageNumber, Integer rowsForPage)
  • public List<T> findBy(String sql)
  • public Boolean delete(String sql)
  • public Boolean deleteMany(String sql)
La libreria para convertir de sql a Mongodb fue desarrollado por Vincent Russell.
Este es el repositorio
Mostrare los ejemplos directos publicados por Vincent
Restricciones

Ejemplo:
List<Factura> fact = facturaRepository.findBy("select * from factura where estatusfactura.idestatusfactura =1 order by idfactura");

    fact.forEach((f) -> {
        System.out.println("factura "+f.getIdfactura() + "  :"+f.getAlmacen().getIdalmacen());
    });




  • findById


Optional<Planetas> p2 = planetasRepository.findById("select * from pais where idplaneta='tierra'");

if (!p2.isPresent()) {
System.out.println("no hay planetas");
} else {
planetas =p2.get();
System.out.println("el planeta es " + planetas.toString());
}



  • findPagination

String sql = "select * from pais where idcontinente='am' order by idpais";
List<Pais> paisList = paisRepository.findPagination(sql,1,10);



  • findBy

String sql = "select * from pais where idcontinente='am'";
List< Paises > list =paisesRepòsitory.findBy(sql,"am");


  • findFirst

String sql ="select * from pais where poblacion > 50";
Optional<Pais> optional = paisRepository.findFirst(sql);
if (optional.isPresent()) {
Pais p = optional.get();


}


  • delete

String sql ="delete from planeta where idplaneta='tierra'";

planetasRepository.delete(sql);

  • deleteMany

String sql ="delete from planeta where idplaneta='tierra'";
planetasRepository.deleteMany(sql);




Aquí hay mas detalles de la implementaciòn y las instrucciones que soporta y las que aun faltan.


Friday, January 11, 2019

ejbjmoordb 0.9

La versiòn 0.9 de ejbjmoordb para NoSQL(MongoDB)
Ahora permite usar Bson filter para las condiciones de busqueda y no solo un Document directamente.
Bson filter = Filters.and(Filters.eq("almacen.idalmacen",loginController.getAlmacen().getIdalmacen()), Filters.ne("estatusfactura.idestatusfactura", 5));
totalFacturas = facturaRepository.count(filter);


maven
 <repositories>
        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>

    </repositories>
 <dependency>
            <groupId>com.github.avbravo</groupId>
            <artifactId>ejbjmoordb</artifactId>
            <version>0.9</version>

        </dependency>

Friday, November 23, 2018

Java EE/Jakarta Ejbmoordb en FISC Academy Fest!

Java EE/Jakarta Ejbmoordb en  FISC Academy Fest!
El miércoles 21 de Noviembre en la Facultad de Ingeniera de Sistemas computacionales de La Universidad Tecnológica de Panamá ser realizo el 2 FISC ACADEMIC FEST.



Un evento de muy alto nivel donde los estudiantes mostraban sus proyectos, ademas de conferencias.
En esta ocasión realice unas presentaciones sobre Java Enterprise Edition, Microservicios, EJBMoordb.





También  mostré algo de Test con jmoordbunit





Mi agradecimiento a un gran amigo Victor Lopez por la invitación y a los organizadores y autoridades y docentes de  la F.I.S.C.



Thursday, November 15, 2018

Testing de bases de datos dinámicas

Testing de bases de datos dinámicas

Requerimientos:
  • ejbjmoordb
  • jmoordbUnit
  • Base de datos: MongoDB
Muchas ocasiones deseamos hacer testing de las bases de datos sin afectar las de producción
podemos utilizar el método repository.setDatabase(nombre-base-datos) para indicar la base de datos con la que deseamos hacer las pruebas, si no existe se creara en tiempo de ejecución.
Debemos establecerlo en el método init()

rolRepository.setDatabase("transporte_test");

Ejemplo:
Tenemos una base de datos llamada transporte y deseamos hacer los test sobre una base de datos que crearemos dinamicamente llamada transporte_test


Código


/*
 * 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.avbravo.transportetest.test;

import com.avbravo.avbravoutils.JsfUtil;
import com.avbravo.ejbjmoordb.pojos.UserInfo;
import com.avbravo.jmoordbunit.anotation.Test;
import com.avbravo.jmoordbunit.test.UnitTest;
import com.avbravo.transporteejb.entity.Rol;
import com.avbravo.transporteejb.repository.RolRepository;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.DependsOn;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.inject.Inject;
import org.bson.Document;

/**
 *
 * @author avbravo
 */
@Startup
@Singleton
@DependsOn("ConductorTest")
public class RolTest {
    @Inject
    UnitTest unitTest;
    @Inject
    RolRepository rolRepository;
     @PostConstruct
    void init() {
        unitTest.start(RolTest.class);
        rolRepository.setDatabase("transporte_test");
        findAll();
        save();
      delete();
      
    }
    
      @PreDestroy
    public void destroy() {
        unitTest.end(RolTest.class);
       
    }
    @Test
    private void findAll(){
        unitTest.assertNotEquals("findAll()", 0, rolRepository.findAll().size());
    }
  
    @Test
    private void save(){
        try {
            Rol rol = new Rol();
            rol.setIdrol("TEST");
            rol.setRol("ROL TESTING");
            rol.setActivo("si");
            List<UserInfo> userInfoList = new ArrayList<>();
            userInfoList.add(new UserInfo("xx", "avbravo", JsfUtil.getFechaActual(), "save()"));
            rol.setUserInfo(userInfoList);
            unitTest.assertTrue("save()", rolRepository.save(rol));
        } catch (Exception e) {
            unitTest.fail("save()", rolRepository.getException().toString());
            System.out.println("save() "+e.getLocalizedMessage());
        }
    }
    
    @Test
    private void delete(){
        unitTest.assertTrue("delete()", rolRepository.delete(new Document("idrol","TEST")));
    }
    
   
    
    
}



Wednesday, November 14, 2018

jmoordbUnit

Esta disponible la versiòn 0.4.3 de jmoordbunit, un framework especifico para hacer test para jmoordb en aplicaciones Java Enterprise Edition/Jakarta EE que utilizan bases de datos NoSQL (MongoDB).
https://avbravo.gitbooks.io/jmoordbunit/content/

Dependencias
<dependency>
     <groupId>com.github.avbravo</groupId>
     <artifactId>jmoordbunit</artifactId>
     <version>0.4.3</version>
 </dependency>
Repositorio

<dependency>
     <groupId>com.github.avbravo</groupId>
     <artifactId>jmoordbunit</artifactId>
     <version>0.4.3</version>
 </dependency>

Su uso es muy básico

@Startup
@Singleton
@DependsOn("TestEnvironment")
@Test
@Report(path = "/home/avbravo/Descargas/")
public class BodegaTest {

    @Inject
    UnitTest unitTest;
    @Inject
    BodegaRepository bodegaRepository;
   
    @PostConstruct
    void init() {
        unitTest.start(BodegaTest.class);
       
        save();
        findAll();

    }

    @Test
    private void save() {
        try {
           
            //Mock
            Bodega bodega = new Bodega();
            bodega.setIdbodega("bodega-test");
            bodega.setDireccion("Panama");
            bodega.setTelefono("(507)");
            //User info es una clase que usa el framework para guardar referencias
            //de usuarios
            List<UserInfo> list = new ArrayList<>();
            bodega.setUserInfo(list);
            bodega.setActivo("si");
           
            unitTest.assertEquals("save()", true,bodegaRepository.save(bodega));
        } catch (Exception e) {
            System.out.println("save() " + e.getLocalizedMessage());
        }

    }

    @Test
    private void findAll() {

    unitTest.assertNotEquals("findAll", 0, bodegaRepository.findAll().size());


    }

    @PreDestroy
    public void destroy() {
        unitTest.end(BodegaTest.class);
    }
}


generando los reportes del test


También genera interfaz gráfica en base a los test

@Test
    public String save() {
        try {

//Mock
            Color color = new Color();
            color.setActivo("si");
            color.setAutoincrementable(15);
            color.setIdcolor("rojo");
            List<UserInfo> list = new ArrayList<>();
            color.setUserInfo(list);
            Boolean expResult = true;
            Boolean save = unitTest.assertEquals("save", true, colorRepository.save(color));
            if (!save) {
                /*
            Dibuja la interfaz
                 */
                unitTest.form();
                unitTest.formTitle("Registros de colores");
                unitTest.panel();

                unitTest.panelAddInputText(Arrays.asList(new InputText("idcolor", color.getIdcolor()),
                        new InputText("activo", color.getActivo())
                ));

                unitTest.panelClose();
                unitTest.buttonGreen("Save");
                unitTest.formClose();

                unitTest.errorMessage("No se pudo guardar");

            }

        } catch (Exception e) {
            System.out.println("save() " + e.getLocalizedMessage());
        }

        return "";
    }



Friday, November 09, 2018

Jugando con Java Lambda/Stream

Jugando con Java Lambda/Stream
Java ofrece características interesantes

  List<Vehiculo> validos = temp.stream()
                        .filter(x -> isVehiculoValid(x)).collect(Collectors.toList()); 

 validos.forEach((v) -> {
                        Optional<Vehiculo> optional = vehiculoList.stream()
                                .filter(v2 -> v2.getIdvehiculo() == v.getIdvehiculo())
                                .findAny();
                        if (!optional.isPresent()) {
                            suggestions.add(v);
                        }
                    });



Si no usamos Java 8

                    for (Vehiculo v : validos) {
                        found = false;
                        for (Vehiculo v2 : vehiculoList) {
                            if (v.getIdvehiculo() == v2.getIdvehiculo()) {
                                found = true;
                            }

                        }
                        if (!found) {
                            suggestions.add(v);
                        }
                    }



public Boolean isVehiculoValid(Vehiculo vehiculo) {
        Boolean valid = false;
        try {

            if (vehiculo.getActivo().equals("si") && vehiculo.getEnreparacion().equals("no")) {

                for (Tipovehiculo t : solicitud.getTipovehiculo()) {
                    if (vehiculo.getTipovehiculo().getIdtipovehiculo().equals(t.getIdtipovehiculo())) {
                        valid = true;
                        break;
                    }
                }
            }

        } catch (Exception e) {
            JsfUtil.errorMessage("isVehiculoValido()) " + e.getLocalizedMessage());
        }
        return valid;
    }

Thursday, November 08, 2018

< p:schedule > con diálogos

Cuando deseamos usar un <p:schedule> con dialogos debemos usar <p:commandButton>
y agregar un <b:growl> al dialogo, para que este no se cierre y se muestren los mensajes.

al dar clic en cualquier fecha




cuando se da clic en el botón editar y no hemos colocado los datos requeridos se muestra el growl con los mensajes.


Componente schedule


 <p:schedule id="schedule"                            
                                value="#{calendarioSolicitudController.eventModel}" widgetVar="myschedule" timeZone="GMT-5" locale="es">

                        <p:ajax  event="eventSelect"  listener="#{calendarioSolicitudController.onEventSelect}" update="eventDetails" oncomplete="PF('eventDialog').show();" />
                        <!--<p:ajax  event="dateSelect" listener="#{calendarioSolicitudController.onDateSelectCalendar}" update="newDetails" oncomplete="PF('newDialog').show();" />-->
                    </p:schedule>


Controller


    private ScheduleModel eventModel;

    private ScheduleModel lazyEventModel;

    private ScheduleEvent event = new DefaultScheduleEvent();  @PostConstruct


    public void init() {
        try {
   cargarSchedule();

        } catch (Exception e) {
            JsfUtil.errorMessage("init() " + e.getLocalizedMessage());
        }
    }

   public void cargarSchedule() {
        try {

            Document doc = new Document("tipovehiculo.idtipovehiculo", tipovehiculo.getIdtipovehiculo()).append("estatus.idestatus", estatus.getIdestatus()).append("activo", "si");
            solicitudList = solicitudRepository.findBy(doc, new Document("fecha", 1));
            eventModel = new DefaultScheduleModel();
            if (!solicitudList.isEmpty()) {
                solicitudList.forEach((a) -> {

                    eventModel.addEvent(
                            new DefaultScheduleEvent("# " + a.getIdsolicitud() + " Mision:" + a.getMision() + " Responsable: " + a.getUsuario().get(1).getNombre() + " " + a.getEstatus().getIdestatus(), a.getFechahorapartida(), a.getFechahoraregreso())
                    );
                });
            }

        } catch (Exception ex) {
            JsfUtil.errorMessage("cargarSchedule() " + ex.getLocalizedMessage());
        }
    }



 public void onEventSelect(SelectEvent selectEvent) {
        try {
            // esnuevo = false;
            viajesSelected = new Viajes();
            esDocente = false;
            event = (ScheduleEvent) selectEvent.getObject();
            esAprobado = false;
            String title = event.getTitle();
            Integer i = title.indexOf("M");

            Integer idsolicitud = 0;
            if (i != -1) {
                idsolicitud = Integer.parseInt(title.substring(1, i).trim());
            }
            solicitud.setIdsolicitud(idsolicitud);
            Optional<Solicitud> optional = solicitudRepository.findById(solicitud);
            if (optional.isPresent()) {
                solicitud = optional.get();

                solicita = solicitud.getUsuario().get(0);
                responsable = solicitud.getUsuario().get(1);
                facultadList = solicitud.getFacultad();
                unidadList = solicitud.getUnidad();
                carreraList = solicitud.getCarrera();
                solicitudSelected = solicitud;
                estatusSelected = solicitud.getEstatus();
                esDocente = solicitud.getTiposolicitud().getIdtiposolicitud().equals("DOCENTE");
                if (solicitud.getEstatus().getIdestatus().equals("APROBADO")) {
                    esAprobado = true;
                    List<Viajes> list = new ArrayList<>();
                    list = viajesRepository.findBy(new Document("solicitud.idsolicitud", solicitud.getIdsolicitud()));
                    if (list.isEmpty()) {
                        JsfUtil.warningMessage(rf.getMessage("warning.notexitsviajeconesasolicitud"));
                    } else {
                        viajesSelected = list.get(0);
                    }
                }else{
                    viajesSelected.setActivo("si");
                    viajesSelected.setFechahorainicioreserva(solicitud.getFechahorapartida());
                    viajesSelected.setFechahorafinreserva(solicitud.getFechahoraregreso());
                }
            }

        } catch (Exception e) {

            JsfUtil.errorMessage("onEventSelect() " + e.getLocalizedMessage());
        }
    }


 @Override
    public String edit() {
        try {
            if (esAprobado) {
                if (JsfUtil.fechaMayor(viajes.getFechahorainicioreserva(), solicitud.getFechahorapartida())) {

                    JsfUtil.warningDialog(rf.getAppMessage("warning.view"), rf.getMessage("warning.fechainicioreservamayorfechapartida"));
                    return "";
                }
                if (JsfUtil.fechaMenor(viajes.getFechahorafinreserva(), solicitud.getFechahoraregreso())) {

                    JsfUtil.warningDialog(rf.getAppMessage("warning.view"), rf.getMessage("warning.fechafinreservamenorfecharegreso"));
                    return "";
                }

                if(solicitud.getNumerodevehiculos() != vehiculoList.size()){
                    JsfUtil.warningDialog(rf.getAppMessage("warning.view"), rf.getMessage("warning.numerodevehiculosnoigualvehiculos"));
                    return "";
                }
                if(conductorList.size() != vehiculoList.size()){
                    JsfUtil.warningDialog(rf.getAppMessage("warning.view"), rf.getMessage("warning.conductoresnoigualvehiculos"));
                    return "";
                }
             
             
             
      viajes = viajesSelected;
                Integer idviaje = autoincrementableTransporteejbServices.getContador("viajes");
                viajes.setActivo("si");
                viajes.setIdviaje(idviaje);
                viajes.setConductor(conductorList);
                viajes.setVehiculo(vehiculoList);
                viajes.setSolicitud(solicitud);
                viajes.setNumerovehiculos(solicitud.getNumerodevehiculos());
             
             

                viajes.setUserInfo(userInfoServices.generateListUserinfo(loginController.getUsername(), "create"));
                if (viajesRepository.save(viajes)) {
                    revisionHistoryTransporteejbRepository.save(revisionHistoryServices.getRevisionHistory(viajes.getIdviaje().toString(), loginController.getUsername(),
                            "create", "viajes", viajesRepository.toDocument(viajes).toString()));
                    JsfUtil.successMessage(rf.getAppMessage("info.save"));

                } else {
                    JsfUtil.successMessage("save() " + viajesRepository.getException().toString());
                    return "";
                }
            }

            solicitud.setEstatus(estatusSelected);

            revisionHistoryTransporteejbRepository.save(revisionHistoryServices.getRevisionHistory(solicitud.getIdsolicitud().toString(), loginController.getUsername(),
                    "update", "solicitud", solicitudRepository.toDocument(solicitud).toString()));

            solicitudRepository.update(solicitud);

            JsfUtil.infoDialog(rf.getAppMessage("info.view"), rf.getAppMessage("info.update"));
        } catch (Exception e) {

            JsfUtil.errorMessage("edit()" + e.getLocalizedMessage());
        }
        return "";
    }



Formulario

  <p:dialog widgetVar="eventDialog" header="#{msg['dialogo.solicitud']}"
                      width="650" height="450"
                      styleClass="customDialog"

                      responsive="true"

                      showEffect="clip" hideEffect="clip">
                <b:panelGrid id="eventDetails" colSpans="2,10" size="xs" >

                    <p:outputLabel  value="#{msg['field.idsolicitud']}" />
                    <p:outputLabel  value="#{calendarioSolicitudController.solicitud.idsolicitud}" id="idsolicitud"   />



                    <p:outputLabel  value="#{msg['field.fechapartida']}" />
                    <p:fieldset >
                        <p:calendar  disabled="true"  size="8"                               
                                     style="background-color: grey;"
                                     pattern="dd/MM/yyyy" value="#{calendarioSolicitudController.solicitud.fechahorapartida}"  />

                        <p:outputLabel  value="#{msg['field.horapartida']}" />     
                        <p:calendar  disabled="true" 
                                     size="8"
                                     pattern="HH:mm:ss a" value="#{calendarioSolicitudController.solicitud.fechahorapartida}"  />


                    </p:fieldset>


                    <p:outputLabel  value="#{msg['field.lugarpartida']}" />

                    <p:outputLabel value="#{calendarioSolicitudController.solicitud.lugarpartida}" id="lugarpartida"   />


                    <p:outputLabel  value="#{msg['field.fecharegreso']}" />
                    <p:fieldset >

                        <p:calendar  disabled="true"  size="8"                               
                                     style="background-color: grey;"
                                     pattern="dd/MM/yyyy" value="#{calendarioSolicitudController.solicitud.fechahoraregreso}"  />



                        <p:outputLabel  value="#{msg['field.horaregreso']}" />
                        <p:calendar  disabled="true" 
                                     size="8"
                                     pattern="HH:mm:ss a" value="#{calendarioSolicitudController.solicitud.fechahoraregreso}"  />


                    </p:fieldset>

                    <p:outputLabel  value="#{msg['field.numerodevehiculos']}" />
                    <p:outputLabel  value="#{calendarioSolicitudController.solicitud.numerodevehiculos}" />

                    <b:commandButton value="#{app['button.close']}"
                                     iconAwesome="fa-close"
                                     oncomplete="PF('eventDialog').hide();"/>

                    <p:commandButton
                        rendered="#{applicationMenu.menuBarAdministracion}"
                        value="#{app['button.edit']}"
                        update="growl"
                        oncomplete="PF('myschedule').update(); "
                        actionListener="#{calendarioSolicitudController.edit}"                   

                        />

                    <b:growl id="growl"/>

                </b:panelGrid>

            </p:dialog>


ejbjmoordb 0.12 , soporte para instrucciones sql

S oporte de SQL en ejbjmoordb a partir de la versiòn 0.11  <dependency>             <groupId>com.github.avbravo</groupId>...