martes, 20 de agosto de 2013

Ejecutar procedimiento almacenado en hibernate 4

De vez en cuando hay que ejecutar procedimiento almacenados en hibernate 4 he aqui un ejemplo, en realidad utiliza hibernate como la capa mas alta, al final lo ejecuta por jdbc, y esto es porque hibernate 4 solo ejecuta procedimientos almacenados de forma directa si estos devuelven datos en plan resultset, en caso contrario segun nos cuenta en su pagina se debe de utilizar por jdbc, que le llaman un "Work"

Ejemplo:

Params es una clase para encapsular lo datos entrada salida.

public void executeProcedimientoAlmacenado(final Params params) {
final StringBuilder sql = new StringBuilder("");
sql.append(" call esquema.nombre_procedimiento_almacenado(");
sql.append(" ?,");//IN_param_1
sql.append(" ?,");//IN_param_2
sql.append(" ?)");//OUT_param_1
getSession().doWork(new Work(){

public void execute(Connection connection) throws SQLException {
CallableStatement callStmt = connection.prepareCall(sql.toString());
int indexParam=1;
callStmt.setInt(indexParam++, params.getInParam_1());//1
    callStmt.setInt(indexParam++, params.getInParam_2() !=null ? params.getInParam_2() : Types.NULL);//2
callStmt.registerOutParameter(indexParam++, Types.INTEGER);//3
callStmt.executeUpdate();

params.setOutParam(callStmt.getInt(3)); //El parametro 3 es la salida, y lo pasamos al objecto params
}

});
}

Como se ve se utiliza "Work" que es una ejecución directa jdbc encampsulada por hibernate 4, y el objeto Params contiene los datos de entrada posterioremente se setean los de salida y así desde donde se llama el método el params contiene los resultados.

el getSession() es para obtener la session de hibernate, que se traduce también en sessionFactory.getSession() el sessionFactory es inyectado con Spring al Dao que ejecute los procedimientos almacenados, igual que cualquier otro dao.


viernes, 16 de agosto de 2013

Ejecutar procedumiento almacenado de DB2 en DbVisualizer Free 9.0.8

