viernes, julio 27, 2007

JAX-WS 2.1 vs JAX-WS 2.0

El artículo de Kohsuke es de enero de 2007 y aconseja pasarnos ya a JAXB 2.1 y JAX-WS 2.1... aunque tengamos que poner cosas en {jdk6}/lib/endorsed.

Seguramente todo esto nos evitaría quebraderos de cabeza al usar el wsimport y todo eso... porque NO podemos usar la AntTask que viene con Glassfish v2 (hay que poner en el classpath del taskdef los siguientes jars: {glassfish v2}/lib/webservices-tools.jar y webservices-rt.jar) a menos que pongamos en nuestro {jdk6}/lib/endorsed las librerías de JAX-WS 2.1 (lo siento, no he terminado este ejercicio porque estaba fuera de mis objetivos de esta semana). :-(

Entre otras cosas, el uso de JAX-WS 2.1 nos permitiría tener los famosos WS "stateful". Así que quizás sería buena idea pasarnos a JAX-WS 2.1 después de todo...




Introducción a JAX-WS 2.0 con Java SE 6

He encontrado un enlace bastante sencillo de seguir como introducción a JAX-WS con JDK 6. No hace falta Glassfish, un Tomcat vale para estas pruebas (pero arrancado con JDK 6, claro).

La segunda parte de este artículo es aún mejor porque explica cómo hacer un simulador de un webservice "de verdad" para poder desarrollar un cliente.

Aconsejo no usar NetBeans para poder "tomar el pulso" a todo lo que está ocurriendo. (Bueno, en realidad quiero decir que uséis vuestro IDE preferido, retirando NetBeans de la categoría de IDE y pasándolo a la de generador de código). Ahora en serio, en realidad yo he usado el build.xml que viene y simplemente he tenido que cambiar en el build.properties dónde está mi JDK (y eso simplemente porque he preferido meterlo en Eclipse para ver mejor el código).

¡Ah, por cierto! No es necesario que os descarguéis el código tal y como dicen en el artículo: viene en <vuestro jdk6>/sample/webservices/EbayClient (y también EbayServer). :-)

Por cierto, al ejecutar el dichoso "wsimport" no lo hace como una tarea ant sino que ejecuta el binario que viene con el JDK (un poco triste, pero es el estilo Sun...). De todos modos, lo peor es cuando ves lo que se genera en el paquete "ebay.apis": ¡¡¡714 clases por 115 @webmétodos!!! Esto me recuerda un artículo sobre JAX-WS, aunque no queda bien parado...

De todos modos, si alguien se queda "con hambre", ahí va un enlace a artículos sobre este tema.


viernes, julio 20, 2007

EasyMock: IllegalStateException y matchers

Ayer estaba haciendo un test con EasyMock y me daba el siguiente error:

java.lang.IllegalStateException: 2 matchers expected, 1 recorded.
    at org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:41)
    at org.easymock.internal.ExpectedInvocation.&lt;init&gt;(ExpectedInvocation.java:33)
    at org.easymock.internal.ExpectedInvocation.&lt;init&gt;(ExpectedInvocation.java:26)
    at org.easymock.internal.RecordState.invoke(RecordState.java:64)
    at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:24)
    at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:45)
    at $Proxy0.find(Unknown Source)
    at com.degesys.core.idm.logic.DTOFactoryImplTest.testGetUserDTO(DTOFactoryImplTest.java:190)
...

Resulta que mi código era como sigue:

EasyMock.expect(mockManager.find(LdapObject.class, EasyMock.anyObject())).andReturn(mockLdapObject);

"Gugleando" encontré lo siguiente:
http://marcels-javanotes.blogspot.com/2007/03/easymock-and-illegalstateexception.html

Y finalmente, en el "manual" de EasyMock dice:
If you would like to use matchers in a call, you have to specify matchers for all arguments of the method call.


Por tanto, mi código debía quedar como:
EasyMock.expect(mockManager.find(EasyMock.same(LdapObject.class), EasyMock.anyObject())).andReturn(mockLdapObject);

