Monday, August 31, 2009

Multiconexiones JDBC

Las clases conexion en una aplicacion JAVA es la clave para que tu aplicacion JAVA acceda y se conecte a un servidor de base de datos. Para ello se realiza clases que mediante Driver JDBC se conectan. Muchas veces los desarrolladores caen en la necesidad de crear muchas conexiones que se encuentran regadas en difrentes partes de la aplicacion, esto en realidad no es lo optimo pero se hace muchas veces. Lo mejor es tener una clase que administre las conexiones a las base de datos. El ejemplo que mostraremos continuacion realiza esto y mucho mas. Este consta que un ECLIPSE Dinamic Project que posee un paquete de conexion (org.java.conexion), que maneja administra las conexiones a diferentes motores de datos SIMULTANEAMENTE( MySql, SqlServer, Oracle, Postgres ). Simplemente con cambiar un parametro en el fichero .properties.

Dentro de la aplicacion se encontrarà todas las librerias JDBC necesarias y tambien se encontrara el fichero ScriptBD.txt con los script de prueba para cada motor de datos.


Para descargar la aplicacion demo de multiconexiones JDBC pulsar AQUI.

CONFIGURACION JDBC PARA SQL SERVER 2005 EXPRESS

En esta oportunidad mostrae la configuración para crear una conexión JDBC entre una aplicación JAVA con el respectivo servidor SQL Server 2005 Express.

Los requerimientos previos y el software necesario son los siguientes:

Requerimientos Previos:>

- NetFramework v4.0.exe (DESCARGAR.)
- Windows Installer v4.5.exe (DESCARGAR.)

Herramienta SQL Sever (DESCARGAR AMBOS.):

- SQL Server 2005 Express.exe.
- SQL Server Manager Studio 2005 Express.msi

Para acceder a este motor de datos vía una aplicación JAVA JDBC, se debe de realizar lo siguiente:

Descargar los drivers de conexión desde AQUI.:

- sqljdbc.jar
- sqljdbc4.jar
- mssqlserver.jar
- msbase.jar
- msutil.jar
- jtds-1.2.2.jar

Acceder a tu herramienta de desarrollo ECLIPSE y crear un proyecto Dinamic Web y en la carpeta lib ingresar los .Jars de conexión descargados. Luego, creamos una clase .java para la conexión con los motores de datos SQL Server 2000 y SQL Server 2005, aquí comparto mi clase que desarrolle:

package org.java;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;

public class ConexionSQLServeJDBC{

private Connection conexion = null;
private final String url = "jdbc:microsoft:sqlserver://";
private final String servidor = "localhost\\SQLEXPRESS";
//"192.168.1.33"; //"LOCALHOST"; //"LOCALHOST\\SQLEXPRESS SQLSERVER2000";
private final String puerto = "1433";
private final String baseDatos = "DEMODB";
private final String usuario = "sa";
private final String password = "sql";
private final String metodo = "cursor"; //direct - cursor;

//Constructor.
public ConexionSQLServeJDBC(){
}

//Levanta la Aplicacion.
public static void main( String[] args ) throws Exception{
ConexionSQLServeJDBC conexionJDBC = new ConexionSQLServeJDBC();
conexionJDBC.propiedadesDataBase();
}
/**
* getConnectionUrl
* @return String
*/
private String getConnectionUrl(){

/*
* El driver de Microsoft NO funciona con "servidor\instancia". Para solucionar el
* tema, debes indicar la direccion IP del servidor + el puerto de la instancia.
*/

//String SQL = ( this.url + this.servidor + ":" + this.puerto + ";databaseName=" + this.baseDatos + ";" + "selectMethod=" + this.metodo + ";" );

String SQL = ( this.url + this.servidor + ":" + this.puerto + ";databaseName=" + this.baseDatos + ";" );

System.out.println( "Cadena CONEXION JDBC: " + SQL );

return SQL;
}
/**
* getConnection
* @return Connection
*/
private Connection getConnection(){
try{
Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );
this.conexion = java.sql.DriverManager.getConnection( this.getConnectionUrl(), this.usuario, this.password );

if( this.conexion != null ){
System.out.println( "Conexión .... OK" );
}
else{
System.out.println( "Conexión .... NOK" );
}
}
catch( Exception e ){
e.printStackTrace();
System.out.println( "Error de seguimiento en 'getConnection()': " + e.getMessage() );
}
return this.conexion;
}

