Česky   |  Deutsch   |  English   |  Español   |  Français   |  Indonesia   |  日本語   |  한글   |  Polski   |  Português (BR)   |  Türkçe   |  中文   |  正體中文   |  Tu idioma  
PlanetNetbeans
Planet NetBeans es un rama de NetBeans relacionado con toda la Blogosphere.
Feeds
[RSS 1.0 Feed] [RSS 2.0 Feed]
[FOAF Subscriptions] [OPML Subscriptions]
¿Tienes un blog acerca de NetBeans? Agrega tu blog a PlanetNetBeans.
Feed Subscripciones

Powered by:    Planet

Última actualización:
July 28, 2016 08:02 AM
All times are UTC

Sponsored by
sponsored by Oracle

visit NetBeans website
AVBravo - July 14, 2016 05:29 PM
COMPILATION ERROR : error: cannot find symbol en Maven

Entre algunos errores que podemos encontrar al crear un proyecto  maven
COMPILATION ERROR :  error: cannot find symbol.
Generalmente tenemos una clase en uno de los paquetes , y esta la importamos en otro paquete pero al compilar el proyecto se genera errores como este:

Editamos el archivo pom.xml y agregamos
    <build>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>


AVBravo - July 13, 2016 03:11 AM
Un ejemplo sencillo de Refactorización y Genericos

Un ejemplo sencillo de Refactorización y Genericos

public class Refactorizador<K, V> {

    public V copyFromBeans(K k, V v) {
        try {
            Class claseK = k.getClass();
            Class claseV = v.getClass();

            Method[] metodosK = claseK.getMethods();

            for (Method method : metodosK) {
                if (isGetter(method)) {
                    Method metodoGetK = claseK.getDeclaredMethod(method.getName());
                    Method metodoSetV = claseV.getDeclaredMethod(changeGetBySet(method.getName()), method.getReturnType());
                    metodoSetV.invoke(v, metodoGetK.invoke(k));
                }

            }

        } catch (Exception e) {
            System.out.println("refactorizador() " + e.getLocalizedMessage());
        }
        return v;
    }
   
     public  boolean isGetter(Method method) {

        if (!method.getName().startsWith("get")) {
            return false;
        }
        if (method.getName().startsWith("getClass")) {
            return false;
        }

        if (method.getParameterTypes().length != 0) {
            return false;
        }
        if (void.class.equals(method.getReturnType())) {
            return false;
        }
        return true;
    }

    public  boolean isSetter(Method method) {
        if (!method.getName().startsWith("set")) {
            return false;
        }
        if (method.getParameterTypes().length != 1) {
            return false;
        }
        return true;
    }

    /**
     * cambia el metodo get por set
     *
     * @param metodo
     * @return
     */
    public String changeGetBySet(String metodo) {
        try {

            metodo = metodo.replace("get", "set");
        } catch (Exception e) {
            System.out.println("changeGetBySet()" + e.getLocalizedMessage());
        }
        return metodo;
    }
  
}
Clases:
public class Persona{
   private String nombre;

   private String direccion;
//get/set

}
public class Generales{
   private String nombre;
   private String direccion;
//get/set
}

Uso:
Copia el contenido de la clase Persona a la clase Generales
Refactorizador refactorizador = new Refactorizador();
Persona persona = new Persona();
persona.setNombre("X12");
persona.setDireccion("Panama");

 Generales generales = new Generales();
generales= (Generales) refactorizador.copyFromBeans(persona,generales);

AVBravo - June 29, 2016 02:35 PM
Entrevista a Adam Bien sobre Microprofile.io

Recientemente se han creado iniciativas para impulsar los avances en la plataforma JEE  como son Java EE Guardians (https://javaee-guardians.io/) con el propósito de impulsar la plataforma JEE8 , y en los últimos días  algunas empresas entre las que figuran (Redhat,Payara, IBM,Tomitribe, LJC) se unieron para  MicroProfile ( http://microprofile.io), para promover la implementación de Microservicios dentro de JEE.
En esta oportunidad entreviste por segunda vez a Adam Bien( http://www.adam-bien.com/), sobre algunos aspectos generales de Microprofile.



1. Do you consider that microservices is fundamental to the Java Ecosystem?

In most projects we built “microservices” for several years without knowing the term. Microservices are not fundamental, they are rather natural fit to Java EE.

2. Do you believe that there is a delay in the adoption of microservices?

No. My clients are perfectly happy with Java EE 7 full profile. It is surprisingly lean.
However, monitoring could be even more standardized (beyond JSR-77) and exposed via stock JAX-RS.

Monitoring and other non-functional requirements are not the part of the microprofile.io, but this is just the start.

3. Why does this alliance arise prior to a JCP specification?

Do you mean microprofile.io? It is just a pragmatic way to involve community. The goal is to standardize whatever possible with JCP. But we should involve the community first.


4.Will major changes in the use of microservices affect the  develop meant of business applications?
All project driven by actual requirements and not by esoteric architectures should look already surprisingly microservices compliant.

5- Was us your opinion about  Java EE Guardians  and  MicroProfile.io?
I did not created Java EE Guardians (JEG). Because of lack of time I’m watching “from outside” what they are doing. IMO The JEG try to explain Oracle that Java EE is important for business. I share their opinion: http://www.adam-bien.com/roller/abien/entry/oracle_moves_in_strange_ways

microprofile.io focusses on a minimal Enterprise Java profile. I’m not sure whether we can officially call it Java EE 8 MicroProfile.

It wouldn’t surprise me, if another Java EE related website is going to be published soon :-)






6. What recommendations  could you give us?

Write 90% business code, focus on domain, forget the fashion. Simplicity wins in long term.

Agradecido a Adam Bien por su tiempo y sus aportes.


AVBravo - June 26, 2016 07:58 PM
Funciones Year en JPA

Si deseas usar funciones SQL con JPA, podemos hacerlo mediante FUNC('funcion',nombre-columna')


public List<Recibos> findByIdentificadorAnioActividades(Identificador id, Integer anio, Actividades idactividades) {
        Query query = em.createQuery("SELECT r FROM Recibos r WHERE r.id = :id and FUNC('YEAR',r.fecha) = :anio and r.idactividades = :idactividades and r.anulado ='no'");
        query.setParameter("idactividades", idactividades);
        query.setParameter("anio", anio);
        return query.setParameter("id", id).getResultList();
    }

AVBravo - June 15, 2016 03:20 AM
JavaEE Guardians Petición


Como parte de las actividades del grupo Java EE Guardians, https://javaee-guardians.io/, se creo una petición para lograr avances en una de las plataformas de desarrollo mas robustas Java EE.
Puedes firmarla si estas de acuerdo con la propuesta en el siguiente enlace:
https://www.change.org/p/larry-ellison-tell-oracle-to-move-forward-java-ee-as-a-critical-part-of-the-global-it-industry

Hasta este momento lleva más de 800 firmas, de desarrolladores, lideres de grupos de usuarios,etc.

AVBravo - June 11, 2016 03:45 PM
JavaEE 8 con JPA muy fácil

JavaEE 8 con JPA muy fácil
Que tan fácil es programar en JavaEE8, aun no esta terminado JavaEE8, pero desde hace algún tiempo tenemos la oportunidad de ir probando  las características que implementa.
Usaremos un proyecto creado con JPA Modeler, y mostraremos lo sencillo que es implementar un nuevo modulo en este ejemplo para almacenar la información de una persona en una tabla en MySQL.
Agregamos a la pagina principal el nuevo modulo llamado persona.


Creamos un formulario con los datos de la persona

Lo mostramos en una tabla


Creamos un entity llamado Persona
@Entity
public class Persona implements Serializable {

    @Id
    @FormParam("id")
    private Long id;

    @Column(name = "nombre")
    @Basic
    @NotNull
    @Size(min = 5, max = 50, message = "El nombre debe tener entre 5 y 50 caracters")
    @FormParam("nombre")
    private String nombre;

    @Basic
    @FormParam("direccion")
    private String direccion;
//get/set
}

Creamos el facade PersonaFacade
@Stateless
@Named("persona")
public class PersonaFacade extends AbstractFacade<Persona> {

    @PersistenceContext(unitName = "DEFAULT_PU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public PersonaFacade() {
        super(Persona.class);
    }
    
}

Creamos el controller PersonaController
@Path("persona")
public class PersonaController {

    @Inject
    private Models model;
    @Inject
    private PersonaFacade facade;
    @Inject
    private BindingResult validationResult;
    @Inject
    private ErrorBean error;

    @GET
    @Path("new")
    @Controller
    public String emptyPersona() {
        return "/view/persona/create.jsp";
    }

    @POST
    @Path("new")
    @Controller
    @ValidateOnExecution(type = ExecutableType.NONE)
    @CsrfValid
    public String createPersona(@Valid
            @BeanParam Persona entity) {
        if (validationResult.isFailed()) {
            return ValidationUtil.getResponse(validationResult, error);
        }
        facade.create(entity);
        return "redirect:persona/list";
    }

    @GET
    @Path("update/{id}")
    @Controller
    public String editPersona(@PathParam("id") Long id) {
        model.put("PERSONA", facade.find(id));
        return "/view/persona/update.jsp";
    }

    @POST
    @Path("update")
    @Controller
    @ValidateOnExecution(type = ExecutableType.NONE)
    @CsrfValid
    public String updatePersona(@Valid
            @BeanParam Persona entity) {
        if (validationResult.isFailed()) {
            return ValidationUtil.getResponse(validationResult, error);
        }
        facade.edit(entity);
        return "redirect:persona/list";
    }

    @GET
    @Path("remove/{id}")
    @Controller
    public String removePersona(@PathParam("id") Long id) {
        facade.remove(facade.find(id));
        return "redirect:persona/list";
    }

    @GET
    @Path("{id}")
    @Controller
    public String findPersona(@PathParam("id") Long id) {
        model.put("PERSONA", facade.find(id));
        return "/view/persona/view.jsp";
    }

    @GET
    @Path("list")
    @Controller
    public String findAllPersona() {
        model.put("PERSONA_LIST", facade.findAll());
        return "/view/persona/list.jsp";
    }
    
}



Ejemplo del jsp









AVBravo - June 08, 2016 01:37 AM
Java EE Guardians

Java EE Guardians



Después de unos meses sin escribir, ya que me encontraba en algunos proyectos que me han mantenido con un retraso en la publicación de algunas cosas sobre NetBeans , Java,JavaEE.
En esta ocasión deseo compartir con ustedes este iniciativa Java EE Guardians.
En la cual deseo agradecer a Reza  Rahman por la invitación a participar de este incitativa.

Java EE Guardians es un grupo de personas comprometidas con el futuro de Java EE, preocupados por los retrasos en los avances de JEE8 , el objetivo es preservar los intereses de la comunidad incluyendo Oracle para continuar con el éxito de JEE en el lado del servidor.
JEE es muy importante para el ecosistema de Java en general,  es usado en aplicaciones de misión critica y grandes cantidades de aplicaciones están escritas en JEE, por lo cual es fundamental la evolución de la plataforma.

Que actividades se están haciendo:

  • Evangelización de JEE, JEE8
  • Apoyo a los JSRs de Java EE 8
  • Discusiones activas con los miembros del grupo de expertos de JavaEE8
Hay muchas actividades en las que puedes participar.
Algunos enlaces de interés donde se amplían los detalles en el sitio oficial https://javaee-guardians.io/

Twitter:
JavaEE Guardian

Reza Rahman







AVBravo - December 02, 2015 02:23 AM
Web Responsive con Primefaces

Web Responsibe con Primefaces

Primefaces 5.3 soporta Web Responsive, por ejemplo



en el panelGrid indicamos la propiedad layout con el valor de grid
<p:panelGrid columns="3" layout="grid">


AVBravo - December 01, 2015 01:11 AM
Reportes con imagenes en Java Server Faces

Reportes con imagenes en Java Server Faces
Deseamos mostrar en el reporte la imagen escudonacional.gif, que está almacenada en
/resources/imagenes


En el controller que usamos para imprimir crear el metodo 
 public static String getPath() { 
        try { 
            ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance() 
                    .getExternalContext().getContext(); 
            return ctx.getRealPath("/"); 

        } catch (Exception e) { 

           JSFUtil.addErrorMessage("getPath() " + e.getLocalizedMessage()); 
   } 
        return null; 

    } 


En el método imprimir, generar el path mediante el llamado a getPath(), y colocar la 
ubicación de la imagen. 

private String imprimirGeneralIngresos(List<InformeGeneralIngresos> list, Double 
totalenviado, Double totalcomision, Double totalitbm, Double total) { 
        try { 

            String ruta = "/resources/reportes/informes/informegeneralingresos.jasper"; 
            HashMap parameters = new HashMap(); 


            ​
String path = getPath() + "resources/imagenes/escudonacional.gif"; 
                  parameters.put("P_RUTAIMAGEN", path);  


            gestorImpresion.imprimir(list, ruta, parameters); 
        } catch (Exception ex) { 
            JSFUtil.addErrorMessage("imprimirEnviados() " + ex.getLocalizedMessage()); 
        } 
        return null; 
    } 




 En el diseñador de Reporte  
Agregar el parámetro P_RUTAIMAGEN de tipo String 

Arrastrar un objeto de tipo image 

se muestra el dialogo para seleccionar la imagen 

Darle clic en Cancelar para no seleccionar ninguna imagen 

se muestra el icono que representa a la imagen 


dar clic en el image y buscar en properties , la propiedad Image Expression 

dar clic en el boton ... 

En el diálogo dar clic en Parameters y  seleccionar P_RUTAIMAGEN 

Quedaría de la siguiente manera, dar clic en Ok 


El icono que se mostraba anteriormente desaparece y queda el área de la imagen que será 
reemplaza por la que indiquemos en el controller 

Compilar el reporte 

Al ejecutar el proyecto se muestra la imagen en el reporte. 














AVBravo - November 21, 2015 04:30 AM
Usar un splitButton con datatable primefaces

En algunas ocasiones necesitamos desplegar varias opciones en un datatable, para evitar tener que definir muchas columnas, podemos utilizar un splitButton , que invoca un dialogo en base a cada opción seleccionada.


Al seleccionar la opción detalle, muestra un dialogo con el detalle de la fila seleccionada.
    <p:column style="width:40px;">  

                                    <p:fragment autoUpdate="true"> 

                                        <p:splitButton title="#{msg.opciones}"    icon="fa fa-align-left">
                                            
                                            <p:menuitem value="#{msg.detalle}" title="#{msg.detalle}" update=":form:growl,:form:datatableImpuestos   ,:form:panelcomentario" oncomplete= "PF('detalleDialogVar').show()"  icon="fa fa-file-text-o" >
                                                  <f:setPropertyActionListener value="#{item}" target="#{impuestoscontribuyentesController.selected}" />  
                                            </p:menuitem>
                                          
                                             <p:menuitem value="#{msg.pagos}" title="#{msg.pagos}" update=":form:growl,:form:datatableImpuestos   ,:form:panelpagos" oncomplete= "PF('pagosDialogVar').show()"  icon="fa fa-pinterest-p" >
                                                  <f:setPropertyActionListener value="#{item}" target="#{impuestoscontribuyentesController.selected}" />  
                                            </p:menuitem>
                                                 <p:separator />
                                            <p:menuitem value="#{msg.morosidad}" title="#{msg.morosidad}" update=":form:growl,:form:datatableImpuestos   ,:form:panelmorosidad" oncomplete= "PF('morosidadDialogVar').show()"  icon="fa fa-medium" >
                                                  <f:setPropertyActionListener value="#{item}" target="#{impuestoscontribuyentesController.selected}" />  
                                            </p:menuitem>
                                         <p:menuitem value="#{msg.recargo}" title="#{msg.recargo}" update=":form:growl,:form:datatableImpuestos   ,:form:panelrecargo" oncomplete= "PF('recargoDialogVar').show()"  icon="fa fa-bell" >
                                                  <f:setPropertyActionListener value="#{item}" target="#{impuestoscontribuyentesController.selected}" />  
                                            </p:menuitem>
                                       
                                           
                                        </p:splitButton>

                                      
                                    </p:fragment>


                                </p:column>


El dialogo
  <p:dialog  modal="false" 
                                   height="220"  width="510" draggable="true"
                                   id="pagarDialogVar"
                                   widgetVar="detalleDialogVar">

                            <b:panel id="panelcomentario2" look="primary" title="#{msg.detalle}">
                                <!--<p:panelGrid columns="2" id="panelcomentario">-->
                                <b:panelGrid id="paneldetalle" colSpans="2,10">
                                    <p:outputLabel value="#{msg.idnivel6}"/>
                                    <p:outputLabel value="#{impuestoscontribuyentesController.selected.idnivel6.idnivel6}"/>
                                    <p:outputLabel value="#{msg.nombre}"/>

                                    <p:outputLabel value="#{impuestoscontribuyentesController.selected.idnivel6.nombre}"/>


                                    <h:outputText value="#{msg.rango}"/>

                                    <h:outputText value="( #{impuestoscontribuyentesController.selected.idnivel6.minimo} a #{impuestoscontribuyentesController.selected.idnivel6.maximo} )"/>





                                    <p:commandButton 
                                        icon="ui-icon-close"
                                        update=":form:datatableImpuestos   ,:form:growl"
                                        onclick="PF('comentarioDialogVar').hide();"
                                        type="button" />


                                </b:panelGrid>


                            </b:panel>

                        </p:dialog>




AVBravo - November 10, 2015 09:37 PM
PrimeFaces Theme Development

Ya esta disponible el libro PrimeFaces Theme Development. de Andy Bailey, Sudheer Jonna
Si deseas cambiar la apariencia de PrimeFaces, crear tus propios Temas, este libro te guía paso a paso en como hacerlo.-

https://www.packtpub.com/web-development/primefaces-theme-development

Es la seguna ocasión que tengo el placer de ser revisor de un libro de Sudhher Jonna, mis felicitaciones por el trabajo realizado y a Pack Publishing por la oportunidad de participar en sus proyectos.



AVBravo - November 07, 2015 06:48 PM
Autocomplete con Converter

Autocomplete con Converter

Converter antes de JSF 2.3 no soportan CDI

, por lo que debemos usarlo a través de @Named y @RequestScoped

En el formulario sin jsf 2.3

Usamos            <f:converter binding="#{actividadesConverter}" />

<p:outputLabel  rendered="#{!actividadesController.nuevoregistro}"
                                               value="#{msg.actividad}" for="actividad" />
                               <p:autoComplete  scrollHeight="250"   dropdown="true"  size="45"   
                                                rendered="#{!actividadesController.nuevoregistro}"
                                                value="#{actividadesController.selected}"  
                                                completeMethod="#{actividadesController.actividadesServices.completeActividad}"  
                                                var="p"  
                                                itemLabel="#{p.actividad}"  itemValue="#{p}"
                                                forceSelection="true">
                                   <f:converter binding="#{actividadesConverter}" />
                                   <p:ajax event="itemSelect" listener="#{actividadesController.handleSelect}" update=":form:panel,:form:growl" />  
                                   <f:facet name="itemtip">
                                       <h:panelGrid columns="1" cellpadding="5">
                                           <h:outputText value="#{p.actividad}" />
                                           <h:outputText value="#{p.tipo}" />
                                           <h:outputText value="#{p.idactividades}" />
                                       </h:panelGrid>
                                   </f:facet>
                               </p:autoComplete>




En el converter sin jsf 2.3

Debemos usar las anotaciones @Named
@RequestScoped
import com.javscaz.brigem.Actividades;
import com.javscaz.brigem.ejb.ActividadesFacade;
import com.javscaz.brigem.generales.JSFUtil;
import javax.enterprise.context.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.inject.Inject;
import javax.inject.Named;


@Named
@RequestScoped
public class ActividadesConverter implements Converter {
@Inject
ActividadesFacade actividadesFacade;
   @Override
   public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {
       System.out.println("");
       Actividades actividades = new Actividades();
       try {
           if (null != s) {
               actividades.setIdactividades(Integer.parseInt(s));
               actividades = actividadesFacade.findById(actividades.getIdactividades());
           }
       } catch (Exception e) {
           JSFUtil.addErrorMessage("getAsObject()" + e.getLocalizedMessage());
       }
       return actividades;
   }


   @Override
   public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
       String r = "";
       try {


           if (o instanceof Actividades) {
               Actividades actividades = (Actividades) o;
               r = String.valueOf(actividades.getIdactividades());
           } else if (o instanceof String) {
               r = (String) o;
           }
       } catch (Exception e) {
           JSFUtil.addErrorMessage("getAsString()" + e.getLocalizedMessage());


       }
       return r;
   }
}

Crear el EJB SessionBean  Services

Es idéntico para JSF 2.3 y anteriores, alli colocamos los complete que seran invocados desde los formularios

import com.javscaz.brigem.Actividades;
import com.javscaz.brigem.ejb.ActividadesFacade;
import com.javscaz.brigem.generales.JSFUtil;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.inject.Inject;


/**
*
* @author avbravo
*/
@Stateless
public class ActividadesServices {


     @Inject
   ActividadesFacade actividadesFacade;


  
   public List<Actividades> completeActividad(String query) {
       List<Actividades> actividadesList = new ArrayList<>();
       List<Actividades> suggestions = new ArrayList<>();
       try {
           query = query.trim();


           actividadesList = actividadesFacade.findByActividadLike(query.toLowerCase());
           actividadesList.stream().forEach((p) -> {
               suggestions.add(p);
           });


       } catch (Exception e) {
           JSFUtil.addErrorMessage("completeComercio() " + e.getLocalizedMessage());
       }


       return suggestions;
   }


    
}


En el Controller

En cada controller donde se usará el autocomplete debemos injectar el Services y generar los métodos set/get


Injectar el services


@Inject
   ActividadesServices actividadesServices;
   
   public ActividadesServices getActividadesServices() {
       return actividadesServices;
   }


   public void setActividadesServices(ActividadesServices actividadesServices) {
       this.actividadesServices = actividadesServices;
   }


JSF 2.3 Soporta CDI en los Converter



Crear al converter con jsf 2.3

Usar @FacesConverter(value = "actividadesConvertidor")


import com.javscaz.brigem.Nivel1;
import com.javscaz.brigem.generales.JSFUtil;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;


/**
*
* @author avbravo
*/
@FacesConverter(value = "actividadesConvertidor")
public class ActividadesConvertidor implements Converter {
@Inject
ActividadesFacade actividadesFacade;
   @Override
   public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {


       Actividades actividades = new Actividades();
       try {
           if (null != s) {
               actividades.setIdactividades(Integer.parseInt(s));
               actividades = actividadesFacade.findById(actividades.getIdactividades());
           }
       } catch (Exception e) {
           JSFUtil.addErrorMessage("getAsObject()" + e.getLocalizedMessage());
       }
       return actividades;
   }


   @Override
   public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
       String r = "";
       try {


           if (o instanceof Actividades) {
               Actividades actividades = (Actividades) o;
               r = String.valueOf(actividades.getIdactividades());
           } else if (o instanceof String) {
               r = (String) o;
           }
       } catch (Exception e) {
           JSFUtil.addErrorMessage("getAsString()" + e.getLocalizedMessage());


       }


       return r;
   }


}

