viernes, 6 de noviembre de 2009

MANEJO DE 'WEB SERVICE' CON 'AXIS2'.

Hace un tiempo posteè sobre el manejo de Web Service con AXIS1, esta vez mostraré el manejo de Web Service (Su consumo) pero con AXIS2. Este Framework AXIS2 a diferencia de su versión anterior AXIS1 permite un mejor manejo de los Web Service Orientados a Objetos, ya que en la versión anterior de AXIS los Objetos del Service enviados como parámetros por el Web Service, se podían regenerar desde un cliente WS pero para poder parsearlos se necesita de forma obligada el número de serialVersionUID (Para poder comprobar que es el mismo objeto) , aquí AXIS1 era débil. AXIS2 supero eso ya que no tiene este traspié. AXIS2 solamente posee un problema al momento de la generación del cliente WS que mas adelante mostraremos y solucionaremos.

Al igual que el ejemplo posteado con AXIS1 mostraré la generación del Cliente WS y consumo de dichos procesos:

/********** PROCESOS 'WS' **********/
//Probando 'SUMA'.
clienteWS.getResultadoSuma( numero_01, numero_02, accesoWS );

//Probando 'RESTA'.
//clienteWS.getResultadoResta( numero_01, numero_02, accesoWS );

//Probando 'MULTIPLICACION'.
//clienteWS.getResultadoMultiplicacion( numero_01, numero_02, accesoWS );

//Probando 'DIVISION'.
//clienteWS.getResultadoDivision( numero_01, numero_02, accesoWS );

//Probando 'obtenerUsuario'.
//clienteWS.getObjetoUsuario( accesoWS );

//Probando 'obtenerListaUsuarios'.
//clienteWS.getListaUsuarios( accesoWS );;
/***********************************/

Los pasos son los siguientes:

1.- Tenemos el WSDL ya generado del servidor “UsuarioServiceImpl.wsdl” , este WSDL esta en la ruta: WebContent/wsdl/UsuarioServiceImpl.wsdl. En base a esta ruta generaremos por medio de consola el Cliente AXIS2, pero tendremos que configurar las variables de entorno antes.

2.- Bajarte la ultima versión de AXIS2: http://ws.apache.org/axis2/1_5_1/installationguide.html

3.- Ubicarla en una ruta en tu PC: “D:\JAVA\Axis\axis2-1.5.1”

4.- Registrar las variables de entorno (Tanto en Usuario como en Sistema):



5.- Generar el cliente AXIS2 desde consola aplicando el siguiente còdigo desde la ruta raiz del proyecto trabajado:

%AXIS2_HOME%/bin/WSDL2Java -p org.java.service -uri WebContent/wsdl/UsuarioServiceImpl.wsdl -s



6.- En este momento AXIS2 genera un error:

Es posible que cuando se desee generar un cliente JAVA con AXIS2 en base a un WSDL, uno encuentre con un error así:

Unexpected subelement 'XXXX'

Esto se debe a que AXIS2 genera el Cliente WS de una forma no totalmente correcta. Ya que confunde los NameSpaceURI. Supongamos como en este caso que el Servidor WS posee dos paquetes:

- PAQUETE DEL OBJETO: org.java.bean
- PAQUETE DEL WS: org.java.servidor.ws

Al momento de la generación del Cliente WS con AXIS2, los NameSpaceURI se invierten y quedan de la siguiente manera:

- NAMESPACE APUNTANDO AL OBJETO: “http://bean.java.org"
- NAMESPACE APUNTANDO AL WS: "http://ws.servidor.java.org"

Aquí esta el problema y la solución seria buscar la clase 'Stub' generada, en este caso 'ConsultaWSServiceStub' y en ella buscar por cada Objeto que se trabaje su:

static MY_OBJETO parse:

/**
* Factory class that keeps the parse method
*/
public static class Factory{

/**
* static method to create the object Precondition: If this object is an element, the
* current or next start element starts this object and any intervening reader events
* are ignorable If this object is not an element, it is a complex type and the reader
* is at the event just after the outer start element Postcondition: If this object is
* an element, the reader is positioned at its end element If this object is a complex
* type, the reader is positioned at the end element of its outer element
*/
public static Usuario parse( javax.xml.stream.XMLStreamReader reader ) throws java.lang.Exception{

Y cambiar el NameSpace para cada campo de > cada Objeto trabajado, de la siguiente forma:

AQUI SE DA EL 'ERROR':

while( !reader.isStartElement() && !reader.isEndElement() )
reader.next();
if( reader.isStartElement() &&
new javax.xml.namespace.QName( "http://bean.java.org", "nombre" ).equals( reader.getName() ) ){
nillableValue = reader.getAttributeValue( "http://www.w3.org/2001/XMLSchema-instance", "nil" );
if( !"true".equals( nillableValue ) && !"1".equals( nillableValue ) ){
java.lang.String content = reader.getElementText();
object.setNombre( org.apache.axis2.databinding.utils.ConverterUtil.convertToString( content ) );
}
else{
reader.getElementText(); // throw away text nodes if any.
}
reader.next();
} // End of if for expected property start element
else{
// A start element we are not expecting indicates an invalid parameter was
// passed throw new org.apache.axis2.databinding.ADBException( "Unexpected subelement " + reader.getLocalName() );
}

AQUI SE DA EL 'SOLUCION':

while( !reader.isStartElement() && !reader.isEndElement() )
reader.next();
if( reader.isStartElement() &&
new javax.xml.namespace.QName( "http://ws.servidor.java.org", "nombre" ).equals(
reader.getName() ) ){
nillableValue = reader.getAttributeValue( "http://www.w3.org/2001/XMLSchema-instance", "nil" );
if( !"true".equals( nillableValue ) && !"1".equals( nillableValue ) ){
java.lang.String content = reader.getElementText();
object.setNombre(
org.apache.axis2.databinding.utils.ConverterUtil.convertToString( content ) );
}
else{
reader.getElementText(); // throw away text nodes if any.
}
reader.next();
} // End of if for expected property start element
else{
// A start element we are not expecting indicates an invalid parameter was
// passed throw new org.apache.axis2.databinding.ADBException( "Unexpected subelement " + reader.getLocalName() );
}

7.- Creamos la clase: org/java/client/ClienteWS_Generado.java y vamos descomentando y ejecutando los procesos anteriormente nombrados uno por uno para probar su manejo. Recordar que primero se tiene que desplegar el demo del 'Proyecto Servidor' que es parte del demo posteado llamado: Ejemplo Web Service con JAX-WS , para poder probar sin problemas el Cliente WS con AXIS2.

Para mayor detalle descargar el ejemplo completo: AQUÌ.

jueves, 15 de octubre de 2009

MANEJO DE FECHAS CON JODA API

El manejo de Fechas en JAVA siempre a sido un poco molestoso ya que uno por muchos motivos tiende al manejo de dichas fechas de diferentes formas:

En String, Date, Calendar, GregorianCalendar, etc.

Y porque no hay un estándar en dicho manejo de fechas, las tendencias son siempre convertir formatear, reconvertir y volver a formatear para manipular los datos de un lado a otro. Bueno en esta oportunidad presento esta API Java que puede ayudar en algo dichos problemas ya que proporción objetos (No Deprecated) que son fáciles de manipular, que permiten muchas conversiones: StringToDate, DateToString, etc. y que con una sola línea te devuelve lo deseado, el API se llama JODA y aquí les comparto una clase JAVA donde muestro su manejo. El manejo es tan fácil como decir:

int anos = Years.yearsBetween( fechaInicio, fechaFin ).getYears();

Aquí maestro el resumen informativo de un demo en donde trabajo el cálculo de 2 fechas:


FECHA INICIO [DateTime]: 1983-01-04T00:00:00.000-05:00
FECHA FIN [DateTime]: 2009-10-15T14:23:30.093-05:00

FECHA INICIO [Date]: Tue Jan 04 00:00:00 COT 1983
FECHA FIN [Date]: Thu Oct 15 14:23:30 COT 2009

FECHA INICIO [Date MGT]: 4 Jan 1983 05:00:00 GMT
FECHA FIN [Date MGT]: 15 Oct 2009 19:23:30 GMT

FECHA INICIO [Date LOCALE]: 04-ene-1983 0:00:00
FECHA FIN [Date LOCALE]: 15-oct-2009 14:23:30

FECHA INICIO [Calendar]: java.util.GregorianCalendar[time=410504400000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/Bogota",offset=-18000000,dstSavings=0,useDaylight=false,transitions=5,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=1983,MONTH=0,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=4,DAY_OF_YEAR=4,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-18000000,DST_OFFSET=0]

FECHA FIN [Calendar]: java.util.GregorianCalendar[time=1255634610093,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/Bogota",offset=-18000000,dstSavings=0,useDaylight=false,transitions=5,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2009,MONTH=9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=15,DAY_OF_YEAR=288,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=23,SECOND=30,MILLISECOND=93,ZONE_OFFSET=-18000000,DST_OFFSET=0]

//VALIDANDO
[F.INICIO] ES ANTES [F.FIN]
[F.FIN] ES DESPUES [F.INICIO]


DATOS [FECHA INICIO]
--------------------
AÑO: 1983
AÑO DE LA CENTURIA: 83
AÑO DE LA ERA: 1983
MES DEL AÑO: 1
DIA DEL MES: 4
DIA DE LA SEMANA: 2
DIA DEL AÑO: 4
MINUTO DEL DIA: 0
MINUTO DE LA HORA: 0
SEGUNDO DEL DIA: 0
SEGUNDO DEL MINUTO: 0


DATOS [FECHA FIN]
-----------------
AÑO: 2009
AÑO DE LA CENTURIA: 9
AÑO DE LA ERA: 2009
MES DEL AÑO: 10
DIA DEL MES: 15
DIA DE LA SEMANA: 4
DIA DEL AÑO: 288
MINUTO DEL DIA: 863
MINUTO DE LA HORA: 23
SEGUNDO DEL DIA: 51810
SEGUNDO DEL MINUTO: 30

//OTROS DATOS
DIAS ENTRE [F.INICIO] & [F.FIN]: 9781
MESES ENTRE [F.INICIO] & [F.FIN]: 321
AÑOS ENTRE [F.INICIO] & [F.FIN]: 26
MINUTOS ENTRE [F.INICIO] & [F.FIN]: 14085503
SEGUNDOS ENTRE [F.INICIO] & [F.FIN]: 845130210


Para descargar El demo pulsar:
AQUÌ.

jueves, 8 de octubre de 2009

OBTENCIÒN DE DATOS DE XML CON XPATH Y JAVA

El otro dìa me encontre con un post que hablaba muy bien de un lenguaje de programaciòn para el ràpido acceso a datos embebidos en un fichero XML, este lenguaje se llama XPATH
y es una versiòn superior a otro conocido pero màs antiguo lenguaje llamado XQL, el cual su logica era en base a consultas tipo SQL acceder a los datos pero no de una BD sino de XML propiamente. XPATH heredò toda la sintaxis de este lenguaje como predecesor que es y le ha puesto varias mejoras. XPATH como lenguaje esta orientado a buscar información dentro de
documentos con esctructura en XML. Uno de sus ùnicos defectos que le he podido encontrar es que no se pueden realizar JOINs, pero se puede jugar con los datos obtenidos y cargar listas de datos por ejemplo de còdigos que pueden servir en entrada para la obtenciòn de datos de otra tabla (si lo orientamos a SQL por decir) y que finalmente da un resultado similar al de un JOIN. Este lenguaje es verdaderamente ràpido y lo mejor es que podemos trabajarlo simultaneamente con JAVA, ya que JAVA posee librerìas que soportan las consultas generadas con los XPATH Querys y por ser un lenguaje superior JAVA te permite lo anteiormente hablado de simular un JOIN cargando
listas y recorriendolas.

Al comienzo XPATH puede causar un poco de molestia, ya que su sintaxis no es SQL, pero poco a poco uno le agarra el truco, yo en medio dìa lo aprendì y para probarme que tan bien lo aprendì, busquè y encontre una muy buena WEB donde explican todo en Español sobre XPATH y posse un SIMULADOR donde te toman un TEST de sintaxis
que en base a preguntas y con un gran XML a tu costado, tienes que demostrar que sabes y codificar tu Query y comparar el resultado que tienes con el resultado correcto, que tambien se muestra al lado.

Los links son los siguientes:

- TUTORIAL: http://geneura.ugr.es/~victor/cursillos/xml/XPath
- FICHERO XML: http://geneura.ugr.es/~victor/cursillos/xml/XPath/ejercicios_xpath_xml.html
- SIMULADOR: http://geneura.ugr.es/~victor/cursillos/xml/XPath/ejercicios_xpath.html

Pero como este es un BLOG de JAVA, tenemos que hablar de JAVA, asi voy a mostrar la soluciòn de este simulador pero dentro de una aplicaciòn JAVA que yo mismo cree y que de paso muestra el facil manejo de lentura de XML que este XPATH con JAVA de manera conjunta hacen.

Para descargar la aplicaciòn demo pulsar:
AQUI.

SIMPLE XML FRAMEWORK 1.2

En esta oportunidad voy a hablar sobre un muy buen y potente Framework para manipulaciòn de ficheros XML. Este Framework se llama SIMPLE FRAMEWORK v1.2. Este framework a diferencia de todos los anteriores Frameworks de parseo de datos para ficheros XML que he utilizado previamente, los cuales trabajan para la obtencion de los datos recorriendo y recorreindo todos los XML muchas veces y que la verdad no es òptimo. Por ejemplo en mi trabajo los XML que manejamos son verdaderamente GIGANTES tanto asì que para su recorrido y obtenciòn de los datos podìan demorar unas 2 horas en algunos casos, algo realmente catastròfico. Bueno este framework viene para la salvaciòn de estos problemas, ya que su logica de trabajo esta orientada a la creaciòn y manipulaciòn de los XML pero con una Lògica Orientada a Objetos, ustedes diran como??, bueno para su trabajo se debe ter una seria de objetos (Beans) relacionados de la misma forma que uno quiere que su XML este formado (herendando, instanciando, etc) a tal punto de que cuando uno mande a generar el XML el framework lo genere de una forma excelente y en un màximo 10 lineas de còdigo y luego cuando se requiere acceder a los datos del XML, el mètodo respectivo que instancia el fichero XML automaticamente carga en memoria todo el XML y uno simplemente recorrerìa los objeto dentro de tu aplicacion via GET y obtendrìas los datos, todo un registro o una lista de registros de forma completa. Eso si este Framework trabaja con JAVA mìnimo 1.5, ya que manipula los beans con Anotaciones.

Aquì les comparto un completo ejemplo para mostrales la potencia de este Framework:
Descargar.

miércoles, 22 de julio de 2009

Integración JSF - IBATIS

Hola compañeros en esta oportunidad estoy posteando sobre este muy bonito Framework
llamado IBATIS, la verdad no muchos motivos no lo había utilizado antes, pero por necesidad de que el manejo de dicho framework es Standard en mi centro de trabajo, me dedique un par de días a investigar todo acerca de este framework y de di con la sorpresa de que es muy útil, rápido de configurar e integrar con otros frameworks a comparación de otros como Hibernate ( Aunque la verdad aun prefiero trabajar con Hibernate ). Este framework lo muy bueno que tiene es que las consultas SQL las realiza en un fichero .XML que esta necesariamente amarrado a un objeto del negocio y donde se mapearan todas las consultas relacionadas a las transacciones en donde este objeto este relacionado, las consultas están embebidas dentro de tags especiales del IBATIS que permiten recibir variables primitivas, variables de tipo clase y hasta objetos completos. Permite el uso de comodines para las consultas y parámetros dinámicos diferenciados por símbolos como el #, permite la reutilización de las consultas realizadas ( Llamado de un QUERRY a otro QUERRY ), para minimizar código, Manejo de Store Procedure, etc. Todo esto dentro de los mapeos y desde la implementación de cualquier DAO asignado simplemente se le llamaría por medio del nombre del ID el cual esta asignado al IBATIS tag que envuelve la consulta SQL respectiva, algo como lo que muestro pero empleado para distintos procesos CRUD:

• Integer estadoGuardar = (Integer)this.update( "nombreIdSQL", nombreMiObjeto );

• Usuario objUsuario = (Usuario)this.insert( "nombreIdSQL", nombreMiObjeto );

• Usuario usuario = (Usuario)queryForObject( "nombreIdSQL", codigo );

• List listaUsuario = (List)queryForList( "getListaUsuario", codigo );


Pensando en esto he visto la necesidad de hacer un aplicativo J2EE de ejemplo donde integro los Frameworks JSF y IBATIS. Es un ejemplo muy completo que se inicia con un login:

Usuario: rguerra
Password: 123

Y internamente es un mantenimiento completo de USUARIOS: Listado, Registro, Modificacion, Eliminacion (CRUD) y ademas le he agredado Filtros con comboBoxs y funcionalidad keyPress.

El aplicativo WEB esta realizado con Eclipse v3.3, bajo una plataforma JAVA v1.6 (Pero funciona tambien con la v1.5), IBATIS v2.1.6 y una motor datos MySql. El Script SQL se encuentra dentro del proyecto y viene con un Store Procedure incluido utilizado para el proceso de logín.

Aplicativo Ejemplo:

Login de la aplicacion..

Listado de Usuarios

Registro de Usuarios Nuevos de tipo 'Administrador'

Usuaio Nuevo Listado

Modificacion de Usuario Nuevo

Listado de Usuario Modificado

Eliminacion de Usuario Modificado

Listado de Usuarios Actuales


Para mayor detalle descargar el ejemplo completo: AQUI.

lunes, 1 de junio de 2009

MANEJO DE 'WEB SERVICE' CON 'AXIS1'.

Ultimamente en mi nuevo trabajo me solicitaron la integracion de dos sistemas que trabajaban por separado y analizando decidi aplicar 'Web Service'(WS), asi que buscando decidi aplicar este muy buen Framework para manejo en JAVA de Web Service 'AXIS1'. El ejemplo presentado acontinuaciòn consiste en dos proyectos JAVA:

1.- Ejemplo_ServidorWS_AXIS1:
- Posee clases de conexion a MySql.
- Posee un Patròn DAO y las Interfaces respectivas.
- Posee Servicios de acceso.
- Aqui se genarara el 'WSDL'(Que es un XML mapeado con los paràmetros que accederàn de un sistema al otro), mediante la herramienta que brinda Eclipse.

2.- Ejemplo_ClienteWS_AXIS1:
- Posee dos ejemplos de Cliente 'Web Service', el primero generado mediante la herramienta del Eclipse para generar un 'Cliente WS' en base al 'WSDL' ya creado, y el segundo cliente es en base varias clases que brinda 'AXIS' para el acceso automàtico en base a solo el nombre de la ruta del 'WSDL' en String.

Datos Importante (Sobre el Ejemplo a Descargar):
- El ejemplo del manejo de Web Service esta preparado para correr con platformas JAVA v1.5 y v1.6 (Aqui se debe quitar de a carpeta 'lib': jsp-api.jar y servlet.jar ya que vienen dentro del 'JDK-1.6' sino crea conflicto y no levantar la aplicaciòn), trabaja con una conexion a MySql (El Stript se encuentra dentro del Aplicativo Servidor) y fue desarrollado en Eclipse v3.3.

- Para levantar el 'Web Service', se tiene que tener ya un proyecto Java listo con las conexion a MySql, que trabajara como 'Servidor' y en base a la Implementacion de una Interface 'DAO' o la de un 'Servicio' se generara el 'WSDL', donde se mapearan los datos de entrada y salida para la interconexion de los sistemas. (Al correr la aplicaciòn con el Tomcat, se levanta junto con la aplicacion el servicio 'WSDL'). Ver imagenes:

Se muestra el arbol de la aplicaciòn que servirà de Servidor para el 'WS'.

Comenzamos a generar el 'WS' con la herramienta de Eclipse.

Seguir pasos que se muestran en la imagen.

Chequear los mètodos que serviràn para la generaciòn del 'WS'
(Seran mapeados en el XML).

Iniciar el Servidor y pulsar finalizar.

Se levantarà la aplicaciòn y se mostrarà una pàgina 'JSP'.

Del 'WDSL' generado obtendremos la ruta del del 'WSDL' para probar si el servicio esta iniciado.

A la vez que se levanta el servidor se inicia el Servicio del 'WS'. Observemos el 'WSDL' generado agregando al link el '?wsdl'.

Luego de esto, para generar el cliente con la herramienta que facilita el Eclipse
copiamos la carpeta 'WSDL' con todo su contenido del Proyecto Java que sirve de 'Servidor' al proyecto que servirà de 'Cliente' y del 'UsuarioDaoImpl.wsdl' generar las clases base.


Dar los cheks respectivos que se muestran en la imagen.

Se muestra la ubicaciòn donde se generà las clases de apoyo al 'WS' (org.java.dao) en la aplicacion 'Cliente'.

Se muestran las clases generadas en el proyecto Cliente 'WS'.

Luego de estos pasos, ya podemos trabajar con el cliente 'WS'. Mostrarè dos formas de realizar un cliente 'WS' para realizar un mantenimiento via 'WS', los procesos seràn los siguientes y se ejecutaràn en base al orden que sean descomentados:

/********** PROCESOS 'WS' **********/
clienteWS.registrarUsuario( accesoWS );
//clienteWS.modificarUsuario( accesoWS );
//clienteWS.eliminarUsuario( accesoWS );
//clienteWS.obtenerObjetoUsuario( accesoWS );
//clienteWS.obtenerListaObjetosUsuario( accesoWS );
/**************************************/

1.- Cliente 'WS' en base a las clases generadas:'src.org.java.client.ClienteWS_Generado.java', utiliza las clases generadas por Eclipse para conectarse al 'WSDL'.

2.- Cliente 'WS' de acceso automàtico sin utilizar ninguna clase generada:'src.org.java.client.ClienteWS.java', no necesita ninguna clase sino que utiliza las Clases que brinda AXIS para el acceso automàtico, necesitando simplemente la ruta del 'WSDL' en String.

Para mayor detalle descargar el ejemplo completo: AQUI.

AUTOMATIZACIÒN DE PROCESOS CON 'QUARZ'

Hace tiempo estaba buscando alguna forma de como realizar 'Procesos Automàticos', que estos se ejecuten periodicamente, que a la vez la configuracion de estos Procesos Automaticos conocidos como (JOBs) sean totalmente personalizables y los importante que sea hecho en JAVA. Indagando encontre este muy buen 'Framework' 'QUARZ', que permite todo lo anterior dicho y màs. Aquì muestro el manejo de este muy buen Framework:

Configuraciòn:
1.-Configuramos el Web.xml, ingresando el acceso al servlet:

[servlet]
[servlet-name]QuartzInitializer[/servlet-name]
[display-name]Quartz Initializer Servlet[/display-name]
[servlet-class]org.quartz.ee.servlet.QuartzInitializerServlet
[/servlet-class]
[load-on-startup]1[/load-on-startup]
[/servlet]

[servlet]
[servlet-name]QuarzMB[/servlet-name]
[display-name]Quartz Servlet[/display-name]
[servlet-class]org.java.manageBean.QuarzMB[/servlet-class]
[load-on-startup]2[/load-on-startup]
[/servlet]


2.- Este al ejecutarce la aplicaciòn accedera automaticamente a:
'org.java.manageBean.QuarzMB' y a su metodo:

public void init( ServletConfig config ) throws ServletException{
System.out.println( "DENTRO DE 'init( ServletConfig config )' " );

super.init( config );

try{
this.IniciarQuarz();
}
catch( IOException e ){
e.printStackTrace();
}
}

3.-En el metodo 'IniciarQuarz()' descomentaremos el ejemplo de los tres ejemplos que he preparado para la demostracion de este Framework:

public void IniciarQuarz() throws ServletException, IOException{
System.out.println( "DENTRO DE 'IniciarQuarz()' " );

try{
this.fechaInicio = new Date();
this.fechaFin = null;

QuarzMB job = new QuarzMB();
job.iniciarEjemploJob_01( this.fechaInicio, this.fechaFin );
//job.iniciarEjemploJob_02( this.fechaFin );
//job.iniciarEjemploJob_03( this.fechaInicio, this.fechaFin );
}
catch( Exception e ){
e.printStackTrace();
}
}

4.- Por ejemplo la salida al ejecutarce el Ejemplo #1 se darìa cada 5 segundos y serìa la siguiente (En realidad no se envìa los emails, pero si dentro de dicho mètodo se hace una funcionalidad de envìo de emails funcionarà sin problema):


------------- ['2009-06-01 23:19:20'] JOB Ejecutado ------------
******* DENTRO DE 'envioAlertaProceso_01()' *******
Enviando Email...#0 [cesarricardo_guerra19@hotmail.com] a Cesar Ricardo
Enviando Email...#1 [magaly_027@hotmail.com] a Catherine Magaly
Enviando Email...#2 [i220051@cibertec.edu.pe] a Milko Samame

------------- ['2009-06-01 23:19:25'] JOB Ejecutado ------------
******* DENTRO DE 'envioAlertaProceso_01()' *******
Enviando Email...#0 [cesarricardo_guerra19@hotmail.com] a Cesar Ricardo
Enviando Email...#1 [magaly_027@hotmail.com] a Catherine Magaly
Enviando Email...#2 [i220051@cibertec.edu.pe] a Milko Samame

------------- ['2009-06-01 23:19:30'] JOB Ejecutado ------------
******* DENTRO DE 'envioAlertaProceso_01()' *******
Enviando Email...#0 [cesarricardo_guerra19@hotmail.com] a Cesar Ricardo
Enviando Email...#1 [magaly_027@hotmail.com] a Catherine Magaly
Enviando Email...#2 [i220051@cibertec.edu.pe] a Milko Samame


Para un mejor entendimiento del manejo de este Framework, puedes descargar el proyecto 'Eclipse' completo: AQUI.

sábado, 9 de mayo de 2009

Validaciones con Hibernate Annotations & RichFaces

Explorando una forma nueva de realizar las validaciones, comence a indagar como podria realizarlo por medio de Anotaciones con el Framework 'Hibernate' y bueno probando resulto el demo preparado a continuaciòn.

Este demo esta realizado en Eclipse, Maven y RichFaces (Para el acceso a las anotaciones, mediante uno de sus controles). Para los que no puedan correr la aplicacion por medio de Maven, aqui esta un muy buen tutorial descargable.

Para descargar la aplicaciòn demo pulsar:
Aquì.

domingo, 3 de mayo de 2009

Integraciòn JSF - Applet - Servlet

Hola como estan, hace unos dìas estaba trabajando y surgiò la necesidad de realizar una implementaciòn de un sistema y integrar 2 logicas de programaciòn distintas (Aplicacion J2SE y J2EE), para ello sabia que tenia que relizarlo mediante applets incrustados dentro de la aplicaciòn oreintada a web. Pero, lo que deseaba hacer es que trabaje en el servidor, una tranferencia de datos que tenia que hacer mediante un formulario, y como el applet no trabaja en el servidor mismo sino en el cliente, tube que indagar formas diferentes formas de conectar estas 2 logicas de trabajo y encontre una par de formas de hacerlo:

Mediante una conexion de la aplicacion web, enviandole aparametros al applet y este a su vez conectandoce con el servlet (Que hara lo que tenga que hacer en el servidor: guardar en base de datos, guardar una imagen en disco, etc) para que luego este servlet regrese un mensaje de confirmacion entre otras cosas y estas se muestren en la aplicacion web. Todo esto es apreciado en algunos ajemplos que preparè.

Para visualizar como luce la aplicaciòn pulsar:
Aquì.

Para descargar la aplicaciòn demo online pulsar:
Aquì.

Hasta una nueva oportunidad.

jueves, 30 de abril de 2009

Integracion 'J2EE - JMF - BLOB' en 3 Motores de Datos Distintos.

Hola como están, en esta oportunidad estoy presentando un demo que muestra la integración de J2EE + JMF + BLOB (Archivos) en 3 diferentes motores de datos. La idea de este demo surgió hace un par de semanas ya que en mi ex-trabajo aparecieron los requerimientos de hacer un sistema que manejara un control de WebCam en tiempo real dentro de la misma aplicación web y yo buscando me encontré con JMF que permitía hacer todo esto y mas ya que es un API para manejo de multimedia, luego surgió otro requerimiento que las imágenes que para la webcam sean en guardadas no en una ruta del servidor sino en la misma BD. Y esto fue un problema ya que no todos los motores de datos manejan la misma clase para guardar el archivo BLOB. Y finalmente recuperar la imagen guardada y mostrarla. Bueno lo anteriormente explicado salio finalmente exitoso y me dio la idea de ir un poco más y preparar un demo como este:

EXPLICACIÒN:
La aplicación que he desarrollado y continuación explicare esta basada en J2EE, JMF, JSF (Tomahawk, Sandbox, Richfaces), trabaja con 3 motores de datos simultaneamente ( MySql, Postgres y Oracle ) y fue desarrollado en la IDE: 'Red Hat Developer Studio'( Que es un Eclipse v3.3 mejorado ). Esta aplicación en si consta de 3 demos:

1er Demo: Búsqueda BLOB 'Applet-Servlet', donde se aplica una lógica de programación basada en 'Applet-Servlet' y muestra un ambiente de consulta para obtener el objeto que trae consigo a mostrar el archivo guardado en la BD como blob. Para la consulta hay que escoger el código del registro y tipo de archivo que se obtendrá de la BD y que ya esta guardada como tipo de dato (Imagen, Música, Video, Documento). Esto será validado al momento de obtener dicho archivo para dependiendo de eso mostrarse en el navegador, en un Applet JMF ( Como 'Control Imagen' o Como 'Reproductor' ).

2do Demo: Búsqueda BLOB 'Jsf-Servlet', donde se aplica una lógica de programación basada en 'Jsf-Servlet' y muestra un ambiente de consulta para obtener el objeto que trae consigo a mostrar el archivo guardado en la BD como blob. Para la consulta hay que escoger el código del registro y tipo de archivo que se obtendrá de la BD y que ya esta guardada como tipo de dato (Imagen, Música, Video, Documento). Esto será validado al momento de obtener dicho archivo para dependiendo de eso mostrarse en el navegador, mediante un Servlet que utiliza un clase que desarrollé llamada 'ManejoContentType' que lee la extensión del archivo obtenido y automáticamente retorna el tipo de ContentType respectivo para que el Servlet retorne en el response.

3er Demo: Demo Mantenimiento BLOB, donde se muestra un mantenimiento completo (CRUD), utilizando las lógicas explicadas anteriormente.

4to Demo: Este demo no es propio de la aplicación web pero es importante ya que muestra el manejo de BLOB ejecutando una clase descomentando y comentando métodos (CRUD), dicha clase esta ubicada en: 'Manejo_Java_BLOB\src\org\java\main\Main.java', recuerda que para la ejecución de esta clase se tiene que haber hecho previamente 'Configuración Previa' y que luego de ejecutar los 4 métodos CRUD de la clase en orden, se tiene que copiar nuevamente el contenido de: 'Manejo_Java_BLOB\fuentes\imagenesPrueba' en: 'C:\Imagenes'.

Para visualizar como luce la aplicación pulsar:
[[ VISUALIZAR ]]


CONFIGURACIÒN PREVIA
Para configurar la aplicación hay que tener ya cargada la aplicación en 'Red Hat Developer Studio o en Eclipse v3.3. Luego hay que ver a cual de los 3 motores de datos que soporta la aplicación nos vamos a conectar, esto al igual que los paràmetros de conecciòn son configurables en el archivo: 'Manejo_Java_BLOB\src\org\java\conexion\jdbc.properties'
( 1=MySql, 2=Postgres, 3=Oracle ).
(Si tenemos los 3 motores de datos podemos acceder a los 3, alterando el archivo .properties y reiniciando el servidor para cada acceso), para la manipulaciòn de los datos de tipo BLOB, de en los 3 motores de datos, podemos usar esta muy buena herramienta DbVisualizer v6.5.1 . Luego, hay que crear la carpeta 'C:\Imagenes' y hay que pegar el contenido de 'Manejo_Java_BLOB\fuentes\archivosBlob' y de 'Manejo_Java_BLOB\fuentes\imagenesPrueba' ahí dentro (Estos serán los archivos que serán grabados como BLOB en los registros de prueba ). Después, ejecutaremos los scripts que serán soportados en los motores de datos, para ello accederemos a la ruta 'Manejo_Java_BLOB\fuentes\bd\ScriptBD.txt', dentro están los scripts para crear las tablas, secuenciales y inserts respectivos por motor de datos. Finalmente, Instalar la plataforma JMF v2.1 y luego el Plugin MP3 v3.1.0. (Recuerda que estos tienen que estar relacionados con el JDK o JRE que la aplicación este usando).

DESCARGAS:
Descarga Aplicación Demo Completa.
Descarga Plataforma JMF v2.1.
Descarga Java MP3 Plugin v3.1.0.

jueves, 5 de marzo de 2009

Manejo Conexiones JDBC

En esta oportunidad estoy mostrando un documento que muestra los informaciòn importante para el manejo de conexiones JDBC en distintos motores de datos, la informaciòn que he recaudada es la siguiente:

- Clase Driver:
- URL de Conexión:
- Ejemplo URL:
- Librerìa 'jar':
- Hibernate Dependency:

Las librerìas JBDC de las cuales se a juntado la informaciòn, son de los siguientes motores de datos:

- DB2
- DERBY
- H2
- HSQLDB
- INFORMIX
- MySQL
- ORACLE
- PostgreSQL
- SQLSERVER
- SYBASE

Para descargar el documento con toda la informaciòn anteriormente explicada pulsar: AQUI.

Para descargar todas las librerias (.JARs) JDBC de todos los motores de datos nombrados pulsar: AQUI.

viernes, 27 de febrero de 2009

Validaciones y Mensajes Dinamicos con JSF

Aqui muestro una forma muy efectiva de como manejar los Validadores en un Formulario
utilizando el Framework 'JSF', en los casos que se manipulen datos de tipo: 'BigDecimal, String, Integer, Date'. Ademas, muestro tambien una forma de como manipular los de 'JSF' para trabajarlos de forma dinàmica ( Estados: INFO, ERROR, WARNING ).

Para visualizar la Aplicacion demo, donde muestro todo lo explicado anteriormente pulsar: AQUI.

Porsiaca la Aplicacion demo la desarrolle en la Ide 'Eclipse v3.3'. Y para verlo se puede simplemente importar dicho proyecto desde Eclipse.

viernes, 16 de enero de 2009

Hibernate Dialect

Aqui comparto los diferentes Dialecto que Hibernate utiliza, para su manejo de los diferentes motores de datos. Estos son:


A.- DB2 - org.hibernate.dialect.DB2Dialect

B.- HypersonicSQL - org.hibernate.dialect.HSQLDialect

C.- Informix - org.hibernate.dialect.InformixDialect

D.- Ingres - org.hibernate.dialect.IngresDialect

E.- Interbase - org.hibernate.dialect.InterbaseDialect

F.- Pointbase - org.hibernate.dialect.PointbaseDialect

G.- PostgreSQL - org.hibernate.dialect.PostgreSQLDialect

H.- Mckoi SQL - org.hibernate.dialect.MckoiDialect

I.- Microsoft SQL Server - org.hibernate.dialect.SQLServerDialect

J.- MySQL - org.hibernate.dialect.MySQLDialect

K.- Oracle (Any Version) - org.hibernate.dialect.OracleDialect

L.- Oracle 9 - org.hibernate.dialect.Oracle9Dialect

M.- Progress - org.hibernate.dialect.ProgressDialect

Ñ.- FrontBase - org.hibernate.dialect.FrontbaseDialect

O.- SAP DB - org.hibernate.dialect.SAPDBDialect

P.- Sybase - org.hibernate.dialect.SybaseDialect

Q.- Sybase Anywhere - org.hibernate.dialect.SybaseAnywhereDialect


COMPARATIVO JSP - JSF

En esta oportunidad hablare de un comparativo basico entre JSP y JSF. Ya que a mi como a la mayoria que ahora trabaja con este Framework les pudo haber pasado, el tratar en entender la logica de trabajo de JSF y seguro querer tratar de trabajarlo como uno estaba acostumbrado a trabajar con JSP.

Para comenzar JSP trabaja de una conocida forma en base Request/Response por el contrario JSF tiene una logica de trabajo tipo aplicacion Desktop en base a eventos, esto para que el Developer que venga de trabajar en JAVA J2SE al querer migrar a trabajar con J2EE les sea mas facil de entender. Al comienzo para los que ya han tenido un paso por JSP les sera un poco dificultoso la forma de trabajo pero despues les aseguro que mes gustara mucho este framework, esto debido a la cantidad de controles en sus diferentes frameworks que implementan la logica de trabajo de JSF como lo son: "MyFaces,A4j,RichFaces,Jenia Faces,Tomahawk,IceFaces". Todos muy buenos en realidad y o mejor que pueden trabajar de la mano. La unica cosa que hasta ahorita critico a JSF y en lo que pienso que deberian de mejorar lo antes posible es en tratar que sus controles al momento de hacer el Diseño de la Interfaz sean mas amigables ya que por mas que se traba con una buen CSS. Nunca pero nunca una Interfaz en JSF puede lucir de una manera profesional (Pude lucir bien pero profesional nunca) y claro el diseño demora bastante (La difencia en cuanod se trabajaba con HTML puro, que era rapido y frexible ).

Bueno pero lo que queria hablar desde el comienzo solo me deje llevar, era de como trabajar desde los ManageBean (Que vendria a ser tu Servlet al trabajar con JSF).
al querer mandar y obtener un parametro, un atributo, setear en sesion y simular los tan importantes resquest y response al trabajar con JSF. Bueno aqui les dejo la solucion:


I.- SETEAR EN SESION:

A.- JSP: request.getSession().setAttribute("miVariable",valor);

B.- JSF: FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("miVariable", valor);


II.- RECUPERAR LA SESION:

A.- JSP: request.getSession().getAttribute("miVariable");

B.- JSF: FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("miVariable");


III.- RECUPERANDO 'Context, Request, Response':

A.- JSP: En JSP es automatico al utilizar los Servlet.

B.- JSF: Se tiene que simular el manejo 'Context, Resquest, Response' tanto para el HttpServlet o el Servlet, segun se requiera.


- FacesContext context = FacesContext.getCurrentInstance();

- HttpServletRequest request = (HttpServletRequest)context.getCurrentInstance().getExternalContext().getRequest();

- HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();

- ServletContext request2 = (ServletContext)context.getCurrentInstance().getExternalContext().getRequest();

- ServletContext sContext = (ServletContext)context.getExternalContext().getContext();

- ServletRequest sRequest = (ServletRequest)context.getExternalContext().getRequest();

- ServletResponse sResponse = (ServletResponse)context.getExternalContext().getResponse();