/**
* propiedadesDataBase
*/
public void propiedadesDataBase(){

DatabaseMetaData metaData = null;
ResultSet rs = null;
int contador = 0;

try{
this.conexion = this.getConnection();

if( this.conexion != null ){
metaData = this.conexion.getMetaData();

System.out.println( "" );
System.out.println( "****** INFORMACION DEL CONTROLADOR JDBC ******" );
System.out.println( " - NOMBRE: " + metaData.getDriverName() );
System.out.println( " - VERSION: " + metaData.getDriverVersion() );
System.out.println( "" );
System.out.println( "****** INFORMACION DE BASE DE DATOS ******" );
System.out.println( " - NOMBRE: " + metaData.getDatabaseProductName() );
System.out.println( " - VERSION: "+ metaData.getDatabaseProductVersion() );
System.out.println( "" );
System.out.println( " - BASES DE DATOS ACTIVAS: " );

rs = metaData.getCatalogs();

while( rs.next() ){
contador += 1;
System.out.println( " BD #" + contador + ": " + rs.getString( 1 )
);
}
this.cerrarConexiones( this.conexion, rs );
}
else{
System.out.println( "Error: No hay ninguna Conexión SQL Activa" );
}
}
catch( Exception e ){
e.printStackTrace();
}
}
/**
* cerrarConexiones
* @param conexion
* @param rs
*/
private void cerrarConexiones( Connection conexion, ResultSet rs ){
try{
if( conexion != null ){
conexion.close();
}
if( rs != null ){
rs.close();
}
}
catch( Exception e ){
e.printStackTrace();
}
}
}

Thursday, July 23, 2009

Sintaxis JAVA & JAVADOC 'Standar'

El otro día indagando en las opciones de esta maravillosa Ide de desarrollo que es el Eclipse v3.3, ya que por lo que conozco se que es, en la mayoría de sus opciones, personalizadle, la solución para aplicar un forma estándar en lo que respecta la creación de mis métodos, clases, declaraciones, iteradores, etc. Cuando digo aplicar un estándar me refiero a una sintaxis personalizada (espacios entre declaración y variable, distancia entre métodos y declaraciones, la llaves estén pegadas o no pegadas a la clase o método, etc. ) y al igual que para las sintaxis netamente de la programacion de JAVA, necesitaba una para ya no están creando los JAVADOC para cada método o get y set, etc. Buscando la solución la encontré Eclipse tiene opciones para la personalización de todo esto que he hablado, simplemente entrando a:
(Windows/Preferences/Java/Code Style).

Dentro encontraran estas 2 opciones:

I.- Code Formatter (o Formatter):
En esta opciones uno puede crear un perfil de formato, que quedara registrado en el comboBox y que dentro de dicho perfil se crearan desde una interfase a base de taps toda la personalización en cuando al código de programación que desees para luego guardar en un XML todos tu profile. También permite la importación de un XML que anteriormente hayas guardado.

II.- Code Template:
En esta opciones uno puede importar un XML donde se encuentre personalizado todo los JAVADOC, para cada caso que se indica en las opciones Commets y Code.

La funcionalidad esta para la sintaxis JAVA es aplicada cuando generes código o crees clases, etc. utilizando la herramienta (ECLIPSE) misma o sino cuando pegues en el paquete una clase externa o código externo y simplemente pulsado:
(Crtl + Shift + F), todo el código será transformado según la sintaxis que hayas definido en tu XML importado o creado.

Aquí muestro dos imágenes, una de cada opción:

Code Formatter (ó Formatter)


Code Template