Espero que si alguien tiene el mismo problema, esto le sirva de ayuda.

Telegrama EasyMock

He estado buscando un tutorial sobre EasyMock y creo que lo he encontrado. STOP. He visto que ha salido hace muy poquito la versión 2.3 pero aún no la he evaluado porque nosotros usamos EasyMock Class Extensions porque así podemos crear mocks a partir de interfaces y no sólo de implementaciones particulares(*). STOP. Para incluir EasyMock Class Extensions en un proyecto usando Maven es muy fácil:

<dependency>
<groupid>org.easymock</groupid>
<artifactid>easymockclassextension</artifactid>
<version>2.2.2</version>
</dependency>

STOP. Esto último lo he extraído de MVNrepository. STOP.

(*) Ver comentario.

lunes, julio 16, 2007

Repositorio Maven 2 oficial de Sun

Telegráfico:

https://maven2-repository.dev.java.net/

Me ha costado encontrar dónde demonios estaba el repositorio de Maven 2 hasta que se me ocurrió buscar en "The Aquarium" por "maven".

jueves, julio 12, 2007

Glassfish y Google Trends

Estoy suscrito al blog de Ignacio Coloma (sorry, it's in English) y hoy me ha sorprendido (otra vez) con una búsqueda en Google Trends comparando Glassfish con otros servidores.

Lo que más me llama la atención es cómo desde India no se hacen apenas búsquedas sobre Glassfish, especialmente si las comparas con Weblogic, lo que también creo que demuestra (tal y como dice Ignacio) que Glassfish tiene un mal "timing" (al menos desde el punto de vista mercadotécnico).

Sobre JSF, sólo espero que JSF 2.0 resuelva los problemas de adopción de los que adolece JSF 1.x y que la documentación existente no ha conseguido resolver (lo cuál quizás demuestre que no es un problema de documentación sino de otro tipo).

¿No creen ustédes?


jueves, julio 05, 2007

Sesión con Eduard Pelegrí en Madrid (cont.)

Siento el retraso en poner las notas de la sesión que comenté en un anterior post, y lo siento más aún porque tampoco ha sido debido a que haya estado en Barcelona en el Java Symposium. :-(

Aunque quizás suene a excusa, he estado muy liado... En serio, he estado inmerso en preparar la migración de un proyecto que usa JPA, JAX-WS, JAXB, etc. a integración continua. Ya os contaré a partir del lunes algunas de las buenas prácticas que estoy extrayendo de esto, pero sí os puedo adelantar que tengo un CruiseControl 2.7 (con una consola mejorada, aunque no del todo conseguida) llamando a varios proyectos que se construyen con Maven 2, por supuesto lanzando los tests unitarios e incluso despliegando los correspondientes EAR en un Glassfish usando el plugin antrun. Y aunque algunos puedan pensar que es una simpleza, no lo es tanto cuando debes pensar en que el diseño del procedimiento y todo lo que le rodea (incluyendo la organización del repositorio, la configuración en el SVN, etc.) debe escalar (y mucho) porque en un futuro no muy lejano tendremos cientos de proyectos como éste en marcha...

Pero lo prometido es deuda... y voy a tratar de hacer un "resumen muy resumido" de aquellas notas sobre la sesión con Mr. Pelegrí (que algunos afortunados habrán ya&nbsp; podido atender en primera persona en el Java Symposium).

Project GlassFish
Eduard nos comenzó contando cómo se han unido los equipos que desarrollaban el viejo iPlanet (con sus diversas denominaciones) y otros que venían de proyectos en comunidades como Apache y que habían confluido en la construcción de la implementación de referencia de Java EE (es decir, de Glassfish). Los del primero actualmente se dedican sobre todo a la consola y, si no entendí mal, a todo lo relacionado con alta disponibilidad), mientras que los del segundo, lógicamente, se dedican a lo que es Glassfish en sí (implementación de Java EE).

En cuanto a las versiones aclaró lo siguiente:
  • GF v1 = 9.0 Platform Edition
  • GF v2 = 9.1 (Ya no hay editions sino profiles, e.d. el administrador decide qué características están disponibles en la instancia correspondiente). En esta versión se incluye:
    • nuevo stack de WS (incluido WSIT para interoperabilidad con WS de .NET)
    • mejoras en el rendimiento, el tiempo de arranque...
    • balanceo de carga, clustering, failover...
  • GF v3 = Modularización

Glassfish v2

Durante esta sesión, Eduard se centró especialmente en Glassfish v2 (que aún está en "beta" pero falta muy poco para su versión final).

En cuanto al "failover" y la alta disponibilidad, explicó que lo están implementando con HADB y replicación de memoria. Aconsejó que, en general, consideremos la alternativa de la replicación de memoria porque es una solución más fácilmente manejable (casi coste de configuración cero) y da un rendimiento más que aceptable. Usar HADB es una solución más compleja y en la mayoría de las situaciones más costosa de lo realmente necesario. (Permitidme que no entre en este tema en mayor profundidad porque yo ahí me pierdo bastante y creo que es mejor no hablar de aquello que no se conoce bien).

Alguien le pidió una comparativa entre GF v2 y JBoss (para una configuración en cluster) y dijo que aunque no la tenía la trataría de encontrar. Si alguien tiene interés en ella, creo que lo mejor sería que la pidiera en el foro.

En cuanto a todo lo relacionado con WebServices... después de que nos enseñara una comparativa entre GF v2 y Axis2 en la que, claro está, GF era bastante superior... Perdonad la suspicacia, pero no me suelo creer demasiado las comparativas, sobre todo cuando me dicen que XFire es una mejor implementación que Axis2 (si es así, ¿por qué no comparar GF con XFire?) Explicó que el xml pull-parser Woodstox tiene bastante que ver con esto.

Bueno, yo le pregunté (me gané una camiseta) por su opinión sobre SCA y los planes de Glassfish respecto a esta iniciativa. Me dijo que, en su opinión, JBI y SCA quizás terminarán convergiendo porque los unos y los otros están tomando ideas entre ellos. En cualquier caso, lógicamente, Glassfish está apostando ahora por JBI como mecanismo para hacer que los servicios colaboren entre sí. En este sentido le pregunté sobre Java CAPS pero, al no ser él un experto en esto, tampoco me pudo decirme mucho...

También nos habló de Metro, que es un "bundle" de frameworks que usa Glassfish v2 para implementar el stack de WebServices, pero también se podrían usar con Tomcat, Jetty...

En cuanto al web tier de GF v2, Eduard nos habló de JSR 199 (que son JSPs que se compilan al vuelo, sin persistir en fichero), de mejoras en el protocolo AJP (de Apache), un "non-blocking SSL", lo último en JSF... ¡Ah! Y Grizzly, claro. Por cierto, que nos contó que Grizzly se convirtió (a partir de la versión 1.5) en un framework de programación de java.nio (en una API) porque es muy fácil cometer errores.

Alguien presente le preguntó sobre seguridad y el Security Manager y él explicó que a partir de la 9.0 decidieron permitir que se usaran frameworks o productos (como Struts) que entran en conflicto con el Security Manager y que esa es la razón por la que está apagado por defecto.

Glassfish v3


A continuación, Eduard pasó a adelantarnos algunas de las características de Glassfish v3 (del que ya está disponible una "technology preview").

El arranque en v3 será sustancialmente más rápido porque van a refactorizar para tener un núcleo (HK2) más módulos y contenedores/servicios, donde un servicio podrá ser p.ej. un motor JBI. Esto permitirá tener servidores más livianos, p.ej. para hacer plataformas de juegos "massive scale" (tipo "warcraft").

GF v3 saldrá antes que Java SE 7, y parece ser que para este último no han decidido aún cómo implementar los módulos (si adoptan OSGi o no). Mi compañero Sixto Cantolla le preguntó por cómo afectaría esta decisión de Java SE 7 a GF v3 y Eduard nos explicó que ellos habían desacoplado hasta donde afecta (el "modules subsystem") y que el resto era "agnóstico".

Quizás haya una versión "Early Access" de v3 antes de fin de año, pero se espera que la versión definitiva estará para Java EE 6.


A continuación nos hizo un resumen de algunos proyectos de la comunidad Glassfish que más peso están tomando (algunos se incorporan a GF v2 y v3):
  • JSFTemplating (que se está usando en la consola)
  • Woodstock (componentes JSF)
  • Open MQ (una implementación de JMS "enterprise quality")
  • Hudson (un servidor de integración continua)
  • jMaki (permite usar diferentes librerías Javascript a la vez, especialmente útil para aplicaciones Ajax)
  • Rome (RSS)
  • WADL (escribe interfaces REST)
  • y muchos más...

La última pregunta fue acerca de la elección del nombre "Glassfish" para el proyecto:
Cuando se creó el proyecto, se puso el foco en la transparencia, como la de uno de esos peces de cristal (glassfish en inglés).
Ruego a aquellos que estuvieron presentes en la sesión disculpéis tanto mis lagunas de memoria como aquellas incorrecciones técnicas que haya podido cometer. La solución es fácil: pulsad en el enlace "escribir un comentario". :-)