En el formulario con jsf 2.3



<p:autoComplete  scrollHeight="250"   dropdown="true"  size="45"   
                                                rendered="#{!actividadesController.nuevoregistro}"
                                               value="#{actividadesController.selected}"  
                                               completeMethod="#{actividadesController.actividadesServices.completeActividad}"  
                                               var="p"  
                                               itemLabel="#{p.actividad}"  itemValue="#{p}"
                                               converter="actividadesConverter" forceSelection="true">


                                   <p:ajax event="itemSelect" listener="#{actividadesController.handleSelect}" update=":form:panel,:form:growl" />  
                                   <f:facet name="itemtip">
                                       <h:panelGrid columns="1" cellpadding="5">
                                           <h:outputText value="#{p.actividad}" />
                                           <h:outputText value="#{p.tipo}" />
                                       </h:panelGrid>
                                   </f:facet>

                               </p:autoComplete>

AVBravo - November 04, 2015 05:20 PM
NetBeans 8.1 Disponible para descarga

Ya esta disponible NetBeans 8.1 para descarga desde: https://netbeans.org/downloads/


Aquí puedes encontrar las novedades
https://netbeans.org/community/releases/81/
Entre ellas el soporte para Node.js, Express, Gulp,Mocha and Selenium, entre otras novedades.

AVBravo - August 12, 2015 05:35 PM
VII ENCUENTRO CENTROAMERICANO DE SOFTWARE LIBRE


Es inevitable no reflexionar sobre el VII Encuentro CentroAmericano de Software Libre-Honduras 2015 Sitio web http://ecsl2015.softwarelibre.ca/
Generalmente se piensa que el software Libre se trata de un producto de software, la concepción va un poco más allá; son las libertades, las personas los que realmente hacen la diferencia y han logrado luchar por muchos años , contra una serie de factores en contra pero que permite unir a muchas personas, organizaciones y empresas en un fin común, defender las libertades a las que todos tenemos derecho.

Expositores

Una oportunidad para encontrar amigos con varios años de no ver, como es Alexandre Oliva. A otros desde el ECSL 2014 que se realizo en Panamá. También la oportunidad de conocer a nuevos amigos que realizan un trabajo muy fuerte desde cada una de las comunidades en sus diversos países.




Contenido filosófico, social, tecnológico fueron aspectos fundamentales en el evento, mientras era admirable la organización del evento y sobre todo el trato único y familiar que nos dieron nuestros anfitriones Hondureños, que desde el primer instante de la llegada a San Pedro Sula, fue excelente.

Tengo que agradecer a grandes amigos: Mauro Rosero quien fue que me ha permitido participar de las comunidades centro americanas de software libre (ya que en parte de mi trabajo es con otras comunidades), invitándome a participar en el ECSL en Panamá y quien me invito nuevamente a ECSL en Honduras, y permitió que la Universidad Tecnológica de Panamá, apoyara mi participación en este evento, por la importancia que representa a nivel de la región estas iniciativas que cada año resultan superar las anteriores.
 A Richard Dominguez quien gestiono todas las actividades en Panamá y por circunstancias adversas no pudo asistir.
A mis grandes amigos Hondureños Diego Turcios, Delmy Saray (atención increíble), Angel y a todos los demás miembros del comité felicidades por un gran trabajo.

Un evento de muchas actividades, conferencias, talleres, mesas de discusión,grandes ponencias,  casos de usos , reuniones informales que permitieron conocer nuevos amigos.

Mi primera participación fue sobre JavaEE (NetBeans :JEE7 +Enterprise Java Beans+Java Server Faces + JPA + Primecaces),





La segunda actividad hable un poco sobre Java8 y NetBeans Platform (desarrollo de plugins)

Hicimos unas sesiones sobre Java y NetBeans con dos grandes amigos Fatima(El Salvador) y Jaime(Nicaragua)
También estuve presente en la reunión donde se escogió la nueva sede para el ECSL 2016, Nicaragua, que tengo la plena confianza que sera tan exitosa como esta organizada en Honduras.
Fotos de muchos amigos durante las conferencias.



Unitec donde fue la sede del evento

Un ambiente muy ameno al terminar las actividades en Unitec

En las inscripciones 

También una presentación de alto nivel de Estefania, quien dio una conferencia magistral sobre el observatorio de software libre, quien no es del área de sistemas y esta incursionando como ella lo definió esta en un proceso de migración, al que ha iniciado de manera muy fuerte.

A los demás miembros de las comunidades y Universidades que expusieron sus conocimientos de manera impresionante, mis felicitaciones y a todos mis amigos un saludo desde Panamá, y continúen con este esfuerzo que cada vez adquiere mayor importancia. Nuevamente gracias por la oportunidad de hablar algo sobre Java que es la segunda vez que se permite la participación en el ECSL, saludos y gracias.