Para mayor detalle descargar los 'XML' con los Standares aplicados y listos para ser importados pulsando: AQUI.

Tuesday, June 2, 2009

Eclipse ShortCuts

Tratando de tener un mejor y màs manejo de esta excelente IDE de desarrollo. Posteo en esta oportunidad la lista de ShortCuts que maneja Eclipse junto con todas las demas IDEs màs potentes como WebsPhere, Red Hat Developer Studio, MyEclipse, JBoss Developer Studio, Etc. Ya que poseen como base a Eclipse. La lista de Eclipse ShortCuts es:

Explicaciòn.

Monday, May 4, 2009

Descargador Videos Youtube en JAVA.

Aqui les comparto un demo creado con la finalidad de generar un Descargador de Video de 'Youtube' en JAVA. El demo esta desarrollado en base a Hilos.

Para el manejo simplemente en el textField ingresar la URL del video de Youtube deseado y pulsar el boton descargar. Dependiendo del tamaño del video la aplicacion como que se colgara, pero la razon es que se genero un hilo de descarga. Al finalizar la descarga en mostrara en el TextArea la ruta donde se guardo el video descargado y un mensaje de conformidad.

Los videos descargado bajaràn en formado .Flv en la ruta:
C:\VideosDescargados y para visualizarlos se tendra que descargar el reproductor: Riva FLV PLAYER v2.0.

Dentro del comprimido se encontrara un .zip con el codigo fuente de la aplicacion y un .jar que es el ejecutable ya compilado y funcionando.

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

Saturday, May 2, 2009

Encriptaciòn, Criptografia y Firmas Digitales en JAVA.

Hola como estan, en esta oportunidad postearè sobre Encriptaciòn, Criptografia y Firmas Digitales en JAVA , por ese motivo estoy compartiendo un par de clases especiales ('ManejoEncriptacion.java') para el manejo de encriptacion y desencriptacion de datos y manejo de firmas digitales, utilizando los algoritmos 'SHA1, MD5, BASE64, CIPHER, SHA1PRNG, SUNJCE, BLOWFISH' . Esta muy bien detalla y ordenada. El manejo de este par de clases seria simplemente instanciandolas y accediendo a los mètodos respectivos, segun convenga. He creado dentro de cada clase un mètodo "main" que muestra la forma como llamar a los mètodos para ver su funcionamiento y lo que imprime al ejecutarce dichas clases:

I.- Ejecuciòn clase: 'ManejoEncriptacion.java' Al ejecutarce esta clase se muestran la aplicaciòn de los algoritmos respectivos, ya antes comentados.


/*******************************************************************************/
Dato Original a Encriptar: Cesar Ricardo Guerra Arnaiz ==> 'JAVAMAN'

- Dato Encriptado utilizando 'SHA1': 963B634E2A2A74399D521545372C590640F6328FF615
- Dato Encriptado utilizando 'MD5': 9B47DE66E257144C9A6C4BA463DC673C1C67
- Dato Encriptado utilizando 'BASE64': Q2VzYXIgUmljYXJkbyBHdWVycmEgQXJuYWl6ID09PiAnSkFWQU1BTic=
- Dato Encriptado utilizando 'CIPHER': rqYOA80r41UjlAdaIq32MSW8ZBzh1ue/qUux9Z9TvDFclqWrG8e55mTxVE9ohJ2u

- Dato Comparado Existente 'SHA1': true
- Dato Comparado Existente 'MD5': true
- Dato Desencryptado utilizando 'BASE64': Cesar Ricardo Guerra Arnaiz ==> 'JAVAMAN'
- Dato Desencryptado utilizando 'CIPHER': Cesar Ricardo Guerra Arnaiz ==> 'JAVAMAN'
/*******************************************************************************/


II.- Ejecuciòn clase: 'ManejoCriptografia_FirmasDigitales.java'
Esta clase al ejecutarce guardara en la ruta: C:\\Encriptacion\\
4 archivos '.txt' ( CriptografiaPrivada.txt, CriptografiaPublica.txt,CriptografiaSecreta.txt, FirmaDigital.txt ), con las llaves pùblica, privada, secreta y la firma digital generada respectivamente.


