Tuesday, June 16, 2015

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.


Saturday, June 13, 2015

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>

















Tuesday, May 19, 2015

Monday, May 18, 2015

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>



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%; }





Saturday, May 09, 2015

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>