martes, 15 de abril de 2008

jax-ws: Java Web Services

Para comenzar es necesario descargar el binario correspondiente a la implementacion de referencia de JAX-WS. En la seccion de vinculos se encuentra una referencia al sitio donde puede encontrarlo. Los ejemplos presentados aqui refieren a la distribucion que se encuentra aqui.

Instalacion de JAX-WS

Una vez que se ha obtenido JAX-WS, es necesario instalarlo en el entorno local para comenzar a desarrollar web services. Para ello descomprima la distribucion de JAX-WS de la siguiente manera:
java -jar JAXWSx.x.x-.jar
por ejemplo:
java -jar JAXWS2.1.3-20071218.jar
De esto resultara el directorio jaxws-ri que contiene las librerias, documentacion y ejemplos.

A continuacion se desarrolla un web service y un cliente que consuma el servicio para mostrar, mediante un ejemplo sencillo el proceso de creacion de web services mediante JAX-WS.

Creacion del servicio Echo

El servicio Echo es definido por la interfaz java IEchoService.java y la clase java que implementa dicha interfaz EchoServiceImpl.java. A continuacion se presenta el codigo para ambas, clase e interfaz:
package test.echo.service;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService(serviceName="EchoService", name="Echo")
public class EchoService {

@WebMethod()
public String echo(String value) {
return value;
}
}
JAX-WS provee un conjunto de anotaciones que permite convertir una simple clase java en un web service. Como se observa en el ejemplo anterior, la clase java EchoService se encuentra decorada con la anotacion @WebService, que indica que dicha clase es un web service.

La anotacion @WebMethod es utilizada para indicar cuales de los metodos de la clase definida como servicio seran expuestos o publicados.

Las anotaciones que decoran a la clase EchoService deben ser procesadas para que JAX-WS genere las clases adicionales que dan forma al servicio Echo. Para esto es necesario emplear la herramienta Apt (Annotation processing tool) que se encuentra en la libreria jaxws-tools.jar. Esta herramienta puede ser invocada por linea de comando, de la siguiente manera:
apt -classpath C:\jaxws-ri\lib\FastInfoset.jar;
C:\jaxws-ri\lib\activation.jar;
C:\jaxws-ri\lib\http.jar;
C:\jaxws-ri\lib\jaxb-api.jar;
C:\jaxws-ri\lib\jaxb-impl.jar;
C:\jaxws-ri\lib\jaxb-xjc.jar;
C:\jaxws-ri\lib\jaxws-api.jar;
C:\jaxws-ri\lib\jaxws-rt.jar;
C:\jaxws-ri\lib\jaxws-tools.jar;
C:\jaxws-ri\lib\jsr173_api.jar;
C:\jaxws-ri\lib\jsr181-api.jar;
C:\jaxws-ri\lib\jsr250-api.jar;
C:\jaxws-ri\lib\resolver.jar;
C:\jaxws-ri\lib\saaj-api.jar;
C:\jaxws-ri\lib\saaj-impl.jar;
C:\jaxws-ri\lib\sjsxp.jar;
C:\jaxws-ri\lib\stax-ex.jar;
C:\jaxws-ri\lib\streambuffer.jar com.sun.tools.apt.Main
-d "jaxws-samples\bin"
-s "jaxws-samples\src"
-sourcepath "jaxws-samples\src"
-g:none "jaxws-samples\src\test\echo\service\IEchoService.java"
"jaxws-samples\src\test\echo\service\EchoServiceImpl.java"
o tambien puede ser incorparada al proceso de costruccion (build), invocada por Ant. Para hacerlo, es necesario primero declarar la tarea correspondiente a Apt, como se muestra a continuacion:

Luego es necesario definir los targets para invocar a la herramienta Apt y compilar la clase que contiene la logica del servicio Echo definida antes:

La ejecucion de Apt generara dos clases:
  • Echo.java
  • EchoResponse.java
en el directorio test/echo/service/jaxws. Estas dos son clases de bajo nivel y se encargan de encapsular los mensajes SOAP empleados en la consulta y en la respuesta. Son altamente dependientes de anotaciones empleadas por JAXB para el mapeo de XML a objetos java.