/*******************************************************************************/
Llave Privada: Sun DSA Private Key
parameters:
p:
fca682ce 8e12caba 26efccf7 110e526d b078b05e decbcd1e b4a208f3 ae1617ae
01f35b91 a47e6df6 3413c5e1 2ed0899b cd132acd 50d99151 bdc43ee7 37592e17
q:
962eddcc 369cba8e bb260ee6 b6a126d9 346e38c5
g:
678471b2 7a9cf44e e91a49c5 147db1a9 aaf244f0 5a434d64 86931d2d 14271b9e
35030b71 fd73da17 9069b32e 2935630e 1c206235 4d0da20a 6c416e50 be794ca4

x: 05d1cd9b f2a50d95 ebd60b1f 92a6c366 b48c5246

Llave Publica: Sun DSA Public Key
Parameters:
p:
fca682ce 8e12caba 26efccf7 110e526d b078b05e decbcd1e b4a208f3 ae1617ae
01f35b91 a47e6df6 3413c5e1 2ed0899b cd132acd 50d99151 bdc43ee7 37592e17
q:
962eddcc 369cba8e bb260ee6 b6a126d9 346e38c5
g:
678471b2 7a9cf44e e91a49c5 147db1a9 aaf244f0 5a434d64 86931d2d 14271b9e
35030b71 fd73da17 9069b32e 2935630e 1c206235 4d0da20a 6c416e50 be794ca4

y:
d13969c4 4a72fc75 34c8a901 f9a7385c c5e0f58a f7e4ff2f 86c81303 34c88ead
174e69a5 2e419e0b 075af7f1 0b0ee3af 7e701dee 8e392760 afb42e5b 051bf3f3


Llave Secreta: com.sun.crypto.provider.DESKey@fffe78e4

DSA 'Llave Privada' 'DATOS ESPECIFICOS'
g: 5421644057436475141609648488325705128047428394380474376834667300766108262613900542681289080713724597310673074119355136085795982097390670890367185141189796
p: 13232376895198612407547930718267435757728527029623408872245156039757713029036368719146452186041204237350521785240337048752071462798273003935646236777459223
q: 857393771208094202104259627990318636601332086981
x (Private Key): 33223720685525160964687769090827582703053591110

DSA 'Llave Publica' 'DATOS ESPECIFICOS'
g: 5421644057436475141609648488325705128047428394380474376834667300766108262613900542681289080713724597310673074119355136085795982097390670890367185141189796
p: 13232376895198612407547930718267435757728527029623408872245156039757713029036368719146452186041204237350521785240337048752071462798273003935646236777459223
q: 857393771208094202104259627990318636601332086981
y (Public Key): 10957964172216934477577618607139934551345542158063249939755549047479274223759870433197949180499126827884422297601943888110924226391334218853590138250589171

Mensaje Transacciòn: Clave 'Privada' Guardada
Mensaje Transacciòn: Clave 'Publica' Guardada
Mensaje Transacciòn: Clave 'Secreta' Guardada

Mensaje Transacciòn: Clave 'Privada' Recuperada
Mensaje Transacciòn: Clave 'Publica' Recuperada
Mensaje Transacciòn: Clave 'Secreta' Recuperada

Mensaje Transacciòn: 'Firma Digital' Creada
Mensaje Transacciòn: 'Firma Digital' Guardada en Archivo
Firma Digital: 0, 5lE?Í"0Y"ššµ?
¬Dêãå± r“ ×)”f¡îM)ÕÃu†å1dXà
Existe Firma Digital: false
Mensaje Transacciòn: 'Firma Digital' Recuperada de Archivo
Obteniendo Firma Digital 'Archivo': 0, 5lE?Í"0Y"ššµ?
¬Dêãå± r“ ×)”f¡îM)ÕÃu†å1dXà