AVBravo - June 17, 2015 02:19 AM
Utilizar Github como repositorio de Maven

Hace unos años un gran amigo, inicio su mundo en Java, con grandes proyectos y un excelente blog comparte sus conocimientos.

Antony escribió una entrada  Utilizar Github como repositorio de Maven en donde explica el uso de Jitpack. Una guía muy practica y efectiva.


AVBravo - June 13, 2015 05:41 PM
Crear Traductor usando API http://spa.hablaa.com/ con Primefaces

Crear Traductor usando API http://spa.hablaa.com/ con Primefaces

Hablaa.com es un direccionario en linea que ofrece un servicio de traducción grauito

Podemos implementar nuestro traductor, permitiendo al usuario que seleccione el idioma origen y el destino y realicemos la conversión.



Para las traducciones utilizamos el url, donde especificamos la palabra a traducir, el idioma origien (3 caracteres) y el idioma destino(3 caracteres)
En este ejemplo traducimos la palabra apple de ingles a español y nos devuelve un json
[{"text":"la manzana","pos":{"code":null,"title":null},"source":"Hablaa.com"},{"text":"manzana","pos":{"code":null,"title":null},"source":"Hablaa.com"}]


Luego solo nos queda procesar el json y obtener el atributo text que contiene la palabra.
Para ver la lista de idiomas soportados













LectorJSON.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.javscaz.girosjsd.generales;


import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.net.URL;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import javax.json.Json;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;


/**
*
* @author avbravo
*/
@Named(value = "lectorJSON")
@SessionScoped
public class LectorJSON implements Serializable {


   private String lectura;
   private String origen;
   private String destino;
   private String languageorigen;
   private String languagedestino;


   public String getLanguageorigen() {
       return languageorigen;
   }


   public void setLanguageorigen(String languageorigen) {
       this.languageorigen = languageorigen;
   }


   public String getLanguagedestino() {
       return languagedestino;
   }


   public void setLanguagedestino(String languagedestino) {
       this.languagedestino = languagedestino;
   }


   public String getOrigen() {
       return origen;
   }


   public void setOrigen(String origen) {
       this.origen = origen;
   }


   public String getDestino() {
       return destino;
   }


   public void setDestino(String destino) {
       this.destino = destino;
   }


   public String getLectura() {
       return lectura;
   }


   public void setLectura(String lectura) {
       this.lectura = lectura;
   }


   /**
    * Creates a new instance of LectorJSON
    */
   public LectorJSON() {
   }


   public String lector() throws IOException {
       try {
                 origen = origen.trim();
           destino = "";
           URL url = new URL("http://spa.hablaa.com/hs/translation/" + origen + "/" + languageorigen + "-" + languagedestino + "/");
           InputStream is = url.openStream();


           JsonParser parser = Json.createParser(is);
           while (parser.hasNext()) {
               Event e = parser.next();
               if (e == Event.KEY_NAME) {
                   switch (parser.getString()) {
                       case "text":
                           parser.next();                        
                           destino = parser.getString();
                           break;
                   }
               }
           }


       } catch (Exception ex) {
           JSFUtil.addErrorMessage("lector() " + ex.getLocalizedMessage());
       }
       return null;
   }


}

















Página .xhtml


<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
     xmlns:p="http://primefaces.org/ui"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:f="http://xmlns.jcp.org/jsf/core"


     xmlns:b="http://bootsfaces.net/ui">


   <body>


       <ui:composition template="./template.xhtml">
           <ui:define name="content">
               <f:view>
                   <h:form>
                      <b:panel look="primary" title="#{app['application.title']}">
                     <h:panelGrid columns="4" cellpadding="5">
                              <h:outputText value="origen:"/>
                               <b:inputText value="#{lectorJSON.origen}">
                                   <f:facet name="prepend">
                                       <h:outputText value="" />
                                   </f:facet>
                               </b:inputText>
                               <h:outputText  value="traducida:"/>
                               <b:inputText id="salida" value="#{lectorJSON.destino}">
                               </b:inputText>
                               <h:outputText  value="De"/>
<b:selectOneMenu  value="#{lectorJSON.languageorigen}"                
                                                 required="true"
                                                 >
                             <f:selectItem itemLabel="Español" itemValue="spa" />
                            <f:selectItem itemLabel="Chino(simplificado)" itemValue="zho" />
                            <f:selectItem itemLabel="Ingles" itemValue="eng" />
</b:selectOneMenu>
                              <h:outputText  value="A"/>
             <b:selectOneMenu  value="#{lectorJSON.languagedestino}"                     
                                                 required="true"
                                                 >
                             <f:selectItem itemLabel="Chino(simplificado)" itemValue="zho" />
                             <f:selectItem itemLabel="Ingles" itemValue="eng" />
                             <f:selectItem itemLabel="Español" itemValue="spa" />
         </b:selectOneMenu>


<p:commandButton value="Traducir" actionListener="#{lectorJSON.lector()}"
                                              update="salida,growl"
                                               />
                           </h:panelGrid>
                       </b:panel>
                       <p:growl id="growl" showDetail="true" />
                       <p:growl id="messages" showDetail="true" life="2000" />
                   </h:form>
              </f:view>
           </ui:define>


           <!--            <ui:define name="bottom">
                           bottom
                       </ui:define>-->


       </ui:composition>


   </body>
</html>

















AVBravo - May 20, 2015 01:08 AM
Lo nuevo que traera NetBeans 8.1

Lo nuevo que traera NetBeans 8.1

Soporte para plantillas Jade



  • Soporte para NodeJS
  • JUnit integrado


AVBravo - May 19, 2015 01:31 AM
Autocompletado con Primefaces + JPA

Autocompletado con Primefaces + JPA
Tabla: Nivel1


Con NetBeans IDE generamos los Entity
Categories: Persistence    File Types: Entity Classes from Database


Luego generar los EJB


Editamos Nivel1Facade.java y agregar los métodos findByIdNivel1Like(), findByNombreLike().

public List<Nivel1> findByIdNivel1Like(String idnivel1) {

              Query query = em.createQuery("SELECT n FROM Nivel1 n WHERE lower(n.idnivel1) like :idnivel1");
                   idnivel1 = "%" + idnivel1.trim() + "%";
       return query.setParameter("idnivel1", idnivel1).getResultList();
     
}

    public List<Nivel1> findByNombreLike(String nombre) {

              Query query = em.createQuery("SELECT n FROM Nivel1 n WHERE lower(c.nombre) like :nombre");
                   nombre = "%" + nombre.trim() + "%";
       return query.setParameter("nombre", nombre).getResultList();
     
    
   }


Editar Nivel1SearchController.java

Agregar los métodos complete(),  completeNombre()

public List<Nivel1> complete(String query) { List<Nivel1> suggestions = new ArrayList<>(); try { query = query.trim(); nivel1Facade.findByIdNivel1Like(query.toLowerCase()); nivel1List.stream().forEach((p) -> { suggestions.add(p); }); } catch (Exception e) { JSFUtil.addErrorMessage("complete() "+e.getLocalizedMessage()); } return suggestions; } public List<Nivel1> completeNombre(String query) { List<Nivel1> suggestions = new ArrayList<>(); try { query = query.trim(); nivel1Facade.findByNombreLike(query.toLowerCase()); nivel1List.stream().forEach((p) -> { suggestions.add(p); }); } catch (Exception e) { JSFUtil.addErrorMessage("completeNombre() "+e.getLocalizedMessage()); } return suggestions; }

En la página .xhtml
   <p:outputLabel  rendered="#{!nivel1Controller.nuevoregistro}" value="#{msg.idnivel1}" for="idnivel1" />
                               <p:autoComplete size="45"   rendered="#{!nivel1Controller.nuevoregistro}" value="#{nivel1Controller.selected}"  
                                                 completeMethod="#{nivel1SearchController.complete}"  
                                                 var="p"  
                                                 itemLabel="#{p.idnivel1}"  itemValue="#{p}" converter="nivel1Converter" forceSelection="true">

                                   <p:ajax event="itemSelect" listener="#{nivel1Controller.handleSelect}" update=":form,:form:growl" />  
                                   <f:facet name="itemtip">
                                       <h:panelGrid columns="2" cellpadding="5">
                                           <h:outputText value="#{p.nombre}" />
                                       </h:panelGrid>
                                   </f:facet>
                               </p:autoComplete>



AVBravo - May 18, 2015 10:45 PM
primefaces growl con bootfaces

Para mostrar el componente <p:growl> de Primefaces si utilizamos en conjunto con bootfaces y deseamos evitar que el growl se muestre sobrepuesto en el menu, incluimos en nuestro template o archivo css

  .ui-growl { right: 50%; top: 20%; }





AVBravo - May 09, 2015 09:57 PM
Crear Submenú bootfaces

Crear Submenú bootfaces


Basado en el ejemplo "Multi level dropdown menu BS3" cuya fuente es 

A continuación se muestra como integrarlo con bootfaces y primefaces.


Para crear submenus con bootfaces seguimos el siguiente procedimiento

  • Editar template.xhtml  y en la sección <h:header> y dentro de   <style type="text/css">
t.png
copiar

.dropdown-submenu {
   position: relative;
}

.dropdown-submenu>.dropdown-menu {
   top: 0;
   left: 100%;
   margin-top: -6px;
   margin-left: -1px;
   -webkit-border-radius: 0 6px 6px 6px;
   -moz-border-radius: 0 6px 6px;
   border-radius: 0 6px 6px 6px;
}

.dropdown-submenu:hover>.dropdown-menu {
   display: block;
}

.dropdown-submenu>a:after {
   display: block;
   content: " ";
   float: right;
   width: 0;
   height: 0;
   border-color: transparent;
   border-style: solid;
   border-width: 5px 0 5px 5px;
   border-left-color: #ccc;
   margin-top: 5px;
   margin-right: -10px;
}

.dropdown-submenu:hover>a:after {
   border-left-color: #fff;
}

.dropdown-submenu.pull-left {
   float: none;
}

.dropdown-submenu.pull-left>.dropdown-menu {
   left: -100%;
   margin-left: 10px;
   -webkit-border-radius: 6px 0 6px 6px;
   -moz-border-radius: 6px 0 6px 6px;
   border-radius: 6px 0 6px 6px;
}



  • En la página de Menú
<b:dropMenu rendered="#{loginBean.logeado}" value="#{men['menu.ingresos']}" >
                   <b:navLink value="#{men['menu.nivel1']}"  href="/faces/page/nivel1/nivel1.xhtml"/>

                   <li class="dropdown-submenu">
                       <a tabindex="-1" href="#">Regimen</a>
                       <ul class="dropdown-menu">

                            <b:navLink value="#{men['menu.nivel2']}"  href="/faces/page/nivel1/nivel2.xhtml"/>
                           <li class="dropdown-submenu">
                               <a href="#">Otros</a>
                               <ul class="dropdown-menu">                                 
                                    <b:navLink value="#{men['menu.nivel4']}"  href="/faces/page/nivel4/nivel4.xhtml"/>
                                    <b:navLink value="#{men['menu.nivel5']}"  href="/faces/page/nivel5/nivel5.xhtml"/>
                               </ul>
                           </li>
                            <b:navLink value="#{men['menu.nivel3']}"  href="/faces/page/nivel3/nivel3.xhtml"/>
                     
                       </ul>
                   </li>
               </b:dropMenu>



AVBravo - April 07, 2015 12:47 AM
Grupos de Usuarios Java America Latina

Este video muestra la opinión de los lideres de Java de América Latina, y acerca de su trabajo.
Entre ellos Yara, Bruno, Alexis, Jorge, Cesar entre otros miembros importantes que están haciendo un gran trabajo con las comunidades en esta actividad de promoción de Java .

AVBravo - March 31, 2015 05:09 PM
GitHub con NetBeans

GitHub con NetBeans  (Guía rápida)
Pasos 
❏ Crear un repositorio en GitHub https://github.com/ 
❏ Clonar el repositorio en Netbeans 

❏ Menu Team­­>Git­­>Clone 


❏ Indicar el Repository URL ,User  y Password 

Presionar el botón Next 

❏ seleccionar el Remote Branches 


Presionar el botón Next 
❏ Seleccionar el directorio destino 

❏ Si el proyecto existe el IDE lo abrirá automáticamente 
❏ Si aun no hemos creado el proyecto y no hemos realizado ningun Push al 
repositorio 
❏ NetBeans nos solicitara que creemos un proyecto Nuevo 
❏ Procedemos a configurar el proyecto 
❏ Cuando realizamos cambios en el proyecto, estos debemos subirlos al repositorio 
❏ Seleccionamos el proyecto y desde el menú ​
Team​
 (o dar clic derecho en el Proyecto 
y seleccionar Git) 
❏ Ejecutar Add (Solo cuando existan archivos nuevos el IDE los marcará de color 
verde) 
❏ Luego Commit (Los archivos que se modifican tendrán un color azul) 
❏ Luego Remote­­>Push to stream 














AVBravo - March 17, 2015 03:27 AM

Si desemos utilizar <p:feedReader> componente de Primefaces

<p:feedReader value="http://rss.news.yahoo.com/rss/sports" var="feed">
   <h:outputText value="#{feed.title}" style="font-weight: bold;display:block"/>
   <h:outputText value="#{feed.description.value}" escape="false"/>
   <p:separator />
</p:feedReader>

Debemos incluir las siguientes dependencias <p:feedReader
<dependency>
           <groupId>com.totsp.feedpod</groupId>
           <artifactId>purl-org-content</artifactId>
           <version>0.3</version>
       </dependency>

 <dependency>
           <groupId>rome</groupId>
           <artifactId>rome</artifactId>
           <version>1.0</version>
       </dependency>

  <dependency>
           <groupId>jdom</groupId>
           <artifactId>jdom</artifactId>
           <version>1.1</version>
           <type>pom</type>

       </dependency>

AVBravo - March 14, 2015 02:54 PM
Método onblur

Método onblur
Si tenemos un formulario y deseamos que el usuario escribe por ejemplo una cédula, y no da enter, podríamos invocar algún método específico mediante el método onblour y usando <p:remoteCommnad>.
De esta manera no es necesario que presione Enter con escribir la cédula y salir del componente se activa el método.