DbVisualizer es gratis, pero tiene muchas limitaciones la version gratuita :( y como siempre los empresarios se niegan a pagar las licencias de todas las utilerias que necesarias para realizar sistemas de manera mas agil. Si no queremos usar la linea de comandos de DB2 podemos ejecutar lo siguiente en el DbVisualizer:

@call esquema.nombre_procedimiento_almacenado(param1, param2, ${nomVar||(null)||Date||dir=out}$);

se utiliza el @call para ejecutar el procedimiento almacenado
las variables de entrada van directamente en los parametros.
Cuando es variable de salida se le especifica, lo que esta entre ${.....}$ indica que es una variable y se compone de 4 parametros:
nomVar, nombre de la variable cualquier.
(null), se especifica el valor, ya que es variable de salida, se pone a null.
Date, Es el tipo, puede ser Integer, String, BigInteger, etc....
dir, indica si es entrada "in", salida "out" o entrada salida "inout"

Cuando se ejecuta el procedimiento almacenado nomVar guarda el valor y luego para ver su valor se ejecuta:

@echo nomVar: ${nomVar}$;

y se muestra un popup con su valor.


jueves, 1 de agosto de 2013

Utileria. Convertir un DTO en String.


Aveces hace falta para sacar en consola o en el log, los valores de un objeto

    /**
     * Transforma un DTO a cadena.
     * @param obj
     * @return
     * @throws SecurityException 
     * @throws NoSuchMethodException 
     */
    public static String dtoToString(Object obj){
    if(obj!=null){
    StringBuilder out = new StringBuilder();
        out.append("[");
        Field[] props = obj.getClass().getDeclaredFields();
        for(Field prop:props){
    try{
    String methodName= "get";
        methodName += String.valueOf(prop.getName().charAt(0)).toUpperCase();
    methodName += prop.getName().substring(1);
    Method getter = obj.getClass().getMethod(methodName);
    Object value = getter.invoke(obj, new Object[0]);
        out.append(prop.getName()+":"+value);
        out.append(", ");
    }catch(Exception e){
    }    
        }
        out.append("]");
        return out.toString();
    }else{
    return "No dto object";
    }
    }


Utileria. Para poblar un pojo con datos provenientes de un resultSet.

Esta es una clase utileria para poblar un objeto DTO con datos provenientes de un resultset en java

package com.inditex.isu4.core.services.factory;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;

/**
 * Factoria de construccion de DTO's
 * @author etereum
 *
 */
public class DTOFactory{

private static Logger log = Logger.getLogger(DTOFactory.class);

/**
* Contrulle la lista de DTO's apartir del tipo de dto que se pase como parametro.
* @param dtoType
* @param rs
* @return
* @throws SQLException
* @throws InstantiationException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
* @throws SecurityException
*/
public static <T> List<T> getDTOListFromRS(T dtoType, ResultSet rs) throws SQLException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException{
log.debug("getDTOListFromRS....");
List<T> dataList = new ArrayList<T>();
Constructor[] factories = dtoType.getClass().getDeclaredConstructors();
Constructor factory = null;
for (int i = 0; i < factories.length; i++) {
factory = factories[i];
   if (factory.getGenericParameterTypes().length == 0)
break;
}
while(rs.next()){
   Object dto = factory.newInstance();
   Field[] props = dto.getClass().getDeclaredFields();
  for(Field prop:props){
 try{
Object value = rs.getObject(prop.getName());
  String methodName= "set";
      methodName += String.valueOf(prop.getName().charAt(0)).toUpperCase();
  methodName += prop.getName().substring(1);
  Class<?> classType =null;
  if(value ==null){
  continue;
  }else if(value instanceof String){
      classType=String.class;
  }else if(value instanceof Integer){
      classType=Integer.class;
  }else if(value instanceof Date){
  classType=Date.class;
  }
  Method setter = dto.getClass().getMethod(methodName, classType);
  setter.invoke(dto, value);
 }catch(Exception e){
 log.warn("No fue posible asignar el valor. ["+prop+"]");
   log.warn("Exception.getDTOListFromRS", e);
   }
           }
dataList.add((T)dto);
}
log.debug("getDTOListFromRS.OK.");
return dataList;
}

}

miércoles, 10 de abril de 2013

Oferta laboral

"Empresas" malas, malas, malas, malisimas, o peor aun simples "Gestorias" que regentean personas en otras palabras carroñeros de personal.

De:  ..... @avancesoluciones.com>
Para: ....@hotmail.com
Enviado: Un día, del mes, del año  alas ..50:00:01
Asunto: Propuesta de trabajo Desarrollador Java Sr Mexico Neo

Hola Buen día:

El motivo  de mi correo es porque vi tu cv en OCC, el cual me intereso para la siguiente posición que tengo.

Se solicita JAVA Developer
Se necesita quetenga experiencia en desarrollo Java de  3 años.
Duración:  6 meses
Localidad: México

El esquema que manejamos es el siguiente:
1.- Se te contrata por la duración del proyecto.
2.- Se te da tu pago libre
3.- El pago es Quincenal.
3.-  No se manejan las prestaciones de ley , se te daría Seguro de Gastos médicos Mayores por la duración de tu proyecto.
4.- Se te da seguimiento, es decir cuando este por terminar tu proyecto se trata de ver si el cliente tiene algún proyecto en base a tu perfil.
Si te interesa y cumples con el skill, te pido me mandes estos formatos llenos y tu  cv actualizado, si tienes alguna duda indícamelo para contactarte.
En caso de que no estés disponible o no te interese el proyecto si conoces a alguien que pudiera interesarle el proyecto te pido le pases mis datos.
Espero tu respuesta sea positiva o no.
Saludos :D
  
Lic. C (que tiene nomina, prestaciones de ley, plus, y vive usar y tirar a la gente)
AVANCE|Delivery Center
Empresa Verificada (MOPROSOFT)
 @avancesoluciones.com
Monterrey | Houston | México DF | Chihuahua
-------------------------------------------------------------------------------------

Visitando la pagina de la empresa vemos que no tiene ni la mas mínima información... ademas de estar echa en PHP, (son tan cutres que pagan el hosting mas barato).

Al parecer es una de esas gestorías que se auto nombran "Consultoras expertas en IT" que buscan profesionales en informática para revenderlos, al revendedor, mermar el sueldo del trabajador por el transpaso de manos en mano.

Y porque no dicen lo mas importante? la paga? acaso serán 50,000 pesos mensuales? solo así se compensa su esquema, y eso para un becario, un becario tiene a lo mas 8 meses de experiencia... bueno quizás me estoy excediendo, lo dejamos en 49,999.99, para un becario. Ya que no tienes seguridad social ni para ti, ni para tus padres, hijos o pareja, dice que dan gastos médicos mayores, que de seguro será solo para ti, y solo durante el proyecto, entonces no puedes darles exclusividad porque 2 meses antes tienes que ir buscando otro proyecto. Aunque si nunca te dicen la fecha limite del proyecto, vamos mal!!!!!.

Esta claro que esta oferta se puede tomar mientras se consigue algo mejor, que de verdad de "empresas" como esta estoy hasta los huevos!!!!!!!!!!!






jueves, 17 de enero de 2013

Configurar Apache Server y PHP en windows.

Here we go.......

No confundir Apache Server con Apache Tomcat Server.... que yo me confundia antes, ambos son servidores de Apache.

Hay que descargar apache server, y php, yo prefiero hacerlo en formato zip, en lugar de usar el distribuible para windows...

Paso 1: Descargar...

Apache Server  V2.0.64
PHP 5

Paso 2: Descomprimir...

Ahora hay que descomprimir cada fichero... mi directorio donde los voy a descomprimir sera:
d:/oha/installa/
De tal forma que me queda...

Apache server en:
d:/oha/installa/apache-server-2.0.64/Apache2

Apache2 es el directorio que ya viene el el zip.

Php en..
d:/oha/install/php-5.4.10

php-5.4.10 es el directorio para poner ahi el contenido del zip de php.

Paso 3: iniciar apache.

En el directorio "Apache2/bin" tenemos el comando Apache.exe, entonces en linea de comandos vamos al directorio bin y ejecutamos ..

Apache.exe -k start

Puede que les de error como el que sigue:

(OS 10048)S¾lo se permite un uso de cada direcci¾n de socket (protocolo/direcci¾n de red/puerto)  : make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs




Esto es porque algun programa esta usando el puerto 80, entonces hay que cambiarlo. Para cambiarlo hay que ir al fichero httpd.conf en el directorio conf de donde hayan instalado apache.

Hay que buscar la linea "Listen 80" o solo "Listen" y en lugar de poner 80, lo sustituimos por 8080.
Tambien la linea "ServerName" ahi tendra el nombre de su pc, y el puerto, susitumos el 80 por 8080 igual.

Guardamos y cerramos.

Si volvemos a ejecutar Apache.exe -k start quizas vuelva a mandar un error diciendo que apache no esta definido como servicio, para solucionar esto debemos ejecutar...

httpd.exe -k install -n "Apache2"

Ahora si ejecutamos

apache-server-2.0.64\Apache2\bin>Apache.exe -k start
apache-server-2.0.64\Apache2\bin>



Y luego vamos al navegador y escribimos "http://localhost:8080" y debe aparecer una pagina parecida a la de tomcat, y si no muestra nada, marron!!!!!!!!!! buscar el error en google que no soy adivino :D.

Paso 5. Detener apache jejejeje

Como vamos a configurar php vamos a detener apache.

Apache.exe -k stop                  igual que shutdown.
Apache.exe -k shutdown            igual que stop
Apache.exe -k restart                  Reinicia

Paso 4. Configurar php en apache server

Php se instala en apache server de 2 formas, como modulo o cgi, no se cual sea lo mejor pero yo solo se intalarlo como cgi asi que ahi vamos...

En el fichero httpd.conf tenemos que agregar 3 lineas...

ScriptAlias /php/ "D:/oha/install/php-5.4.10/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php-cgi.exe"

Buscar en el fichero  la seccion "ScriptAlias", es decir esta palabra y ahi se agrega la ruta donde esta instalado php, basicamente se define un Alias, la variable es /php/ y luego la ruta donde esta instalado.

Despues buscar la seccion "AddType" y agregar la parte de AddType. Basicamente se dice que aceptaremos tipos .php, asi como los .html, .cgi y esas extenciones raras :D.

Por ultimo agregar "Action" creo que no hay seccion action, asi que lo pueden agregar al final. aqui se junta el exe php-cgi.exe con el alias que definimos anteriormete, y listo!!!!!!!!!!!!!! ya todo chachi guay piruli deberia de funcionar. y si no marron!!!!!!!!!!!!!!!!!!.

Paso 5. Probar...

En el fichero httpd.conf miramos donde es donde podemos poner nuestros ficheros, ya sea html, o php, buscando la variable "DocumentRoot" ahi nos dara una ruta, que regularmente es /Apache2/htdocs
en esa ruta es donde colocamos nuestros ficheros html, o php.

Entonces en ese directorio podemos crear otro directorio o poner directament el php.
Yo cree algo así /Apache2/htdocs/test/hola.php

Y el contenido de hola.php es:

<?php
phpinfo();
?>

Y ya solo queda iniciar apache.... remember...

apache-server-2.0.64\Apache2\bin>Apache.exe -k start
apache-server-2.0.64\Apache2\bin>

Y ahora en el browser

http://localhost:8080/test/hola.php







Proyecto Base SWT para windows...

Este es un proyecto base para SWT.
Utiliza maven version 3.0.3
Eclipse, Juno.
SWT v 4.234  para windows

Este proyecto genera un zip con un jar que se puede ejecutar con "java -jar nombre.jar" o doble click en el jar y siempre y cuando se tenga instalado JRE ya se iniciara la aplicacion.

Una vez descomprimido ejecutar:

mvn clean package

Y ya tenemos el zip para distribuir.


Click aqui para descargarlo....




miércoles, 16 de enero de 2013

Calendario + JavaFX

Ho no!!!!!!!!!!!!!!!!!!!!!!!!!! componente Calendario en JavaFX

Pues eso.... un componente para mostrar el calendario, gracias a nuestro señor jesucristo hay gente tan agradable que comparte sus componentes y no hay que reinventar la rueda.....

http://www.e-zest.net/blog/calendar-control-in-javafx-2-0/

Muestra un popup calendario, con el boton de calendario y el textbox de calendario

ComboBox + CheckBox + JavaFX

Pues eso.... como siempre se requieren chorradas para presentar los datos al usuario de una forma facil de digerir, y ahora se necesita un checkBox con seleccion multiple.

Pues me di de topes, porque no hayaba la forma y al final realice un componente que para sacarnos de apuros ayuda....


import java.util.ArrayList;
import java.util.List;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.Bounds;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ListView;
import javafx.scene.layout.VBox;
import javafx.stage.Popup;

/**
 * Simula un ListBox con elementos checkBox.
 * @author oscarha
 *
 */
public class MultiComboBox<T> extends VBox implements EventHandler<Event>{
 
    private ListView<CheckBox> checkBoxList = new ListView<CheckBox>();
    private Popup checkBoxListPopup = new Popup();
    private List<T> dataList = new ArrayList<T>();
    private Button comboLabel = new Button("0 Seleccionados");
   
    /**
     * Constructor por defecto.
     */
    public MultiComboBox(){
        checkBoxListPopup.setAutoHide(true);
        checkBoxListPopup.setAutoFix(true);
        checkBoxListPopup.setHideOnEscape(true);
        checkBoxListPopup.getContent().add(checkBoxList);
        getChildren().add(comboLabel);
        comboLabel.setOnMouseClicked(this);
        checkBoxList.setOnMouseClicked(this);
    }

    /**
     * OnClick
     */
    public void handle(Event event) {
        if(event.getSource().equals(comboLabel)){
            comboLabelOnClick();
        }       
    }
   
    /**
     * Muestra o esconde el ListView de CheckBoxes
     */
    private void comboLabelOnClick(){
        if(checkBoxListPopup.isShowing()){
            checkBoxListPopup.hide();
        }else{
            Parent parent = getParent();
            Bounds childBounds = getBoundsInParent();
            Bounds parentBounds = parent.localToScene(parent.getBoundsInLocal());
            double layoutX = childBounds.getMinX() + parentBounds.getMinX() + parent.getScene().getX() + parent.getScene().getWindow().getX();
            double layoutY = childBounds.getMaxY() + parentBounds.getMinY() + parent.getScene().getY() + parent.getScene().getWindow().getY();
            checkBoxListPopup.show(this, layoutX, layoutY);
        }
    }

    /**
     * Obtiene todos los datos.
     * @return
     */
    public List<T> getDataList() {
        return dataList;
    }

    /**
     * Inicializa los datos.
     * @param pDataList
     */
    public void setDataList(List<T> pDataList) {
        this.dataList = new ArrayList<T>();
        this.dataList.add(null);
        this.dataList.addAll(pDataList);
        refreshData();
    }
   
    /**
     * Actualiza los datos.
     */
    private void refreshData(){
        checkBoxList.getItems().clear();
        setTodosOption();
        for(int a=1; a<getDataList().size(); a++){
            CheckBox checkBox = new CheckBox(getDataList().get(a).toString());
            checkBox.setOnAction(new EventHandler<ActionEvent>() {

                public void handle(ActionEvent arg0) {
                    refreshLabel();
                }
               
            });
            checkBoxList.getItems().add(checkBox);
        }
    }
   
    /**
     * Pone la opcion de todos al inicio del list view.
     */
    private void setTodosOption(){
        CheckBox checkBox = new CheckBox("Todos");
        checkBox.selectedProperty().addListener(new ChangeListener<Boolean>(){

            public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean newValue) {
                for(int a=1; a<dataList.size(); a++){
                    checkBoxList.getItems().get(a).setSelected(newValue);
                }
                refreshLabel();
            }
           
        });       
        checkBoxList.getItems().add(checkBox);
    }
   
    /**
     * Actualiza la etiqueta.
     */
    private void refreshLabel(){
        int size = getSelectedData().size();
        comboLabel.setText(size+" Seleccionados");
    }
   
    /**
     * Obtiene los datos que se hayan seleccionado.
     * @return
     */
    public List<T> getSelectedData(){
        List<T> selList = new ArrayList<T>();
        for(int a=1; a<dataList.size(); a++){
            if(checkBoxList.getItems().get(a).isSelected()){
                selList.add(dataList.get(a));
            }
        }
        return selList;
    }
   
   
}




Queda una chorrada mas o menos así......

Presentación

Otra pagina mas de programación.....