Si obtiene el siguiente mensaje de advertencia cuando se ejecuta la tarea que ejecuta apt:
apt:
[apt] warning: Annotation types without processors:
[javax.xml.bind.annotation.XmlRootElement,
javax.xml.bind.annotation.XmlAccessorType, javax.xml.bind.annotation.XmlType,
javax.xml.bind.annotation.XmlElement]
[apt] 1 warning
asegurece que apt recibe como argumento fork="true".

Si obtiene el siguiente mensaje:
apt:
[apt] java.lang.NoClassDefFoundError: com/sun/tools/apt/Main
[apt] Exception in thread "main"
asegurece que tools.jar, distribuido junto con el JRE, este incluido en el classpath empleado para ejecutar apt.

Ahora sera necesario generar el wsdl empleado para publicar el servicio. Para esto se debe emplear otra herramienta de JAX-WS llamada wsgen. A continuacion se muestra como ejecutar la herramienta wsgen por linea de comando:
C:\jaxws-ri\bin>wsgen -cp "project-home\jaxws-samples\bin"
-d "project-home\jaxws-samples\bin" -keep -wsdl
-r "project-home\jaxws-samples\src\test\echo\service\wsdl"
-s "project-home\jaxws-samples\src" test.echo.service.EchoService
o tambien puede ser incorparada al proceso de costruccion (build), invocada por Ant. Para hacerlo, es necesario primero declarar la tarea correspondiente a wsgen, como se muestra a continuacion:

Luego se define el target para invocar a la herramienta wsgen y generar el wsdl correspondiente al servicio:

Creacion del cliente para el servicio Echo

wsimport
Buildfile: C:\Documents and Settings\sg0203921\workspacee\jaxws-samples\build.xml
Trying to override old definition of task apt
wsimport:
[wsimport] parsing WSDL...
[wsimport] generating code...
[wsimport] compiling code...
BUILD SUCCESSFUL
Total time: 6 seconds
Clases generadas:
  • Echo_Type.java
  • Echo.java
  • EchoResponse.java
  • EchoService.java
  • ObjectFactory.java
  • package-info.java

Publicacion del servicio Echo en Tomcat 6

Vinculos:

domingo, 13 de abril de 2008

eclipse: Integracion con Tomcat

El plug-in de Sysdeo para Eclipse permite, entre otras cosas, ejecutar en forma normal o en modo "debug" aplicaciones que requieren de un contenedor de servlets como lo es Tomcat.

Descargar el software

Descargue el software de Sysdeo correspondiente a la version de Eclipse que utiliza.

Vinculos:

java: Introduccion a JavaSpaces

Que es JavaSpaces?

Permite construir aplicaciones distribuidas empleando las facilidades que proveen las programacion orientada a objetos y Java.

Vinculos:
Jini - Network technology
Jini - Starter kit
Jini - Core Platform definitions
Jini.org
Blitz - Tools for easy JavaSpaces
GigaSpaces - Complete JavaSpaces implementation and more
GigaSpaces Wiki
Getting started with the JavaSpaces technology

martes, 8 de abril de 2008

Axis2: Echo web service

Creacion del Servicio

Para desarrollar el servicio de Echo, es necesario crear una clase java que sea el punto de entrada y que se pueda registrar y publicar en la apilacion web de Axis2. El codigo fuente correspondiente al servicio es el siguiente:
package test.echo.service;

public class EchoService {

public String echo(String value) {
return value;
}
}
Cada servicio requiere tambien una minima configuracion como la que se presenta a continuacion, que permite a Axis2 conocer los detalles necesarios sobre el servicio:


La configuracion presentada debe estar definida en un archivo xml cuyo nombre debe ser services.xml.

Empaquetado del servicio

Para poder desplegar el servicio en Tomcat a traves de la aplicacion web de Axis2, es necesario respetar una estructura predefinida. La clase java para el servicio debera estar ubicada en la estructura de directorio definido por la estructura de paquete, mientras que tambien es necesario incluir en archivo services.xml.

Publicacion del servicio

Aparecera entonces listado entre los servicios publicados a traves de la aplicacion web de Axis2 en Tomcat:


Al hacer click en el servicio "Echo", el wsdl correspondiente al servicio sera mostrado por el navegador:


Creacion del client para consumir el Servicio

Para crear un cliente que puede consumir el servicio Echo, se emplea la utilidad de Axis2 que permite generar codigo a partir de un wsdl, llamada wsdl2java.
Acceda el directorio AXIS_HOME/bin y ejecute desde alli esta utilidad, especificando algunos parametros, como se muestra a continuacion:
wsdl2java -uri http://localhost:8080/axis2/services/Echo?wsdl -p
test.echo.client -o C:\axis2-1.3\samples\userguide
Los parametros especificados tienen el siguiente singnificado:
uri: La URL donde el wsdl a partir del cual se generara el codigo se encuentra.
p: La estrutura de paquete que se desea para el codigo generado.
o: La ubicacion en el sistema de archivos donde seran generadas las clases.

El codigo generado consiste en las siguientes dos clases java:
  • EchoStub.java
  • EchoCallbackHandler.java


Estas clases contiene demasiadas lineas de codigo, dificil de entender y casi imposible de modificar. Es importante tener claro de utilizar las utilidades para generacion de codigo permite obtener una solucion rapida, pero no siempre efectiva.

Ahora es necesario crear el punto de entrada para la ejecucion del cliente del servicio. A continuacion se muestra un ejemplo:
package test.echo.client;

import java.rmi.RemoteException;

import org.apache.axis2.AxisFault;