Listado Algoritmos 'KeyPairGenerator': [ECIES, GOST3410, ECGOST3410, EC, DIFFIEHELLMAN, ECDSA, DSA, ECDH, ECDHC, RSA, DH, ELGAMAL]
Listado Algoritmos 'Signature': [SHA256WITHRSAENCRYPTION, RSASSA-PSS, MD5WITHRSA/ISO9796-2, SHA256WITHECDSA, SHA384WITHECDSA, ECGOST3410, SHA256WITHRSA/PSS, DSA, ECDSA, MD4WITHRSAENCRYPTION, SHA384WITHRSA, RIPEMD128WITHRSAENCRYPTION, RIPEMD160WITHRSAENCRYPTION, SHA384WITHRSAENCRYPTION, SHA512WITHRSA, SHA224WITHECDSA, MD2WITHRSA, NONEWITHDSA, SHA256WITHECNR, SHA224WITHRSAENCRYPTION, SHA256WITHDSA, RIPEMD256WITHRSAENCRYPTION, SHA224WITHECNR, MD5WITHRSA, SHA1WITHRSAENCRYPTION, SHA256WITHRSA, SHA512WITHECDSA, SHA512WITHRSAENCRYPTION, SHA384WITHRSA/PSS, GOST3410, SHA1WITHRSA/PSS, SHA1WITHECNR, SHA1WITHDSA, SHA1WITHRSA/ISO9796-2, SHA512WITHRSA/PSS, SHA224WITHRSA/PSS, SHA224WITHDSA, SHA512WITHDSA, SHA1WITHRSA, MD5ANDSHA1WITHRSA, RIPEMD160WITHRSA/ISO9796-2, SHA512WITHECNR, SHA384WITHDSA, MD5WITHRSAENCRYPTION, MD2WITHRSAENCRYPTION, SHA384WITHECNR, 1.2.840.113549.1.1.10]

Lista Proveedores Encriptacion:
--------------------------------
SUN version 1.6
SunRsaSign version 1.5
SunJSSE version 1.6
SunJCE version 1.6
SunJGSS version 1.0
SunSASL version 1.5
XMLDSig version 1.0
SunPCSC version 1.6
SunMSCAPI version 1.6
BC version 1.36
/*******************************************************************************/


Para descargar el paquete completo: pulsar AQUI #1. - AQUI #2.

Sunday, March 29, 2009

Serializacion & Deserializaciòn de Objetos

En esta oportunidad muestro el manejo de 'Serializacion & Deserializacion de Objetos en Java'. Esto lo elabore en base de Objetos Stream, como sus dos mètodos famosos: 'writeObject' y 'readObject'. Los dos ejemplos que se muestran, realizan lo mismo impreso en consola, la diferencia que es que en el primer ejemplo el seteo de objetos esta en modo 'HardCode' y en el segundo utilizo un bean 'BeanSerializable' para la transmisiòn. En total los dos ejemplos cuantan con tres clases:

BeanSerializable.java

import java.io.Serializable;
import java.util.Date;

