jueves, 30 de diciembre de 2010

MANEJO API JEXCEL

El otro día me escribieron a mi email una consulta sobre manipulación de ficheros .xls desde Java y recomendé un API ya bastante antigua llamada POI de Jakarta, que era una que había utilizado hace varios años atrás, pero luego pensé y me dije si habrán creado alguna mejor forma para la manipulación de dichos ficheros Excel que son tan populares y me puse a buscar en la Internet la existencia de alguna API nueva y me encontré con una muy buena pero no tan nueva jejeje, llamada JExcel API .
Y justo me puse a entenderla y postear sobre ella. Esta API (http://jexcelapi.sourceforge.net) es una API Opensource para especializado en la manipulación (Read/Write) de ficheros .xls sobre ccualquier sistema operativo donde exista y funcione una máquina virtual Java (es decir, no sólo Windows) puede procesar y entregar las hojas de cálculo Excel. Debido a que es Java, la API se puede invocar desde dentro de un Servlet, dando así acceso a hojas de cálculo Excel a través de aplicaciones Web.

El ejemplo preparado es un proyectito simple de tipo desktop sobre Eclipse, donde ejecuto independientemente dos clases por separado.

- org.java.jexcel.read.test.ReadExcel.java
- org.java.jexcel.write.test.WriteExcel.java

I. ReadExcel.java: Permite la lectura de un archivo Excel que debe de ser ubicado en: C://JAVA_EXCEL.xls (Este archivo lo encuentras en el SourFolder Resources del proyecto adjunto) y su salida de lo leído en consola.


********************************************************************
*************************** FORMA MANUAL ***************************
********************************************************************

- CELDA #C2: NOMBRE
- COLUMNA #C2: 1
- FILA #C2: 1

- CELDA #C2: APELLIDO
- COLUMNA #C2: 2
- FILA #C2: 1

- CELDA #D2: DNI
- COLUMNA #D2: 3
- FILA #D2: 1

- CELDA #E2: EDAD
- COLUMNA #E2: 4
- FILA #E2: 1

********************************************************************
************************* FORMA AUTOMATICA *************************
********************************************************************
OBTENIENDO [LABEL]: A1
OBTENIENDO [LABEL]: A2
OBTENIENDO [LABEL]: A3
OBTENIENDO [LABEL]: A4
OBTENIENDO [LABEL]: A5
OBTENIENDO [LABEL]: B1
OBTENIENDO [LABEL]: NOMBRE
OBTENIENDO [LABEL]: Cesar Ricardo
OBTENIENDO [LABEL]: Catherine Magaly
OBTENIENDO [LABEL]: B5
OBTENIENDO [LABEL]: C1
OBTENIENDO [LABEL]: APELLIDO
OBTENIENDO [LABEL]: Guerra Arnaiz
OBTENIENDO [LABEL]: Cotrina Vasques
OBTENIENDO [LABEL]: C5
OBTENIENDO [LABEL]: D1
OBTENIENDO [LABEL]: DNI
OBTENIENDO [NUMBER]: 41816133
OBTENIENDO [NUMBER]: 48798678
OBTENIENDO [LABEL]: D5
OBTENIENDO [LABEL]: E1
OBTENIENDO [LABEL]: EDAD
OBTENIENDO [NUMBER]: 27
OBTENIENDO [NUMBER]: 25
OBTENIENDO [LABEL]: E5
OBTENIENDO [LABEL]: F1
OBTENIENDO [LABEL]: FECHA
OBTENIENDO [DATE]: 20 12 2010 12:00:00
OBTENIENDO [DATE]: 21 12 2010 12:00:00
OBTENIENDO [LABEL]: F5
OBTENIENDO [LABEL]: G1
OBTENIENDO [LABEL]: G2
OBTENIENDO [LABEL]: G3
OBTENIENDO [LABEL]: G4
OBTENIENDO [LABEL]: G5

II. ReadExcel.java: Permite la creación de un archivo .xls, llamado: C:\\JAVA_EXCEL_CREATED.xls, donde se está incrustando cabeceras de texto simple, link, imágenes, etc.

Para descargar el demo pulsar Aquí

viernes, 24 de diciembre de 2010

MANEJO SPRING JDBC

Que tal en esta oportunidad hablare sobre otra opción para el manejo de la persistencia que viene como aporte de SPRING , este es un módulo de SPRING que brinda conexión a múltiples motores de datos de una forma muy sencilla.

Spring JDBC simplifica el manejo del estándar JDBC, obviando partes importantes que comúnmente a un se le puede pasar como es la de abrir o cerrar sesiones y conexiones (DataSource) respectivas. Funciona para JDK 1.5 (+)

Desde Spring JDBC uno puede heredar de la clase JdbcDaoSupport y acceder a JdbcTemplate que brinda un soporte para un listado de métodos especializados (query, queryForObject, queryForList,etc) , así mismo uno puede manejar acceso a procedimientos almacenados mediante la clase SimpleJbcCall , entre varias otras funcionalidades.

El demo preparada esta bien detallada: Trabaja con Spring 3.0, Maven 2.2.1, Spring JDBC 2.5.6 (JdbcDaoSupport) y para la prueba respectiva hay un JUnit TestCase para un mantenimiento amarrado a: MySql 5.1 (Script en resources).

Para probarlo ejecutar la clase JUnit, descomentando previamente los procesos de cada mantenimiento: src/main/test/org/java/spring/test/TestSpringJDBC.java

Para descargar el demo pulsar Aquí

domingo, 19 de diciembre de 2010

MANEJO SPRING v3.0

Ahora que esta tan de moda el manejo del Framework SPRING mostrare un demo de su manejo, de una forma bien peculiar aplicada a la programación. Cabe recalcar que la idea base la cual me inspiro fue una muy similar que mostró en una exposición mi amigo Lennon Shimokawa de su demo TORTUGAS NINJA en su presentación sobre SpringCore.

El demo actual a mostrar, esta basado en la leyenda de la sobre la batalla MITOLOGICA de la TITANOMAQUIA que habla sobre batalla entre: "LOS DIOSES vs LOS TITANES". En aquella batalla los TITANES se revelan en contra de los OLIMPICOS conformados por los dioses que se reunían a debatir sus hazañas en el famoso monte OLIMPO.

DIOSES:
- ZEUS.
- POSEIDON.
- HELIOS/APOLO/ABEL
- HADES.

TITANES:
- CRONOS.
- REA.
- OCEANA.
- CRIO.

Programaticamente, se va a representar de forma dinámica la batalla mano a mano de c/u, mediante un JUnitTest:

org.java.spring.batalla.TestBatallaMitologica.java

Es importante decir que se utilizo MAVEN para la creación del proyecto JAVA y la IDE Spring Tools Suite v2.5.1 (STS) . Desde este LINK se puede verificar su manejo.

Finalmente, al ejecutar dicha clase se obtendrá una salida en consola similar a esta:

DATOS [DIOS]:
- NOMBRE: ZEUS
- ARMA: LANZA
- PODER: EL RAYO
- NIVEL: 100

DATOS [TITAN]:
- NOMBRE: OCEANA
- ARMA: NO TIENE
- PODER: SUPER FUERZA
- NIVEL: 80

INICIA LA BATALLA:
- EL DIOS: [ZEUS], UTILIZA SU PODER: [EL RAYO], CONTRA EL TITAN: [OCEANA]
- EL TITAN: [OCEANA], UTILIZA SU PODER: [SUPER FUERZA], CONTRA EL DIOS: [ZEUS]
- EL DIOS: [ZEUS], UTILIZA SU ARMA: [LANZA], CONTRA EL TITAN: [OCEANA]
- EL TITAN: [OCEANA], UTILIZA SU PODER: [SUPER FUERZA], CONTRA EL DIOS: [ZEUS]

FINAL:
- GANO EL DIOS: [ZEUS]

Para descargar el demo pulsar Aquí

MANEJO DE MAVEN DESDE (STS).

El tutorial mostrara una forma diferente de manejar MAVEN desde la IDE Spring Tools Suite v2.5.1 (STS), que es en realidad un ECLIPSE v3.6 con un mayor soporte de Plugins.

PASO #I:
Comenzaremos, configurando el MAVEN por defecto que viene con embebido en el Spring Source Tools Suite v2.5.1.

PASO #II:
Ingresamos en la barra de menú a:
Windows/preferences/maven/user preferentes, pulsamos el botón Browse y editamos el archivo:
settings.xml y mapeamos:

[localRepository>]C:\RepositorioMaven[/localRepository]

PASO #III:
Para un mejor control de nuestras librerías de JAVA, vamos a crear nuevo un Repositorio en la ruta:

C:\RepositorioMaven

Y lo registramos en la interfaz mostrada en el paso anterior.

PASO #IV:
Con la IDE ya configurada vamos a crear un nuevo proyecto MAVEN

File/new/other/Maven/Maven Project

PASO #V:
Ingresamos el WorkSpace donde será creado dicho proyecto MAVEN.

PASO #VI:
Filtramos por el archetype: que deseamos utilizar:

ARCHETYPE: maven-archetype-webapp.

PASO #VII:
Registramos datos importantes de lo que será el POM.xml, archivo de configuración del MAVEN.

- GOUPID: org.java.spring
- ARTIFACTID: PROYECT_DEMO_SPRING_XML
- VERSION: 1.0
- PACKAGE: org.java.spring.PROYECT_DEMO_SPRING_XML

PASO #VIII:
Al archivo de configuración POM.xml ingresamos las dependencias de las librerías (.JARs) Spring 3.0 que vamos a utilizar, para su descarga respectiva.

PASO #IX:
Limpiamos el previamente el proyecto MAVEN creado y luego ejecutamos el dicho proyecto, para la validación y descarga de sus dependencias registradas

PASO #X:
Verificamos la descarga de los .JARs realizada en MAVEN DEPENDENCIES dentro del menú izquierdo.

PASO #XI:
Registramos un PLUGIN en el POM.xml para el soporte de JAVA 1.6 al compilar.

PASO #XII:
Limpiamos el previamente y luego ejecutamos el Proyecto MAVEN creado, para la validación y descarga de sus dependencias registradas.

PASO #XIII:
Verificamos el proceso realizado.

PASO #XIV:
Agregamos el soporte de SPRING al proyecto.

PASO #XV:
Creamos los SourceFolder para TEST y para JAVA.

PASO #XVI:
Mapeamos la configuración realizada hasta el momento.

PASO #XVII:
Como se va a manejar Spring en el proyecto creado, creamos el archivo de configuración de Spring:

applicationContext.xml

PASO #XVIII:
Editamos el "applicationContext.xml" creado, y registramos los NameSpace y esquemas con los que Spring trabajara. Así mismo creamos un paquete donde comenzaremos a trabajar y mapeamos el acceso al archivo de configuración "application-entityBean.xml".

PASO #XIX:
Accedemos al archivo de configuración de BEANs de Spring "application-entityBean.xml", aquí se mapearan las entidades simples o anidadas de nuestra aplicación (Lo ingresado es simbólico).

Para un mayor detalle de lo explicado (CAPTURAS DE PANTALLA), descargar el Tutorial de MAVEN(STS) completo pulsar: Aquì

domingo, 17 de octubre de 2010

MANEJO FRAMEWORK "AJAX TAGs v1.5.1"

Luego de postear anteriormente sobre el manejo de AJAX de forma NATIVA, esta vez les mostrare un ejemplo de como manejar este Framework que facilita el manejo de AJAX mediante una serie de TAGs que brinda el acceso al servidor sin la necesidad del clasico PostBack. Esta librería permite la aplicación de funcionalidad AJAX en el desarrollo de componentes como:

- COMBOBOX.
- LISTAS.
- CALLOUT.
- PORLET.
- TOGGLE.
- EDITOR.
- TREE.
- Etc.

La logica de este Framework esta basado al manejo de un Servlet especial que extiende de la clase: BaseAjaxServlet

Aqui el mapeo respectivo en el web.xml: (Ojo por motivos de Visualización he cambiado '<' por '[' & ']' por '>')


[servlet][display-name]AjaxServlet[/display-name]
[servlet-name]AjaxServlet[/servlet-name]
[servlet-class]org.java.servlet.AjaxServlet[/servlet-class]
[load-on-startup]2[/load-on-startup][/servlet]

[servlet-mapping]
[servlet-name]AjaxServlet[/servlet-name]
[url-pattern]/AjaxServlet[/url-pattern]
[/servlet-mapping]

[!-- **** SERVLET: CARGA LAS LIBRERIS DEL 'JAR' **** --]
[servlet]
[servlet-name]sourceloader[/servlet-name]
[servlet-class]net.sourceforge.ajaxtags.servlets.SourceLoader[/servlet-class]
[init-param]
[param-name]prefix[/param-name]
[param-value]/ajaxtags[/param-value]
[/init-param]
[/servlet]

[servlet-mapping]
[servlet-name]sourceloader[/servlet-name]
[url-pattern]/ajaxtags/js/*[/url-pattern]
[/servlet-mapping]

[servlet-mapping]
[servlet-name]sourceloader[/servlet-name]
[url-pattern]/img/*[/url-pattern]
[/servlet-mapping]

[servlet-mapping]
[servlet-name]sourceloader[/servlet-name]
[url-pattern]/css/*[/url-pattern]
[/servlet-mapping]
[!-- ************************************** --]


Para descargar el ejemplo completo, descargarlo de: AQUÌ.

MANEJO DE "AJAX" (FORMA NATIVA)

En esta oportunidad mostrare el manejo de AJAX (Asynchronous JavaScript And XML) de la forma Nativa, pero en dos formas distintas de realizar. Al decir forma Nativa, hago referencia a que no utilizare ningún Framework especializado, sino que me apoyare en funciones JavaScript o mediante un simple fichero .JS.

Lo más resaltante es el diseño del fichero .JS que permitirá el acceso al servidor de forma directa sin la realización de un Post Back, el fichero es el siguiente:

var vAJAX;

/*** GLOBALES ***/
var Id_OBJETO;
var URL_Redirec;
var Id_Mostrar;

function PROCESAR_AJAX( Id_OBJETO2, URL_Redirec2, Id_Mostrar2 ){

this.Id_OBJETO = Id_OBJETO2;
this.URL_Redirec = URL_Redirec2;
this.Id_Mostrar = Id_Mostrar2;

recuperaAjax();
}

function recuperaAjax(){

//CREAMOS EL CONTROL 'XMLHttpRequest', SEGÚN EL NAVEGADOR UTILIZADO:
if( window.XMLHttpRequest ){
vAJAX = new XMLHttpRequest(); //SI NO ES 'INTERNET EXPLORER'
}
else{
vAJAX = new ActiveXObject( "Microsoft.XMLHTTP" ); //SI ES 'INTERNET EXPLORER'
}

//ALMACENAMOS EN EL CONTROL, LA FUNCION QUE INVOCARA CUANDO LA PETICION CAMBIE DE ESTADO
vAJAX.onreadystatechange = funcionCallback; //IMPORTANTE LOS LLAMADOS A LOS METODOS SE HACEN SIN PONER '()'

//ENVIAMOS LA PETICION...
vAJAX.open( "GET", URL_Redirec + "?PERSONA=" + Id_OBJETO , true );
vAJAX.send( "" );
}

function funcionCallback(){
//alert(Id_OBJETO);
alert(URL_Redirec);
//alert(Id_Mostrar);

//COMPROBAMOS SI LA PETICION SE HA COMPROBADO: (TIENE QUE COINCIDIR CON EL ESTADO #4)
if( vAJAX.readyState == 4 ){

//COMPROBAMOS SI LA RESPUESTA HA SIDO CORRECTA: (TIENE QUE COINCIDIR CON 'HTTP 200')
if( vAJAX.status == 200 ){

//ESCRIBIMOS EL RESULTADO DE LA PAGINA 'HTML' MEDIANTE 'DHTML'
if( Id_Mostrar == "IMPRIMIR" ){
document.all.IMPRIMIR.innerHTML = "" + vAJAX.responseText + "";
}
else{
alert("");
}
}
}
}






Para descargar el ejemplo completo, descargarlo de: AQUÌ.

domingo, 10 de octubre de 2010

MANEJO DE 'WEB SERVICE' CON 'JAX-WS'.

Que tal amigos después de un tiempo regreso para postear sobre este tema interesante relacionado a WebService. En esta oportunidad hablare sobre el Framework JAX-WS, este Framework en comparación de otros Frameworks, te facilita la generación WebService vía un simple Servlet y algo muy bueno es que permite a diferencia de otros Frameworks para WS, el manejo de colecciones (ArrayList, List, Vector) como INPUT & OUTPUT de cada una de las operaciones que se declaren en dichos WS.

Los pasos para poder levantar un WS vía JAX-WS son los siguientes:

- Descargar las fuentes Core del JAX-WS pulsando: AQUÌ..

- Ubicar las fuentes descomprimirlas y ubicarlas en la ruta: C:\JAVA\JAX-WS\JAXWS2.a.2.
- Crea la variable de entorno: JAXWS_HOME, que apunte a la ruta donde estaba las fuentes de JAX-WS descargadas: C:\JAVA\JAX-WS\JAXWS2.1.2\jaxws-ri
- Crea un Servlet similar a este:

package org.java.ws.servlet;

import static org.java.ws.util.Constantes.URL_WEBSERVICE;
import java.io.Serializable;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.java.ws.servidor.UsuarioDAOImpl;

/**
* @author cguerra.
* @clase: InicialiadorJAXServlet.java
* @descripción descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com
http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: nombre del email del autor.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión 1.0
*/
public class InicialiadorJAXServlet extends GenericServlet implements Serializable{

private static final long serialVersionUID = -2482469492687227649L;

/**
* Constructor.
*/
public InicialiadorJAXServlet(){
}

/**
* init mètodo que se carga al iniciar el sistema y accede al método que manda a iniciar el Proceso.
* @throws ServletException
*
*/
public void init( ServletConfig configuracion ) throws ServletException{
System.out.println( "DENTRO DE 'init( ServletConfig configuracion )' " );

super.init( configuracion );

try{
this.IniciarWebService();
}
catch( Exception e ){
e.printStackTrace();
}
}

/**
* IniciarWebService, Mètodo que manda a iniciar el WebService.
*/
public void IniciarWebService(){
System.out.println( "DENTRO DE 'IniciarWebService()' " );

try{
String webService = URL_WEBSERVICE;

UsuarioDAOImpl daoImpl = new UsuarioDAOImpl();
daoImpl.inicializaWebService( webService );
}
catch( Exception e ){
e.printStackTrace();
}
}

/**
* service
* @param request
* @param response
*/
public void service( ServletRequest request, ServletResponse response ){
System.out.println( "DENTRO DE 'service( ServletRequest request, ServletResponse response )' " );
}

}


- Crear la Interfase y su clase que Implemente el WS. Además, para la generación en si del WS se puede realizar de 2 formas a continuación detalladas:


GENERAR WEBSERVICE DESDE UNA CLASE 'JAVA'
--------------------------------------------------------------------------


I.- UBICARSE DESDE LA RUTA 'SRC' DEL PROYECTO EN DOS:

Ejecutar en Orden:

(FORMA MANUAL)
A.- javac org/java/ws/bean/Usuario.java
B.- javac org/java/ws/servidor/UsuarioDAO.java
C.- javac org/java/ws/servidor/UsuarioDAOImpl.java

(FORMA DINAMICA)
set RAIZ_SRC= .
set JAVA_SRC=%RAIZ_SRC%\org\java\ws\bean\*.java
set JAVA_SRC=%JAVA_SRC%%RAIZ_SRC%\org\java\ws\servidor\*.java
set JAVA_SRC=%JAVA_SRC%%RAIZ_SRC%\org\java\ws\util\*.java
javac %JAVA_SRC%


D.- %JAXWS_HOME%/bin/wsgen -cp . org.java.ws.servidor.UsuarioDAOImpl -s . -verbose -r ..\WebContent\wsdl -wsdl
E.- Ejecutar esta linea de Comandos o desplegar desde el Servidor:
java org.java.ws.servidor.UsuarioDAOImpl
F.- Actualizar el nombre del 'WebService' en el WSDL, ya que luego de generarce no aparece.


GENERAR WEBSERVICE DESDE UN 'WSDL'
--------------------------------------------------------------


I.- UBICARSE DESDE LA RUTA 'RAIZ' DEL PROYECTO EN DOS:
- FORMA#1: wsimport WebContent\WEB-INF\wsdl\music.wsdl -s src -verbose
- FORMA#2: %JAXWS_HOME%/bin/wsimport WebContent\WEB-INF\wsdl\music.wsdl -s src -verbose

II.- UBICARSE DESDE LA RUTA 'SRC' DEL PROYECTO EN DOS:
- FORMA#1: wsimport ..\WebContent\WEB-INF\wsdl\music.wsdl -s . -verbose
- FORMA#2: %JAXWS_HOME%/bin/wsimport ..\WebContent\WEB-INF\wsdl\WEB-INF\music.wsdl -s . -verbose

Luego de esto se habrá generado el WS y se apreciaría un mensaje similar a este, al ingresar una URL similar a esta, que significa que el WS esta activo:

http://localhost:8099/ServidorWS_JAXWS_Generado/UsuarioDAOImpl
Web Services
No JAX-WS context information available.

Para el consumo del dicho WS ya desplegado, nos podemos apoyar también con JAX-WS, para ello realizamos lo siguiente:

GENERAR CLIENTE 'WEBSERVICE'
--------------------------------------------------


UBICARSE DESDE LA RUTA 'SRC' DEL PROYECTO EN DOS:

I.- GENERACION DE CLASES:

A.- DESDE 'URL':
%JAXWS_HOME%/bin/wsimport http://localhost:8090/servidorJaxWs/UsuarioDAOImpl?wsdl -s . -verbose

B.- DESDE 'FICHERO':
%JAXWS_HOME%/bin/wsimport ..\WebContent\wsdl\UsuarioDAOImplService.wsdl -s . -verbose


II.- COMPILACION & EJECUCION DE CLIENTE 'WS':

A.- Ejecución desde Consola 'DOS':
- javac org/java/ws/test/ClienteWS.java
- java org/java/ws/test/ClienteWS PARAMETRO

B.- Ejecución desde Clase JAVA:
- Ejecutar desde 'Java Aplication'.

Al ejecutar la clase: ClienteWS se probara dicho WS.

Para descargar el ejemplo completo, descargarlo de: AQUÌ.

TUTORIAL MAVEN

Este completo tutorial explica todo lo mas resaltante sobre Maven, en esta oportunidad la versión 2.0.9.

Esta muy buena herramienta nos puede ayudar en el proceso de creación de nuestro proyecto Java. ¿Cómo lo logra?, mediante el uso de los arquetipos de Maven, que son estructuras de proyecto predefinidas y reconocidas en un archivo xml (Pom.xml), que se generan mediante los plugins de Maven (Cada plugin de arquetipo relacionado a un Jars necesario). Además, los principales proyectos Open Source en Java, están utilizando cada día más el uso de Maven para su desarrollo, por lo que cada vez es más frecuente encontrar plugins de arquetipos para el desarrollo de aplicaciones.

Maven, para ser compilado necesita de requerimiento el Internet ya que mediante unos comandos en consola (Posteriormente explicaremos), Maven lee los plugins de arquetipos escritos en el archivo Pom.xml y descarga las librerías necesarias en un repositorio predefinido para el almacenamiento de las librerías respectivas.

También, Maven permite generar y versionar un Proyecto dentro de un War, ordenar y comprimir las librerías (Jars) utilizadas dentro de un .Zip, generar un completo JavaDoc de la aplicación, etc. Todo mediante códigos en consola.

El tutorial expuesto acontinuacion toca los temas:

I.- REQUISITOS.
II.- CARACTERISTICAS.
III.- INSTALACION DE MAVEN.
IV.- CREACION DE UN PROYECTO JAVA CON MAVEN.
V.- PROCESOS QUE SE PUEDEN HACER CON MAVEN.
VI.- MANEJO DEL POM.XML.
VII.- EXCLUSIONES EN LAS DEPENDENCIES.
VIII.- PROYECTO MULTIMÓDULO.
VIII.- CICLO DE VIDA.
IX.- INSTALACION DEL PLUGIN DE MAVEN PARA ECLIPSE.
X.- REPOSITORIOS IMPORTANTES DE MAVEN.
XI.- DEFINICIONES RÀPIDAS E IMPORTANTES DE MAVEN.
XII.- HERRAMINETAS REALCIONADAS CON MAVEN.
XIII.- ENLACES RELACIONADOS DE MAVEN.


Para descargar el Tutorial de Maven completo pulsar Aquì




MANEJO API JAVAMAIL

Que tal amigos, luego de un largo receso regreso con muchas ganas para postear algo que en estos días es muy útil en el desarrollo de nuestras aplicaciones (Según se requiera), es el manejo de la API que Java maneja para el envío de emails
(JAVAMAIL)
, esta API permite fácilmente enviar emails a cualquier servidor de correos que se cuente con el SMTP (Protocolo).

La aplicación preparada consta de un aplicativo tipo WEB, con 3 paquetes con 3 clases (Una clase por paquete), la lógica es mas o menos de esta manera, se tiene un DTO (Data Transfer Object) especial para el seteo de los diferentes parámetros que se manejara: (cuentaEmailRemitente, cuentaEmailDestinatario, servidor, servidor, etc) . Es importante contar con los SMTP de los diferentes servidores de correos a los cuales uno requiero conectar (El demo preparado soporte los siguientes: Gmail, Hormail, Yahoo) . Luego de seteado el objeto este es enviado a una clase ya preparada llamada: UtilEmail, esta clase ya hace todas las validaciones respectivas y se encarga de enviar el email, de la forma más rápida.

Es requerido la autenticación para cada servidor de emails al cual se desee conectar. El demo también soporta el multienvio de emails (Uno puedo mandar 1 o N emails en un solo envío), pero tener cuidado con esto para que después no registren en el BLACK LIST (http://mxtoolbox.com/blacklists.aspx) . Finalmente, algo que si me gusto es que el demo permite, simultáneamente el manejo de texto, Html y adjunto en un mismo email. El adjunto cualquier tipo de archivo ubicado necesariamente en el SourceFolder: recursos.



Para descargar el ejemplo completo descargarlo de: AQUÌ.

sábado, 28 de agosto de 2010

INTEGRACION: HIBERNATE + MAVEN + JDBC

Que tal compañeros regreso a postear luego de algún tiempo y en esta oportunidad hablare y mostrare un ejemplo de como manejar el Framework Hibernate .

Si hablamos un poco de este Framework es uno de los Frameworks orientados a persistencia mas utilizados por las diferentes ventajas que nos brinda.

Facilidad para el manejo transaccional de distintas bases de datos, ya que este Framework es de tipo ORM (Object Relational Mappin) , esto hace que el Framework realice un el mapeo completo de la base de datos relacional utilizada, en archivos XMLs (Uno por cada Bean creado) los mapeos y clases generadas expresan herencia y polimorfismo y creando una base de datos orientada a objetos. Esto hace que al momento de la creación de los Querys no nos preocupemos por la DB utilizada ya que dicho Query servirá para cualquier Base de datos ya que el acceso a los datos los puedes manejar de distintas formas utilizando ESQL y CRITERIA.

El ejemplo posteados esta principalmente orientado a mostrar el manejo del Framework Hibernate manejando un patrón DAO para facilitar el acceso a persistencia. Adicionalmente, el ejemplo realiza las mismas operaciones de persistencia realizadas con Hibernate con JDBC, a modo que se vea un comparativo del manejo de persistencia.

Este proyecto demo esta orientado a Web y fue desarrollado en la IDE JBOSS Developer Studio v2.0 que es en si un ECLIPSE con varios PLUGINs adicionales y la ejecución del proyecto en si esta controlado con Maven. (Para los que no conocen Maven entrar aquí: ) y soportado en la BD SAMPLE que viene cargada dentro de DERBY. (Una versión de Derby viene ya integrado con en al descarga de la IDE NetBeans) , facilitando la inicialización de la BD desde el mismo NetBeans.

EJECUCION:

La ejecución de los ejemplos preparados están realizados en JUnit-Test (Click derecho + Run ass + JUnit Test) y son los siguientes:

- TestConexionJdbc
- TestObjetoClienteJdbc
- TestListaObjetosClienteJdbc
- TestObjetoClienteHibernate
- TestListaObjetosClienteHibernate

Finalmente, en la clase pe.com.crga.framework.java.impl.ClienteDaoHibernate se muestra 3 formas distintas del manejo de Hibernate para las operaciones manejadas (Solo se descomenta la deseada) .

Para descargar el ejemplo completo descargarlo de: AQUÌ.

sábado, 8 de mayo de 2010

DEFINICIONES IMPORTANTES DE CALIDAD DE SOFTWARE

Es muy importante que se conozca sobre algunas definiciones de CALIDAD DE SOFTWARE que es muy probable que escuchemos de forma muy seguida. Aquí las enumero:

I.- APLICACIONES DISTRIBUIDAS:
Las aplicaciones distribuidas son aplicaciones que están diseñadas como aplicaciones de n niveles. La arquitectura de estas aplicaciones distribuidas favorece el diseño de aplicaciones escalables compartiendo recursos, como bases de datos y componentes empresariales

2.- ESCALABILIDAD:
La escalabilidad de una aplicación requiere una pertenencia equilibrada entre dos dominios distintos, software y hardware.
Para que un sistema sea escalable tiene que cumplir tres condiciones para ajustarse a los cambios:

- Tiene que poder adaptarse a un incremento en el número de usuarios.
- Tiene que poder adaptarse a un incremento en el tamaño de los datos que maneja.
- Tiene que ser mantenible.

Cuanto más fácil sea cumplir estas tres condiciones, más escalable será el sistema. La escalabilidad no es lo mismo que el rendimiento del sistema (performance). Lescalabilidad depende más del diseño de la aplicación que de las tecnologías usadas para implementarla.

La escalabilidad puede avanzar grandes pasos que aumenten la escalabilidad de un dominio sólo para sabotearlos cometiendo errores en el otro. Por ejemplo, la creación de un grupo de servidores Web con equilibrio de carga no beneficiará una aplicación Web que se ha diseñado para ejecutarse un solo equipo. De igual modo, el diseño de una aplicación altamente escalable y su implementación en equipos conectados a una red con poco ancho de bada no controlará bien las cargas pesadas cuando se sature el tráfico en la red.

2.1.- ESCALAR EN VERTICAL:
El escalado en vertical es el término que más se utiliza para lograr escalabilidad utilizando software mejor, más rápido y más caro. El escalado incluye agregar más memoria, más procesadores o procesadores más rápidos o, simplemente, migrar la aplicación a un único equipo más potente. Normalmente, este método permite un aumento en la capacidad sin requerir cambios en el código fuente. Desde el punto de vista administrativo, las cosas permanecen igual puesto que sigue habiendo un único equipo que administrar.

Actualizar un componente de hardware en un equipo sólo mueve el limite de capacidad de procesamiento de un lado a otro. Por ejemplo, una máquina que está al 100 % de uso de la CPU podría mejorar su capacidad agregando otra CPU. Sin embargo, la limitación puede pasar de la CPU a la memoria del sistema. Agregar CPU no aporta rendimiento en un modelo lineal. En su lugar, el rendimiento va disminuyendo cada vez que se agrega un procesador adicional. Para equipos con configuraciones de varios procesadores simétricos (SMP), cada procesador adicional produce una sobrecarga del sistema. Por tanto, un equipo con cuatro procesadores no obtendrá una mejora del 400% en capacidad sobre una versión con un único procesador. Una vez que haya actualizado todos los componentes de hardware al máximo de su capacidad, llegará el momento en que alcance el límite real de la capacidad de procesamiento del equipo. Llegado ese punto, el siguiente paso es escalar en vertical para moverse a otro equipo.


Escalar en vertical conlleva también otros posibles problemas. El uso de un único equipo en el que basar una aplicación crea un único punto de error, lo que disminuye enormemente la tolerancia de errores del sistema. Si bien algunos métodos, como varias fuentes de alimentación, pueden implementar redundancia en un sistema de un único equipo, pueden resultar costosas.

2.2.- ESCALAR EN HORIZONTAL:
Una alternativa a escalar en vertical es escalar en horizontal. Escalar en horizontal aprovecha el ahorro que supone utilizar el hardware de PC activo para distribuir la carga de procesamiento en más de un servidor. Aunque el escalado en horizontal se logra utilizando muchos equipos, la colección funciona esencialmente como un único equipo. Al dedicar varios equipos a una tarea común, mejora la tolerancia de errores de la aplicación. Por supuesto, desde el punto de vista del administrador, escalar en horizontal presenta un desafío mayor de administración debido al mayor número de equipos.

Los desarrolladores y administradores utilizan una gran variedad de técnicas de equilibrio de carga para escalar en horizontal con la plataforma Windows. El equilibrio de carga permite escalar un sitio en horizontal a través de un clúster de servidores, facilitando la adición de capacidad agregando más servidores duplicados. También proporciona redundancia, concediendo al sitio capacidad de recuperación de conmutación por error, de manera que permanece disponible para los usuarios incluso si uno o más servidores fallan (o si es preciso retirarlos del servicio para realizar labores de mantenimiento). El escalado en horizontal proporciona un método de escalabilidad que no se ve mermado por limitaciones de hardware. Cada servidor adicional proporciona una mejora casi lineal de la escalabilidad.
La clave para escalar horizontalmente una aplicación con éxito es la transparencia de ubicación. Si alguna parte del código de la aplicación depende de saber qué servidor está ejecutando el código, no se ha logrado la transparencia de ubicación y será difícil el escalado en horizontal. Esta situación se denomina afinidad de ubicación. La afinidad de ubicación requiere cambios de código para escalar una aplicación en horizontal de un servidor a varios, lo que, en pocas ocasiones, constituye una opción económica. Si diseña la aplicación con transparencia de ubicación en mente, resulta más fácil escalarla en horizontal.


3.- ROBUSTEZ:
Es la capacidad de los productos software de reaccionar apropiadamente ante condiciones excepcionales.
En implementación se cuenta con el mecanismo de excepciones el cual garantiza el correcto flujo de ejecución del código. (Programación por contrato)
Cuando se culmina un software de alta calidad, se presentarán casos o aspectos que no contemplarás y la robustez asegura que no se causarán eventos de índole grave o catastrófica. En detalles técnicos si se presenta errores en tu software, la robustez hará un despliegue de mensajes de error apropiados, en donde se pueda terminar la aplicación de manera limpia y segura para los datos.

4.- PORTABILIDAD:
Es la facilidad con que un sistema software puede ser migrado entre diferentes plataformas hardware o software.

5.- INTEGRIDAD:
Es la característica de un sistema de ser capaz de proteger sus diferentes componentes contra los procesos o elementos que no tengan derecho de acceso a los mismos. La integridad es un factor muy importante en sistemas contables , administrativos y gerenciales ya que de ellos depende el capital de la empresa

6.- COMPATIBILIDAD:
Es la facilidad de combinar diferentes elementos software con el fin de ejecutar una labor en conjunto.

7.- ALTA DISPONIBILIDAD:
Se refiere a la habilidad de la comunidad de para acceder al sistema, consiste en una serie de medidas tendientes a garantizar la disponibilidad del servicio, es decir, asegurar que el servicio funcione durante las veinticuatro horas.

8.- FRONT-END:
Es la parte del que interactúa con el o los usuarios.

9.- BACH-END:
Es la parte que procesa la entrada desde el front-end hasta back-end hace referencia al estado final de un proceso. Contrasta con front-end, que se refiere al estado inicial de un proceso

10.- FAT CLIENT o (Thin Server):
Es el aprovechamiento de datos, donde el cliente ha sido dotado de "inteligencia" y realiza muchos procesamientos locales.
En este esquema de arquitectura el grueso de la aplicación es ejecutada en el cliente, es decir, el nivel de presentación y el nivel de aplicación corren en un único proceso cliente, y el servidor es relegado a realizar las funciones que provee un administrador de base de datos.

11.- THIN CLIENT (Fat Server):
Este es el caso opuesto al anterior, el proceso cliente es restringido a la presentación de la interfaz de usuario, mientras que el grueso de la aplicación corre por el lado del servidor de aplicación. Aquí se posee poco procesamiento local, son más débiles y por supuesto, fáciles de manejar o administrar. La cantidad de datos requeridos por un cliente fat es constante mientras que un cliente más delgado típicamente requerirá de un servidor mayor con mayor capacidad de procesamiento y administración.

miércoles, 5 de mayo de 2010

MANEJO 'IBM WebSphere MQ' EN JAVA

Que tal compañeros el dia de hoy hablaré sobre un tema relacionado a la integración de aplicaciones empresariales. WebSphere MQ (anteriormente MQSeries) que es un modo de transmisión de data via colas MQ, para la integración de aplicaciones empresariales. El envio de datos a traves de MQ muy popular ya que es más rápido que si se trabajara vía el protocolo SOAP o via ficheros.

I.- Características de WebSphere MQ:

* Admite cualquier tipo de conectividad heterogénea, desde equipos de escritorio hasta macrocomputadoras (admite una gran variedad de plataformas distintas).
* Dispone de una extensa familia de interfaces de programación de aplicaciones (API) diseñados con el objeto de facilitar la creación de código para tareas de mensajería.
* Garantiza la entrega sin duplicaciones de los mensajes importantes.
* Permite un mapeo de objetos via ficheros .cpy, xsd y direntes transformaciones de mensajes (Formatos).
* Proporciona conectividad de aplicaciones. Puede utilizarse de forma autónoma o con otros miembros de la familia para ofrecer una solución de integraciones de negocio global.

II.- Sistemas Operativos y Plataformas de Hardware Apropiadas.

* AIX
* HP OpenVMS (Alpha)
* HP-UX
* iSeries i5/OS V5R3
* iSeries OS/400 V5R2
* Linux
* Linux for iSeries
* Linux for pSeries POWER
* Sun Solaris
* Windows 2000
* Windows NT
* Windows XP

III.- Ejemplo Aplicativo:

Ahora si mostraré una forma de trabajar con de WebSphere MQ en JAVA. Para ello se tiene que tener en cuenta y configurar previamente Las colas MQ que serviran para la transmisión. Estos son los datos que se tendra que configura antes que nada:

- QManager
- colaIN
- colaOUT
- canal
- servidor
- puerto
- id
- password
- messageId

Luego ya configurado y definido se registrará en un archivo .properties que será nuestro archivo de configuración del ejemplo a mostrar.

#####################################################################
################ PROPIEDADES DE PARA ACCESO DE DATOS ################
#####################################################################

#### EL DELIMITADOR DE ACCESO PUEDE SER CON LA SIMBOLOGIA => ':', '=', 'BLANCO' ####

##--------- CONFIGURACION: 'LOCAL MESSAGE BROKER' ---------##
propiedad.MQ.QManager = WBRK61_DEFAULT_QUEUE_MANAGER
propiedad.MQ.colaIN = MQ.A
propiedad.MQ.colaOUT = MQ.B
propiedad.MQ.canal = SYSTEM.BKR.CONFIG
propiedad.MQ.servidor = localhost
propiedad.MQ.puerto = 2414
propiedad.MQ.id = MQSIUSER
propiedad.MQ.password = MQSIPASS
propiedad.MQ.messageId = JAVAMAN00000000000000000


Se debe analizar como se van a manejar las colas MQ, ya que si son utilizados un solo 2 aplicaciones (La aplicación que hace PUT y la que hace GET a la trama) y si van a haber muchas aplicaciones que dejen en una misma cola diferentes Tramas MQ. Para el primer caso bastaría con el manejo de la ultima trama que se deja en cola ya que un aplicatibo lo dejara y otro lo leera en ese mismo instante, pero si se está en un escenario como el 2do se necesita el manejo de messageId y correlationId para poder manejar la identificación y deferenciación de cada Trama qye se deposita en una misma cola MQ.

Los ejemplos preparados soportan todo esto anteriormente mencionado.

Clase 'PruebaEnviarMQ':

package org.java.mq;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;

/**
* @author: cguerraa.
* @clase: PruebaEnviaMQ.java
* @descripción: descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com - http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: cesarricardo_guerra19@hotmail.com.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión: 1.0
*/
public class PruebaEnviarMQ{

private static final String ARCHIVO_CONFIGURACION = "ConfiguracionMQ.properties";
private static final String SOURCE_FORDER = "src/";

private static String TRAMA_INPUT = "MENSAJE GUARDADO DE FORMA DIRECTA VIA APLICATIVO JAVA - MQ ...!!!...ENVIO: OPCION CLASE JAVA.";

private Properties objProperties = null;
private MQQueueManager objQueueManager = null;
private ManejoErroresMQ manejoErroresMQ = null;
private ObjetoMQ objetoMQ = null;

{
this.objProperties = this.getObjetoProperties();
this.manejoErroresMQ = new ManejoErroresMQ();
this.objetoMQ = new ObjetoMQ();
}

//Constructores ...
public PruebaEnviarMQ(){
}

public PruebaEnviarMQ( String tramaParam ){
super();
TRAMA_INPUT = tramaParam;
}

public PruebaEnviarMQ( String nombreQManager, String colaInParam, String colaOutParam,
String canalParam, String servidorParam, String puertoParam,
String idParam, String passwordParam ){
super();
this.objetoMQ.setNombreQManager( nombreQManager );
this.objetoMQ.setColaInParam( colaInParam );
this.objetoMQ.setColaOutParam( colaOutParam );
this.objetoMQ.setCanalParam( canalParam );
this.objetoMQ.setServidorParam( servidorParam );
this.objetoMQ.setPuertoParam( puertoParam );
this.objetoMQ.setIdParam( idParam );
this.objetoMQ.setPasswordParam( passwordParam );
}

/**
* main
* @param argumentos
*/
public static void main( String[] argumentos ){
PruebaEnviarMQ conexionMQ = new PruebaEnviarMQ();
conexionMQ.enviarMensajeMQ();
}

/**
* cargarConfiguracionMQ
*/
public void cargarConfiguracionMQ(){

//Inicializando Paramentos ...
this.objetoMQ.setMensajeTramaMQ( TRAMA_INPUT );
this.objetoMQ.setTiempoInicioMQ( Long.toString( ( new java.util.Date() ).getTime() ) );
this.objetoMQ.setCorrelationIdMQ( this.objetoMQ.getTiempoInicioMQ() + new java.util.Date().getTime() );
this.objetoMQ.setNombreQManager( this.objProperties.getProperty( "propiedad.MQ.QManager" ).trim() );
this.objetoMQ.setColaInParam( this.objProperties.getProperty( "propiedad.MQ.colaIN" ).trim() );
this.objetoMQ.setColaOutParam( this.objProperties.getProperty( "propiedad.MQ.colaOUT" ).trim() );
this.objetoMQ.setCanalParam( this.objProperties.getProperty( "propiedad.MQ.canal" ).trim() );
this.objetoMQ.setServidorParam( this.objProperties.getProperty( "propiedad.MQ.servidor" ).trim() );
this.objetoMQ.setPuertoParam( this.objProperties.getProperty( "propiedad.MQ.puerto" ).trim() );
this.objetoMQ.setIdParam( this.objProperties.getProperty( "propiedad.MQ.id" ).trim() );
this.objetoMQ.setPasswordParam( this.objProperties.getProperty( "propiedad.MQ.password" ).trim() );
this.objetoMQ.setMessageIdParam( this.objProperties.getProperty( "propiedad.MQ.messageId" ).trim().getBytes() );

//Imprimiendo Datos MQ.
this.imprimeDatosMQ();

MQEnvironment.channel = this.objetoMQ.getCanalParam();
MQEnvironment.hostname = this.objetoMQ.getServidorParam();
MQEnvironment.port = Integer.parseInt( this.objetoMQ.getPuertoParam() );
MQEnvironment.userID = this.objetoMQ.getIdParam(); //Normalmente el mismo 'ID' del dominio.
MQEnvironment.password = this.objetoMQ.getPasswordParam(); //Normalmente el mismo 'PASSWORD' del dominio.

MQEnvironment.disableTracing();
}

/**
* enviarMensajeMQ
*/
public void enviarMensajeMQ(){

try{
this.cargarConfiguracionMQ();

System.out.println( "TRAMA ENVIADA [PUT]: " + this.objetoMQ.getMensajeTramaMQ() );

this.objQueueManager = new MQQueueManager( this.objetoMQ.getNombreQManager() );

//Configurar las opciones en la cola que se va a abrir...
//Todas las opciones de WebSphere MQ tienen el prefijo MQC en Java.
int opcionesInputMQ = MQC.MQOO_OUTPUT; //MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;

//--------- Especificar las opciones de mensaje para ESCRIBIR (PUT). ---------------------------------------//
MQQueue objColaOUT = this.objQueueManager.accessQueue( this.objetoMQ.getColaInParam(), opcionesInputMQ, null, null, null );
MQPutMessageOptions opcionesPUT = new MQPutMessageOptions();
MQMessage mensajeOUT = new MQMessage(); //Definir un mensaje WebSphere MQ simple y escribir texto en formato UTF...

mensajeOUT.writeUTF( this.objetoMQ.getMensajeTramaMQ() );

mensajeOUT.messageId = mensajeOUT.messageId; //this.messageIdParam;
//mensajeOUT.correlationId = mensajeOUT.correlationId; //this.correlationIdMQ.getBytes();
mensajeOUT.format = MQC.MQFMT_STRING; //Formato que consiste en Solo Caracteres enviados.

//Escribe el mensaje en la cola MQ.
objColaOUT.put( mensajeOUT, opcionesPUT );

//Cerrando Colas MQ.
objColaOUT.close();

//Desconectar del gestor de colas
this.objQueueManager.disconnect();
}
catch( MQException e ){
int codigoTermino = e.completionCode ;
int codigoRazon = e.reasonCode ;

this.manejoErroresMQ.validaErrorMQ( codigoTermino, codigoRazon );
System.exit( 0 );
}
catch( IOException e ){
System.out.println( "SE HA PRODUCIDO UN ERROR DE TIPO 'IOException': " + e );
System.exit( 0 );
}
finally{
}
}

/**
* getObjetoProperties
* @return Properties
*/
public Properties getObjetoProperties(){

String rutaFichero = null;
Properties accesoFichero = null;
FileInputStream streamInput = null;

try{
rutaFichero = SOURCE_FORDER + ARCHIVO_CONFIGURACION; //DESDE ECLIPSE.
//rutaFichero = "ARCHIVO_CONFIGURACION"; //DESDE UNIX.

accesoFichero = new Properties();
streamInput = new FileInputStream( rutaFichero );

//Carga Fichero.
accesoFichero.load( streamInput );
}
catch( IOException e ){
e.printStackTrace();
}

return accesoFichero;
}

/**
* imprimeDatosMQ
*/
public void imprimeDatosMQ(){
System.out.println( "" );
System.out.println( "*************** PARAMETROS DE CONFIGURACION ***************" );
System.out.println( "- QMANAGER: " + this.objetoMQ.getNombreQManager() );
System.out.println( "- COLA IN: " + this.objetoMQ.getColaInParam() );
System.out.println( "- COLA OUT: " + this.objetoMQ.getColaOutParam() );
System.out.println( "- CANAL: " + this.objetoMQ.getCanalParam() );
System.out.println( "- SERVIDOR: " + this.objetoMQ.getServidorParam() );
System.out.println( "- PUERTO: " + this.objetoMQ.getPuertoParam() );
System.out.println( "- ID: " + this.objetoMQ.getIdParam() );
System.out.println( "- PASSWORD: " + this.objetoMQ.getPasswordParam() );
System.out.println( "- MESSAGE ID: " + this.objetoMQ.getMessageIdParam() );
System.out.println( "- CORRELATION ID: " + this.objetoMQ.getCorrelationIdMQ() );
System.out.println( "***********************************************************" );
System.out.println( "" );
}
}

Clase 'PruebaObtieneMQ':

package org.java.mq;

import java.io.IOException;
import java.io.FileInputStream;
import java.util.Properties;
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;

/**
* @author: cguerraa.
* @clase: PruebaObtieneMQ.java
* @descripción: descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com - http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: cesarricardo_guerra19@hotmail.com.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión: 1.0
*/
public class PruebaObtenerMQ{

private static final String ARCHIVO_CONFIGURACION = "ConfiguracionMQ.properties";
private static final String SOURCE_FORDER = "src/";

private Properties objProperties = null;
private MQQueueManager objQueueManager = null;
private ManejoErroresMQ manejoErroresMQ = null;
private ObjetoMQ objetoMQ = null;

{
this.objProperties = this.getObjetoProperties();
this.manejoErroresMQ = new ManejoErroresMQ();
this.objetoMQ = new ObjetoMQ();
}

//Constructores ...
public PruebaObtenerMQ(){
}

public PruebaObtenerMQ( String nombreQManager, String colaInParam, String colaOutParam,
String canalParam, String servidorParam, String puertoParam,
String idParam, String passwordParam ){
super();
this.objetoMQ.setNombreQManager( nombreQManager );
this.objetoMQ.setColaInParam( colaInParam );
this.objetoMQ.setColaOutParam( colaOutParam );
this.objetoMQ.setCanalParam( canalParam );
this.objetoMQ.setServidorParam( servidorParam );
this.objetoMQ.setPuertoParam( puertoParam );
this.objetoMQ.setIdParam( idParam );
this.objetoMQ.setPasswordParam( passwordParam );
}

/**
* main
* @param argumentos
*/
public static void main( String[] argumentos ){
PruebaObtenerMQ conexionMQ = new PruebaObtenerMQ();
conexionMQ.obtenerMensajeMQ();
}

/**
* cargarConfiguracionMQ
*/
public void cargarConfiguracionMQ(){

//Inicializando Paramentos ...
this.objetoMQ.setTiempoInicioMQ( Long.toString( ( new java.util.Date() ).getTime() ) );
//this.objetoMQ.setCorrelationIdMQ( this.tiempoInicioMQ + new java.util.Date().getTime() );
this.objetoMQ.setCorrelationIdMQ( "COSAPISOFT" ); //HardCode.

this.objetoMQ.setNombreQManager( this.objProperties.getProperty( "propiedad.MQ.QManager" ).trim() );
this.objetoMQ.setColaInParam( this.objProperties.getProperty( "propiedad.MQ.colaIN" ).trim() );
this.objetoMQ.setColaOutParam( this.objProperties.getProperty( "propiedad.MQ.colaOUT" ).trim() );
this.objetoMQ.setCanalParam( this.objProperties.getProperty( "propiedad.MQ.canal" ).trim() );
this.objetoMQ.setServidorParam( this.objProperties.getProperty( "propiedad.MQ.servidor" ).trim() );
this.objetoMQ.setPuertoParam( this.objProperties.getProperty( "propiedad.MQ.puerto" ).trim() );
this.objetoMQ.setIdParam( this.objProperties.getProperty( "propiedad.MQ.id" ).trim() );
this.objetoMQ.setPasswordParam( this.objProperties.getProperty( "propiedad.MQ.password" ).trim() );
this.objetoMQ.setMessageIdParam( this.objProperties.getProperty( "propiedad.MQ.messageId" ).trim().getBytes() );

MQEnvironment.channel = this.objetoMQ.getCanalParam();
MQEnvironment.hostname = this.objetoMQ.getServidorParam();
MQEnvironment.port = Integer.parseInt( this.objetoMQ.getPuertoParam() );
MQEnvironment.userID = this.objetoMQ.getIdParam(); //Normalmente el mismo 'ID' del dominio.
MQEnvironment.password = this.objetoMQ.getPasswordParam(); //Normalmente el mismo 'PASSWORD' del dominio.

MQEnvironment.disableTracing();
}

/**
* obtenerMensajeMQ
*/
public void obtenerMensajeMQ(){
try{
this.cargarConfiguracionMQ();

this.objQueueManager = new MQQueueManager( this.objetoMQ.getNombreQManager() );

int opcionesOutputMQ = MQC.MQOO_INPUT_SHARED;

//--------- Especificar las opciones de mensaje para OBTENER (GET). ---------------------------------------//
//MQQueue objColaIN = this.objetoMQ.accessQueue( this.colaOutParam, opcionesOutputMQ, null, null, null );
MQQueue objColaIN = this.objQueueManager.accessQueue( "MQ.A", opcionesOutputMQ, null, null, null );
//MQQueue objColaIN = this.objetoMQ.accessQueue( "MQ.A", MQC.MQOO_INPUT_AS_Q_DEF );

MQGetMessageOptions opcionesGET = new MQGetMessageOptions();
MQMessage mensajeIN = new MQMessage();

opcionesGET.options = MQC.MQGMO_WAIT;

mensajeIN.messageId = mensajeIN.messageId;
//mensajeIN.correlationId = this.correlationIdMQ.getBytes(); //mensajeInput.correlationId;

if( mensajeIN.correlationId != null ){
System.out.println( "CORRELATION ID DEL MENSAJE 'IN': " + mensajeIN.correlationId );
}

//Obteniendo el mensaje de la COLA MQ.
objColaIN.get( mensajeIN, opcionesGET );

String mensajeObtenido = mensajeIN.readString( mensajeIN.getTotalMessageLength() );
System.out.println( "TRAMA OBTENDIDA [GET]: " + mensajeObtenido );

String tamanoMensajeObtenido = String.valueOf( mensajeIN.getTotalMessageLength() );
System.out.println( "TAMAÑO 'TRAMA OBTENDIDA': [" + tamanoMensajeObtenido + "]" );

//Cerrando Colas MQ.
objColaIN.close();

this.objQueueManager.disconnect();
}
catch( MQException e ){
int codigoTermino = e.completionCode ;
int codigoRazon = e.reasonCode ;

this.manejoErroresMQ.validaErrorMQ( codigoTermino, codigoRazon );
System.exit( 0 );
}
catch( IOException e ){
System.out.println( "SE HA PRODUCIDO UN ERROR DE TIPO 'IOException': " + e );
System.exit( 0 );
}
finally{
}
}

/**
* getObjetoProperties
* @return Properties
*/
public Properties getObjetoProperties(){

String rutaFichero = null;
Properties accesoFichero = null;
FileInputStream streamInput = null;

try{
rutaFichero = SOURCE_FORDER + ARCHIVO_CONFIGURACION; //DESDE ECLIPSE.
//rutaFichero = "ARCHIVO_CONFIGURACION"; //DESDE UNIX.

accesoFichero = new Properties();
streamInput = new FileInputStream( rutaFichero );

//Carga Fichero.
accesoFichero.load( streamInput );
}
catch( IOException e ){
e.printStackTrace();
}

return accesoFichero;
}
}

Clase 'PruebaEnviaObtieneMQ':

package org.java.mq;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;

/**
* @author: cguerraa.
* @clase: PruebaEnviaObtieneMQ.java
* @descripción: descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com - http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: cesarricardo_guerra19@hotmail.com.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión: 1.0
*/
public class PruebaEnviarObtenerMQ{

private static final String ARCHIVO_CONFIGURACION = "ConfiguracionMQ.properties";
private static final String SOURCE_FORDER = "src/";

private static String TRAMA_INPUT = "MENSAJE GUARDADO DE FORMA DIRECTA VIA APLICATIVO JAVA - MQ ...!!!...ENVIO DE TRAMA DESDE LANZADOR EN JAVA.";

private Properties objProperties = null;
private MQQueueManager objQueueManager = null;
private ManejoErroresMQ manejoErroresMQ = null;
private ObjetoMQ objetoMQ = null;

{
this.objProperties = this.getObjetoProperties();
this.manejoErroresMQ = new ManejoErroresMQ();
this.objetoMQ = new ObjetoMQ();
}

//Constructores ...
public PruebaEnviarObtenerMQ(){
}

public PruebaEnviarObtenerMQ( String tramaParam ){
super();
TRAMA_INPUT = tramaParam;
}

public PruebaEnviarObtenerMQ( String nombreQManager, String colaInParam, String colaOutParam, String canalParam,
String servidorParam, String puertoParam, String idParam, String passwordParam ){
super();
this.objetoMQ.setNombreQManager( nombreQManager );
this.objetoMQ.setColaInParam( colaInParam );
this.objetoMQ.setColaOutParam( colaOutParam );
this.objetoMQ.setCanalParam( canalParam );
this.objetoMQ.setServidorParam( servidorParam );
this.objetoMQ.setPuertoParam( puertoParam );
this.objetoMQ.setIdParam( idParam );
this.objetoMQ.setPasswordParam( passwordParam );
}

/**
* main
* @param argumentos
*/
public static void main( String[] argumentos ){
PruebaEnviarObtenerMQ conexionMQ = new PruebaEnviarObtenerMQ();
conexionMQ.enviarObtenerMQ();
}

/**
* enviarObtenerMQ
*/
public void enviarObtenerMQ(){

try{
this.cargarConfiguracionMQ();

System.out.println( "TRAMA ENVIADA [PUT]: " + this.objetoMQ.getMensajeTramaMQ() );

MQEnvironment.channel = this.objetoMQ.getCanalParam();
MQEnvironment.hostname = this.objetoMQ.getServidorParam();
MQEnvironment.port = Integer.parseInt( this.objetoMQ.getPuertoParam() );
MQEnvironment.userID = this.objetoMQ.getIdParam();
MQEnvironment.password = this.objetoMQ.getPasswordParam();

//MQEnvironment.enableTracing( 2 );
MQEnvironment.disableTracing();

this.objQueueManager = new MQQueueManager( this.objetoMQ.getNombreQManager() );

//Configurar las opciones en la cola que se va a abrir...
//Todas las opciones de WebSphere MQ tienen el prefijo MQC en Java.
int opcionesInputMQ = MQC.MQOO_OUTPUT;
int opcionesOutputMQ = MQC.MQOO_INPUT_SHARED;

//--------- Especificar las opciones de mensaje para ESCRIBIR (PUT). ---------------------------------------//
MQQueue objColaOUT = this.objQueueManager.accessQueue( this.objetoMQ.getColaInParam(), opcionesInputMQ, null, null, null );
MQPutMessageOptions opcionesPUT = new MQPutMessageOptions();
MQMessage mensajeOUT = new MQMessage(); //Definir un mensaje WebSphere MQ simple y escribir texto en formato UTF...

mensajeOUT.messageId = this.objetoMQ.getMessageIdParam();
mensajeOUT.correlationId = this.objetoMQ.getCorrelationIdMQ().getBytes();
mensajeOUT.format = MQC.MQFMT_STRING; //Formato que consiste en Solo Caracteres enviados.

//Definir un mensaje WebSphere MQ simple y escribir texto en formato UTF...
mensajeOUT.writeUTF( this.objetoMQ.getMensajeTramaMQ() );

//Escribe el mensaje en la cola MQ.
objColaOUT.put( mensajeOUT, opcionesPUT );

//Cerrando Colas MQ.
objColaOUT.close();

//--------- Especificar las opciones de mensaje para OBTENER (GET). ---------------------------------------//
MQQueue objColaIN = this.objQueueManager.accessQueue( this.objetoMQ.getColaInParam(), opcionesOutputMQ, null, null, null );
MQGetMessageOptions opcionesGET = new MQGetMessageOptions();
MQMessage mensajeIN = new MQMessage();

opcionesGET.options = MQC.MQGMO_WAIT;
mensajeIN.messageId = mensajeOUT.messageId;
mensajeIN.correlationId = mensajeOUT.correlationId;

if( mensajeIN.correlationId != null ){
System.out.println( "CORRELATION ID DEL MENSAJE 'IN': " + mensajeIN.correlationId );
}

//Obteniendo el mensaje de la COLA MQ.
objColaIN.get( mensajeIN, opcionesGET );

System.out.println( "" );

String mensajeObtenido = mensajeIN.readString( mensajeIN.getTotalMessageLength() );
System.out.println( "TRAMA OBTENDIDA [GET]: " + mensajeObtenido );

String tamanoMensajeObtenido = String.valueOf( mensajeIN.getTotalMessageLength() );
System.out.println( "TAMAÑO 'TRAMA OBTENDIDA': [" + tamanoMensajeObtenido + "]" );

//Cerrando Colas MQ.
objColaOUT.close();

//Desconectar del gestor de colas
this.objQueueManager.disconnect();
}
catch( MQException e ){
int codigoTermino = e.completionCode ;
int codigoRazon = e.reasonCode ;

this.manejoErroresMQ.validaErrorMQ( codigoTermino, codigoRazon );
System.exit( 0 );
}
catch( IOException e ){
System.out.println( "SE HA PRODUCIDO UN ERROR DE TIPO 'IOException': " + e );
System.exit( 0 );
}
}

/**
* cargarConfiguracionMQ
*/
public void cargarConfiguracionMQ(){

//Inicializando Paramentos ...
this.objetoMQ.setMensajeTramaMQ( TRAMA_INPUT );
this.objetoMQ.setTiempoInicioMQ( Long.toString( ( new java.util.Date() ).getTime() ) );
this.objetoMQ.setCorrelationIdMQ( this.objetoMQ.getTiempoInicioMQ() + new java.util.Date().getTime() );
this.objetoMQ.setNombreQManager( this.objProperties.getProperty( "propiedad.MQ.QManager" ).trim() );
this.objetoMQ.setColaInParam( this.objProperties.getProperty( "propiedad.MQ.colaIN" ).trim() );
this.objetoMQ.setColaOutParam( this.objProperties.getProperty( "propiedad.MQ.colaOUT" ).trim() );
this.objetoMQ.setCanalParam( this.objProperties.getProperty( "propiedad.MQ.canal" ).trim() );
this.objetoMQ.setServidorParam( this.objProperties.getProperty( "propiedad.MQ.servidor" ).trim() );
this.objetoMQ.setPuertoParam( this.objProperties.getProperty( "propiedad.MQ.puerto" ).trim() );
this.objetoMQ.setIdParam( this.objProperties.getProperty( "propiedad.MQ.id" ).trim() );
this.objetoMQ.setPasswordParam( this.objProperties.getProperty( "propiedad.MQ.password" ).trim() );
this.objetoMQ.setMessageIdParam( this.objProperties.getProperty( "propiedad.MQ.messageId" ).trim().getBytes() );

//Imprimiendo Datos MQ.
this.imprimeDatosMQ();

MQEnvironment.disableTracing();
}

/**
* getObjetoProperties
* @return Properties
*/
public Properties getObjetoProperties(){

String rutaFichero = null;
Properties accesoFichero = null;
FileInputStream streamInput = null;

try{
rutaFichero = SOURCE_FORDER + ARCHIVO_CONFIGURACION; //DESDE ECLIPSE.
//rutaFichero = "ARCHIVO_CONFIGURACION"; //DESDE UNIX.

accesoFichero = new Properties();
streamInput = new FileInputStream( rutaFichero );

//Carga Fichero.
accesoFichero.load( streamInput );
}
catch( IOException e ){
e.printStackTrace();
}

return accesoFichero;
}

/**
* imprimeDatosMQ
*/
public void imprimeDatosMQ(){
System.out.println( "" );
System.out.println( "*************** PARAMETROS DE CONFIGURACION ***************" );
System.out.println( "- QMANAGER: " + this.objetoMQ.getNombreQManager() );
System.out.println( "- COLA IN: " + this.objetoMQ.getColaInParam() );
System.out.println( "- COLA OUT: " + this.objetoMQ.getColaOutParam() );
System.out.println( "- CANAL: " + this.objetoMQ.getCanalParam() );
System.out.println( "- SERVIDOR: " + this.objetoMQ.getServidorParam() );
System.out.println( "- PUERTO: " + this.objetoMQ.getPuertoParam() );
System.out.println( "- ID: " + this.objetoMQ.getIdParam() );
System.out.println( "- PASSWORD: " + this.objetoMQ.getPasswordParam() );
System.out.println( "- MESSAGE ID: " + this.objetoMQ.getMessageIdParam() );
System.out.println( "- CORRELATION ID: " + this.objetoMQ.getCorrelationIdMQ() );
System.out.println( "***********************************************************" );
System.out.println( "" );
}
}




Para mayor detalle descargar el ejemplo completo de: AQUÌ.

domingo, 2 de mayo de 2010

MANEJO DE JAKARTA HTTP CLIENT

Bueno en esta oportunidad postearé sobre un Framework muy útil, para los casos en los que, muchos desarrolladores, en algún momento hemos estado en el escenario en el que teníamos que enviar parámetros a un Servlet pero sin esta necesariamente en un JSP, ni apoyándose en una funciona JavaScript, sino que desde una clase JAVA. Para esto un Framework aparece en nuestro rescate, este se llama: 'Jakarta Commons HttpClient'. Este Framework permite realizar una conexión directa a un JSP o un Servlet enviando fácilmente los parámetros respectivos y identificar rápidamente datos como del Response como: TIPO (GET/POST), URL, SERVLET, PARAMETROS DEL SERVLET, ESTATUS, HTML, etc.

El demo preparado muestra el manejo de 'HttpClient' y se conecta con un 'Servlet' de un demo anteriomente mostrado para manejos de Servlet´s. El ejemplo de Servket lo descargas de aquí:
DEMO MANEJO SERVLET.

Para mayor detalle descargar el ejemplo completo de 'HttpClient': AQUÌ.

sábado, 1 de mayo de 2010

MANEJO DE SERVLETs

Que tal esta oportunidad postearé sobre un tema ya un poco antiguo, pero que nunca pasará 100% de moda, ya que por mas frameworks que utilicemos para nuestros desarrollos en algún momento tendremos la necesidad de recurrir al uso de un Servlet.

Un servlet es un objeto que se ejecuta en un servidor o contenedor JEE, especialmente diseñado para ofrecer contenido dinámico desde un servidor web, generalmente HTML.

Un servlet implementa la interfaz javax.servlet.Servlet o hereda alguna de las clases más convenientes para un protocolo específico (Ejm: javax.servlet.HttpServlet). Al implementar esta interfaz el servlet es capaz de interpretar los objetos de tipo 'HttpServletRequest' y 'HttpServletResponse' quienes contienen la información de la página que invocó al servlet.

Ciclo de vida de un Servlet.

El ciclo de vida de un Servlet se divide en los siguientes puntos:

1. El cliente solicita una petición a un servidor vía URL.
2. El servidor recibe la petición.
2.1. Si es la primera, se utiliza el motor de Servlets para cargarlo y se llama al método init().
2.2. Si ya está iniciado, cualquier petición se convierte en un nuevo hilo. Un Servlet puede manejar múltiples peticiones de clientes.
3. Se llama al método service() para procesar la petición devolviendo el resultado al cliente.
4. Cuando se apaga el motor de un Servlet se llama al método destroy(), que lo destruye y libera los recursos abiertos.

Asi mismo un Servlet permite el acceso por medio de unos objetos, para el acceso al contexto de la aplicación.

-------------
ServletConfig
-------------

- Para el acceso al contexto actual de una aplicación Web corriendo en una JVM.
- Un ServletConfig por 'Servlet'.
- Es usado para el acceso al 'ServletContext'.
- Se accede al objeto mediante: getServletConfig().getInitParameter( "nombreParametro" );

--------------
ServletContext
--------------

- Para el acceso al contexto actual de una aplicación Web corriendo en una JVM.
- Usado para el acceso a la configuración de elemento deployado.
- Se acceder al objeto mediante: getServletContext().getInitParameter( "nombreParametro" );

El ejemplo preparador muestra una aplicación dividida en 2 partes:

La primera muestra un Login que valida un usuario y password, aqui se muestra el manejo de metodos como: doGet(), doPost(), service(), destroy(), etc.Mientras que el segundo ejemplo muestra el manejo de un muy útil ImageServlet.







Para mayor detalle descargar el ejemplo completo: AQUÌ.