Segmento de codigo


<p:remoteCommand update="tabView,:form:barra:toolbar,:form:growl,:form:datatableImpuestos"  
                                            name="remotefindcontribuyentes" actionListener="#{componentePagos


      <p:inputText   id="cedula"
                                          disabled="#{!componentePagos.escontribuyente}"
                                          value="#{componentePagos.cedula}"  placeholder="8-888-8888"
                                          title="#{msg.cedula}"
                                          onblur="remotefindcontribuyentes();"
                                          onkeypress="if (event.keyCode == 13) {
                                                      remotefindcontribuyentes();
                                                      return false;
                                                  }"
                                          />

AVBravo - February 13, 2015 02:45 AM
Java Español- Norte America-Centro America-Sur America Reunión 2015

Java Español- Norte America-Centro America-Sur America Reunión 2015
Continuan las reuniones para organizar las actividades de promoción de Java a Nivel de Latinoamerica, próximamente se estarán comunicando los avances.



AVBravo - February 12, 2015 09:46 PM
Como usar ui:repeat

Como usar ui:repeat

Entity
@Entity
@Table(name = "TIPOS_PATOLOGICOS")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "TiposPatologicos.findAll", query = "SELECT t FROM TiposPatologicos t"),
    @NamedQuery(name = "TiposPatologicos.findByIdTipoPatologico", query = "SELECT t FROM TiposPatologicos t WHERE t.idTipoPatologico = :idTipoPatologico"),
    @NamedQuery(name = "TiposPatologicos.findByDescripcion", query = "SELECT t FROM TiposPatologicos t WHERE t.descripcion = :descripcion")})
public class TiposPatologicos implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID_TIPO_PATOLOGICO")
    private Integer idTipoPatologico;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 50)
    @Column(name = "DESCRIPCION")
    private String descripcion;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idTipoPatologico")
    private Collection<AntecedentesPatologicos> antecedentesPatologicosCollection;


Creamos un beans
Ya que deseamos mostrar la descripción y solicitar al usuario que ingrese un comentario
public class TiposPatologicosBeans {
private String antecedente;
TiposPatologicos tiposPatologicos = new TiposPatologicos();

    /**
     * Creates a new instance of TiposPacientesBeans
     */
    public TiposPatologicosBeans() {
    }

/*
*agregar los get/set
*
*/
}


En el Controller
Crear un método para cargar los registros
 private Boolean cargarTiposPatologicos() {
        try {

            listTiposPatologicosBeans.removeAll(listTiposPatologicosBeans);

            List<TiposPatologicos> l;
            l = tiposPatologicosFacade.findAll();

            if (l == null || l.isEmpty()) {

                JSFUtil.addSuccessMessage(rf.getMensajeArb("warning.nohaytipospatologicos"));
                return false;
            }

            for (TiposPatologicos t : l) {

                TiposPatologicosBeans tp = new TiposPatologicosBeans();

                tp.setAntecedente(rf.getMensajeArb("label.ninguno"));
                tp.setTiposPatologicos(t);
                listTiposPatologicosBeans.add(tp);

            }

            return true;
        } catch (Exception e) {

            JSFUtil.addErrorMessage("cargarTiposPatologicos()" + e.getLocalizedMessage());
        }
        return false;
    }


Crear un método para guardar cada registro
Recorremos el list
 private Boolean saveAntecedentesPatologicos() {
        try {

            for (TiposPatologicosBeans tpb : listTiposPatologicosBeans) {
                antecedentesPatologicos.setIdFicha(fichaClinica);
                antecedentesPatologicos.setIdTipoPatologico(tpb.getTiposPatologicos());
                antecedentesPatologicos.setObservaciones(tpb.getAntecedente());
                antecedentesPatologicosFacade.create(antecedentesPatologicos);

            }
            return true;
        } catch (Exception e) {
            JSFUtil.addErrorMessage("saveAntecedentesPatologicos()" + e.getLocalizedMessage());
        }
        return false;
    }




En el xhtml
Deseamos mostrar la descripción y crear un <p:inputTextarea para cada registro


Genera la siguiente vista


AVBravo - January 30, 2015 02:51 PM
HTML6 y Java Server Faces

HTML6 y Java Server Faces
En http://html6spec.com/. explican algunas características de html6, entre ellas el uso de namespaces como se hacia en xhtml, ahora es parte de la especificación.

Para los desarrolladores Java EE,(a continuación el tutorial oficial de Oracle)
Encontraran Facelets,  que es un poderoso lenguaje de declaración que es usado para construir vistas  Java Server Faces usando plantillas HTML. Se basa en el uso de XHTML. para crear las paginas web.

Ahora en HMTL6 podemos usar directamente los namespaces


Java Server Faces

Por ejemplo:
head en facelets



head en html6



body en facelets



body en hmtl6


Los cambios en HMTL6 son comunes en Facelets, para los desarrolladores Java Server Faces+ Faceletes, representan una mejor integración. Y el algo comuen en el desarrollo. basado en componentes (Primefaces)




AVBravo - January 27, 2015 09:37 PM
FileUpload con Primefaces

FileUpload con Primefaces


goto.png
Si queremos subir imagenes a nuestra aplicación usaremos el componente FileUpload
Debemos realizar los siguientes pasos:

Agregar al archivo web.xml


   <filter>
       <filter-name>PrimeFaces FileUpload Filter</filter-name>
       <filter-class>
           org.primefaces.webapp.filter.FileUploadFilter
       </filter-class>
   </filter>
   <filter-mapping>
       <filter-name>PrimeFaces FileUpload Filter</filter-name>
       <servlet-name>Faces Servlet</servlet-name>
   </filter-mapping>


s.png


Crear dentro de resources el directorio donde deseamos almacenar las imagenes
En este ejemplo: resources/fotos/clinicas y agregue una imagen llamada fotos.png que se usará como imagen inicial.
f.png




En JSFUtil u otro @Named Beans que usemos agregamos tres métodos uno para obtener el path de la aplicación web , otro para obtener el path relativo a /fotos/clinicas y el otro para copiar los archivos.
/*
    devuelve el path de la aplicacion
    */
   public static String getPath() {
       try {
           ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
                   .getExternalContext().getContext();
           return ctx.getRealPath("/");


       } catch (Exception e) {


           addErrorMessage("getPath() " + e.getLocalizedMessage());
       }
       return null;


   }

/*
    devuelve un hashmap con la ruta de fotos clinicas y el url para las imagenes
    */
   public static HashMap<String, String> getMapPathFotosClinica() {
       try {
           HashMap<String, String> map = new HashMap<String, String>();
          
           String path = getPath() + "resources/fotos/clinicas/";
           map.put("path", path);
           map.put("url", "/resources/fotos/clinicas/");
           return map;
       } catch (Exception e) {


           addErrorMessage(" getMapPathFotosClinica() " + e.getLocalizedMessage());
       }
       return null;


   }


    /*
    devuelve un hashmap con la ruta de fotos clinicas y el url para las imagenes
    */
   public static String getPathFotosClinica() {
       try {             
       
           String path = getPath() + "resources/fotos/clinicas/";
return path;
       } catch (Exception e) {


           addErrorMessage("getPathFotosClinica() " + e.getLocalizedMessage());
       }
       return null;


   }



   /*
    copia un archivo generalmente cuando se usa el fileupload
    fileName: nombre del archivo a copiar
    in: Es el InputStream
    destination: ruta donde se guardara el archivo
 
    */
   public static Boolean copyFile(String fileName, InputStream in, String destination) {
       try {


           // write the inputStream to a FileOutputStream
           OutputStream out = new FileOutputStream(new File(destination + fileName));


           int read = 0;
           byte[] bytes = new byte[1024];


           while ((read = in.read(bytes)) != -1) {
               out.write(bytes, 0, read);
           }


           in.close();
           out.flush();
           out.close();


           return true;
       } catch (IOException e) {
           JSFUtil.addErrorMessage("copyFile() " + e.getLocalizedMessage());
       }
       return false;
   }
Mostrare dos formas para manejar la imagen , una atraves del path incluyendo el url
En el Controller agregar dos atributos.


private String imagenURL ="/resources/fotos/clinicas/foto.png";
private String imagen="foto.png";


Nota: Recuerde que en el directorio /resources/fotos/clinicas se agrego una imagen llamada fotos.png.


crear el método  handleFileUpload() que se encarga de guardar el archivo


En este obtenemos la ruta del directorio /fotos/clinicas/
   public void handleFileUpload(FileUploadEvent event) {
       try {


           UploadedFile file = event.getFile();
//application code
           String destination;


           HashMap<String, String> map = JSFUtil.getPathFotosClinica();


           destination = map.get("path");
           if (destination == null) {
               JSFUtil.addErrorMessage(rf.getMensajeArb("warning.noseobtuvopath"));
           } else {
               imagenURL = map.get("url") + file.getFileName();
               imagen = file.getFileName();
               if (JSFUtil.copyFile(file.getFileName(), file.getInputstream(), destination)) {                  
               }
           }


       } catch (Exception e) {
           JSFUtil.addErrorMessage("handleFileUpload()" + e.getLocalizedMessage());
       }


   }




En la pagina xhtml agregamos el componente.
Colocamos dos <h:graphicImage en el primero usamos el url completo y en el segundo solo el nombre de la imagen.
y.png
 <p:panelGrid id="fotos" columns="1">
             <h:graphicImage value="#{clinicasController.imagenURL}" height="100" width="100"/>
           <h:graphicImage value="/resources/fotos/clinicas/#{clinicasController.imagen}" height="100" width="100"/>
         <p:fileUpload auto="true" label="Foto" fileUploadListener="#{clinicasController.handleFileUpload}" update=":form:growl,:form:fotos"/>
                          
                        </p:panelGrid>


al dar clic en el botón FOTO , seleccionamos una imagen y se carga la  imagen en los dos componentes.
d.png
Solo dejamos una de los dos , esta incluido solo a modo de ejemplo. Recomendaria usar     <h:graphicImage value="/resources/fotos/clinicas/#{clinicasController.imagen}" height="100" width="100"/>


Si ejecutamos el proyecto desde NetBeans IDE, con un proyecto web Maven
lo guarda la imagen en el path /target/nombreproyectoversion/resources/fotos/clinicas
a.png

FileUpload y almacenar la imagen en una base de datos
Si tenemos un campo llamado logoClinica de tipo String en la tabla