public class EchoClient {

public void run() {
try {
EchoStub es = new EchoStub();

EchoStub.Echo request = new EchoStub.Echo();
request.setParam0("Hello, Echo!");

EchoStub.EchoResponse response = es.echo(request);

System.out.println(response.get_return());

} catch (AxisFault e) {
e.printStackTrace();

} catch (RemoteException re) {
re.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
EchoClient ec = new EchoClient();
ec.run();
}
}
Al ejecutar el cliente, la salida que se vera por consola es: "Hello, Echo!"

Vinculos:

Axis2: Instalacion y ejemplos en Eclipse

Creacion de axis2.war

Para generar la aplicacion web que permite administrar servicios, es necesario acceder al directorio webapp y ejecutar el archivo de compilacion que alli se encuentra:
C:\axis2-1.3\webapp> ant
Buildfile: build.xml

init:
[mkdir] Created dir: C:\axis2-1.3\dist
[mkdir] Created dir: C:\axis2-1.3\dist\temp
[copy] Copying 53 files to C:\axis2-1.3\dist\temp

prepare.repo:
[copy] Copying 8 files to C:\axis2-1.3\dist\temp\WEB-INF
[mkdir] Created dir: C:\axis2-1.3\dist\temp\WEB-INF\conf
[copy] Copying 1 file to C:\axis2-1.3\dist\temp\WEB-INF\conf

create.war:
[war] Building war: C:\axis2-1.3\dist\axis2.war
[delete] Deleting directory C:\axis2-1.3\dist\temp

BUILD SUCCESSFUL
Total time: 6 seconds
Instalacion de axis2.war

Una vez que la aplicacion web se encuentra correctamente empaquetada, es necesario colocarla en el directorio webapps del servidor web:
C:\axis2-1.3\dist> cp axis2.war C:\apache-tomcat-6.0.14\webapps

Luego es necesario iniciar el servidor web:
C:\apache-tomcat-6.0.14\bin>startup
Using CATALINA_BASE: C:\apache-tomcat-6.0.14
Using CATALINA_HOME: C:\apache-tomcat-6.0.14
Using CATALINA_TMPDIR: C:\apache-tomcat-6.0.14\temp
Using JRE_HOME: c:\dev\jdk1.5.0_11


Podra observar en la consola algunos mensajes indicando el despliegue de aplicaciones, entre ellas la recien agregada:
INFO: Deploying web application archive axis2.war
[INFO] Deploying module: addressing-1.3
[INFO] Deploying module: metadataExchange-1.3
[INFO] Deploying module: ping-1.3
[INFO] Deploying module: script-1.3
[INFO] Deploying module: soapmonitor-1.3
[INFO] script module activated
[INFO] Deploying Web service: version.aar

Al iniciar el servidor, apunte su navegador a la siguiente URL: http://localhost:8080/axis2. Debera entonces visualizar lo siguiente:


Ahora es momento de crear un proyecto java en Eclipse y agregar a alguno de los ejemplos incluidos en la distribucion de Axis2. Por el momento incluiremos los ejemplos de la guia de usuario donde se muestra como crear diversos tipos de clientes de web services.

Primero es necesario crear el proyecto java:


El nombre del proyecto no es importante, pero si es necesario saber donde a sido desempaquetado Axis2, ya que en esa ubicacion es donde se encuentra el directorio samples con los ejemplos. Como se observa en la imagen el ejemplo importado es "userguide". Ahora es necesario verificar que todos los archivos requeridos son importandos, por lo cual debera presionar el boton "Next":


Para lograr una compilacion exitosa es necesario definir cuales y la ubicacion de las librerias requeridas. Estas tambien se encuentra en la ubicacion donde Axis2 fue desempaquetado, en el directorio lib. Entonces debera activar la solapa "Libraries" y luego presionar el boton "Add external jar":


Para terminar presione el boton "Finish", y el proyecto quedara creado, listo para compilar y ejecutar.

Vinculos:

Axis2: Web Services y Java

Introduccion

Apache Axis2 es la implementacion en Java para clientes y servidores de web services. Introduce mejoras respecto a su predecesor, Axis1, suministrando facilidades para:
  • Enviar mensajes SOAP (con o sin adjuntos)
  • Recibir y procesar mensajes SOAP
  • Crear web services desde clases Java
  • Crear clases Java para cliente y servidor a partir del WSDL
  • Crear y utilizar REST web services
  • Crear y utilizar web services que utilizan las recomendaciones WS-*
Manejo de mensajes SOAP

En Axis2, acciones como crear un mensaje SOAP, encriptarlo, enviarlo, procesarlo, etc., son conocidas como "fases". Axis2 define fases por defecto, como "pre-dispatch", "distpatch", "message processing", etc. Cada fase esta definida por un conjunto de "handlers". Axis2 permite definir que manejadores se aplican en cada fase y el orden en el cual son ejecutados. Ademas de los manejadores provistos por Axis2, es posible agregar manejadores particulares. Los "handlers" provienen de modulos como Rampart, que es la implementacion de WS-Security para web services en Java.

Distribuciones

Axis2 provee dos tipos de distribuciones:
  • Binaria estandard
  • WAR (Web Archive)
Distribucion binaria estandard

Provee las librerias y utilidades necesarias para crear aplicaciones que interactuan con web services. Los siguientes archivos se encuentran incluidos en esta distribucion:
/bin
+- axis2.bat
+- axis2.sh
+- axis2server.bat
+- axis2server.sh
+- java2wsdl.bat
+- java2wsdl.sh
+- wsdl2java.bat
+- wsdl2java.sh
+- setenv.sh
/lib
+- activation-1.1.jar
+- ...
+- XmlSchema.jar
/repository
+- /modules
+- modules.list
+- addressing-1.1.mar
+- ...
+- /services
+- services.list
+- version.aar
+- ...
/samples
+- ...
/webapp
+- ...
/conf
+- axis2.xml

LICENSE.txt
README.txt
NOTICE.txt
INSTALL.txt
release-notes.html
Utilidades

axis2.bat: Permite ejecutar comandos java sin necesidad de tener que incluir las librerias de axis en el classpath.
java2wsdl.bat: Permite crear la descripcion del web service a partir de clases java.
wsdl2java.bat: Permite crear las clases java necesarias para consumir un web service.
axis2server: Es un servidor web sencillo que permite enviar y recibir mensajes a una aplicacion.

Directorios

lib: Aloja las librerias de Axis2 y todas aquellas otras requeridas.
repository: Aloja modulos y web services.
conf: Incluye el archivo de despliegue global axis2.xml.
samples: Contiene ejemplos.

Vinculos:

lunes, 7 de abril de 2008

java3d: Ejemplos de Java 3D desde Eclipse

Para ejecutar los ejemplos de Java 3D desde Eclipse es necesario primero crear un projecto java a partir del codigo fuente de los ejemplos:


Luego podra configurar el classpath para el proyecto, asi como tambien la ubicacion donde las clases seran compiladas. Por el momento, quedaran las opciones por defecto:


Es necesario ahora borrar los siguientes archivos:
  • COPYRIGHT.txt
  • LICENSE.txt
  • README-build.html
  • README-FIRST.txt
  • THIRDPARTY-LICENSE-3DLABS.txt
  • THIRDPARTY-LICENSE-VIEWPOINT.txt
y el directorio nbproject.

Puede verificar que, en el directorio donde se encuentran los ejemplos, dos nuevos archivos fueron creados por Eclipse: .project y .classpath.

Puede emplear el archivo build.xml incluido para compilar los ejemplos y generar las clases necesarias para ejecutarlos.

Primero ejecute el target "clean" empleando las facilidades de Eclipse. Despliegue el menu contextual sobre el archivo build.xml y seleccione la opcion Run AsAnt Build... :


A continuacion se puede observar la salida generada por Ant:
Buildfile: C:\j3d-examples\build.xml
init:
clean:
[delete] Deleting directory C:\j3d-examples\build
[delete] Deleting directory C:\j3d-examples\dist
BUILD SUCCESSFUL
Total time: 2 seconds
Luego es necesario ejecutar el target "jar", que esta definido por defecto en el archivo build.xml. La salida generada por Ant es la siguiente:
Buildfile: C:\j3d-examples\build.xml
init:
init-compile:
compile:
[mkdir] Created dir: C:\j3d-examples\build\classes
[javac] Compiling 148 source files to C:\j3d-examples\build\classes
[javac] Note: Some input files use or override a deprecated API.
[javac] Note: Recompile with -Xlint:deprecation for details.
[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.
[copy] Copying 48 files to C:\j3d-examples\build\classes\org\jdesktop\j3d\examples\resources
[copy] Copying 44 files to C:\j3d-examples\build\classes\org\jdesktop\j3d\examples
jar:
[mkdir] Created dir: C:\j3d-examples\dist
[jar] Building jar: C:\j3d-examples\dist\j3d-examples.jar
BUILD SUCCESSFUL
Total time: 6 seconds
Ahora que el jar con los ejemplos fue generado, puede ejecutar cualquiera de ellos. Para hacerlo emplee el menu "Run" de Eclipse:



Al ejecutar el applet observara lo siguiente:

[java3d_examples005.PNG]

Vinculos:

java3d: Instalacion de Java 3D

Para instalar Java 3D apunte el navegador a la siguiente ubicacion y descargue el instalador o el paquete de librerias comprimidas en zip. En este caso la instalacion se realizara para el sistema Windows, por lo que seleccionamos el archivo java3d-XXX-windows-i586.zip.

Al extraer los archivos de la distribucion se creara el directorio java3d-XXX-windows-i586 con los siguientes archivos:
  • COPYRIGHT.txt
  • LICENSE-Java3D-vXXX.txt
  • README-distribution.txt
  • README-unzip.html
  • README.txt
  • j3d-jre.zip (Contiene las librerias de Java 3D a instalar)
El archivo README-unzip.html contiene informacion acerca de la instalacion de las librerias para JRE y JDK.

Solo resta descomprimir el contenido del archivo j3d-jre.zip en el directorio apuntado por la variable de entorno JAVA_HOME/jre.

Verifique que los archivos j3d*.dll se encuentran en el directorio JAVA_HOME\jre\bin, mientras que los j3dcore.jar, j3dutils.jar y vecmath.jar deben estar ubicados en el directorio JAVA_HOME\jre\lib\ext.

Puede ahora descargar los ejemplos y demostracion para verificar la instalacion y ver a Java 3D en accion. Descarguelos desde la siguiente ubicacion.

Al extraer los ejemplos, podra encontrarlos en el directorio j3d-examples/src. La distribucion de los ejemplos contiene los siguientes archivos y directorios:
  • build.xml
  • COPYRIGHT.txt
  • LICENSE.txt
  • manifest.mf
  • README-build.html (Contiene informacion relacionada a la compilacion y ejecucion de los ejemplos)
  • README-FIRST.txt
  • THIRDPARTY-LICENSE-3DLABS.txt
  • THIRDPARTY-LICENSE-VIEWPOINT.txt
  • /src
  • /nbproject
El archivo build.xml puede ser usado mediante Ant directo o a traves de Eclipse para compilar los ejemplos. El directorio nbproject contiene el archivo de configuracion de proyecto para Netbeans.

Vinculos:

java2d: Mostrando una imagen

Java 2D provee algunas clases muy utiles para cargar imagenes en formato BMP, JPG, GIF y PNG sin hacer esfuerzos. En el siguiente ejemplo muestro como hacerlo:

InputStream is = this.getClass().getResourceAsStream("imagen.png");

try {
BufferedImage img = ImageIO.read(is);

} catch (IOException ioe) {
System.out.println("Unable to load image.");
}


La imagen decodificada por ImageIO y almacenada en una instancia de BufferedImage. Luego, para mostrar en pantalla, es necesario proveer una implementacion particular del metodo paint de algun componente, como el JPanel de Swing. En el siguiente ejemplo muestro como hacerlo:

public class Image2D extends JPanel {

private BufferedImage img;
...

public void paint(Graphics g) {

if (null == this.img) return;

Graphics2D g2 = (Graphics2D) g;
g2.drawImage(this.img, null, 0, 0);
}


El segundo parametro pasado al metodo drawImage es nulo ya que no es de interes producir ninguna modificacion sobre la imagen cargada, solo mostrarla como es.

java2d: Dibujando una linea

Java 2D se encuentra incluido en la distribucion estandar de J2SE. Dibujar una linea o alguna forma como un rectangulo o un circulo es simple. En el siguiente ejemplo muestro como hacerlo:

package test;

import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

public class Line2D extends JPanel {

@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;

int width = this.getWidth();
int height = this.getHeight();

g2.drawLine(20, 20, width - 20, height - 20);
}
}


Como se puede ver en el ejemplo, es necesario proveer una implementacion particular del metodo paint. En este ejemplo la implementacion provista dibuja una linea en el panel.

Vinculos:

martes, 22 de enero de 2008

JProbe: Instalacion

Instalar JProbe en Windows

Descargar JProbe del sitio web oficial http://www.quest.com.

Luego ejecutar el instalador haciendo doble click en el archivo.

miércoles, 26 de diciembre de 2007

Java: Anotaciones

Crear una anotacion

Para crear una anotacion es necesario crear un archivo cuyo nombre sea el de la anotacion y su extension .java. En el caso de la anotacion de ejemplo resulta que el archivo Ejemplo.java tendra el siguiente contenido:

package anotaciones;

public @interface Ejemplo {}


Aplicar politicas a la anotacion

Las anotaciones pueden emplearse para anotar codigo fuente, empleando procesadores de anotaciones, o para anotar clases en tiempo de ejecucion.
La anotacion de ejemplo se debera modificar de la siguiente manera para que sea utilizada por procesadores de anotaciones en tiempo de compilacion:

package anotaciones;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.SOURCE)
public @interface Ejemplo {}


En caso que sea necesario acceder a la misma en tiempo de ejecucion, sera necesario emplear una politica de retencion diferente:

package anotaciones;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Ejemplo {}


En los ejemplos anteriores se usaron anotaciones de anotaciones, y son llamadas meta-anotaciones.

Restringir elementos a los cuales se aplica la anotacion

En los ejemplos anteriores tampoco se aplico limitacion alguno en cuanto al uso de la anotacion de ejemplo. Las anotaciones pueden ser aplicadas a clases, metodos, atributos, etc, siempre y cuando se indique cual es su objetivo.
La anotacion de ejemplo sera entonces empleada en tiempo de ejecucion, solo en metodos, con lo cual resultara:

package anotaciones;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Ejemplo {}


Uso de anotaciones en tiempo de ejecucion

A continuacion se emplea el ultimo ejemplo de anotacion presentado antes.