Muchas gracias.

Eclipse 3.3 Europa ya está aquí

Por si alguien no lo había notado aún, soy un entusiasta de Eclipse. Pienso que es el mejor IDE, sin lugar a dudas. NetBeans 5.5 (y lo que he visto de la 6.0) ha mejorado bastante, pero ni por muchos nuevas funcionalidades y módulos que le pongan (algunos, es cierto, de un gran valor añadido), en mi opinión, aún no le llegan ni a la suela del zapato a Eclipse. La plataforma es muchísimo más productiva para cualquier programador Java, aunque algunos (que se autoproclaman programadores porque hacen "botón derecho lo-que-sea") digan que no.

Cuando NetBeans sea capaz de:
  • permitir hacer refactors tan potentes (incluso ahora permite tener un historial de refactors que se puede deshacer o incluso guardar),
  • o integrarse con JUnit, TestNG, CVS, SVN... con la misma facilidad y ergonomía con que lo hace Eclipse (y no basado en la salida estándar),
  • o una funcionalidad como Mylyn (antiguo Mylar) que permite asociar el trabajo en el IDE a tareas en un repositorio como Bugzilla, Trac... (JBuilder, que está basado en Eclipse, ya está proporcionando también acceso a repositorio Xplanner),
  • o una constelación de proyectos que incluso muchos se pueden usar fuera de la "plataforma Eclipse" (como la implementación de SDO, o BIRT...)
(Y eso sin hablar de esa configuración repleta de ficheros con trayectorias absolutas y dependientes del usuario que abre el proyecto, haciendo casi imposible compartir las configuraciones entre miembros de un mismo equipo...)

Incluso algunos de los que tenemos que estar "cerca del sol" (Sun) porque trabajamos con Glassfish, a pesar de que aún encontramos carencias en Eclipse para ser más productivos con esta plataforma, preferimos trabajar todo lo posible con Eclipse y dejar NetBeans para poco más que un "desplegador". Especialmente ahora que el dichoso plug-in de Glassfish ya es instalable desde Eclipse 3.3 directamente como un driver de servidor más.

Bueno, pues toda esta perorata era para explicar que ya está disponible (desde hace un par de días) la última versión "coordinada" (ésta llamada Europa, la anterior llamada Callisto). Está basada en la versión 3.3 del IDE más toda una cohorte de proyectos de mayor o menor peso que se liberan anualmente por estas fechas (desde el año pasado) con el objetivo de proporcionar una plataforma de referencia para aquellos que desarrollan plug-ins y que, antes de esta decisión, se las veían y deseaban para decidir cuáles eran las versiones de los diferentes frameworks que forman la base del IDE que podían usar para comenzar un desarrollo.