Ajustamos el Controller
 @PostConstruct
   public void init() {
       nuevoregistro = false;
       desactivar = true;
       clinicas.setLogoClinica("foto.png");


   }
 @Override
   public String prepararNew() {
       try {
           
           clinicas = new Clinicas();
           clinicas.setLogoClinica(imagen);


       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return null;
   }

@Override
   public String save() {
       try {
               clinicas = new Clinicas();
              clinicas.setLogoClinica(imagen);
       


@Override
   public String delete() {
       try {
                   clinicas.setLogoClinica(imagen);




Editamos el método  handleFileUpload()
public void handleFileUpload(FileUploadEvent event) {
       try {


           UploadedFile file = event.getFile();
//application code
           String destination;


                 destination = JSFUtil.getPathFotosClinica();
           if (destination == null) {


               JSFUtil.addErrorMessage(rf.getMensajeArb("warning.noseobtuvopath"));
           } else {
               
               clinicas.setLogoClinica(file.getFileName());
               if (JSFUtil.copyFile(file.getFileName(), file.getInputstream(), destination)) {
                  
               }
           }


       } catch (Exception e) {
           JSFUtil.addErrorMessage("handleFileUpload()" + e.getLocalizedMessage());
       }


   }

AVBravo - January 26, 2015 02:11 PM
Búsquedas en JPA utilizando concat y like

Búsquedas en JPA utilizando concat y like

Deseamos tener una página xhtml donde realizamos búsquedas de registros, una tabla tiene los campos (primernombre, segundonombre,apellidopaterno,apellidomaterno).
Queremos buscar por primer nombre, apellido paterno o permitirle al usuario que escriba en una caja el nombre completo, es decir una combinacion de dos campos primernombre y apellidopaterno. Nuestro dialogo de busqueda (basado en Java Server Faces->Primefaces), tendrá una vista similar a esta.
busqueda.png

El código xhtml del diálogo donde se generan los componentes para el <p:outputLabel y el <p:inputText> correspondientes al atributo nombreCompleto que debe ser declarado en el @Named y el metodo buscarNombreCompleto()
s.png


Definiciones en el @Named
@Named
@ViewScoped
public class AdministradoresSistemaSearchController implements Serializable{
 private String nombreCompleto;

public String getNombreCompleto() {
       return nombreCompleto;
   }

   public void setNombreCompleto(String nombreCompleto) {
       this.nombreCompleto = nombreCompleto;
   }
public String buscarNombreCompleto() {
       try {
           administradoresSistema.setPrimerNombre("");
           administradoresSistema.setPrimerNombre("");
           administradoresSistemaList = administradoresSistemaFacade.findByNombreCompletoLike(nombreCompleto);
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return "";
   }

En el Facade
Descomponer el texto para separar el nombre y el apellido y colocarle % entre ambos para hacer más genérica la búsqueda.
Esto permitirá buscar por ejemplo
a vill → buscara todos los nombres que inicien con a y el apellido que inicie con vill
aristides v → buscara todos los nombre que inicien con aristides y el apellido inicie con v

   public List<AdministradoresSistema> findByNombreCompletoLike(String nombreCompleto) {
      nombreCompleto = nombreCompleto.trim();
      StringTokenizer st = new StringTokenizer(nombreCompleto);
      String texto="";
      while (st.hasMoreTokens()) {
          if(!texto.equals("")){
              texto+="%";
          }
          texto += " "+st.nextToken();

    }
      nombreCompleto = "%" +texto.trim() + "%";
       Query query = em.createQuery("SELECT a FROM AdministradoresSistema a WHERE CONCAT (lower(a.primerNombre),' ',lower(a.apellidoPaterno)) like ?1");
       query.setParameter(1, nombreCompleto);
      return query.getResultList();

  }

AVBravo - January 16, 2015 02:14 PM
PrimeFaces BluePrints

Si deseas conocer sobre el desarrollo de aplicaciones web con Java Server Faces y Primefaces, el libro Primefaces BluePints que puedes ver en el siguiente enlace



Es una guía para su aprendizaje, se ofrece una explicación muy básica de los componentes, con ejemplos bastante claros, con la famosa aplicación "Hello World".
Se explica el uso de Ajax con Primefaces, que se realiza de manera muy sencilla.
Client Side Validation: Se muestran sugerencias y ejemplos de uso.
Aplicación completa desde el Login de usuarios hasta manejo de imágenes.
Manejo de base de datos, uso de Layouts.
Sin lugar  a dudas una serie de ejemplos y recomendaciones que son muy utiles, para lograr un conocimiento adecuado que nos permita el desarrollo de aplicaciones web con Java server faces + Primefaces.

El uso de datatable, dialogos, reportes , exportaciones de datos, graficas, son componentes que se explican con mucho detalle.




AVBravo - December 17, 2014 07:44 PM
Agrupar, Ordenar por Fechas y Totalizar con Java 8

Agrupar, Ordenar por Fechas y Totalizar con Java 8


Tenemos una lista de registros de recibosdetalles.


Deseamos agruparlos por idnivel6 y luego por fecha, y encontrar el total por cada fecha del idnivel6.
Similar a la salida que se muestra a continuacion
ordenar.png


Primero obtenemos los registros
2d.png
filtrados por fecha


  recibosdetallesList = recibosdetallesFacade.findByEntreFechas(desde, hasta);


 /*
                0. elimino los recibosdetalles cuyos recibos fueran anualados
                */
               recibosdetallesList.stream().filter((r) -> (r.getIdrecibo().getAnulado().equals("si"))).forEach((r) -> {
                   recibosdetallesList.remove(r);
               });


//IMPRIMIR LOS DETALLES
 System.out.println("!================= Recibos Detalles =====================!");
               recibosdetallesList.forEach(p
                       -> System.out.println(p.getIdrecibo().getIdrecibo() + " ---> " + p.getIdnivel6().getIdnivel6() + " --> " + p.getFecha()));

/*
                1. Agruparlos por nivel6
                */
               Map<Nivel6, List<Recibosdetalles>> listRecibosdetallesAgrupado = recibosdetallesList
                       .stream()
                       .collect(Collectors.groupingBy(p -> p.getIdnivel6()));


  /*
                2. Recorrer los agrupados por nivel6
                */
               System.out.println("!============== <AGRUPADOS POR NIVEL 6< ==================!");
               listRecibosdetallesAgrupado
                       .forEach((Nivel6 idnivel6, List<Recibosdetalles> p) -> {
                           /*
                            2.1 Imprime cada nivel6 agrupado
                            */
                           System.out.println("====================================================");
                           System.out.println("Nivel6: " + idnivel6.getIdnivel6());


                           /*
                            2.3 Agrupo por fecha                                
                            */
                           Map<Date, List<Recibosdetalles>> listFecha = p
                           .stream()
                           .collect(Collectors.groupingBy(p2 -> p2.getFecha()));


                           /*
                            2.3 Recorro la agrupacion por fecha
                            */
                           listFecha
                           .forEach((Date fecha, List<Recibosdetalles> p3) -> {


                               System.out.println("Fecha: " + fecha);
                               /*
                                2.4 Recorro la lista ordenada y sumo los montos de las fechas
                                */
                               System.out.println(" ---------total: " + totalizarFecha(p3));


                           });


                     

                       });

private Double totalizarFecha(List<Recibosdetalles> p3) { try { Double s = 0.0; s = p3.stream().map((i) -> i.getPago()).reduce(s, (accumulator, _item) -> accumulator + _item); return s; } catch (Exception e) { JSFUtil.addErrorMessage("totalizarFecha() " + e.getLocalizedMessage()); } return 0.0; }

AVBravo - December 17, 2014 02:07 AM
Ordenar List y agrupar con Java 8

Ordenar List y agrupar con Java 8


Proyecto: Rigemjsf
Clase: InformeConsolidadoController.java


Queremos un informe agrupado por idnivel5 y totalizar cada idnivel6.




Tenemos un Beans llamado consolidado


@Named
@RequestScoped
public class Consolidado {
private Date fecha;
private String nombre;
private Integer idrecibo;
private Double pago;
private String idnivel6;
private String nombrenivel6;
private String idnivel5;
private String nombrenivel5;









 public String imprimirTodos() {
       try {
           /*
           agruparlo por idnivel6
            */


Map<String, List<Consolidado>> listAgrupado = listConsolidado
                   .stream()
                   .collect(Collectors.groupingBy(p -> p.getIdnivel6()));


           //recorrer el list
           listAgrupado
                   .forEach((String idnivel6, List<Consolidado> p) -> {
                       add(p);
                   });


//Ordenarlo por nivel5


           Collections.sort(listConsolidadoFinal,
                   (Consolidado a, Consolidado b) -> a.getIdnivel5().compareTo(b.getIdnivel6()));
           


         
       } catch (Exception ex) {
           JSFUtil.addErrorMessage("imprimir() " + ex.getLocalizedMessage());
       }
       return null;
   }
   /*
    anade a la lista final la sumatoria
    */
//Aqui totalizamos y agregamos objetos al  nuevo list
     private void add(List<Consolidado> list) {
       try {
           Double s = 0.0;
           s = list.stream().map((i) -> i.getPago()).reduce(s, (accumulator, _item) -> accumulator + _item);
           Consolidado icr = new Consolidado();
           icr = list.get(0);
           icr.setPago(s);
           listConsolidadoFinal.add(icr);
       } catch (Exception e) {
           JSFUtil.addErrorMessage("add() " + e.getLocalizedMessage());
       }


   }


   }

AVBravo - December 07, 2014 07:06 PM
Libro JEE7 Capítulo 0. Búsquedas

Capítulo 7. Búsquedas
Puedes descargarlo en pdf
https://www.dropbox.com/sh/yzivtufjce1h57g/AAAJzegPVBxFtiqzEOlIAdsoa?dl=0

Encuesta
https://docs.google.com/forms/d/1WG7uzOe17V4u36fC05V3ijYEPZ8fhJD1NPUrkNBS0Jk/alreadyresponded?usp=send_form




Formulario de Búsqueda con DialogFrame


Crearemos un formulario de búsqueda que se podrá invocar desde cualquier formulario o CDI/Beans.


al dar clic en buscar, nos llevará al diálogo para realizar las búsquedas








Para el manejo de registros, a veces no deseamos tener un datatable con todos los registros cargados, si no simplemente un formulario, en el cual podamos realizar búsquedas de manera rápida, cuando lo hacemos por la llave primaria es sencillo ya que solo tendremos un registro, cuando lo hacemos por otros atributos tendremos una lista de registros en los cuales podemos seleccionar uno de ellos, esta lista se mostrará en un dialog, para que el usuario seleccione el registro adecuado.

Crearemos un formulario para realizar búsquedas por cualquier atributo , por palabras exactas o mediante aproximación.


















Pasos:
  1. Editar el CDI Beans EstatusController, inyectar CDI Beans Globales,crear el método init() con la anotación @PostConstructor.


@Inject
   GestorImpresion gestorImpresion;

@PostConstruct
   public void init() {
       //nomnbre de la pagina a retornar
       globales.setUltimapagina("estatusinsert");
      // encontrado = false;
       if (globales.getEstatus().getIdestatus() != "") {
           estatus = globales.getEstatus();
       //    encontrado = true;
       }
   }




  1. Crear CDI EstatusSearchController.java que usaremos para realizar las búsquedas.


  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: EstatusSearchController
  • Package com.avbravo.scrumweb.controlller.net
  • Scope: ViewScoped


import com.avbravo.scrumweb.Estatus;
import com.avbravo.scrumweb.ejb.EstatusFacade;
import com.avbravo.scrumweb.generales.Globales;
import com.avbravo.scrumweb.generales.ResourcesFiles;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;


@Named
@ViewScoped
public class EstatusSearchController implements Serializable{

   @Inject
   EstatusFacade estatusFacade;
   @Inject
   ResourcesFiles rf;
   @Inject
   Globales globales;
   Estatus selected = new Estatus();
   private List<Estatus> filtered;
   List<Estatus> estatusList;

   private String nombreestatus;
   private String idestatus;
   private String esinicial;

   private Boolean usarlike = false;

   public String getIdestatus() {
       return idestatus;
   }

   public void setIdestatus(String idestatus) {
       this.idestatus = idestatus;
   }

   public String getEsinicial() {
       return esinicial;
   }

   public void setEsinicial(String esinicial) {
       this.esinicial = esinicial;
   }

   public List<Estatus> getFiltered() {
       return filtered;
   }

   public void setFiltered(List<Estatus> filtered) {
       this.filtered = filtered;
   }

   /**
    * Creates a new instance of EstatusDataController
    */
   public Estatus getSelected() {
       return selected;
   }

   public void setSelected(Estatus selected) {
       this.selected = selected;
   }

   public EstatusSearchController() {
       estatusList = new ArrayList<>();

   }

   public List<Estatus> getEstatusList() {
       return estatusList;
   }

   public void setEstatusList(List<Estatus> estatusList) {
       this.estatusList = estatusList;
   }

   public String getNombreestatus() {
       return nombreestatus;
   }

   public void setNombreestatus(String nombreestatus) {
       this.nombreestatus = nombreestatus;
   }

   public Boolean getUsarlike() {
       return usarlike;
   }

   public void setUsarlike(Boolean usarlike) {
       this.usarlike = usarlike;
   }

   @PostConstruct
   public void init() {

   }

   public void iniciar() {
       estatusList = estatusFacade.getEstatusList();
   }

   public void iniciar(String value) {
       estatusList = estatusFacade.findByEsinicial(value);
   }

   public String buscar() {
       if (!usarlike) {
           estatusList = estatusFacade.findByEstatus(nombreestatus);
       } else {
           estatusList = estatusFacade.findByEstatusLike(nombreestatus);
       }

       return "";
   }

   public String buscarEsInicial() {

       estatusList = estatusFacade.findByEsinicial(esinicial);
       return "";
   }

   public String buscarIdEstatusList() {

       estatusList = estatusFacade.findByIdEstatusList(idestatus);
       return "";
   }

   public String showAll() {
       estatusList = estatusFacade.findAll();
       return "";
   }

   public String retornar() {
       globales.setEstatus(selected);
       return globales.getUltimapagina();
   }

}



  1. Editar estatusinsert.xml, agregamos un boton para buscar, uno para editar y otro para eliminar, ademas de un diálogo donde se confirmará si se eliminara o no el registro.  

  • Colocar el id=”form” para el form principal
<h:form rendered="#{menuBeans.estatusCrear}" id="form">
  • Indicar el alto y ancho del dialogo
height="175"  width="400"

<p:dialog visible="true" header="#{app['form.estatusnew']}" closable="true"
                                 height="175"  width="400"
        showEffect="clip" hideEffect="fade"   
         widgetVar="estatusinsertDialog">



  • Agregamos panelGroup con el botón buscar en el inputText estatus

  <h:outputLabel value="#{msg.idestatus}" for="idestatus" />
   <h:panelGroup>
             <h:inputText id="idestatus" value="#{estatusController.estatus.idestatus}" title="#{msg.idestatus}" required="true" requiredMessage="#{msg.idestatus} #{app['info.required']}"/>
            <p:commandButton immediate="true"   icon="ui-icon-search"  action="estatussearch"/>
   </h:panelGroup>


  • Agregar los botones de editar , imprimir y eliminar en el <f:facet name="footer">
             <f:facet name="footer">
                      <p:commandButton icon="ui-icon-disk" update="panel,growl"                                                    
rendered="#{menuBeans.estatusCrear}"
                                       action="#{estatusController.save()}"/>
                      <p:commandButton id="button_edit"
                                      update="form,growl"
rendered="#{menuBeans.estatusEditar}"
                                      icon="ui-icon-pencil" action="#{estatusController.edit()}"/>
                       <p:commandButton  id="printButton"
                                      action="#{estatusController.imprimir()}"
                                     icon="ui-icon-print" ajax="false" />
                       <p:commandButton  id="button_delete" update="form,growl" icon="ui-icon-trash"
rendered="#{menuBeans.estatusEliminar}"
                               onclick="PF('confirmationwidgetVar').show();" type="button" />
            </f:facet>










  • Agregar el diálogo para confirmar la eliminación debajo del otro diálogo

<p:dialog id="confirmDialog" modal="false"  header="Delete"  widgetVar="confirmationwidgetVar">
                           <h:panelGrid columns="2">
                               <p:outputLabel value="#{msg.estatus}"/>
                               <p:outputLabel value="#{estatusController.estatus.estatus}"/>

                           </h:panelGrid>

                           <f:facet name="footer">
                               <p:commandButton id="removeButton" value="si"
                                                update="form,growl"
                                                oncomplete="PF('confirmationwidgetVar').hide();"
                                                actionListener="#{estatusController.delete()}" />

                               <p:commandButton id="cancelButton" value="no" onclick="PF('confirmationwidgetVar').hide()" type="button" />
                           </f:facet>
                       </p:dialog>






















  1. Crear la página estatussearch.xhtml, usaremos un diálogo , donde colocaremos inputText para cada atributo y los commandButton para realizar las operaciones de búsqueda, los resultados los mostraremos en un datatable para que se seleccione el registro adecuado.

Ahora creamos un Facelets Template Client
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione Facelets Template Client
  • En File Name: estatussearch
  • Folder colocamos /page/estatus/
  • Template seleccionamos template.xhtml

Pasos:
  1. Comentamos las opciones del menú
  2. Agregar view,form, growl, messages, y un dialogo global
  3. Agregamos un panelGrid con los atributos que deseamos usar para buscar y un botón al lado de cada uno
  4. Creamos un dataTable que contendrá el resultado de la búsqueda con un botón para seleccionar la fila adecuada. Con dos botones, retornar y mostrar todos.
Agregamos en el    <ui:define name="center">
<f:view>
<h:form id="form" rendered="#{menuBeans.estatusListar}">
<p:messages autoUpdate="true"/>
<p:growl id="growl"/>
<p:dialog  header="search"
                                  closable="true" showEffect="clip"
                                  visible="true"
                                  hideEffect="fade"                                 
                                  height="235"  width="550"
                                  widgetVar="searchDialogWidgetVar">
                           <p:ajax event="close" update="growl"  listener="#{loginBean.irInicio()}"/>  

Colocar un panelGrid colocamos los componentes y los botones de buscar.

<h:panelGrid columns="2">
                               
                               <h:outputLabel value="#{app['form.estatussearch']}" />
                               <h:outputLabel value=""/>
                              
                               <h:outputLabel value="#{msg.idestatus}" for="idestatus" />
                               <h:panelGroup>
                                   <h:inputText id="idestatus" value="#{estatusSearchController.idestatus}" title="Idestatus" />
                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscarIdEstatusList()}"/>
                               </h:panelGroup>
                               
                               <h:outputLabel value="#{msg.estatus}" for="estatus" />
                               <h:panelGroup>
                                   <h:inputText  id="estatus" value="#{estatusSearchController.nombreestatus}" title="#{msg.estatus}" />

                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscar()}"/>
                                   <h:outputLabel value="Like"  />
                                   <p:selectBooleanCheckbox   value="#{estatusSearchController.usarlike}" />  
                               </h:panelGroup>

                               <h:outputLabel value="#{msg.esinicial}" for="esinicial" />
                               <h:panelGroup>
                                   
                                   <p:selectOneMenu id="esinicial" value="#{estatusSearchController.esinicial}"
                                                    requiredMessage="#{msg.esinicial} #{app['info.notnull']}">
                                       <f:selectItem itemLabel="#{app['boton.yes']}" itemValue="si" />
                                       <f:selectItem itemLabel="#{app['boton.no']}" itemValue="no" />
                                   </p:selectOneMenu>
                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscarEsInicial()}"/>
                               </h:panelGroup>
                               <f:facet name="footer">

                               </f:facet>
                           </h:panelGrid>


Agregamos un dataTable basado en estatusSearchController,
  • colocamos dos botones uno para retornar a la página que lo invoco y otro para mostrar todos los registros.
  • Una columna contendrá un botón de selección. Y en el header colocamos el botón de regresar y un botón para mostrar todo.
  • Colocar el id=”datatable”, rows=”7”, utilizar los mensajes de los archivos properties.
  • Colocamos dos botones en el header, retornar y mostrar todo.
  • Cambiar de <h:datatable> y <h:columns> a <p:datatable> y <p:columns>
  <p:dataTable id="datatable" rows="7" value="#{estatusSearchController.estatusList}" var="item">
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Idestatus"/>
                                   </f:facet>
                                   <h:outputText value="#{item.idestatus}"/>
                               </p:column>
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Estatus"/>
                                   </f:facet>
                                   <h:outputText value="#{item.estatus}"/>
                               </p:column>
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Esinicial"/>
                                   </f:facet>
                                   <h:outputText value="#{item.esinicial}"/>
                               </p:column>
                               <p:column >  
             <p:commandButton id="selectButton" update=":form:display"
oncomplete="PF('widgetVarSearch').show()" icon="ui-icon-search" title="View">  
                                       <f:setPropertyActionListener value="#{item}" target="#{estatusSearchController.selected}" />  
             </p:commandButton>  
                               </p:column>
                               <f:facet name="header">
<p:commandButton icon="ui-icon-circle-arrow-w"  action="#{estatusSearchController.retornar()}"/>
<p:commandButton value="All" update ="datatable" action="#{estatusSearchController.showAll()}"/>
                               </f:facet>
                           </p:dataTable>

Cambiamos los textos fijos para usar las etiquetas de los archivos de propiedades.






Agregamos un diálogo debajo del datatable

<p:dialog header="#{app['dialog.search']}" widgetVar="widgetVarSearch" resizable="false" id="searchDialog"  
                                 showEffect="fade" hideEffect="explode"
                                 height="135"  width="250"
                                 modal="false">  

                           <h:panelGrid id="display" columns="2" cellpadding="4" style="margin:0 auto;">  

                               <h:outputLabel value="#{msg.estatus}" for="idestatus" />
                               <h:outputLabel value="#{estatusSearchController.selected.estatus}" />

                               <f:facet name="footer">

                                   <p:commandButton ajax="false"  value="#{app['boton.return']}" action="#{estatusSearchController.retornar()}"/>

                               </f:facet>
                           </h:panelGrid>  

                       </p:dialog>  



Código de estatussearch.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:f="http://xmlns.jcp.org/jsf/core"
     xmlns:p="http://primefaces.org/ui">

   <body>

       <ui:composition template="./../../template.xhtml">
           <!--
                       <ui:define name="top">
                           top
                       </ui:define>
           
                       <ui:define name="bottom">
                           bottom
                       </ui:define>
           
                       <ui:define name="left">
                           left
                       </ui:define>
           -->
           <ui:define name="center">
               <f:view>
                   <h:form id="form" rendered="#{menuBeans.estatusListar}">
                       <p:messages autoUpdate="true"/>
                       <p:growl id="growl"/>
                       <p:dialog  header="search"
                                  closable="true" showEffect="clip"
                                  visible="true"
                                  hideEffect="fade"                                 
                                  height="235"  width="550"
                                  widgetVar="searchDialogWidgetVar">
                           <p:ajax event="close" update="growl"  listener="#{loginBean.irInicio()}"/>  

                           <h:panelGrid columns="2">
                               
                               <h:outputLabel value="Search:"  />
                               <h:outputLabel value=""/>
                              
                               <h:outputLabel value="#{msg.idestatus}" for="idestatus" />
                               <h:panelGroup>
                                   <h:inputText id="idestatus" value="#{estatusSearchController.idestatus}" title="Idestatus" />
                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscarIdEstatusList()}"/>
                               </h:panelGroup>
                               
                               <h:outputLabel value="#{msg.estatus}" for="estatus" />
                               <h:panelGroup>
                                   <h:inputText  id="estatus" value="#{estatusSearchController.nombreestatus}" title="Estatus" />

                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscar()}"/>
                                   <h:outputLabel value="Like"  />
                                   <p:selectBooleanCheckbox   value="#{estatusSearchController.usarlike}" />  
                               </h:panelGroup>

                               <h:outputLabel value="#{msg.esinicial}" for="esinicial" />
                               <h:panelGroup>
                                   
                                   <p:selectOneMenu id="esinicial" value="#{estatusSearchController.esinicial}"
                                                    requiredMessage="#{msg.esinicial} #{app['info.notnull']}">
                                       <f:selectItem itemLabel="#{app['boton.yes']}" itemValue="si" />
                                       <f:selectItem itemLabel="#{app['boton.no']}" itemValue="no" />
                                   </p:selectOneMenu>
                                   <p:commandButton  icon="ui-icon-search"  update=":form:datatable" action="#{estatusSearchController.buscarEsInicial()}"/>
                               </h:panelGroup>
                               <f:facet name="footer">

                               </f:facet>
                           </h:panelGrid>

                           <p:dataTable id="datatable" rows="7" value="#{estatusSearchController.estatusList}" var="item">
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Idestatus"/>
                                   </f:facet>
                                   <h:outputText value="#{item.idestatus}"/>
                               </p:column>
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Estatus"/>
                                   </f:facet>
                                   <h:outputText value="#{item.estatus}"/>
                               </p:column>
                               <p:column>
                                   <f:facet name="header">
                                       <h:outputText value="Esinicial"/>
                                   </f:facet>
                                   <h:outputText value="#{item.esinicial}"/>
                               </p:column>
                               <p:column >  
                                   <p:commandButton id="selectButton" update=":form:display" oncomplete="PF('widgetVarSearch').show()" icon="ui-icon-search" title="View">  
                                       <f:setPropertyActionListener value="#{item}" target="#{estatusSearchController.selected}" />  
                                   </p:commandButton>  
                               </p:column>
                               <f:facet name="header">
                                   <p:commandButton icon="ui-icon-circle-arrow-w"  action="#{estatusSearchController.retornar()}"/>
                                   <p:commandButton value="All" update ="datatable" action="#{estatusSearchController.showAll()}"/>
                               </f:facet>
                           </p:dataTable>



                       </p:dialog>

                       <p:dialog header="#{app['dialog.search']}" widgetVar="widgetVarSearch" resizable="false" id="searchDialog"  
                                 showEffect="fade" hideEffect="explode"
                                 height="135"  width="250"
                                 modal="false">  

                           <h:panelGrid id="display" columns="2" cellpadding="4" style="margin:0 auto;">  

                               <h:outputLabel value="#{msg.estatus}" for="idestatus" />
                               <h:outputLabel value="#{estatusSearchController.selected.estatus}" />

                               <f:facet name="footer">

                                   <p:commandButton ajax="false"  value="#{app['boton.return']}" action="#{estatusSearchController.retornar()}"/>

                               </f:facet>
                           </h:panelGrid>  

                       </p:dialog>  
                   </h:form>
               </f:view>

           </ui:define>

       </ui:composition>

   </body>
</html>
















AVBravo - December 06, 2014 03:16 PM
Conociendo los nuevos miembros del Dream Team

 

I'm now a NetBeans Dream Team Member!

http://blog.eisele.net/2014/12/im-now-netbeans-dream-team-member.html



AVBravo - December 05, 2014 05:57 PM
16 Nuevos Miembros de NetBeans Dream Team

Se incorporan 16 nuevos miembros a NetBeans Dream Team, ampliamente conocidos y comprometidos con la evolución, desarrollo y promoción de NetBeans
Listado actualizado

  • Gail Anderson
  • Paul Anderson
  • Jens Deters
  • Constantin Drabo
  • Markus Eisele
  • Arun Gupta
  • David Heffelfinger
  • Rajmahendra Hegde
  • Josh Juneau
  • Martin Klähn
  • Thomas Kruse
  • Benno Markiewicz
  • Sean Phillips
  • Mark Stephens
  • Martijn Verburg
  • Johan Vos




AVBravo - December 04, 2014 02:13 PM
Libro JEE7 Capitulo 06 iReport

Capitulo 06 iReport

Puedes descargarlo en pdf
https://www.dropbox.com/sh/yzivtufjce1h57g/AAAJzegPVBxFtiqzEOlIAdsoa?dl=0

Encuesta
https://docs.google.com/forms/d/1WG7uzOe17V4u36fC05V3ijYEPZ8fhJD1NPUrkNBS0Jk/alreadyresponded?usp=send_form


En este capítulo mostraremos la forma de crear reportes de una manera muy sencilla utilizando iReport.


Pasos:
  1. Descargar el plugin iReport
  2. Crear reporte
  3. Desarrollar el código para imprimir reporte.


Descargamos el plugin de iReport para NetBeans






Descomprimir el archivo .zip

Desde el menú de NetBeans Tools-->Plugins-->Pestaña Downloaded-->Presionar el botón Add Plugins

En el proyecto seleccionar Build with dependences

Nos ubicamos en resources -->clic derecho y seleccionar New-->Categories: Other→ File Types: Folder

Crear el paquete reportes dentro de resources

Nos ubicamos en reportes y seleccionar  NewOther


Seleccionar Categories: Report
                    File Types: Empty report


dar el nombre





se muestra el diseñador de reportes





Revisamos los atributos del Entity Estatus.java


Abrimos el reporte y en  Field agregamos los tres fields. Clic derecho seleccionar Add Field

se genera el nombre field1
renombrar a idestatus, estatus,esinicial

En la paleta le cambiamos el tipo de dato en las propiedades
Propiedad Field Class
Arrastramos los campos a la sección Detail1, de manera automática se coloca en la columna el título.

Arrastras label Static Text  desde la paleta a la sección Page Header
En el texto colocamos ESTATUS y las propiedades seleccionamos Bold, para que lo coloque en negrita.

En Tools arrastramos Current date para agregar la fecha del sistema.

compilamos el reporte
En la barra se genera el mensaje de compilación exitosa

Se muestra el reporte compilado








CREAR CDI/BEANS PARA MANEJO DE IMPRESIONES

CDI Beans GestorImpresion.java lo usaremos para gestionar las diversos métodos para realizar las impresiones.
Crearemos los métodos con dos parámetros List<?> t , colocamos el ? para que podamos pasar cual list de objetos al método, y String ruta, es la ruta del reporte, HashMap para los parámetros que usaremos en los reportes.
  • imprimir(List<?> t,String ruta,HashMap hashmap) ,imprime la lista de objetos pasados
  • pdf(List<?> t, String ruta, HashMap hashmap), genera un pdf
  • docx(List<?> t, String ruta, HashMap hashmap), genera un archivo docx
  • xlsx(List<?> t, String ruta, HashMap hashmap), genera un archivo xlsx
  • odt(List<?> t, String ruta, HashMap hashmap), genera un archivo odt
  • ppt(List<?> t, String ruta, HashMap hashmap), genera un archivo ppt
  • preparar(List<?> t, String ruta, HashMap hashmap), se utiliza internamente para configurar el entorno del reporte.
De esta manera podemos invocar el reporte desde el controller, donde pasaremos la lista de objetos
public String imprimir() {
       String ruta = "/resources/reportes/estatus.jasper";
       HashMap parameters = new HashMap();
       gestorImpresion.imprimir(estatusFacade.getEstatusList(), ruta, parameters);

       return null;
   }


Crear el CDI Beans
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: GestorImpresion
  • Package com.avbravo.scrumweb.generales
  • Scope: request







Código completo  de GestorImpresion.java

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.oasis.JROdtExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRPptxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;

/**
*
* @author avbravo
*/
@Named
@RequestScoped

public class GestorImpresion {

   JRBeanCollectionDataSource ds;
   FacesContext facesContext;
   ServletContext scontext;
   JasperPrint jasperPrint;

   /**
    * Creates a new instance of GestorImpresion
    */
   public GestorImpresion() {
   }

   public String imprimir(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           ByteArrayOutputStream baos = new ByteArrayOutputStream();
           JRPdfExporter exporter = new JRPdfExporter();
           exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
           exporter.exportReport();
           byte[] bytes = baos.toByteArray();
           if (bytes != null && bytes.length > 0) {
               HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
               response.setContentType("application/pdf");
               response.setHeader("Content­disposition", "inline; filename=\"relatorioPorData.pdf\"");
               response.setContentLength(bytes.length);
               ServletOutputStream outputStream = response.getOutputStream();
               outputStream.write(bytes, 0, bytes.length);
               outputStream.flush();
               outputStream.close();
           }
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String pdf(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.pdf");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String docx(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.docx");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JRDocxExporter docxExporter = new JRDocxExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String xlsx(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.xlsx");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JRXlsxExporter docxExporter = new JRXlsxExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String odt(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.odt");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JROdtExporter docxExporter = new JROdtExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   public String ppt(List<?> t, String ruta, HashMap hashmap) {
       try {
           preparar(t, ruta, hashmap);
           HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
           httpServletResponse.addHeader("Content­disposition", "attachment;filename=report.pptx");
           ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
           JRPptxExporter docxExporter = new JRPptxExporter();
           docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
           docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
                   servletOutputStream);
           docxExporter.exportReport();
           FacesContext.getCurrentInstance().responseComplete();
       } catch (JRException | IOException e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
       return null;
   }

   private void preparar(List<?> t, String ruta, HashMap hashmap) {
       try {
           ds = new JRBeanCollectionDataSource(t);
           facesContext = FacesContext.getCurrentInstance();
           facesContext.responseComplete();
           scontext = (ServletContext) facesContext.getExternalContext().getContext();
           jasperPrint = JasperFillManager.fillReport(scontext.getRealPath(ruta), hashmap, ds);
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getMessage());
       }
   }
 }


































Editar EstatusDataController.java , inyectar GestionImpresion y agregar el método imprimir().En este indicaremos la ruta del reporte, la lista de entitys y el HashMap con los parámetros. E invocamos al método correspondiente en GestionImpresion

@Inject
   GestorImpresion gestorImpresion;

public String imprimir() {
       String ruta = "/resources/reportes/estatus.jasper";
       HashMap parameters = new HashMap();
       gestorImpresion.imprimir(estatusFacade.getEstatusList(), ruta, parameters);
       return null;
   }

/*
*imprimir un solo entity
*/
public String imprimir() {
List<Estatus> list = new ArrayList<>();
list.add(estatus);
       String ruta = "/resources/reportes/estatus.jasper";
       HashMap parameters = new HashMap();
       gestorImpresion.imprimir(list, ruta, parameters);
       return null;
   }



















Editamos estatuslist.xhmtl, agregamos un footer con el boton imprimir, utilizamos en este caso immediate=”true”, para evitar que se realicen las validaciones, ya que desamos mostrar el reporte directamente.

<f:facet name="footer">
             <p:commandButton immediate="true" id="printButton" value="#{app['boton.print']}" action="#{estatusDataController.imprimir()}" icon="ui-icon-print" ajax="false" />                                                                     
  </f:facet>
                        </p:dataTable>
                        </p:dialog>

Cuando ejecutamos el proyecto y seleccionamos estatuslist, se muestra el botón Imprimir
al presionarlo se muestra el reporte para imprimir


AVBravo - December 01, 2014 10:19 PM
Libro JEE7 05. Login y Seguridad

Libro JEE7 05. Login y Seguridad
  • ROLES
  • CREAR CDI BEANS para administrar los roles
  • CREAR CDI RolAdministrador
  • CREAR CDI ValidadorRoles
  • CREAR CDI LoginBean
  • Codigo completo de LoginBean.java
  • EDITAR LA PAGINA index.xhtml
  • EDITAR LA PAGINA menu.xhtml
  • CREAR LA PÁGINA accesodenegado.xhtml
  • EDITAR LA PÁGINA estatusinsert.xhtml
Puedes descargar los capítulos en formato pdf desde aquí
https://www.dropbox.com/sh/yzivtufjce1h57g/AAAJzegPVBxFtiqzEOlIAdsoa?dl=0



En este capítulo mostraremos cómo crear el formulario de login y realizar las validaciones necesarias de los privilegios.
También colocaremos los formularios en un diálogo visible.









ROLES



Para validar los roles de usuarios tenemos varias alternativas, en esta ocasión lo controlaremos desde CDI Beans.
Crearemos un CDI Beans llamado MenuBeans que contendrá las opciones del menú y los privilegios que tiene el usuario en cada opción.


  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name:  MenuBeans
  • Package com.avbravo.scrumweb.generales
  • Scope: Session


Recordar cambiar las anotaciones y los imports.
Si observamos el menú, contamos con la opción Registros y dentro de ella Estatus con dos menuitems, Insertar, Listar.
Definiremos atributos booleanos para los diversos componentes.

Definiremos:
  • Los elementos de la barra con el formato: barraNombre
    • private Boolean barraRegistros = false;
  • Los menú con el formato: nombreMenu
    • private Boolean estatusMenu = false;
  • Los submenu con el formato: nombreOperacion
    • private Boolean estatusCrear = false;


Generamos los get/set mendiante , clic derecho en el código y seleccionar  Insert CodeGetters and Setterts
Nota:
El código generado como son atributos booleanos se generan los métodos is, en nuestro CDI Beans debemos cambiarlo a get para utilizarlo dentro de nuestras páginas java server faces.


 public Boolean isBarraRegistros() {
       return barraRegistros;
   }


   public void setBarraRegistros(Boolean barraRegistros) {
       this.barraRegistros = barraRegistros;
   }


Cambiamos is por get, los métodos set quedan iguales no se modifican.


public Boolean getBarraRegistros() {
       return barraRegistros;
   }


   public void setBarraRegistros(Boolean barraRegistros) {
       this.barraRegistros = barraRegistros;
   }








Codigo completo  de MenuBeans.java


import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;


/**
*
* @author avbravo
*/
@Named
@SessionScoped
public class MenuBeans implements Serializable {


   private static final long serialVersionUID = 1L;


   /*
    * barra de menu
    */
   private Boolean barraRegistros = false;
   /*   
    */
   private Boolean estatusMenu = false;
   private Boolean estatusCrear = false;
   private Boolean estatusConsultar = false;
   private Boolean estatusEditar = false;
   private Boolean estatusListar = false;
   private Boolean estatusEliminar = false;

//Crear el método habilitarTodo(Boolean activo), que recibi un parámetro de tipo //booleano y que será asignado a los todos los atributos del CDI Beans.

public void habilitarTodo(Boolean activo) {
       /*
        barra
        */
       barraRegistros = activo;


       estatusMenu = activo;
       estatusCrear = activo;
       estatusConsultar = activo;
       estatusEditar = activo;
       estatusListar = activo;
       estatusEliminar = activo;
   }


public Boolean getBarraRegistros() {
       return barraRegistros;
   }


   public void setBarraRegistros(Boolean barraRegistros) {
       this.barraRegistros = barraRegistros;
   }


   public Boolean getEstatusMenu() {
       return estatusMenu;
   }


   public void setEstatusMenu(Boolean estatusMenu) {
       this.estatusMenu = estatusMenu;
   }


   public Boolean getEstatusCrear() {
       return estatusCrear;
   }


   public void setEstatusCrear(Boolean estatusCrear) {
       this.estatusCrear = estatusCrear;
   }


   public Boolean getEstatusConsultar() {
       return estatusConsultar;
   }


   public void setEstatusConsultar(Boolean estatusConsultar) {
       this.estatusConsultar = estatusConsultar;
   }


   public Boolean getEstatusEditar() {
       return estatusEditar;
   }
   public void setEstatusEditar(Boolean estatusEditar) {
       this.estatusEditar = estatusEditar;
   }
   public Boolean getEstatusListar() {
       return estatusListar;
   }


   public void setEstatusListar(Boolean estatusListar) {
       this.estatusListar = estatusListar;
   }


   public Boolean getEstatusEliminar() {
       return estatusEliminar;
   }


   public void setEstatusEliminar(Boolean estatusEliminar) {
       this.estatusEliminar = estatusEliminar;
   }


}






















       

CREAR CDI BEANS para administrar los roles

Pasos:
Crearemos un CDI Beans para cada rol, donde indicaremos los privilegios que tiene en base a su rol, y el CDI Beans ValidadorRoles, a continuación mostraremos la imagen de como seria nuestro paquete con los CDI Beans, si observamos existe un CDI para cada rol.

CREAR  CDI RolAdministrador



  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: RolAdministrador
  • Package com.avbravo.scrumweb.roles
  • Scope: request


Inyectamos MenuBeans
 @Inject
   MenuBeans menuBeans;


y creamos el método activar(), donde asignamos valores de true a los atributos correspondientes a los roles, si deseamos que el usuario no tenga acceso a una opción simplemente asignamos un valor de false.


 public void activar() {
       menuBeans.setBarraRegistros(true);
       menuBeans.setEstatusMenu(true);
       menuBeans.setEstatusCrear(true);
       menuBeans.setEstatusConsultar(true);
       menuBeans.setEstatusEditar(true);
       menuBeans.setEstatusListar(true);
       menuBeans.setEstatusEliminar(true);
   }






Código completo  de RolAdministrador.java
import com.avbravo.scrumweb.generales.MenuBeans;
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;


/**
*
* @author avbravo
*/
@Named
@RequestScoped


public class RolAdministrador {


   @Inject
   MenuBeans menuBeans;


   /**
    * Creates a new instance of RolAdministrador
    */
   public RolAdministrador() {
   }
   public void activar() {
       menuBeans.setBarraRegistros(true);
       menuBeans.setEstatusMenu(true);
       menuBeans.setEstatusCrear(true);
       menuBeans.setEstatusConsultar(true);
       menuBeans.setEstatusEditar(true);
       menuBeans.setEstatusListar(true);
       menuBeans.setEstatusEliminar(true);
   }
}

De la misma forma creamos los CDI Beans RolDuenoProducto y en el método activar de cada uno de ellos establecemos los privilegios para acceder o no cada opción.


CREAR  CDI ValidadorRoles



  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: ValidadorRoles
  • Package com.avbravo.scrumweb.roles
  • Scope: request


Pasos:
  1. Inyectamos los CDI Beans de roles
  2. Inyectamos MenuBeans
  3. Crear un método validarRoles(String rolvalidacion), que recivira un parámetro que indica el rol y este será validado llamando al método activar(), del CDI Beans correspondiente.
  4. Si no existe un rol especifico se desactivara todos las opciones de los menu, invocando a menuBeans.habilitarTodo(false);


Código completo  de ValidadorRoles.java


import com.avbravo.scrumweb.generales.JSFUtil;
import com.avbravo.scrumweb.generales.MenuBeans;
import com.avbravo.scrumweb.generales.ResourcesFiles;
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;


/**
*
* @author avbravo
*/
@Named
@RequestScoped
public class ValidadorRoles {
@Inject
RolAdministrador rolAdministrador;
@Inject
RolDuenoProducto rolDuenoProducto;


   @Inject
   MenuBeans menuBeans;
   @Inject
   ResourcesFiles rf;


   /**
    * Creates a new instance of ValidadorRoles
    */
   public ValidadorRoles() {
   }


   public Boolean validarRoles(String rolvalidacion) {
       Boolean ok = Boolean.TRUE;


       try {
           switch (rolvalidacion) {
               case "administrador":


                   rolAdministrador.activar();
                   break;
               case "product owner":


                   rolDuenoProducto.activar();
                   break;
             
               default:
                   menuBeans.habilitarTodo(false);
                   ok = Boolean.FALSE;
                   JSFUtil.warningDialog(rf.getMensajeArb("warning.title"), rf.getMensajeArb("info.sinrolasignado"));
                  
           }
       } catch (Exception e) {
           JSFUtil.addErrorMessage("validarRoles() " + e.getLocalizedMessage());
       }
       return ok;
   }


}





CREAR  CDI LoginBean



  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types, seleccione JSF ManagedBeans
  • Class Name: LoginBean
  • Package com.avbravo.scrumweb.generales
  • Scope: Session


Pasos:
  1. Inyectamos Usuarios, UsuariosFacade,ResourcesFiles, MenuBeans,ValidadorRoles
  2. Crear metodos get/set para el Entity Usuarios.
  3. Crear atributo Boolean logeado y los    @Inject
  4.    RolAdministrador rolAdministrador;
  5.    @Inject
  6.    RolDuenoProducto rolDuenoProducto;
  7. métodos set/get. Recordar cambiar el método is por get.
  8. Crear el método verificarLogin(), en este método se validará el username y password del usuario y el rol que tiene el mismo dentro de la aplicación.
  9. Crear metodo logout()
  10. Crear método init()


Codigo completo  de LoginBean.java

import com.avbravo.scrumweb.Usuarios;
import com.avbravo.scrumweb.ejb.UsuariosFacade;
import com.avbravo.scrumweb.roles.ValidadorRoles;
import java.io.IOException;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpSession;


@Named
@SessionScoped
public class LoginBean implements Serializable {


private static final long serialVersionUID = 1L;
   @Inject
   UsuariosFacade usuariosFacade;
   Usuarios usuarios = new Usuarios();
   @Inject
   ResourcesFiles rf;
   @Inject
   MenuBeans menuBeans;
   @Inject
   ValidadorRoles validadorRoles;


   Boolean logeado = false;
   /**
    * Creates a new instance of LoginBean
    */
    public Usuarios getUsuarios() {
       return usuarios;
   }


   public void setUsuarios(Usuarios usuarios) {
       this.usuarios = usuarios;
   }


   public Boolean getLogeado() {
       return logeado;
   }


   public void setLogeado(Boolean logeado) {
       this.logeado = logeado;
   }


   @PostConstruct
   public void init() {
   }


   public LoginBean() {
   }
   
   public String verificarLogin() {
       try {
           menuBeans.habilitarTodo(false);
           setLogeado(Boolean.FALSE);
           Usuarios u = usuariosFacade.find(usuarios.getUsername());


           if (u == null) {
               JSFUtil.addWarningMessage(rf.getMensajeArb("login.usernamenotvalid"));
               return null;
           }
           if (!u.getActivo().equals("si")) {
               JSFUtil.addSuccessMessage(rf.getMensajeArb("login.inactive"));
               return "";
           }
           if (!u.getPassword().equals(usuarios.getPassword())) {
               JSFUtil.addSuccessMessage(rf.getMensajeArb("login.passwordnotvalid"));
               return "";
           }
           usuarios = u;
           setLogeado(Boolean.TRUE);


           if (validadorRoles.validarRoles(usuarios.getIdgruposusuario().getIdgruposusuario())) {


               return "";
           }


       } catch (Exception e) {
           JSFUtil.addErrorMessage(e, "verificarLogin()");
       }


       return null;
   }


   public String logout() {
       try {


           HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
           if (session != null) {
               session.invalidate();
           }
String url = "/scrumweb/faces/index.xhtml?faces-redirect=true";
           FacesContext fc = FacesContext.getCurrentInstance();
           ExternalContext ec = fc.getExternalContext();
           try {
               ec.redirect(url);
           } catch (IOException ex) {
               JSFUtil.addErrorMessage(ex.getLocalizedMessage());
           }
return "/scrumweb/faces/index.xhtml?faces-redirect=true";
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e, "logout()");
       }
       return null;
   }


   public String irLogin() {
       return "/index";
   }


   public void irInicio() {
       FacesContext ctx = FacesContext.getCurrentInstance();
       ExternalContext extContext = ctx.getExternalContext();


       String url = extContext.encodeActionURL(ctx.getApplication().getViewHandler().getActionURL(ctx, "/index.xhtml"));


       try {
           extContext.redirect(url);
       } catch (IOException ioe) {
           JSFUtil.addErrorMessage(ioe.getLocalizedMessage().toString());
       }
   }
}














EDITAR LA PAGINA index.xhtml

Colocar las etiquetas para validar el login de usuario.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:p="http://primefaces.org/ui"
     xmlns:f="http://xmlns.jcp.org/jsf/core">


   <body>


       <ui:composition template="./template.xhtml">
           <!--
                       <ui:define name="top">
                           top
                       </ui:define>
           
                       <ui:define name="bottom">
                           bottom
                       </ui:define>
           
                       <ui:define name="left">
                           left
                       </ui:define>
           -->


<ui:define name="center">
               <h:form id="formtopnologeado" rendered="#{!loginBean.logeado}" >
                   <p:growl id="growl" life="1500" />
                   <p:dialog visible="true" header="#{app['application.title']}" closable="false" showEffect="clip" hideEffect="fade" widgetVar="loginDialog">  


                       <h:panelGrid columns="2" >
                           <f:facet name="header">
                               <h:outputLabel  value="#{mensajes['boton.login']}"/>
                           </f:facet>


                           <h:outputText value="#{app['login.username']}"></h:outputText>
                         <h:inputText value="#{loginBean.usuarios.username}"  required="true" />
                        <h:outputText value="#{app['login.password']}"  ></h:outputText>
                           <h:inputSecret value="#{loginBean.usuarios.password}"  required="true" />
                           <f:facet name="footer">
<p:commandButton action="#{loginBean.verificarLogin}" value="#{app['boton.login']}" ajax = "false" />
                           </f:facet>
                       </h:panelGrid>
                   </p:dialog>  
               </h:form>


           </ui:define>
</ui:composition>


   </body>
</html>

























EDITAR LA PAGINA menu.xhtml

Editar las opciones y colocar la validación para activar las opciones en base al valor de los atributos de menuBeans.
Paso:
  1. Colocar la propiedad rendered en el <p:megaMenu> utilizando el atributo logeado de loginBean.
  2. Utilizar rendered en el submenú utilizando barraRegistros
  3. Utilizar el atributo rendered de los <menuitem> utilizando estatusCrear y estatusListar.
el rendered y el atributo de menuBeans correspondientes, para establecer la validación.
  1. Colocar en el menuitem logout  actionListener="#{loginBean.logout}" ajax = "false" rendered="#{loginBean.logeado}"

<h:body>
       <ui:composition>
           <h:form id="menuForm" >
               <p:megaMenu rendered="#{loginBean.logeado}">  
                   <p:submenu label="#{app['menu.records']}" rendered="#{menuBeans.barraRegistros}"  icon="ui-icon-check">  
                       <p:column>                              
      <p:submenu label="#{app['menu.estatus']}" rendered="#{menuBeans.estatusMenu}">  
              <p:menuitem value="#{app['menu.insert']}" rendered="#{menuBeans.estatusCrear}" url="/faces/page/estatus/estatusinsert.xhtml" />  
              <p:menuitem value="#{app['menu.list']}"  rendered="#{menuBeans.estatusListar}" url="/faces/page/estatus/estatuslist.xhtml"/>  
      </p:submenu>  


                       </p:column>  
                   </p:submenu>  
                  <p:menuitem value="#{app['login.logout']}" actionListener="#{loginBean.logout}" title="#{app['login.logout']}" ajax = "false" rendered="#{loginBean.logeado}" icon="ui-icon-power"/>


          







CREAR LA PÁGINA accesodenegado.xhtml

Esta página la usaremos para desplegar un mensaje indicando que el usuario no tiene privilegios para visualizar la página, generalmente ocurre cuando el usuario trata de ingresar el url en el navegador para ingresar a paginas no autorizadas.
Pasos:
  1. Crear el Facelets Template Client
  2. Agregar un dialogo visible
  3. Mostrar un texto
  4. Utilizar un boton para enviarlo a la pagina para logearse.


Ahora creamos un Facelets Template Client
  • Desde menú File, seleccione New
  • en Categories, seleccione Java Server Faces
  • en File Types,  JSF Page
  • En File Name: accesodenegado




Colocamos un diálogo, con un panelGrid donde colocamos una etiqueta y un botón para regresar al index.xhtml.











Código completo  de accesodenegado.xhtml


<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
     xmlns:p="http://primefaces.org/ui">


   <h:body>
       <ui:composition>
 
        <p:dialog visible="true" header="#{app['login.accesodenegado']}"  closable="false" showEffect="fade" hideEffect="fade" widgetVar="loginDialog">  
                   <p:panelGrid columns="1" >
                       <h:outputText value="#{app['login.accesodenegadoDetalle']}"/>
                       <p:commandButton action="#{loginBean.irLogin}" value="#{app['boton.return']}" ajax="false"/>
                   </p:panelGrid>
               </p:dialog>
       
       </ui:composition>
  </h:body>
</html>

















EDITAR  LA PÁGINA estatusinsert.xhtml

Estableceremos validación de acceso a nivel de cada página para solo permitir el ingreso al usuario con los privilegios.
Pasos:


  1. Establecer el rendered con la opción de menuBeans en el form principal
<ui:define name="center">
               <f:view>
                   <h:form rendered="#{menuBeans.estatusCrear}">


colocar en comentarios
<!--                            <h1><h:outputText value="#{app['form.estatusnew']}"/></h1>-->


  1. Colocar un dialogo
<p:dialog visible="true" header="#{app['form.estatusnew']}" closable="true" showEffect="clip" hideEffect="fade" widgetVar="estatusinsertDialog">  


cerramos el diálogo después </h:panelGrid>
</p:dialog>


  1. Agregar el include accesodenegado si no se tiene permisos para ingresar al formulario.
antes del </f:view> fuera del form principal.
                
   <h:form rendered="#{!menuBeans.estatusCrear}">
                       <ui:include src="/accesodenegado.xhtml" />
   </h:form>


</f:view>

se mostrará en un diálogo el formulario


Repetimos el proceso para la página estatuslist.xhtml usando el rendered
<h:form id="form" rendered="#{menuBeans.estatusListar}">


Colocamos el datatable en un dialogo.
<p:dialog visible="true" header="#{app['form.estatuslist']}" closable="false" showEffect="clip" hideEffect="fade" widgetVar="estatuslistDialog">  
<p:dataTable id="datatable" paginator="true"
                                        rows="7" value="#{estatusDataController.estatusList}" var="item"
                                        rowKey="#{item.idestatus}"
                                        selectionMode="single"
                                        selection="#{estatusDataController.selected}"
                                        filteredValue="#{estatusDataController.filtered}"
                                        >
   </p:dataTable>
                       </p:dialog>

Agregamos el include con el rendered.
<h:form rendered="#{!menuBeans.estatusListar}">
                       <ui:include src="/accesodenegado.xhtml" />
   </h:form>



Para probarlo podemos pegar en el browser el url


Sin haberse logueado y mostrará el diálogo de acceso denegado, y al presionar el boton Regresar nos lleva a la página index.html donde nos debemos loguear.




De esta manera restringimos el acceso por privilegios a cada página



AVBravo - December 01, 2014 10:10 PM
@NamedQuery y Query con JPA

Si deseamos realizar consultas mediante JPA

1. Crear un NamedQuery 
Creamos el  @NamedQuery en el Entity

    @NamedQuery(name = "Configuracion.findByIdmunicipio", query = "SELECT c FROM Configuracion c WHERE c.idmunicipio = :idmuinicipio"),

@Entity
@Table(name = "configuracion")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Configuracion.findAll", query = "SELECT c FROM Configuracion c"),
    @NamedQuery(name = "Configuracion.findByIdreglasrecargo", query = "SELECT c FROM Configuracion c WHERE c.idreglasrecargo = :idreglasrecargo"),
      @NamedQuery(name = "Configuracion.findByIdmunicipio", query = "SELECT c FROM Configuracion c WHERE c.idmunicipio = :idmunicipio"),
    @NamedQuery(name = "Configuracion.findByFecha", query = "SELECT c FROM Configuracion c WHERE c.fecha = :fecha")})