/**
* En clase es utilizada para el setedo de datos para su posterior serializacion.
*
* @version 1.2 - 29 Marzo 2009.
* @author Ricardo Guerra.
*/
public class BeanSerializable implements Serializable{

private static final long serialVersionUID = -7905579217165381885L;

private Integer codigo;
private String nombre;
private String apellido;
private Date fecha;


public static long getSerialVersionUID() {
return serialVersionUID;
}

public Integer getCodigo() {
return codigo;
}

public void setCodigo(Integer codigo) {
this.codigo = codigo;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getApellido() {
return apellido;
}

public void setApellido(String apellido) {
this.apellido = apellido;
}

public Date getFecha() {
return fecha;
}

public void setFecha(Date fecha) {
this.fecha = fecha;
}
}

Serializando_Deserealizando_Objetos_01.java

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;

/**
* En esta clase estoy mostrando el manejo de Serializacion y Deserealizaciòn
* de datos en modo 'HardCode'.
*
* @version 1.2 - 29 Marzo 2009.
* @author Ricardo Guerra.
*/

public class Serializando_Deserealizando_Objetos_01 implements Serializable{

private static final long serialVersionUID = -2071812553599487256L;


public static void main( String[] args ){

try{
/***************************************/
/**** ENVIAN OBJETOS 'Serializados' ****/
/***************************************/
FileOutputStream salida = new FileOutputStream( "objTemporal" ); //objTemporal, reconoce el nombre del Objeto de la Memoria.
ObjectOutput objSalida = new ObjectOutputStream(salida);

objSalida.writeObject( 123456 );
objSalida.writeObject( "Cesar Ricardo" );
objSalida.writeObject( "Guerra Arnaiz" );
objSalida.writeObject( new Date() );

objSalida.flush();
objSalida.close();


/********************************************/
/**** RECUPERAN OBJETOS 'Deserializados' ****/
/********************************************/
FileInputStream entrada = new FileInputStream( "objTemporal" ); //objTemporal, reconoce el nombre del Objeto de la Memoria.
ObjectInputStream objEntrada = new ObjectInputStream( entrada );

Integer codigo = (Integer)objEntrada.readObject();
String nombre = (String)objEntrada.readObject();
String apellido = (String)objEntrada.readObject();
Date fecha = (Date)objEntrada.readObject();

objEntrada.close();

System.out.println( "Objeto Deserealizado #01: " + codigo );
System.out.println( "Objeto Deserealizado #02: " + nombre );
System.out.println( "Objeto Deserealizado #02: " + apellido );
System.out.println( "Objeto Deserealizado #03: " + fecha );
}
catch( Exception e ){
e.printStackTrace();
}
}

public static long getSerialVersionUID() {
return serialVersionUID;
}
}

Serializando_Deserealizando_Objetos_02.java

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;

/**
* En esta clase estoy mostrando el manejo de Serializacion y Deserealizaciòn
* de datos utilizando un Objeto Bean de apoyo.
*
* @version 1.2 - 29 Marzo 2009.
* @author Ricardo Guerra.
*/

public class Serializando_Deserealizando_Objetos_02 implements Serializable{

private static final long serialVersionUID = -7282739136711013954L;


public static void main( String[] args ){

try{
BeanSerializable objeto = new BeanSerializable();

/***************************************/
/**** ENVIAN OBJETOS 'Serializados' ****/
/***************************************/
FileOutputStream salida = new FileOutputStream( "objTemporal" ); //objTemporal, reconoce el nombre del Objeto de la Memoria.
ObjectOutput objSalida = new ObjectOutputStream(salida);

objeto.setCodigo( 123456 );
objeto.setNombre( "Cesar Ricardo" );
objeto.setApellido( "Guerra Arnaiz" );
objeto.setFecha( new Date() );

objSalida.writeObject( objeto );

objSalida.flush();
objSalida.close();


/********************************************/
/**** RECUPERAN OBJETOS 'Deserializados' ****/
/********************************************/
FileInputStream entrada = new FileInputStream( "objTemporal" ); //objTemporal, reconoce el nombre del Objeto de la Memoria.
ObjectInputStream objEntrada = new ObjectInputStream( entrada );

BeanSerializable objetoBean = (BeanSerializable)objEntrada.readObject();

System.out.println( "Objeto: " + objetoBean );

if( objetoBean instanceof BeanSerializable ){
System.out.println( "Si es Instanciado al Objeto" );
}
else{
System.out.println( "No es Instanciado al Objeto" );
}

objEntrada.close();

System.out.println( "Objeto Deserealizado #1: " + objetoBean.getCodigo() );
System.out.println( "Objeto Deserealizado #2: " + objetoBean.getNombre() );
System.out.println( "Objeto Deserealizado #3: " + objetoBean.getApellido() );
System.out.println( "Objeto Deserealizado #4: " + objetoBean.getFecha() );
}
catch( Exception e ){
e.printStackTrace();
}
}

public static long getSerialVersionUID() {
return serialVersionUID;
}
}