En el EJB invocamos el NamedQuery creado
public List<Configuracion> findByIdMunicipio(Municipios value) {
    Query query = em.createNamedQuery("Configuracion.findByIdmunicipio");
        return query.setParameter("idmunicipio", value).getResultList();
    }

2. No modificamos el Entity
@Entity
@Table(name = "configuracion")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Configuracion.findAll", query = "SELECT c FROM Configuracion c"),
    @NamedQuery(name = "Configuracion.findByIdreglasrecargo", query = "SELECT c FROM Configuracion c WHERE c.idreglasrecargo = :idreglasrecargo"),
    @NamedQuery(name = "Configuracion.findByFecha", query = "SELECT c FROM Configuracion c WHERE c.fecha = :fecha")})

En el EJB creamos el Query
public List<Configuracion> findByIdMunicipio(Municipios value) {
        Query query = em.createQuery("SELECT c FROM Configuracion c WHERE c.idmunicipio = :idmunicipio");
        return query.setParameter("idmunicipio", value).getResultList();
    }


AVBravo - December 01, 2014 03:55 PM
WakaTime plugin para NetBeans

WakaTime ha liberado su plugin para NetBeans.
WakaTime permite dar un seguimiento de tiempo a los desarrolladores.
Lo instalamos en NetBeans, idicamos el api Key, y empezara a llevar el registro de las actividades.


El dashboard, nos permite ver por proyectos



Otros informes

AVBravo - November 29, 2014 09:55 PM
Encuesta sobre el Libro

Amigos, este enlace tiene una encuesta sobre el libro
https://docs.google.com/forms/d/1WG7uzOe17V4u36fC05V3ijYEPZ8fhJD1NPUrkNBS0Jk/viewform?usp=send_form

AVBravo - November 29, 2014 03:50 PM
Libro JEE7 Capítulo 4. DataTable

Libro JEE7 Capítulo 4. DataTable

  • Para el manejo de tablas usaremos el componente <p:datatable>
  • Utilizaremos el CDI Beans EstatusDataController.java , que crearemos para el manejo de la lista de estatus que serán desplegados mediante el componente datatable.
  • Usaremos Método @PostConstructor
  • FILTRAR Y ORDENAR REGISTROS
  • DATATABLE CON FORMULARIO DE INSERCIÓN
  • Datatable con Selección, Edición y Eliminación de Registros


Para el manejo de tablas usaremos el componente <p:datatable>

Utilizaremos el CDI Beans EstatusDataController.java , que crearemos para el manejo de la lista de estatus que serán desplegados mediante el componente datatable.


Usaremos Método @PostConstructor

Se utiliza para invocar métodos al inicio, lo podemos usar para invocar mediante parámetros de un CDI Beans o de Session.

Pasos:
  1. Creamos un List<Estatus>
List<Estatus> estatusList;

  1. en el constructor inicializamos el estatusList.

public EstatusDataController() {
        estatusList = new ArrayList<>();
   }

  1. Ajustar método  getEstatusList()

Cambiamos el método getEstatusList()
por
public List<Estatus> getEstatusList() {
       return estatusFacade.getEstatusList();
   }
public List<Estatus> getEstatusList() {
       return estatusList;
   }

  1. crear los métodos set para estatusList, podemos utilizar el asistente clic derecho Insert code -->Getter and Setter… seleccionar estatusList

   public void setEstatusList(List<Estatus> estatusList) {
       this.estatusList = estatusList;
   }

Creamos el método  init con la anotación @PostConstruct, que sera invocado la primera vez que se carga el CDIBeans.Se usara otro metodo iniciar(), para el caso que deba ser invocado nuevamente.
@PostConstruct
       public void init(){
           iniciar();
       }
corregimos los import

Crear el método iniciar() para cargar registros.
public void iniciar(){
 estatusList = estatusFacade.getEstatusList();
}

Crear otro método iniciar con parámetro String ,este recibirá un parámetro para establecer el filtro de las entidades a mostrar en el datatable.
public void iniciar(String value){
   estatusList = estatusFacade.findByEsinicial(value);
}



Editar el método delete() y agregar la invocación al método iniciar(); de manera que carge el list actualizado.
 public String delete() {
       try {
           estatusFacade.remove(selected);
  iniciar();