<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title type="html">lasterra Blog</title>
    <subtitle type="html">Un blog sobre java</subtitle>
    <id>http://weblogs.javahispano.org/lasterra/es/feed/entries/atom</id>
            
        <link rel="alternate" type="text/html" href="http://weblogs.javahispano.org/lasterra/es/" />
        <updated>2009-05-07T20:39:44+02:00</updated>
    <generator uri="http://rollerweblogger.org" version="4.0 (20071120033321:dave)">Apache Roller (incubating)</generator>
        <link rel="self" href="http://feeds.feedburner.com/lasterra" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/gestion_de_proyectos_mingle_collabnet</id>
        <title type="html">Gestión de proyectos: Mingle, Collabnet y Trac</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/4Lz5jga6pvU/gestion_de_proyectos_mingle_collabnet" />
        <published>2008-01-09T01:37:33+01:00</published>
        <updated>2008-01-09T01:37:33+01:00</updated> 
        <category term="/General" label="General" />
        <category term="gestion" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="projecmanagement" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="proyectos" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Todo año empieza con propósitos y uno de los míos es gestionar mejor el software que desarrollo. Para ello hace falta fuerza de voluntad diaria, y una buena herramienta para gestionar nuestro trabajo.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Supuestamente la fuerza de voluntad a primeros de enero esta en lo más alto, así que estoy centrado en la segunda cuestión, encontrar la herramienta software que me permita gestionar los proyectos. Llevo algunos meses preguntando a compañeros de profesión por cuales son las herramientas que ellos usan y la verdad es que las respuestas son muy variopintas y no he encontrado en ellas una opción que me convezca.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Mi lista de cosas que el gestor de proyectos debe tener es la siguiente&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Debe se un gestor de proyectos software, sin duda nuestro trabajo tiene las suficientes particularidades como para decantarnos por una herramienta diseñada para nuestro sector.&lt;/li&gt;&lt;li&gt;Debe poder gestionar las distintas tareas de un proyecto, desde la captación de requisitos, hasta el reporte de errores.&lt;/li&gt;&lt;li&gt;Debe integrar el código del proyecto dentro de la gestión del mismo. Considero muy interesante operaciones de integración entre los repositorios de código fuente (CVS/SVN) y los gestores de proyecto (visualización de los ficheros de código modificado, cierre de tareas del proyecto de forma automática con commits en el repositorio de código, etc.)&lt;/li&gt;&lt;li&gt;Debe visualizar el estado en el que se encuentra el proyecto con informes que un gerente pueda entender.&lt;/li&gt;&lt;li&gt;Debe ser muy sencillo y &lt;i&gt;rápido&lt;/i&gt;. Bastante duro se hace reportar toda la información como para que encima su uso sea tedioso.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Otros opciones interesantes serían&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Visualizar el estado de las personas para saber su carga de trabajo.&lt;/li&gt;&lt;li&gt;Acceso a los datos a través de servicios Web para poder incluir información del gestor de proyectos en herramientas propias.&lt;/li&gt;&lt;li&gt;Acceso al sistema desde dispositivos móviles.&lt;/li&gt;&lt;li&gt;Acceso al sistema para los usuarios finales / clientes&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A grandes rasgos más o menos es lo que busco y puedo decir que no me importaría pagar por el software que tengo en mente, aunque sin duda la opción ideal sería una open source y programada en Java para poder toquetear el código.&lt;/p&gt;&lt;p&gt;De todas las posibilidades que he visto hasta ahora destaco tres:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.collab.net" target="_blank"&gt;Collabnet&lt;/a&gt;, de los creadores de Subversión, su software de gestión de proyectos es usado por comunidades como &lt;a target="_blank" href="http://java.net"&gt;java.net&lt;/a&gt; y &lt;a target="_blank" href="http://www.tigirs.org"&gt;trigris.org&lt;/a&gt; lo que le da una garantía de capacidad y fiabilidad del software. Recientemente ha salido la versión 5.0 que al igual que la anterior 4.5cuenta con una versión &amp;quot;community&amp;quot; &lt;b&gt;gratuita para menos de 15&lt;/b&gt; desarrolladores o comunidades open source pero con algunas limitaciones. El software esta desarrollado en Java sobre JBoss4 y el Sistema Operativo debe ser o Red Hat Enterprise 5 o la versión paralela de CentOS. Existe para descarga una imagen vmware desde hace unas semanas para que podáis probarlo. En su día yo realice la instalación y tuvo su intringulis. Son necesarios conocimientos de Linux/RedHat&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://studios.thoughtworks.com/mingle-project-intelligence"&gt;Mingle&lt;/a&gt;, realizado por la empresa &lt;a target="_blank" href="http://www.thoughtworks.com"&gt;Thoughtworks.com&lt;/a&gt;, son conocidos por otro de sus software, &lt;a href="http://studios.thoughtworks.com/cruisecontrol"&gt;cruisecontrol &lt;/a&gt;(herramienta de integración continua). Muy de la mano de metodologías ágiles (XP y SCRUM), mingle es demasiado atractivo como para que no este en este lista. Simple, fácil de usar y lo suficientemente completo para que la versión 1.1 cumpla buena parte de mis expectativas. Hace mucho estudie las metodologías ágiles pero tengo que reconocer que estoy un poco descolgado de los términos que se usan, pero aún asi, se puede apreciar la capacidad del software. Tiene un coste de 60$/mes/usuario pero es&lt;b&gt; gratis hasta 5 usuarios&lt;/b&gt; sin ningún tipo de limitación. El proceso de instalación es muy sencillo (al menos en windows) y no es necesario tener ningún tipo de conocimiento de sistemas operativos para ponerlo a funcionar. El sistema esta desarrollado con Java y JRuby.&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt;, es la única alternativa &lt;b&gt;open source&lt;/b&gt; que he podido destacar, pero no esta desarrollado con Java (es python). He obtenido varias recomendaciones sobre el y aunque en principio parece que se queda un poco corto en sus funcionalidades tiene multitud de plugins que hacen de el un gestor de proyectos software a tener en cuenta. Es con el que menos he &amp;quot;jugado&amp;quot; pero no descarto que sea el elegido por ser open source y gratuito.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Seguramente pueda aparecer algún otro en la lista, pero para mi estos destacan sobre el resto dentro de mis necesidades. ¿&lt;b&gt;Creéis que me dejo alguno importante en el tintero?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;En los próximos post ire explicando cada uno de ellos en detalle con pros y contras para poder ver cual es el ganador.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/gestion_de_proyectos_mingle_collabnet</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/nicedit_ligero_simple_bonito_facil</id>
        <title type="html">NicEdit: ligero, simple, bonito, fácil</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/UXtjxhXCa-Q/nicedit_ligero_simple_bonito_facil" />
        <published>2007-12-19T23:10:38+01:00</published>
        <updated>2007-12-19T23:11:20+01:00</updated> 
        <category term="/General" label="General" />
        <category term="wysiwyg" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javascript" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="editores" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Me ha sorprendido y gustado. La verdad es que &lt;a href="http://tinymce.moxiecode.com/" target="_blank"&gt;tinyMCE &lt;/a&gt;es muy potente y extensible, pero es cierto que tarda mucho en cargar, aunque parece que la &lt;a href="http://tinymce.moxiecode.com/punbb/viewtopic.php?id=9178" target="_blank"&gt;nueva versión&lt;/a&gt; que estan preparando será mucho más rápida.&lt;/p&gt;&lt;p&gt;Aun así &lt;a href="http://nicedit.com/"&gt;NicEdit &lt;/a&gt;puede ser una alternativa muy interesante, solo son necesarias 2 lineas de código javascript para que todos tus textareas se conviertas en editores WYSIWYG&lt;/p&gt;&lt;p&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/nicedit.png" alt="nicedit" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;__&lt;br /&gt;&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/nicedit_ligero_simple_bonito_facil</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb25</id>
        <title type="html">Java y XML con JAXB2 (VI)</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/_S6NYqRwX0s/java_y_xml_con_jaxb25" />
        <published>2007-12-17T00:24:22+01:00</published>
        <updated>2007-12-17T00:24:22+01:00</updated> 
        <category term="/Java" label="Java" />
        <category term="binding" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javatype" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javase6" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="java" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javee5" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ejemplo" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="xml" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="documentacion" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="manual" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="customization" scheme="http://rollerweblogger.org/ns/tags/" />
        <summary type="html">El post de hoy será el último sobre las posibles configuraciones a la
hora de compilar el Schema. En el veremos como podemos manejar los
tipos simples definidos en el Schema y como relacionar estos con
Enumerados Java</summary>
        <content type="html">El post de hoy será el último sobre las posibles configuraciones a la hora de compilar el Schema. En el veremos como podemos manejar los tipos simples definidos en el Schema y como relacionar estos con Enumerados Java.&lt;p&gt;Los Schemas XML cuentan con las posibilidad de definir tipos de datos simples. Estos tipos de datos suelen incorporar restricciones para que solo sean validos algunas valores, en muchos casos, esta restricción es una colección de posibles valores. Para este tipo de restricciones JAXB2 cuenta con herramientas para manejar la configuración&amp;nbsp; relacionándola con tipos Enumerados, &lt;i&gt;enum&lt;/i&gt;, bien de forma global en todo el documento a través de la etiqueta &lt;b&gt;&amp;lt;jxb:globalBindings&amp;gt;&lt;/b&gt; y su atributo &lt;b&gt;typesafeEnumBase&lt;/b&gt; o bien localmente seleccionando un elemento simple a través de la etiqueta &lt;b&gt;&amp;lt;jxb:typesafeEnumClass/&amp;gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;[ejemplo] Añadir dos tipos simples en nuestro schema, &lt;b&gt;color &lt;/b&gt;con valores posibles rojo, verde y azul y &lt;b&gt;edad-maxima&lt;/b&gt; con tres enteros como posibles valores 25, 50 y 75. Estos tipos de datos deben sustituir a los que usan los elementos campo-dos y campo-uno-uno respectivamente. Cambiar la configuración para que se cree el enumerado EdadesMaximas y comprobar que el enum Color ha sido creado de forma automática.[/ejemplo]__&lt;/p&gt;&lt;p&gt;El primer paso será modificar nuestro Schema para que contenga estos tipos simples. Debe quedar así&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;           xmlns=&amp;quot;http://weblogs.javahispano.org/lasterra/jaxb2&amp;quot;&lt;br /&gt;           targetNamespace=&amp;quot;http://weblogs.javahispano.org/lasterra/jaxb2&amp;quot;&lt;br /&gt;           elementFormDefault=&amp;quot;qualified&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xs:element name=&amp;quot;elemento-principal&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;            &amp;lt;xs:choice&amp;gt;&lt;br /&gt;                &amp;lt;xs:element name=&amp;quot;campo-uno&amp;quot; type=&amp;quot;campo-uno&amp;quot;/&amp;gt;&lt;br /&gt;                &amp;lt;xs:element name=&amp;quot;campo-dos&amp;quot; type=&amp;quot;&lt;b&gt;color&lt;/b&gt;&amp;quot;/&amp;gt;&lt;br /&gt;                &amp;lt;xs:element name=&amp;quot;campo-tres&amp;quot; type=&amp;quot;xs:int&amp;quot; minOccurs=&amp;quot;1&amp;quot; maxOccurs=&amp;quot;unbounded&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;        &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xs:complexType name=&amp;quot;campo-uno&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;            &amp;lt;xs:element name=&amp;quot;campo-uno-uno&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element name=&amp;quot;campo-uno-dos&amp;quot; type=&amp;quot;&lt;b&gt;edad-maxima&lt;/b&gt;&amp;quot; minOccurs=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;        &amp;lt;xs:attribute name=&amp;quot;attr&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;xs:simpleType name=&amp;quot;color&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xs:restriction base=&amp;quot;xs:string&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;xs:enumeration value=&amp;quot;rojo&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;xs:enumeration value=&amp;quot;verde&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;xs:enumeration value=&amp;quot;azul&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;    &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;    &amp;lt;xs:simpleType name=&amp;quot;edad-maxima&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xs:restriction base=&amp;quot;xs:int&amp;quot;&amp;gt;&lt;br /&gt;             &amp;lt;xs:enumeration value=&amp;quot;25&amp;quot;/&amp;gt;&lt;br /&gt;             &amp;lt;xs:enumeration value=&amp;quot;50&amp;quot;/&amp;gt;&lt;br /&gt;             &amp;lt;xs:enumeration value=&amp;quot;75&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;    &amp;lt;/xs:simpleType&amp;gt;&lt;/b&gt;    &lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;_.Si compilamos el schema sin tocar la configuración, usando el modo inline introducir los tipos de datos sin tocar los elementos JAXB2, veremos que automáticamente se genera el enumerado Color, porque al tener como base el tipo String, JAXB2 sabe manejarlo.Esto se debe a que el globalBinding por defecto usa en su atributo &lt;b&gt;typesafeEnumBase&lt;/b&gt; como tipo de datos base xs:string. Si no deseamos crear ningún tipo de enumerado debemos configurar &lt;b&gt;typesafeEnumBase&lt;/b&gt; con valor xs:NCName en el globalBindings.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Sin embargo no ocurre lo mismo con edad-maxima, que debemos configurarlo usando las etiquetas&amp;nbsp; &lt;b&gt;&amp;lt;jxb:typesafeEnumClass&amp;gt; &lt;/b&gt;y &lt;b&gt;&amp;lt;jxb:typesafeEnumMember&amp;gt;&amp;nbsp; &lt;/b&gt;de la siguiente forma&lt;/p&gt;&lt;pre&gt;&amp;lt;jxb:typesafeEnumClass name=&amp;quot;EdadesMaximas&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;jxb:typesafeEnumMember name=&amp;quot;A&amp;quot; value=&amp;quot;25&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;jxb:typesafeEnumMember name=&amp;quot;B&amp;quot; value=&amp;quot;50&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;jxb:typesafeEnumMember name=&amp;quot;C&amp;quot; value=&amp;quot;75&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/jxb:typesafeEnumClass&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Des esta forma creariamos el enumerado EdadesMaximas con los valores A, B y C.&lt;/p&gt;&lt;pre&gt;@XmlType(name = &amp;quot;edad-maxima&amp;quot;)&lt;br /&gt;@XmlEnum(Integer.class)&lt;br /&gt;public enum EdadesMaximas {&lt;br /&gt;&lt;br /&gt;    @XmlEnumValue(&amp;quot;25&amp;quot;)&lt;br /&gt;    A(25),&lt;br /&gt;    @XmlEnumValue(&amp;quot;50&amp;quot;)&lt;br /&gt;    B(50),&lt;br /&gt;    @XmlEnumValue(&amp;quot;75&amp;quot;)&lt;br /&gt;    C(75);&lt;br /&gt;.....&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Seguro que dejo muchas cosas en el tintero pero bien valen estos post para ver las posibilidades de JAXB2 en lo que respecta a lectura y escritura de XML basandonos en un XMLSchema. En los próximos post veremos la capacidad inversa, como dadas unas clases Java podemos leer y escribir XML y generar nuestro XMLSchema para que un tercero pueda hacer lo que hemos visto hasta ahora.&lt;br /&gt;&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb25</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb24</id>
        <title type="html">Java y XML con JAXB2 (V)</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/3X5cMrdPwvo/java_y_xml_con_jaxb24" />
        <published>2007-12-13T00:41:39+01:00</published>
        <updated>2007-12-13T00:42:36+01:00</updated> 
        <category term="/Java" label="Java" />
        <category term="binding" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javase6" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javatype" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="documentacion" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="customization" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javee5" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="manual" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ejemplo" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="xml" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="java" scheme="http://rollerweblogger.org/ns/tags/" />
        <summary type="html">En el post que toca veremos más configuraciones posibles al compilar el
Schema. Hoy veremos con configurar las priopiedades/elementos y como determinar el tipo de datos con el que las clases Java almacenan los valores de los elementos y atributos del XML.</summary>
        <content type="html">&lt;p&gt;En el post que toca veremos más configuraciones posibles al compilar el Schema. Hoy veremos como configurar las priopiedades/elementos y como determinar el tipo de datos con el que las clases Java almacenan los valores de los elementos y atributos del XML.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Configuración de propiedades&lt;/h3&gt;&lt;p&gt;Si las configuraciones de clase
estaban relacionadas principalmente con los tipos complejos, las
configuraciones de propiedades lo hacen con los elementos más simples del
Schema, element y attribute, que son traducidos a datos miembros en las
clases Java generadas. Estas configuraciones se aplican con la etiqueta
&lt;b&gt;&amp;lt;xjb:property&amp;gt;&lt;/b&gt; y podemos destacar las siguiente:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Nombre de la propiedad, por defecto es el mismo en el schema y la clase Java, pero a través del atributo &lt;i&gt;name&lt;/i&gt; podemos designar otro nombre.&lt;/li&gt;&lt;li&gt;generateIsSetMethod,
collectionType, fixedAttributeAsConstantProperty sobreescriben el
posible valor configurado en los globalBindings para la propiedad
seleccionada.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Además de estos atributos, existe la etiqueta &lt;b&gt;&amp;lt;xjs:baseType&amp;gt;&lt;/b&gt; que a su vez contiene la etiqueta &lt;b&gt;&amp;lt;xjs:javaType&amp;gt; &lt;/b&gt;con la que podemos configurar que tipo de datos va a contener la propiedad.&lt;/p&gt;&lt;h3&gt;Propiedades de Tipo de Datos Java&lt;/h3&gt;&lt;p&gt;Estas
propiedades de configuración permiten definir el tipo de datos java que
almacenará la propiedad. Estos tipos de datos &lt;b&gt;suelen &lt;/b&gt;ser los definidos
por Java o una clase propia que &lt;b&gt;debe tener un constructor vació&lt;/b&gt;. En ambas situaciones, JAXB crea una clase &lt;i&gt;Adapter&lt;/i&gt;,
para que podamos realizar ciertas transformaciones o realizar llamadas
a operaciones de transformación al realizar la lectura y escritura del
XML. Los atributos de configuración de la etiqueta &lt;b&gt;&amp;lt;xjs:javaType&amp;gt;&lt;/b&gt; son:._&lt;/p&gt;&lt;ul&gt;&lt;li&gt;
name, nombre del tipo de datos que va a recoger el valor del XML, puede
ser una clase propia de Java o una creada para al efecto.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;xmlType,
es obligatoria y solo se usa cuando la configuración javaType se aplica
dentro de globalBindings, y a través de ella decidimos en que tipos de
datos XML se aplicará la configuración.&lt;/li&gt;&lt;li&gt;parseMethod y
printMethod son las propiedades que designan a que métodos llamará
JAXB2. El valor de estas propiedades debe ser la ruta completa a la
operación (paquete.clase.operación) y las operaciones serán desde el
Adapter cuando cuando se realiza el marshall y unmarshall
respectivamente. Las operaciones deben, en el caso del
unmarshall/lectura recibir un String y retornar un instancia de la
propia clase y en el caso del marshall/escritura, la inversa, recibir
una instancia de la clase y retornar un String. Por supuesto estas
operaciones no tienen porque estar en la clase designada en el atributo
name (pensar que si se selecciona un tipo de datos java no podríais
modificar la Clase)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;[ejemplo] Sobre nuestro Schema base, configurar el elemento &lt;b&gt;campo-uno-dos&lt;/b&gt;
para que el dato miembro de la clase Java se llama campoDecimal, y que esta no
tenga las operaciones isSet que añadimos en los globalBindings. Hacer también que el tipo de datos &lt;b&gt;campo-uno-uno&lt;/b&gt; sea
com.empresa.EnteroDecimal que cuenta con operaciones crearEnteroDecimal
y escribirEntero encargadas de realizar una transformación en el tipo
de datos.[/ejemplo]&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Para ello, debemos realizar la siguiente configuración (modo inline) en nuestro Schema:&lt;/p&gt;&lt;pre&gt;&amp;lt;xs:element name=&amp;quot;campo-uno-uno&amp;quot; type=&amp;quot;xs:int&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;        &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;            &lt;b&gt;campo-uno-uno sera trasladado al tipo&lt;br /&gt;            com.empresa.&lt;/b&gt;&lt;b&gt;&lt;b&gt;EnteroDecimal&lt;/b&gt;&lt;/b&gt;&lt;br /&gt;        &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;        &amp;lt;xs:appinfo&amp;gt;&lt;br /&gt;            &amp;lt;jxb:property&amp;gt;&lt;br /&gt;                &lt;b&gt;&amp;lt;jxb:baseType&amp;gt;&lt;br /&gt;                    &amp;lt;jxb:javaType name=&amp;quot;com.empresa.EnteroDecimal&amp;quot;&lt;br /&gt;                                  parseMethod=&amp;quot;com.empresa.EnteroDecimal.crearEnteroDecimal&amp;quot;&lt;br /&gt;                                  printMethod=&amp;quot;com.empresa.EnteroDecimal.escribirEntero&amp;quot;/&amp;gt;&lt;br /&gt;                &amp;lt;/jxb:baseType&amp;gt;&lt;/b&gt;&lt;br /&gt;            &amp;lt;/jxb:property&amp;gt;&lt;br /&gt;        &amp;lt;/xs:appinfo&amp;gt;&lt;br /&gt;    &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;&amp;lt;/xs:element&amp;gt;&lt;br /&gt;&amp;lt;xs:element name=&amp;quot;campo-uno-dos&amp;quot; type=&amp;quot;xs:double&amp;quot; minOccurs=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;        &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;            &lt;b&gt;Denominamos a campo-uno-dos campoDecimal y sin&lt;br /&gt;            operaciones is set&lt;/b&gt;&lt;br /&gt;        &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;        &amp;lt;xs:appinfo&amp;gt;&lt;br /&gt;            &lt;b&gt;&amp;lt;jxb:property name=&amp;quot;campoDecimal&amp;quot;&lt;br /&gt;                          generateIsSetMethod=&amp;quot;false&amp;quot;&lt;br /&gt;                    /&amp;gt;&lt;/b&gt;&lt;br /&gt;        &amp;lt;/xs:appinfo&amp;gt;&lt;br /&gt;    &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;&amp;lt;/xs:element&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;La
clase EnteroDecimal debe poseer los métodos indicados en la
configuración y responder a las exigencia de JAXB, por tanto la clase
debe tener un constructor vacío, el método crearEnteroDecimal debe ser
estático, recibir un String y retornar una instancia de EnteroDecimal y
el método escribirEntero la inversa. Veamoslo:&lt;/p&gt;&lt;pre&gt;public class EnteroDecimal {&lt;br /&gt;    private Double decimal = new Double(0.0);&lt;br /&gt;    &lt;b&gt;public EnteroDecimal(){}&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;public static EnteroDecimal crearEnteroDecimal(String valorEntero)&lt;/b&gt;{&lt;br /&gt;        EnteroDecimal traducido =  new EnteroDecimal();&lt;br /&gt;        traducido.setDecimal(new Double(valorEntero));&lt;br /&gt;        return traducido;&lt;br /&gt;    }&lt;br /&gt;    p&lt;b&gt;ublic static String escribirEntero(EnteroDecimal dec)&lt;/b&gt;{&lt;br /&gt;        return &amp;quot;&amp;quot;+ dec.getDecimal().intValue();&lt;br /&gt;    }&lt;br /&gt;    public void setDecimal(Double decimal) {&lt;br /&gt;        this.decimal = decimal;&lt;br /&gt;    }&lt;br /&gt;    public Double getDecimal() {&lt;br /&gt;        return decimal;&lt;br /&gt;    }&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Al ejecutar XJC mediante nuestra tarea de ANT, vemos los resultados:&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Se ha creado una clase Adapter1 dentro del paquete configurado en nuestro schemaBinding.&lt;br /&gt;&lt;pre&gt;package org.lasterra.jaxb2;&lt;br /&gt;import javax.xml.bind.annotation.adapters.XmlAdapter;&lt;br /&gt;import com.empresa.EnteroDecimal;&lt;br /&gt;public class Adapter1&lt;br /&gt;    extends &lt;b&gt;XmlAdapter&amp;lt;String, EnteroDecimal&amp;gt;&lt;/b&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="font-family: mon;"&gt;&lt;span style="font-weight: bold;"&gt;public EnteroDecimal unmarshal(String value) {&lt;br /&gt;        return (com.empresa.EnteroDecimal.crearEnteroDecimal(value));&lt;br /&gt;    }&lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;    &lt;b&gt;public String marshal(EnteroDecimal value) {&lt;br /&gt;        &lt;/b&gt;&lt;b&gt;return (com.empresa.EnteroDecimal.escribirEntero(value));&lt;br /&gt;    }&lt;/b&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;La
clase campoSecundario relacionada con el tipo complejo campo-uno&amp;nbsp;
muestra los cambios de las configuraciones del ejemplo con varias
anotaciones nuevas y la inclusión del nuevo tipo de datos EnteroDecimal
para campoUnoUno y el nuevo nombre de campo-uno-dos. El método
isSetCampoDecimal ya no es generado por XJC.&lt;br /&gt;&lt;pre&gt;@XmlAccessorType(XmlAccessType.FIELD)&lt;br /&gt;@XmlType(name = &amp;quot;campo-uno&amp;quot;, propOrder = {&lt;br /&gt;    &amp;quot;campoUnoUno&amp;quot;,&lt;br /&gt;    &amp;quot;campoDecimal&amp;quot;&lt;br /&gt;})&lt;br /&gt;public class ElementoSecundario {&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;@XmlElement(name = &amp;quot;campo-uno-uno&amp;quot;, required = true, type = String.class)&lt;br /&gt;    @XmlJavaTypeAdapter(Adapter1 .class)&lt;br /&gt;    @XmlSchemaType(name = &amp;quot;int&amp;quot;)&lt;/b&gt;&lt;br /&gt;    protected &lt;b&gt;EnteroDecimal &lt;/b&gt;campoUnoUno;&lt;br /&gt;    @XmlElement(name = &amp;quot;campo-uno-dos&amp;quot;)&lt;br /&gt;    protected double &lt;b&gt;campoDecimal&lt;/b&gt;;&lt;br /&gt;    @XmlAttribute&lt;br /&gt;    protected String attr;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Hay que destacar como en la etiqueta XmlElement del &lt;i&gt;campoUnoUno&lt;/i&gt;
se utiliza como tipo String para que JAXB2 haga las lecturas y
escrituras del XML usando este tipo, eso sí, pasando por el Adapter1.
Otra nota, no he conseguido encontrar forma de renombrar la clase
Adapter1 con la configuración.&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;La configuración externa sería la siguiente&lt;/p&gt;&lt;pre&gt;....&lt;br /&gt;&amp;lt;jxb:bindings node=&amp;quot;//xs:element[@name='campo-uno-uno']&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;jxb:property&amp;gt;&lt;br /&gt;        &amp;lt;jxb:baseType&amp;gt;&lt;br /&gt;            &amp;lt;jxb:javaType name=&amp;quot;com.empresa.EnteroDecimal&amp;quot;&lt;br /&gt;                          parseMethod=&amp;quot;com.empresa.EnteroDecimal.crearEnteroDecimal&amp;quot;&lt;br /&gt;                          printMethod=&amp;quot;com.empresa.EnteroDecimal.escribirEntero&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/jxb:baseType&amp;gt;&lt;br /&gt;    &amp;lt;/jxb:property&amp;gt;&lt;br /&gt;&amp;lt;/jxb:bindings&amp;gt;&lt;br /&gt;&amp;lt;jxb:bindings node=&amp;quot;//xs:element[@name='campo-uno-dos']&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;jxb:property name=&amp;quot;campoDecimal&amp;quot;&lt;br /&gt;                  generateIsSetMethod=&amp;quot;false&amp;quot;&lt;br /&gt;            /&amp;gt;&lt;br /&gt;&amp;lt;/jxb:bindings&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Hemos visto como realizar configuraciones sobre los elementos básicos del Schema, y como manejar los tipos de datos haciendo posible transformaciones entre el Schema y nuestras clases Java.&lt;br /&gt;&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb24</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb23</id>
        <title type="html">Java y XML con JAXB2 (IV)</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/DfKSibXW2SA/java_y_xml_con_jaxb23" />
        <published>2007-12-12T00:02:08+01:00</published>
        <updated>2007-12-12T00:02:09+01:00</updated> 
        <category term="/Java" label="Java" />
        <category term="documentacion" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="manual" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="xml" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="binding" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="customization" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javase6" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ejemplo" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="java" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javee5" scheme="http://rollerweblogger.org/ns/tags/" />
        <summary type="html">&lt;p&gt;En el post de hoy seguiremos profundizando en las diferentes
configuraciones que podemos aplicar sobre XJC para que nuestras clases
Java sean tal y como queremos, para ello vamos a ver las
configuraciones de Clase a través de la etiqueta &lt;b&gt;&amp;lt;xjb:class&amp;gt;&lt;/b&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;En el post de hoy seguiremos profundizando en las diferentes configuraciones que podemos aplicar sobre XJC para que nuestras clases Java sean tal y como queremos, para ello vamos a ver las configuraciones de Clase&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Configuración de Clase&lt;/h3&gt;&lt;p&gt;El tercer nivel de configuración es el de Clase y nos permite configurar la relación entre un elemento del Schema con un interfaz y/o clase Java. Es decir, podemos definir el nombre del interfaz que generara XJC en el paquete configurado y la clase que implementará dicho interfaz. Normalmente esta configuración se aplicará sobre los &lt;i&gt;complexType&lt;/i&gt; de nuestros Schemas.Para ello la etiqueta &lt;b&gt;&amp;lt;xjb:class&amp;gt; &lt;/b&gt;cuenta con tres atributos:._&lt;/p&gt;&lt;ul&gt;&lt;li&gt; name, es el nombre de la clase Java que creará XJC en el paquete configurado.&lt;/li&gt;&lt;li&gt;implClass, es el nombre de la clase Java, con paquete, que debe heredar de la clase generada por JAXB, y que será creada por el ObjectFactory. Esto es interesante, bien porque ya existía una clase con cierta lógica de negocio, bien porque deseamos añadir lógica/código a la clase generada por XJC.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;javadoc, es la documentación JavaDoc que XJC añadirá a la clase creada. Es conveniente introducir dicha documentación en un bloque CDATA para evitar problemas.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;[ejemplo] Realizar cambios en la configuración para que la clase relacionada con el tipo complejo campo-uno se llame ElementoSecundario pero que el ObjectFactory nos cree objetos com.empresa.NivelDos, que previamente nos debemos encargar de programar heredando de ElementoSecundario.[/ejemplo]&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;xs:complexType name=&amp;quot;campo-uno&amp;quot;&amp;gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;xs:annotation&amp;gt;&lt;br /&gt;        &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;            Configuramos XJC para que la clase relacionada se&lt;br /&gt;            llama ElementoSecundario&lt;br /&gt;        &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;        &amp;lt;xs:appinfo&amp;gt;&lt;br /&gt;            &amp;lt;jxb:class name=&amp;quot;ElementoSecundario&amp;quot;&lt;br /&gt;                 implClass=&amp;quot;com.empresa.ElementoNivelDos&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xs:appinfo&amp;gt;&lt;br /&gt;    &amp;lt;/xs:annotation&amp;gt;&lt;/b&gt;&lt;br /&gt;    &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;        &amp;lt;xs:element name=&amp;quot;campo-uno-uno&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;xs:element name=&amp;quot;campo-uno-dos&amp;quot; type=&amp;quot;xs:double&amp;quot; minOccurs=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;xs:attribute name=&amp;quot;attr&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/xs:complexType&lt;/pre&gt;&lt;p&gt;Al ejecutar la tarea de ANT vemos como se esperaba la clase ElementoSecundario&lt;/p&gt;&lt;pre&gt;@XmlAccessorType(XmlAccessType.FIELD)&lt;br /&gt;@XmlType(name = &amp;quot;campo-uno&amp;quot;, propOrder = {&lt;br /&gt;    &amp;quot;campoUnoUno&amp;quot;,&lt;br /&gt;    &amp;quot;campoUnoDos&amp;quot;&lt;br /&gt;})&lt;br /&gt;public class ElementoSecundario {&lt;br /&gt;&lt;br /&gt;    @XmlElement(name = &amp;quot;campo-uno-uno&amp;quot;)&lt;br /&gt;    protected int campoUnoUno;&lt;br /&gt;    @XmlElement(name = &amp;quot;campo-uno-dos&amp;quot;)&lt;br /&gt;    protected double campoUnoDos;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Y como el ObjectFactory crea objetos com.empresa.ElementoNivelDos que nos debemos encargar que hereden de ElementoSecundario.&lt;/p&gt;&lt;pre&gt;public ElementoSecundario createElementoSecundario() {&lt;br /&gt;   return new ElementoNivelDos();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;La configuración externa nos permite ir viendo que cosas podemos hacer con XPath en el atributo node&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;jxb:bindings version=&amp;quot;2.0&amp;quot;&lt;br /&gt;              xmlns:jxb=&amp;quot;http://java.sun.com/xml/ns/jaxb&amp;quot;&lt;br /&gt;              xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;jxb:bindings schemaLocation=&amp;quot;schema.xsd&amp;quot;&lt;br /&gt;                  node=&amp;quot;/xs:schema&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;jxb:globalBindings&lt;br /&gt;                collectionType=&amp;quot;java.util.LinkedList&amp;quot;&lt;br /&gt;                generateIsSetMethod=&amp;quot;true&amp;quot;&lt;br /&gt;                /&amp;gt;&lt;br /&gt;        &amp;lt;jxb:schemaBindings&amp;gt;&lt;br /&gt;            &amp;lt;jxb:package name=&amp;quot;org.lasterra.jaxb2&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/jxb:schemaBindings&amp;gt;&lt;br /&gt;        &lt;b&gt;&amp;lt;jxb:bindings node=&amp;quot;//xs:complexType[@name='campo-uno']&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;jxb:class name=&amp;quot;ElementoSecundario&amp;quot;&lt;br /&gt;                       implClass=&amp;quot;com.empresa.ElementoNivelDos&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/jxb:bindings&amp;gt;&lt;/b&gt;&lt;br /&gt;    &amp;lt;/jxb:bindings&amp;gt;&lt;br /&gt;&amp;lt;/jxb:bindings&amp;gt;&lt;br /&gt;&lt;/pre&gt;Como veís seguiremos bajando de nivel, en el próximo post veremos las configuraciones de propiedades/elementos.&lt;br /&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb23</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/el_video_de_la_semana</id>
        <title type="html">El video de la semana</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/qjC3DOkxgBY/el_video_de_la_semana" />
        <published>2007-12-10T23:49:13+01:00</published>
        <updated>2007-12-10T23:51:06+01:00</updated> 
        <category term="/General" label="General" />
        <category term="humor" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="burbujatecnologica" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Me parto de risa...muy muy bueno¡¡¡&lt;/p&gt;&lt;p&gt;&amp;nbsp;__&lt;/p&gt;

&lt;object width="425" height="373"&gt;&lt;param value="http://www.youtube.com/v/fi4fzvQ6I-o&amp;amp;rel=1&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999&amp;amp;border=1" name="movie" /&gt;&lt;param value="transparent" name="wmode" /&gt;&lt;embed width="425" height="373" wmode="transparent" type="application/x-shockwave-flash" src="http://www.youtube.com/v/fi4fzvQ6I-o&amp;amp;rel=1&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999&amp;amp;border=1" /&gt;&lt;/object&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/el_video_de_la_semana</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb22</id>
        <title type="html">Java y XML con JAXB2 (III)</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/_zk1SpvDIEI/java_y_xml_con_jaxb22" />
        <published>2007-12-10T17:45:02+01:00</published>
        <updated>2007-12-11T11:12:15+01:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="binding" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javee5" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="manual" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="jaxb2" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="documentacion" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javase6" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="xml" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="schemabindings" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="customization" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ejemplo" scheme="http://rollerweblogger.org/ns/tags/" />
        <summary type="html">En el anterior post veíamos como podíamos realizar configuraciones del compilador XJC en
línea y externas para que las clases Java sean tal y
como queremos. En este post veremos la configuración de Schema o
schemaBinding</summary>
        <content type="html">&lt;p&gt;En el &lt;a href="preview/lasterra/es/?previewEntry=java_y_xml_con_jaxb21"&gt;anterior post&lt;/a&gt; veíamos como podíamos realizar configuraciones del compilador XJC en línea y externas para que las clases Java sean tal y como queremos. En este post veremos la configuración de Schema o &lt;b&gt;schemaBinding&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Configuración de Schema&lt;/h2&gt;&lt;p&gt;Si la configuración global, como su
nombre indica, afecta a aspectos generales de la configuración, la
configuración de Schema gestiona la relación entre los Schemas de nuestros documentos XML y las clases Java que se generan.
Para aplicar estas configuraciones debemos usar la etiqueta &lt;b&gt;&amp;lt;xjb:schemaBindings&amp;gt;&lt;/b&gt;. Con ella podemos realizar dos operaciones:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Relacionar un Schema con un paquete java especificado por nosotros usando &lt;b&gt;&amp;lt;xjb:package&amp;gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Que
los nombres de nuestras clases Java generadas mantengan un patrón
concreto, es decir, que cuenten con un prefijo y/o sufijo definido por
nosotros gracias a &lt;b&gt;&amp;lt;jxb:nameXmlTransforms&amp;gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Como hemos visto en los ejemplos anteriores, la tarea de ANT XJC, contaba con el &lt;b&gt;parametro package&lt;/b&gt; para indicarle al compilador en que paquete queríamos que generase las clases. Este paremetro es &lt;b&gt;incompatible &lt;/b&gt;con la configuración &lt;b&gt;&amp;lt;xjb:package&amp;gt;&lt;/b&gt; de &lt;b&gt;&amp;lt;xjb:schemaBindings&amp;gt;&lt;/b&gt;.
De eliminar este parametro de XJC, por defecto todas nuestras clases se
crean en un paquete que se corresponde con el namespace de nuestro
Schema (http://weblogs.javahispano.org/lasterra/jaxb2 --&amp;gt;
org.javahispano.weblogs.lasterra.jaxb2). Respecto a la nomenclatura de
las clase Java, todas se llaman igual que los elementos y tipos
complejos del Schema. Gracias a la etiqueta &lt;b&gt;&amp;lt;jxb:&lt;/b&gt;&lt;b&gt;nameXmlTransforms&lt;/b&gt;&lt;b&gt;&amp;gt;&lt;/b&gt; podemos añadir un prefijo y/o sufijo a nuestras clases Java.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[ejemplo] Realizar cambios en la configuración para que las clases se generen en el paquete
org.lasterra.jaxb2 y que las clases relacionadas con los tipos
complejos se creen con el prefijo Type.[/ejemplo]&lt;/p&gt;&lt;p&gt;__Para el modo inline
debemos modificar nuestro Schema y añadir como hicimos anteriormente las
configuraciones de JAXB2 dentro del bloque &lt;b&gt;&amp;lt;xs:appinfo&amp;gt;&lt;/b&gt;.&lt;/p&gt;&lt;pre&gt;&lt;b&gt;.....&lt;br /&gt;&amp;lt;xs:appinfo&amp;gt;&lt;/b&gt;&lt;br /&gt;    &amp;lt;jxb:globalBindings&lt;br /&gt;            collectionType=&amp;quot;java.util.LinkedList&amp;quot;&lt;br /&gt;            generateIsSetMethod=&amp;quot;true&amp;quot;&lt;br /&gt;            /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;b&gt;jxb:schemaBindings&amp;gt;&lt;br /&gt;        &amp;lt;jxb:package name=&amp;quot;org.lasterra.jaxb2&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;jxb:nameXmlTransform&amp;gt;&lt;br /&gt;            &amp;lt;jxb:typeName prefix=&amp;quot;Type&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/jxb:nameXmlTransform&amp;gt;&lt;br /&gt;    &amp;lt;/jxb:schemaBindings&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;/xs:appinfo&amp;gt;&lt;br /&gt;&lt;/b&gt;.....&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Al
ejecutar nuestra tarea de ANT (recordar que es necesario eliminar le
atributo package) veremos los cambios en nuestro código, la clase
CampoUno se ve afectada por la dos configuraciones y ahora pasa a
quedar así:&lt;/p&gt;&lt;pre&gt;package &lt;b&gt;org.lasterra.jaxb2&lt;/b&gt;;&lt;br /&gt;&lt;br /&gt;import ...&lt;br /&gt;&lt;br /&gt;@XmlAccessorType(XmlAccessType.FIELD)&lt;br /&gt;@XmlType(name = &amp;quot;campo-uno&amp;quot;, propOrder = {&lt;br /&gt;    &amp;quot;campoUnoUno&amp;quot;,&lt;br /&gt;    &amp;quot;campoUnoDos&amp;quot;&lt;br /&gt;})&lt;br /&gt;public class &lt;b&gt;Type&lt;/b&gt;CampoUno {&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Si
cogemos la configuración externa nuestro fichero de binding, añadimos
el bloque &amp;lt;jxb:schemaBinding&amp;gt; y ejecutamos la tarea de ANT XJC
con el atributo binding apuntando a nuestro fichero xjb, veremos que nos da
un error. El mensaje dice:&lt;/p&gt;&lt;p&gt;Compiling file:/D:/proyectos/documentacion/jaxb2/jaxb2-example/schema.xsd&lt;br /&gt;[ERROR] The &amp;quot;jxb:schemaBindings&amp;quot; customization is not associated with any &lt;br /&gt;schema element.&lt;/p&gt;&lt;p&gt;Bien,
esta es una de las razones por las que la configuración externa es un
poco más complicada que el modo en linea. Un documento XSD puede contar
con elementos de varios Schemas.Esta es una de las razones por las que
XMLSchema existe frente a los DTDs, por su capacidad de importar
elementos de otros schemas y ubicarlos en distintos namespaces de un
mismo documento XML. &lt;/p&gt;&lt;p&gt;._Al realizar la configuración en linea,
realizamos las configuraciones dentro del propio documento, y estas
configuraciones se aplican a los elementos que se encuentran bajo la
configuración, es decir, el elemento y los subelementos del mismo.
Cuando realizamos la configuración externa es necesario indicar esta
información. Para ello la etiqueta &lt;b&gt;&amp;lt;jxb:bindings&amp;gt; &lt;/b&gt;cuenta con dos atributos:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;schemaLocation,
que indica la ruta al Schema sobre el cual queremos efectuar la configuración. Esta ruta puede ser local (file:/) o de internet
(http://).&lt;/li&gt;&lt;li&gt;node, con este atributo podemos especificar que
parte del documento queremos configurar. El valor consiste en un ruta
XPath que selecciona un elemento (y solo uno). No os asustéis, yo
tampoco se mucho de XPath, pero en cualquier caso, schemaBinding casi siempre se aplica a todo un schema y por tanto la ruta XPath es en este caso &lt;b&gt;/xs:schema&lt;/b&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Dicho esto, para aplicar la configuración de Schema a todo nuestro documento, nuestro fichero xjb quedaría así&lt;/p&gt;&lt;pre&gt;&amp;lt;jxb:bindings version=&amp;quot;2.0&amp;quot;&lt;br /&gt;              xmlns:jxb=&amp;quot;http://java.sun.com/xml/ns/jaxb&amp;quot;&lt;br /&gt;              xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&amp;gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;jxb:bindings schemaLocation=&amp;quot;schema.xsd&amp;quot; &lt;br /&gt;                  node=&amp;quot;/xs:schema&amp;quot;&amp;gt;&lt;/b&gt;&lt;br /&gt;        &amp;lt;jxb:globalBindings&lt;br /&gt;                collectionType=&amp;quot;java.util.LinkedList&amp;quot;&lt;br /&gt;                generateIsSetMethod=&amp;quot;true&amp;quot;&lt;br /&gt;                /&amp;gt;&lt;br /&gt;        &lt;b&gt;&amp;lt;jxb:schemaBindings&amp;gt;&lt;br /&gt;            &amp;lt;jxb:package name=&amp;quot;org.lasterra.jaxb2&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;jxb:nameXmlTransform&amp;gt;&lt;br /&gt;                &amp;lt;jxb:typeName prefix=&amp;quot;Type&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;/jxb:nameXmlTransform&amp;gt;&lt;br /&gt;        &amp;lt;/jxb:schemaBindings&amp;gt;&lt;/b&gt;&lt;br /&gt;    &amp;lt;/jxb:bindings&amp;gt;&lt;br /&gt;&amp;lt;/jxb:bindings&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Como podéis ver el resultado es el mismo, y a pesar de la dificultad extra del modo externo, mantenemos el Schema intacto.&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb22</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb21</id>
        <title type="html">Java y XML con JAXB2 (II)</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/-m88DqfBkVM/java_y_xml_con_jaxb21" />
        <published>2007-12-06T20:14:11+01:00</published>
        <updated>2007-12-11T11:11:44+01:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jaxb2" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="globalbinding" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javase6" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="documentacion" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javee5" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ejemplo" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="binding" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="java" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="manual" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="xml" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="customization" scheme="http://rollerweblogger.org/ns/tags/" />
        <summary type="html">&lt;p&gt;Hemos visto en el post anterior que con un schema sencillo rápidamente
podemos generar nuestras clases Java para poder leer y escribir XMLs.
Pero como todo en la informática, lo sencillo se convierte en complejo,
dependiendo de nuestro escenario.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Con JAXB2 podemo hacer configuraciones de distintos tipos (Globales, de Esquema, de Clase, etc) bien en modo en línea, incorporando información dentro del schema, o bien en modo externo, a través de un fichero de configuración&lt;br /&gt;&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;Hemos visto en el post anterior que con un schema sencillo rápidamente podemos generar nuestras clases Java para poder leer y escribir XMLs. Pero como todo en la informática, lo sencillo se convierte en complejo, dependiendo de nuestro escenario.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Con JAXB2 podemos realizar operaciones de maquillaje en el compilador de esquemas, XJC. Vamos a ver como podemos realizar estas operaciones y como nos van a ayudar en algunas situaciones relativamente habituales.&lt;/p&gt;&lt;h2&gt;Modo de configuración Inline y External&amp;nbsp;&lt;/h2&gt;&lt;p&gt;Existes dos formas de realizar estas configuraciones:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Modo Inline: Introduciendo elementos del Schema de JAXB dentro del Schema que queremos compilar. Hay que tener en cuenta que en la mayoría de los casos este esquema esta mantenido por un tercero, por lo que para modificarlo debemos crear una copia de el. Esto puede suponer un riesgo en el futuro si se amplia/modifica el schema, ya que nos obligará a modificar nuestra copia. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Modo External: Mediante un fichero externo al Schema donde realizamos estas configuraciones.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;La ventaja del modo en línea es que puede resultar más sencillo de leer. La ventaja del modo externo es que no tocamos el Schema y este se limita a su función original, validar los ficheros XML.&lt;/p&gt;&lt;h2&gt;Configuraciones Globales&lt;/h2&gt;&lt;p&gt;Existen varios tipos de configuraciones, todas ellos aplicables tanto en el modo en línea como en el externo. El más general es Global, y en el podemos configurar entre otras cosas como manejar las Colecciones de elementos XML (ArrayList, Set, etc.), decidir si crear o no una operación isSet para saber si ha sido rellenado el valor de un elemento o no o por ejemplo si un &lt;i&gt;fixed attribute &lt;/i&gt;del Schema debe ser convertido a una constante Java o no. Veamoslo con un ejemplo._&lt;/p&gt;&lt;p&gt;Basándonos en el &lt;a target="_blank" href="http://weblogs.javahispano.org/lasterra/resource/jaxb2_1/schema.xsd"&gt;Schema anterior&lt;/a&gt; vamos a realizar unos cambios:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;La colección de elementos va a ser traducida a &lt;a target="_blank" href="http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html"&gt;java.util.LinkedList&lt;/a&gt; en vez de ArrayList &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Vamos a generar el metodo isSet en las clases Java&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Usando el metodo inline debemos modificar el schema y añadir información que JAXB sabe interpretar. Para que esto sea posible sin que afecte a la misión principal del Schema, existe la etiqueta &lt;b&gt;&amp;lt;xs:appinfo/&amp;gt;.&lt;/b&gt;&amp;nbsp; Esta etiqueta es similar a &amp;lt;xs:documentation/&amp;gt; pero orientada a dar información a aplicaciones informáticas en vez de al programador. Ambas etiquetas son hijas de &amp;lt;xs:annotation&amp;gt;. Dentro de &amp;lt;xs:appinfo&amp;gt; podemos usar etiquetas XML de JAXB que son las encargadas de realizar la configuración inline. Veamos como queda nuestro Schema con las configuraciones inline que necesitamos para este ejemplo:&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:&lt;b&gt;xs&lt;/b&gt;=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;           xmlns=&amp;quot;http://weblogs.javahispano.org/lasterra/jaxb2&amp;quot;&lt;br /&gt;           &lt;b&gt;xmlns:jxb=&amp;quot;http://java.sun.com/xml/ns/jaxb&amp;quot;&lt;br /&gt;           jxb:version=&amp;quot;2.0&amp;quot;&lt;/b&gt;&lt;br /&gt;           targetNamespace=&amp;quot;http://weblogs.javahispano.org/lasterra/jaxb2&amp;quot;&lt;br /&gt;           elementFormDefault=&amp;quot;qualified&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;        &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;            Modificamos el schema que JAXB genere LinkedList&lt;br /&gt;            y métidos isSet&lt;br /&gt;        &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;&lt;b&gt;        &amp;lt;xs:appinfo&amp;gt;&lt;br /&gt;            &lt;/b&gt;&lt;b&gt;&amp;lt;jxb:globalBindings&lt;br /&gt;                    collectionType=&amp;quot;java.util.LinkedList&amp;quot;&lt;br /&gt;                    generateIsSetMethod=&amp;quot;false&amp;quot;&lt;br /&gt;                    /&amp;gt;&lt;br /&gt;        &amp;lt;/xs:appinfo&amp;gt;&lt;/b&gt;&lt;br /&gt;    &amp;lt;/xsd:annotation&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name=&amp;quot;elemento-principal&amp;quot;&amp;gt;&lt;br /&gt;.....&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;_.Destacamos en el ejemplo la incorporación del namespace &lt;b&gt;jxb&lt;/b&gt; al XSD. Este namespace importa el &lt;a href="http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" title="JAXB2 Schema" target="_blank"&gt;Schema de JAXB2&lt;/a&gt; para que podamos usar dentro de nuestro Schema las etiquetas que JAXB2 utiliza para las configuraciones. En el ejemplo se puede ver &lt;b&gt;&amp;lt;jxb:globalBindings&lt;/b&gt;&amp;gt; que es la encargada de realizar las configuraciones globales que hemos comentado. Para el ejemplo solo hemos usado las configuraciones &lt;b&gt;collectionType&lt;/b&gt; y &lt;b&gt;generateSetMethod&lt;/b&gt;, pero &lt;a href="http://java.sun.com/javaee/5/docs/tutorial/doc/bnbbf.html#bnbcd" target="_blank" title="JavaEE 5 Tutorial, JAXB2 Global Bindings"&gt;existen otras que se pueden utilizar&lt;/a&gt;. Los &lt;b&gt;globalBindigs solo son aplicables bajo la etiqueta xs:schema&lt;/b&gt;, si intentamos realizar estas configuraciones bajo otro elemento el compilador nos dará error.&lt;br /&gt; &lt;/p&gt;&lt;p&gt;Si ejecutamos ahora la tarea de &lt;a href="http://weblogs.javahispano.org/lasterra/resource/jaxb2_1/build.xml" target="_blank" title="Script ANT del Ejemplo"&gt;ANT de nuestro ejemplo&lt;/a&gt;, veremos los cambios en las clases generadas, a destacar los efectos en la lista de elementos CampoTres:&lt;/p&gt;&lt;pre&gt;public List&amp;lt;Integer&amp;gt; getCampoTres() {&lt;br /&gt;    if (campoTres == null) {&lt;br /&gt;        campoTres = &lt;b&gt;new LinkedList&amp;lt;Integer&amp;gt;()&lt;/b&gt;;&lt;br /&gt;    }&lt;br /&gt;    return this.campoTres;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public boolean &lt;b&gt;isSetCampoTres&lt;/b&gt;() {&lt;br /&gt;    return ((this.campoTres!= null)&lt;br /&gt;            &amp;amp;&amp;amp;(!this.campoTres.isEmpty()));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void &lt;b&gt;unsetCampoTres&lt;/b&gt;() {&lt;br /&gt;    this.campoTres = null;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;En el método externo la diferencia es que estas configuraciones, el uso del las etiquetas jxb:*, se hacen en un fichero externo. Al ejecutar XJC debemos indicarle donde se encuentra este fichero y el resultado es exactamente igual. Este fichero de configuración es conocido como &lt;i&gt;JAXB binding customization file &lt;/i&gt;y su extensión suele ser xjb. El fichero, como es de esperar, debe importar el &lt;a href="http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" title="JAXB2 Schema" target="_blank"&gt;Schema de JAXB2&lt;/a&gt;. Veamos como sería nuestro fichero xjb para realizar nuestro ejemplo&lt;/p&gt;&lt;pre&gt;&amp;lt;jxb:bindings version=&amp;quot;2.0&amp;quot;&lt;br /&gt;               &lt;b&gt;xmlns:jxb=&amp;quot;http://java.sun.com/xml/ns/jaxb&amp;quot;&lt;/b&gt;&lt;br /&gt;               xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;jxb:bindings&amp;gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;jxb:globalBindings&lt;br /&gt;                    collectionType=&amp;quot;java.util.LinkedList&amp;quot;&lt;br /&gt;                    generateIsSetMethod=&amp;quot;true&amp;quot;&lt;br /&gt;                    /&amp;gt;&lt;/b&gt;&lt;br /&gt;   &amp;lt;/jxb:bindings&amp;gt;&lt;br /&gt;&amp;lt;/jxb:bindings&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Al ejecutar la tarea de ant debemos pasar la ruta a este fichero de configuración a través del attributor binding, por tanto nuestro target ANT quedaría así&lt;/p&gt;&lt;pre&gt;&amp;lt;target name=&amp;quot;compile-schema&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;property name=&amp;quot;jaxb2.path&amp;quot; value=&amp;quot;D:\\jaxb-ri-20070917&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;taskdef name=&amp;quot;xjc&amp;quot; classname=&amp;quot;com.sun.tools.xjc.XJCTask&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;classpath&amp;gt;&lt;br /&gt;        &amp;lt;fileset dir=&amp;quot;${jaxb2.path}/lib&amp;quot; includes=&amp;quot;*.jar&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/classpath&amp;gt;&lt;br /&gt;    &amp;lt;/taskdef&amp;gt;&lt;br /&gt;    &amp;lt;&lt;b&gt;xjc&lt;/b&gt; schema=&amp;quot;schema.xsd&amp;quot; package=&amp;quot;org.javahispano.weblogs.lasterra.jaxb2.ejemplo&amp;quot;&lt;br /&gt;         destdir=&amp;quot;${basedir}/src&amp;quot;&lt;br /&gt;         &lt;b&gt;binding=&amp;quot;jaxb2.jxb&amp;quot;&lt;/b&gt;/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;Hemos visto como se pueden aplicar configuraciones glabales tanto en línea como de forma externa. En los siguientes post veremos otras posibles configuraciones.&lt;br /&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb21</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb2</id>
        <title type="html">Java y XML con JAXB2</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/hc5mwKO2Km0/java_y_xml_con_jaxb2" />
        <published>2007-12-06T02:41:34+01:00</published>
        <updated>2007-12-06T02:59:30+01:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="bind" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="java6" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javaee5" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="xml" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="jaxb2" scheme="http://rollerweblogger.org/ns/tags/" />
        <summary type="html">Traducir, mapear, serializar, transformar todos estos verbos y algún
otro se han usado para explicar la tantas veces repetida operación de
convertir nuestros objectos Java a ficheros XML podemos ver como con JAXB2 esta tarea puede ser muy sencilla.</summary>
        <content type="html">&lt;p&gt;Traducir, mapear, serializar, transformar todos estos verbos y algún otro se han usado para explicar la tantas veces repetida operación de convertir nuestros objectos Java a ficheros XML.&lt;/p&gt;&lt;p&gt;Las formas de realizar esta operación han sido múltiples, desde &lt;a href="http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXPIntro4.html#wp64215" target="_blank" title="J2EE 1.4 SAX APIs"&gt;SAX &lt;/a&gt;y &lt;a href="http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXPIntro5.html#wp64262" target="_blank" title="J2EE 1.4 DOM APIs"&gt;DOM&lt;/a&gt;, pasando por &lt;a target="_blank" href="http://www.jdom.org/"&gt;Jdom&lt;/a&gt;, hasta llegar a soluciones más automáticas como &lt;a title="Castor XML" target="_blank" href="http://www.castor.org/xml-framework.html"&gt;Castor-XML&lt;/a&gt;, &lt;a href="http://xmlbeans.apache.org/"&gt;XMLBeans &lt;/a&gt;o &lt;a title="JAXB 1" href="https://jaxb.dev.java.net/1.0/"&gt;JAXB &lt;/a&gt;y mientras estas herramientas se modernizaban el propio XML también lo hacía evolucionando desde la meta-información basada en &lt;a title="Definición Wikipedia DTD" target="_blank" href="http://es.wikipedia.org/wiki/DTD"&gt;DTDs &lt;/a&gt;hacía el &lt;a title="Definición Wikipedia XMLSchema" target="_blank" href="http://es.wikipedia.org/wiki/XML_Schema"&gt;XMLSchema&lt;/a&gt;, que a día de hoy es el estándar.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Centrándonos en &lt;a title="Página JAXB" target="_blank" href="https://jaxb.dev.java.net/"&gt;JAXB2&lt;/a&gt;, este estándar Java (&lt;a title="JSR 222" target="_blank" href="http://jcp.org/en/jsr/detail?id=222"&gt;JSR-222&lt;/a&gt;) fue incluido dentro de JavaEE 5 y JavaSE 6.&amp;nbsp; &lt;b&gt;Java Arquitecture for XML Binding 2 &lt;/b&gt;trae varias mejoras con respecto a su primera versión.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Soporte completo de XMLSchema, por lo que podremos importar a objetos Java cualquier fichero XML que este validado contra un XMLSchema.&lt;/li&gt;&lt;li&gt;En JAXB2 también es posible realizar la operación inversa, convertir en XML objects de clases Java previamente definidas. Gracias a las anotaciones esta tarea es muy sencilla.&lt;/li&gt;&lt;li&gt;Las clases Java generadas desde los XMLSchema son mucho (muchísismo) más sencillas en esta versión.&lt;/li&gt;&lt;li&gt;Mejor capacidad de validación mediante JAXP1.3.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;En esta primer capítulo de &lt;b&gt;Java y XML&lt;/b&gt; (espero que haya varios más) vamos a ver como desde un documento de definición de un fichero XML, XSD (Xml Schema Definition), podemos fácilmente leer y escribir ficheros XML.&lt;/p&gt;&lt;p&gt; Nuestro primer paso será descargar las librerías de JAXB2. JAXB2 fue incluido en Java 6, luego si usamos esta versión podremos ejecutar el código JAXB2, pero para poder usar la tarea de ANT, es necesario descargarse las librerías completas. Existen 2 versiones de JAXB2&lt;/p&gt;&lt;ul&gt;&lt;li&gt;JAXB2 2.0.X, es la versión incluida en JavaSE 6 y JavaSE 6 Update1&lt;/li&gt;&lt;li&gt;JAXB2 2.1.X, esta incluida en JavaSE 6u2 y posterior&lt;/li&gt;&lt;/ul&gt;Más adelante veremos los problemas que puede generar esta amalgama de versiones, para los objetivos de este post nos vale cualquiera de las dos, pero por aquello de estar a la última, usaremos la última versión disponible: &lt;a href="https://jaxb.dev.java.net/2.1.5/" target="_blank" title="download jaxb2 2.1.5"&gt;2.1.5&lt;/a&gt;.&lt;p&gt;Tras descargar el archivo de instalación en el lugar donde deseamos instalarlo, seguimos los pasos que nos indica el manual y ejecutamos&lt;/p&gt;&lt;pre&gt;java -jar JAXB2_**(version)**.jar&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;con lo que nuestra versión de JAXB queda instalada en la carpeta jaxb-ri-**(version)**. Dentro de esta carpeta destacamos las carpetas bin y lib. &lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;La carpeta &lt;b&gt;bin &lt;/b&gt;cuenta con dos programas&lt;/li&gt;&lt;ul&gt;&lt;li&gt;XJC, compilador de XMLSchema que genera clases Java&lt;/li&gt;&lt;li&gt;Schemagen, &lt;b&gt;TODO &lt;/b&gt;realizar la operación inversa a XJC, genera XMLSchema desde clases Java.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;La carpeta &lt;b&gt;lib &lt;/b&gt;cuenta con varios ficheros JAR&lt;/li&gt;&lt;ul&gt;&lt;li&gt;jaxb-api.jar, cuenta con los interfaces del API JAXB definidos en el paquete &lt;b&gt;javax.xml.bind&lt;/b&gt;. Este fichero JAR no es necesario incluirlo si nuestra JDK es la versión 6 o superior.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;/b&gt;jaxb-impl.jar, implementación de los interfaces&lt;/li&gt;&lt;li&gt;jaxb1-impl.jar, para cumpli dependencia hacía atrás con la anterior versión del estándard&lt;/li&gt;&lt;li&gt;jaxb-xjc.jar, clases de los programas XJC y Schemagen&lt;br /&gt;&lt;/li&gt;&lt;li&gt;activation.jar y jsr_173_1.0_api.jar son dependencias&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;Una vez instalado JAXB2 podemos empezar a trabajar en el ejemplo. La base del ejemplo es un fichero XSD que define como son los XML que vamos a mapear con clases Java. Vamos a utilizar uno muy sencillo, pero si alguien tiene dificultades con XMLSchema le recomiendo (me encantan estos cursillos) seguir el curso de &lt;a href="http://www.w3schools.com/schema/default.asp" target="_blank" title="Cursos XMLSchema"&gt;w3schools.com&lt;/a&gt; pero espero que le ejemplo sea suficientemente sencillo como para no desviarnos de la temática de JAXB. Veamoslo&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;           xmlns=&amp;quot;http://weblogs.javahispano.org/lasterra/jaxb2&amp;quot;&lt;br /&gt;           targetNamespace=&amp;quot;http://weblogs.javahispano.org/lasterra/jaxb2&amp;quot;&lt;br /&gt;           elementFormDefault=&amp;quot;qualified&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xs:element name=&amp;quot;elemento-principal&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;            &amp;lt;xs:choice&amp;gt;&lt;br /&gt;                &amp;lt;xs:element name=&amp;quot;campo-uno&amp;quot; type=&amp;quot;campo-uno&amp;quot;/&amp;gt;&lt;br /&gt;                &amp;lt;xs:element name=&amp;quot;campo-dos&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;                &amp;lt;xs:element name=&amp;quot;campo-tres&amp;quot; type=&amp;quot;xs:int&amp;quot; &lt;br /&gt;                            minOccurs=&amp;quot;1&amp;quot; maxOccurs=&amp;quot;unbounded&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;        &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;    &amp;lt;/xs:element&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xs:complexType name=&amp;quot;campo-uno&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;            &amp;lt;xs:element name=&amp;quot;campo-uno-uno&amp;quot; type=&amp;quot;xs:int&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;xs:element name=&amp;quot;campo-uno-dos&amp;quot; type=&amp;quot;xs:double&amp;quot; &lt;br /&gt;                        minOccurs=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;        &amp;lt;xs:attribute name=&amp;quot;attr&amp;quot; type=&amp;quot;xs:string&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/xs:complexType&amp;gt;    &lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Una vez tenemos el XSD debemos &lt;i&gt;compilarlo &lt;/i&gt;con la herramienta XJC. Podemos ejecutar esta herramienta desde la &lt;a href="https://jaxb.dev.java.net/nonav/2.1.5/docs/xjc.html" target="_blank" title="XJC desde consola"&gt;línea de comandos&lt;/a&gt;, pero encontrareis mucho más útil usar su &lt;a href="https://jaxb.dev.java.net/nonav/2.1.5/docs/xjcTask.html" title="Tarea ANT XJC" target="_blank"&gt;tarea &lt;/a&gt;&lt;a title="Tarea ANT XJC" target="_blank" href="https://jaxb.dev.java.net/nonav/2.1.5/docs/xjcTask.html"&gt;ANT&lt;/a&gt;. &lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;target name=&amp;quot;compile-schema&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;property name=&amp;quot;jaxb2.path&amp;quot; value=&amp;quot;D:\\jaxb-ri-20070917&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;taskdef name=&amp;quot;xjc&amp;quot; classname=&amp;quot;com.sun.tools.xjc.XJCTask&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;classpath&amp;gt;&lt;br /&gt;        &amp;lt;fileset dir=&amp;quot;&lt;b&gt;${jaxb2.path}/lib&lt;/b&gt;&amp;quot; includes=&amp;quot;*.jar&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/classpath&amp;gt;&lt;br /&gt;    &amp;lt;/taskdef&amp;gt;&lt;br /&gt;    &amp;lt;xjc schema=&amp;quot;schema.xsd&amp;quot; &lt;br /&gt;	 package=&amp;quot;org.javahispano.weblogs.lasterra.jaxb2.ejemplo&amp;quot;&lt;br /&gt;         destdir=&amp;quot;${basedir}/src&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Como resultado de la ejecución de esta tarea de ANT se generan tres clases Java._&lt;/p&gt;&lt;ul&gt;&lt;li&gt;La primera clase es ObjectFactory, que estará presente en todos nuestros proyectos donde JAXB2 entra en juego. Como su nombre indica su función es crear los objetos de nuestro esquema.&lt;/li&gt;&lt;li&gt;Las otras dos clases son ElementoPrincipal y CampoUno, que son los dos &lt;b&gt;elementos complejos&lt;/b&gt; de nuestro esquema.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Si nos fijamos en el código de estas dos clases vemos que esta adornado de anotaciones java, pero a la vez es un código muy sencillo y fácil de leer, prácticamente estamos ante un JavaBean/POJO normal y corriente. Esto se hace patente a la hora de trabajar en la lectura y escritura de los archivos XML. Veamos antes las anotaciones de la clase ElementoPrincipal&lt;/p&gt;&lt;pre&gt;@&lt;b&gt;XmlAccessorType&lt;/b&gt;(XmlAccessType.FIELD)&lt;br /&gt;@&lt;b&gt;XmlType&lt;/b&gt;(name = &amp;quot;&amp;quot;, propOrder = {&lt;br /&gt;    &amp;quot;campoUno&amp;quot;,&lt;br /&gt;    &amp;quot;campoDos&amp;quot;,&lt;br /&gt;    &amp;quot;campoTres&amp;quot;&lt;br /&gt;})&lt;br /&gt;@&lt;b&gt;XmlRootElement&lt;/b&gt;(name = &amp;quot;elemento-principal&amp;quot;)&lt;br /&gt;public class ElementoPrincipal {&lt;br /&gt;&lt;br /&gt;    @&lt;b&gt;XmlElement&lt;/b&gt;(name = &amp;quot;campo-uno&amp;quot;)&lt;br /&gt;    protected CampoUno campoUno;&lt;br /&gt;    @&lt;b&gt;XmlElement&lt;/b&gt;(name = &amp;quot;campo-dos&amp;quot;)&lt;br /&gt;    protected String campoDos;&lt;br /&gt;    @&lt;b&gt;XmlElement&lt;/b&gt;(name = &amp;quot;campo-tres&amp;quot;)&lt;br /&gt;    protected List&amp;lt;BigInteger&amp;gt; campoTres;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;_.Solo nos queda ver como trabajan estas clases &lt;i&gt;anotadas &lt;/i&gt;para escribir y leer ficheros XML. Para hacer posible la operación de Marshall y Unmarshal debemos hacer uso de &lt;a title="JavaDoc JAXBContext" target="_blank" href="https://jaxb.dev.java.net/nonav/2.1.5/docs/api/javax/xml/bind/JAXBContext.html"&gt;JAXBContext&lt;/a&gt;. Esta clase es la encargada de procesar las clases Java y realizar la serialización de las objetos. Para obtener una instancia de este objeto debemos indicar el/los paquetes de las clases &lt;i&gt;anotadas&lt;/i&gt;. Una vez tenemos nuestro contexto JAXB podemos obtener un objeto &lt;a title="JavaDoc Marshaller" target="_blank" href="https://jaxb.dev.java.net/nonav/2.1.5/docs/api/javax/xml/bind/Marshaller.html"&gt;Marshaller &lt;/a&gt;encargado de escribir XML a través del método marshall. Veamoslo con un ejemplo:&lt;/p&gt;&lt;pre&gt;public static final void main(String[] args){&lt;br /&gt;    ObjectFactory &lt;b&gt;factoria =  new ObjectFactory&lt;/b&gt;();&lt;br /&gt;    ElementoPrincipal elementoPrincipal = &lt;b&gt;factoria.createElementoPrincipal&lt;/b&gt;();&lt;br /&gt;    CampoUno campoUno = factoria.createCampoUno();&lt;br /&gt;    campoUno.setAttr(&amp;quot;Esto es un attributo string&amp;quot;);&lt;br /&gt;    campoUno.setCampoUnoDos(new Double(9.5));&lt;br /&gt;    elementoPrincipal.setCampoUno(campoUno);&lt;br /&gt;    elementoPrincipal.setCampoDos(&amp;quot;Con esto acaba el ejemplo&amp;quot;);&lt;br /&gt;    &lt;b&gt;//Es curioso como se tratan las listas&lt;br /&gt;    //seguro que esperabas un metodo addCapoTres&lt;br /&gt;    elementoPrincipal.getCampoTres().add(new Integer(1));&lt;/b&gt;&lt;br /&gt;    elementoPrincipal.getCampoTres().add(new Integer(2));&lt;br /&gt;    elementoPrincipal.getCampoTres().add(new Integer(3));&lt;br /&gt;     try {&lt;br /&gt;        &lt;b&gt;JAXBContext &lt;/b&gt;jaxbContext = JAXBContext&lt;br /&gt;           .newInstance(&amp;quot;&lt;i&gt;org.javahispano.weblogs.lasterra.jaxb2.ejemplo&lt;/i&gt;&amp;quot;);&lt;br /&gt;        &lt;b&gt;Marshaller &lt;/b&gt;marshaller = &lt;b&gt;jaxbContext.createMarshaller&lt;/b&gt;();&lt;br /&gt;        &lt;b&gt;marshaller.marshal&lt;/b&gt;(elementoPrincipal, System.out);&lt;br /&gt;    } catch (JAXBException e) {&lt;br /&gt;        e.printStackTrace(); &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Para la lectura de ficheros XML el proceso es similar pero a la inversa, realizando la operación unmarshall del interfaz &lt;a title="JavaDoc Unmarshaller" href="https://jaxb.dev.java.net/nonav/2.1.5/docs/api/javax/xml/bind/Unmarshaller.html"&gt;Unmarshaller&lt;/a&gt;. Lo vemos con el ejemplo de lectura de un String y como obtener el valor del elemento campo-dos&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;String xml = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot; encoding=\&amp;quot;UTF-8\&amp;quot; standalone=\&amp;quot;yes\&amp;quot;?&amp;gt;&amp;quot; +&lt;br /&gt;        &amp;quot;&amp;lt;elemento-principal xmlns=\&amp;quot;http://weblogs.javahispano.org/lasterra/jaxb2\&amp;quot;&amp;gt;&amp;quot; +&lt;br /&gt;        &amp;quot;&amp;lt;campo-uno attr=\&amp;quot;Atributo\&amp;quot;&amp;gt;&amp;quot; +&lt;br /&gt;        &amp;quot;&amp;lt;campo-uno-dos&amp;gt;0&amp;lt;/campo-uno-dos&amp;gt;&amp;quot; +&lt;br /&gt;        &amp;quot;&amp;lt;/campo-uno&amp;gt;&amp;quot; +&lt;br /&gt;        &amp;quot;&amp;lt;campo-dos&amp;gt;EJEMPLO LECTURA&amp;lt;/campo-dos&amp;gt;&amp;quot; +&lt;br /&gt;        &amp;quot;&amp;lt;campo-tres&amp;gt;9&amp;lt;/campo-tres&amp;gt;&amp;lt;campo-tres&amp;gt;8&amp;lt;/campo-tres&amp;gt;&amp;lt;campo-tres&amp;gt;7&amp;lt;/campo-tres&amp;gt;&amp;quot; +&lt;br /&gt;        &amp;quot;&amp;lt;/elemento-principal&amp;gt;&amp;quot;;&lt;br /&gt;try {&lt;br /&gt;    &lt;b&gt;JAXBContext &lt;/b&gt;jaxbContext =&lt;br /&gt;            JAXBContext.newInstance(&amp;quot;org.javahispano.weblogs.lasterra.jaxb2.ejemplo&amp;quot;);&lt;br /&gt;    Unmarshaller unmarshaller = &lt;b&gt;jaxbContext.createUnmarshaller&lt;/b&gt;();&lt;br /&gt;    ElementoPrincipal leido =&lt;br /&gt;            (ElementoPrincipal) &lt;b&gt;unmarshaller.unmarshal&lt;/b&gt;(new StringReader(xml));&lt;br /&gt;    System.out.println(&amp;quot;\n\n&amp;quot; + &lt;b&gt;leido.getCampoDos&lt;/b&gt;());&lt;br /&gt;} catch (JAXBException e) {&lt;br /&gt;    e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Más sencillo no puede ser, al menos no se me ocurre, aunque veremos en futuros capítulos algunos ejemplos con algo más de miga.&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/java_y_xml_con_jaxb2</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/nuevo_intento</id>
        <title type="html">Nuevo intento</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/Ib1PEgeYE4Q/nuevo_intento" />
        <published>2007-12-05T03:36:25+01:00</published>
        <updated>2007-12-05T03:38:57+01:00</updated> 
        <category term="/General" label="General" />
        <category term="blogs" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Voy a volver a intentarlo. Se que soy una persona poco regular en este sentido, pero voy a intentar volver a escribir en el Blog._&lt;/p&gt;&lt;p&gt; Me he puesto varios objetivos:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Escribir más post, aunque sean cortos. De la información de estos post crearé un artículo para publicar en javaHispano. La primera serie de post será sobre JAXB2.&lt;/li&gt;&lt;li&gt;Hacer pruebas con técnicas de SEO y jugar con Adsense. A partir de ahora este blog es con ánimo de lucro... veremos si da para algo.&lt;/li&gt;&lt;li&gt;Escribir sobre movilidad, Java ME y Blackberry. Me muevo en ese mundo y no suelo hablar de el.&lt;/li&gt;&lt;/ul&gt;Ya veremos si me duran las ganas...&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/nuevo_intento</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/glassfish_v2_en_produccion</id>
        <title type="html">Glassfish v2 en producción</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/G790IsMK3Qk/glassfish_v2_en_produccion" />
        <published>2007-09-27T19:41:06+02:00</published>
        <updated>2007-12-05T02:43:43+01:00</updated> 
        <category term="/Java" label="Java" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="instalar" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="mod_jk" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;La semana pasada salió la versión final de &lt;a href="https://glassfish.dev.java.net/downloads/v2-b58g.html" target="_blank" title="Descarga de Glassfish v2"&gt;glassfish v2&lt;/a&gt;, y aprovechando la ocasión decidí instalarlo para un nuevo proyecto que he comenzado en &lt;a href="http://www.nht-norwick.com" target="_blank" title="Mi trabajo"&gt;NHT-Norwick&lt;/a&gt; y que cuenta con varios servicios Web.&lt;/p&gt;&lt;p&gt;La integración netbeans 6 / glassfish es perfecta (no podía ser de otra forma) y &lt;a href="http://weblogs.javahispano.org/lasterra/tags/glassfish_es+jaxws" target="_blank" title="Servicios Web con Netbeans y Glassfish"&gt;desarrollar servicios web con JavaEE5&lt;/a&gt; es de lo más sencillo_.&lt;/p&gt;&lt;p&gt;El único problema que tuve fue con la instalación del enlace &lt;a href="http://weblogs.javahispano.org/lasterra/entry/servidores_virtuales_con_glassfish_y" title="Glassfish detrás de Apache"&gt;mod_jk para glassfish&lt;/a&gt;, que obliga a introducir commons-logging dentro de las librerías del servidor y esto produjo conflictos con el log4j de mi aplicación. La solución fue mover log4j a las librerías del servidor para que lo cargase el mismo ClassLoader que commons-logging. La verdad es que había olvidado este tipo de problemas con los ClassLoaders desde que abandonamos el desarrollo de aplicaciones con EJB1.x y 2.x sobre JBoss, esperemos que solo fuese un susto ;-)&lt;/p&gt;&lt;p&gt;Por lo demás, sigo notando un poco lenta la interfaz de administración, pero me encuentro bastante cómodo con la interfaz de comandos, &lt;b&gt;asadmin&lt;/b&gt;, así que posiblemente solo la use puntualmente para visualizar las estadísticas de los servicios Web.&amp;nbsp;&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/glassfish_v2_en_produccion</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/resumen_pesca_tv</id>
        <title type="html">Resumen pesca TV</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/G7bVjwqycSo/resumen_pesca_tv" />
        <published>2007-06-15T03:48:46+02:00</published>
        <updated>2007-06-15T04:21:52+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="tv" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Casí un mes como blogger oficial de Glassfish en Español, veremos si da algún fruto, aunque tal y como viene de semana, con el más que probable descenso de la Real Sociedad, lo veo difícil.&lt;/p&gt;&lt;p&gt;A principios de semana me comunicaron que el concurso solo aceptaba el ingles como lenguajes, así que me he pasado la semana jugando con los traductores y viendo que saben algo más de ingles que yo, pero creo que tampoco saben suficiente.&lt;/p&gt;&lt;p&gt;&amp;nbsp;En definitiva el resumen queda con: &lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/tags/glassfish_es+instalar" target="_blank" title="3 Post de Instalación y actualización de Glassfish"&gt;3 Post de Instalación y actualización de Glassfish &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/tags/glassfish_es+jaxws" title="4 Post sobre Glassfish y JAX-WS con Netbeans"&gt;&lt;/a&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/tags/glassfish_es+jaxws" title="4 Post sobre Glassfish y JAX-WS con Netbeans"&gt;4 Post/serie Glassfish y JAX-WS con Netbeans&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/tags/glassfish_es+grizzly+virtualhost" title="3 Post sobre Glassfish/Grizzly (Aplicaciones Comet y Virtual Servers)"&gt;&lt;/a&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/tags/glassfish_es+grizzly" title="3 Post sobre Glassfish/Grizzly (Aplicaciones Comet y Virtual Servers)"&gt;3 Post sobre Glassfish/Grizzly (Aplicaciones Comet y Virtual Servers)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/tags/glassfish_es+idea" title="1 Post explicando como hacer debug con IntelliJ Idea sobre Glassfish"&gt;&lt;/a&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/tags/glassfish_es+idea" title="1 Post explicando como hacer debug con IntelliJ Idea sobre Glassfish"&gt;1 Post explicando como hacer debug con IntelliJ Idea sobre Glassfish&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/tags/glassfish_es+clustering" title="1 Post cluster sobre glassfish"&gt;1 Post cluster sobre glassfish&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;Muchos sitios se han hecho echo de mis post, destaco&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.sun.com/page/theaquarium?anchor=from_bilbao_glassfish_en_espa%C3%B1ol"&gt;The aquarium, From Bilbao -- GlassFish en Español&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.java.net/blog/jfarcand/archive/2007/06/grizzly_comet_o_1.html"&gt;Jean-Francois Arcand, Grizzly Comet Orbit Spain&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javahispano.org/news.item.action?id=787486161"&gt;Javahispano, Documentación glassfish en castellano&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Gracias a todos por los ánimos, a Sun Microsystem por la idea del premio y a los desarrolladores de glassfish por su gran trabajo.&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/entry/fish_tv_summary" title="In English"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/English_language_icon.png" /&gt; Fish TV Summary&lt;/a&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/resumen_pesca_tv</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/glassfish_clustering</id>
        <title type="html">Glassfish Clustering</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/kLXSzdH6ulw/glassfish_clustering" />
        <published>2007-06-15T02:55:50+02:00</published>
        <updated>2007-06-15T03:11:32+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="clustering" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Solo me queda por ver el soporte de &lt;a title="aquarium clustering" target="_blank" href="http://blogs.sun.com/theaquarium/tags/clustering"&gt;clustering &lt;/a&gt;para glassfish, punto destacado de la versión V2, y que puede ser otra de las funcionalidades que ayude a que glassfish se introduzca en el mercado.&lt;/p&gt;&lt;p&gt;Del soporte de clustering, lo primero que destaco es, la sencillez de la administración y las excelentes referencias que he encontrado que han hecho cuestionarme si este post era necesario. En los dos puntos se nota que hay una gran empresa detrás de glassfish y que aunque glassfish es open source, no ha perdido estos detalles respecto a sus antecesores Sun App Servers.&lt;/p&gt;&lt;p&gt;Ya explique en el primer post de la serie que glassfish podía contar con múltiples configuraciones llamadas dominios. Además de los dominos glassfish se puede instalar con 3 perfiles distintos: developer, enterprise y cluster. Haciendo un breve resumen, la versión developer es una única instancia que contiene la consola de administración y nuestras aplicadiones. La versión enterprise, cuenta con una instancia de administración, llamada DAS (Domain Administration Server) que permite administrar el resto de instancias del dominio (parar, arrancar, desplegar aplicaciones, etc). Por ultimo la versión cluster permite crear cluster de glassfish.&lt;/p&gt;&lt;p&gt;Por defecto y en el bundle de Netbeans se instala la versión developer, así que el primer paso es cambiar añadir el soporte de cluster, podeis ver como se realiza esta operación en el siguiente &lt;a href="http://download.java.net/javaee5/screencasts/AddClusterSupport/" target="_blank" title="Añadir Soperte Cluster en glassfish v2"&gt;screencast&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;El siguiente paso será &lt;a href="http://blogs.sun.com/dadelhardt/entry/clustering_web_applications_with_glassfish1" target="_blank" title="Crear Cluster glassfish"&gt;crear un cluster en glassfish&lt;/a&gt;, esto consiste en configurar varios nodos que alberguen nuestras aplicaciones. Se ve perfectamente en este &lt;a href="http://download.java.net/javaee5/screencasts/createCluster/" target="_blank" title="Create Glassfihs Cluster"&gt;screencast&lt;/a&gt; Estos nodos pueden estar en una misma máquina y distintos puertos o en distintas máquinas. En cualquier caso a través de la consola de administración administraremos el cluster como si de una única instancia se tratase, &lt;a href="http://download.java.net/javaee5/screencasts/availability/" target="_blank" title="glassfish cluster explanations"&gt;aquí se explica perfectamente&lt;/a&gt; .Como se ve al final del screencast, desplegar una aplicación es exactamente igual que hacerlo en una instancia única.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Para que el cluster tenga sentido debemos poner delante de el un balanceador de carga, que puede ser &lt;a href="http://blogs.sun.com/Prashanth/entry/load_balancing_glassfish_v2_with" target="_blank" title="Balanceo de Carga por Hardware con glassfish"&gt;hardware&lt;/a&gt; (muy caro) o un servidor web &lt;a href="http://blogs.sun.com/dadelhardt/entry/loadbalancing_with_mod_jk_and_glassfish" target="_blank" title="Glassfish Apache Cluster"&gt;Apache &lt;/a&gt;o Sun. Daros cuenta que las funcionalidades de un cluster consisten en replicar la sesión de un nodo a otro de tal forma que si el balanceador de carga me redirigía al nodo A o B, tengo que encontrar mis datos de la sesión en los dos nodos y mejor aún, si el nodo A falla, el balanceador me redirigira al nodo B donde estarán mis datos replicados. Podemos ver un &lt;a href="http://blogs.sun.com/nazrul/entry/under_the_hood_of_glassfish" target="_blank" title="NAZRUL glassfis FAQ"&gt;pequeño auto cuestionario / FAQ &lt;/a&gt;que Nazrul a preparado para ver las dudas de otros administradores&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Aunque bajo un ejemplo sencillo todo es ideal, crear un cluster es añadir un nivel de estabilidad, rendimiento y &lt;b&gt;complejidad, &lt;/b&gt;por lo que es necesarío valorar pros y contras. &lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/glassfish_clustering</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/javascript_thumbnail</id>
        <title type="html">Javascript Thumbnail</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/fgHtytiBIws/javascript_thumbnail" />
        <published>2007-06-13T02:37:04+02:00</published>
        <updated>2007-06-13T02:41:33+02:00</updated> 
        <category term="/General" label="General" />
        <category term="javascript" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="thumbnail" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Me han preguntado por el efecto que he puesto en las imagenes del blog, la verdad es que era justo lo que estaba buscando y lo encontre aquí &lt;a target="_blank" href="http://www.tufuncion.com/thumbnail-js"&gt;http://www.tufuncion.com/thumbnail-js&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;La diferencia entre este y el resto librerias que encontre, es que con este solo tienes que subir una imagen, algo muy imporante si no quieres pasarte la noche cortando y subiendo imagenes.&lt;/p&gt;&lt;p&gt;Para hacer que la imagen se vea pequeñita aplico un estilo a la etiqueta img que reduzca la imagen a un ancho determinado, mas concretamente: &lt;br /&gt;&lt;/p&gt;&lt;pre&gt;p a img {width:220px;border: 1px solid #000000; }&lt;/pre&gt;&lt;p&gt;Despues de subir la imagen el código html es siempre así: &lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;URLCOMPLETA.png&amp;quot; rel=&amp;quot;thumbnail&amp;quot;  &lt;br /&gt;      title=&amp;quot;TITULO&amp;quot;&amp;gt;&lt;br /&gt;         &amp;lt;img vspace=&amp;quot;0&amp;quot; hspace=&amp;quot;0&amp;quot; &lt;br /&gt;              border=&amp;quot;0&amp;quot; align=&amp;quot;bottom&amp;quot; &lt;br /&gt;              src=&amp;quot;URLCOMPLETA.png&amp;quot; &lt;br /&gt;              alt=&amp;quot;TITULO&amp;quot; /&amp;gt;&lt;br /&gt;   &amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Si alguien conoce algo más sencilo....&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/javascript_thumbnail</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/jugando_con_technorati</id>
        <title type="html">Jugando con Technorati</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/9v-qd_6HCOg/jugando_con_technorati" />
        <published>2007-06-13T02:29:51+02:00</published>
        <updated>2007-06-13T11:35:55+02:00</updated> 
        <category term="/General" label="General" />
        <category term="blogs" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="web20" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="technorati" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="weblogs" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Ahora que me estoy poniendo las pilas con el blog estoy jugando bastante con &lt;a title="web20 blogs community" target="_blank" href="http://www.technorati.com"&gt;technorati&lt;/a&gt;. Si no lo conoces y tienes un blog deberias de probarlo unos días, pero sufrirás los siguientes sintomas&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Repetiras fave-me-please sin saber my bien que significa&lt;/li&gt;&lt;li&gt;Tu autoridad no subirá por muchos gritos que des, necesitas que alguien te la de&lt;/li&gt;&lt;li&gt;Buscarás tus blogs amigos y los añadirás a tus favoritos&lt;/li&gt;&lt;li&gt;Encontraras nuevos amigos navegando por tus tags en technorati&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;La verdad es que me parece un software genial&lt;br /&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/jugando_con_technorati</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/glassfish_debug_con_intellij_idea</id>
        <title type="html">Glassfish debug con IntelliJ Idea</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/5B6P-TAqN2A/glassfish_debug_con_intellij_idea" />
        <published>2007-06-12T02:09:17+02:00</published>
        <updated>2007-06-15T03:12:01+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="idea" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="intellij" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="debug" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;El año pasado me &lt;a title="Yakov Sirotkin Java Champion" target="_blank" href="http://www.telamon.ru/%20%20"&gt;hicieron &lt;/a&gt;un regalo de lo más interesante, el Russian Development Pack compuesto de:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="IDEA" target="_blank" href="http://www.jetbrains.com/idea/"&gt;Intellij Idea&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Profiler" target="_blank" href="http://www.yourkit.com"&gt;YourKit Java Profiler&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Excelsior Jet JVM" target="_blank" href="http://www.excelsior-usa.com"&gt;Excelsior JET JVM&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Bugzilla trackeing system" target="_blank" href="http://almworks.com/deskzilla/overview.html"&gt;&lt;/a&gt;&lt;a title="Bugzilla trackeing system" target="_blank" href="http://almworks.com/deskzilla/overview.html"&gt;DeskZilla, Bugzilla tracking system&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a title="Bugzilla trackeing system" target="_blank" href="http://almworks.com/deskzilla/overview.html"&gt;&lt;/a&gt; El Idea me impresiono, ya tenia muy buenas referencias por parte de Roberto, pero ver lo tremendamente eficaz que es, sobre todo si ya llevas algunos años programando en Java, solo se puede explicar se lo utilizas durante un mes. &lt;/p&gt;&lt;p&gt;He utilizado Netbeans desde antes de que lo comprará Sun y lo llamase Forte for Java , los avances han sido increíbles, sobre todo los últimos años, pero sinceramente, aun le queda camino para tener la estabilidad del Idea, tanto camino como los 150€ que cuesta (promoción con javahispano finales de 2006). Y ciertamente, son 150€, pero creo también que deberíamos de ser los informáticos los primeros en reconocer y apreciar cuanto esfuerzo y calidad hay detrás de esa &amp;quot;ridícula&amp;quot; cifra.&lt;/p&gt;
&lt;p&gt;Para mi el debugger del Idea vale el doble de esa cantidad porque sencillamente funciona, y como no podía ser de otra forma, con Glassfish también funciona, aunque en este caso, solo lo hace &lt;b&gt;conectandose en remoto. &lt;/b&gt;Esto supone la pega de tener que arrancar el servidor a través de sus scripts de forma externa al IDE.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;El primer paso es configurar Glassfish para que arranque en modo debug, para ello con Glassfish arrancado y desde la consola de administración, marcamos la opción debug en las opciones del la JVM&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;
&lt;a title="Activar debug mode en Glassfish" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_1.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Activar debug mode en Glassfish" src="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_1.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Al hacer este cambio el servidor nos pide reiniciar por lo que ejecutamos:&lt;/p&gt;
&lt;p&gt; 
&lt;/p&gt;&lt;pre&gt;asadmin stop-domain domain1&lt;br /&gt;asadmin start-domain domain1&amp;nbsp;&lt;/pre&gt;


&lt;p&gt;Al iniciarse Glassfish debemos ver en la consola el siguiente mensajes &lt;br /&gt;&lt;/p&gt;&lt;pre&gt;Listening for transport dt_socket at address: 9009&lt;br /&gt;Application server is listening at address 9009 for debugger &lt;br /&gt;to attach using transport dt_socket&amp;nbsp;&lt;/pre&gt;

&lt;p&gt;A partir de este instante podemos conectarnos remotamente con un Debugger JPDA, en nuestro caso el del Idea. No voy a entrar en detalles de como crear un proyecto web en el entorno, pero si como ejecutar el proyecto en glassfish. Para ello, en la configuración de ejecución del proyecto añadimos una nueva configuración de servidor Glassfish Remoto&lt;/p&gt;
&lt;p&gt;
&lt;a title="Añadir configuración glassfish remoto en Idea" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_2.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Añadir configuración glassfish remoto en Idea" src="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_2.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
El siguiente paso es configurar el servidor Glassfish, para lo cual debemos seleccionar el directorio de instalación y añadir los .jar&amp;nbsp; que tengan las clases que vayamos a utilizar. Una vez hecho esto podemos dar un nombre al servidor y rellenar los datos de configuración del mismo (Puertos y claves de acceso)&lt;/p&gt;
&lt;p&gt;
&lt;a title="Configuración glassfish en Idea" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_3.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Configuración glassfish en Idea" src="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_3.png" /&gt;&lt;/a&gt;
&lt;a title="Configuración glassfish en Idea, asignación de nombre, puertos y claves" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_4.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Configuración glassfish en Idea, asignación de nombre, puertos y claves" src="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_4.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Por utlimo configuramos el puerto de debug al que se conectará el idea, en nuestro caso el 9009&lt;/p&gt;
&lt;p&gt;
&lt;a title="Configuración en Idea del puerto de debug de glassfish remoto" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_5.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Configuración en Idea del puerto de debug de glassfish remoto" src="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_5.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Con estos pasos bastan para tracear las aplicaciones desplegadas en Glassfish y como podeis ver hacer uso de toda la potencia del debugger del Idea.&lt;/p&gt;
&lt;p&gt;
&lt;a title="Idea Debugger en glassfish" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_6.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Idea Debugger en glassfish" src="http://weblogs.javahispano.org/lasterra/resource/glassfiah_debug_idea_6.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;a title="In English" href="http://weblogs.javahispano.org/lasterra/entry/glassfish_debug_with_intellij_idea"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/English_language_icon.png" /&gt; Virtual Servers with Glassfish and/or Apache&lt;/a&gt;&amp;nbsp; &lt;br /&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/glassfish_debug_con_intellij_idea</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/comet_en_glassfish_grizzly_con</id>
        <title type="html">Comet en Glassfish/Grizzly con Ajax o iframe</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/brcLAskuRZg/comet_en_glassfish_grizzly_con" />
        <published>2007-06-11T04:40:23+02:00</published>
        <updated>2007-06-15T03:12:17+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="streaming" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ajax" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="comet" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="prototype" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="grizzly" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;La verdad es que el ejemplo de &lt;a href="http://weblogs.java.net/blog/jfarcand/archive/2006/10/writting_a_come.html" target="_blank" title="Grizzly Comet Example"&gt;Jean-Francois&lt;/a&gt; me parecía demasiado complejo y me quede algo extrañado por el uso de un iframe como cliente del Comet... con todo lo que se habla de AJAX y las posibilidades de Comet, me parecía raro que &amp;quot;volvieramos&amp;quot; a usarlo.&lt;/p&gt;&lt;p&gt;La verdad, es que se nota bastante que esto del Comet es muy nuevo y no hay mucha información en internet, pero he podido encontrar cosas &lt;a href="http://ajaxpatterns.org/HTTP_Streaming" target="_blank" title="HTTP Streaming a.k.a. Comet"&gt;interesantes &lt;/a&gt;y razones por las cuales usar &lt;a href="http://softwareas.com/portable-comet-its-the-iframe-stupid" target="_blank" title="comet: iframe o ajax?"&gt;iframes o AJAX&lt;/a&gt; como cliente de Comet. Tengo que advertir, que si por algo no me destaco es por mis capacidades con javascript, pero conozco un poco y &lt;a href="http://weblogs.javahispano.org/woviux/" target="_blank" title="Roberto¡¡"&gt;me han hablado&lt;/a&gt; bien siempre de &lt;a href="http://prototypejs.org" target="_blank" title="Javascript + AJAX framework"&gt;Prototype&lt;/a&gt;, así que el objetivo era que el cliente AJAX fuera realizado con este framework. Empezemos:&lt;/p&gt;&lt;p&gt;Ya vimos lo sencilla que era la implementación de Comet en Grizzly, pero repito explicación sobre mi ejemplo que tiene menos funcionalidades. &lt;/p&gt;&lt;p&gt;1.- Registramos el comet bajo un nombre. Puede coincidir con una URL para dar sentido a las operaciones pero no es algo obligatorio. Esta operación se debe realizar antes que ninguna otra, por lo que su ubicación natural es el método init de un Servlet. Si además configurames el servlet para que se inicie al arrancar nuestra aplicación con la etiqueta &amp;lt;load-on-startup&amp;gt;0&amp;lt;/load-on-startup&amp;gt; nos evitaremos problemas.&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;public void init (ServletConfig config) throws ServletException&lt;br /&gt;{&lt;br /&gt;    super.init(config);&lt;br /&gt;    //comet = servlet context path pero no es obligatorio&lt;br /&gt;    contextPath = config.getServletContext()&lt;br /&gt;            .getContextPath() + &amp;quot;/subscription&amp;quot;;&lt;br /&gt;    CometEngine cometEngine = CometEngine.getEngine();&lt;br /&gt;    context = cometEngine.register(contextPath);&lt;br /&gt;    context.setExpirationDelay(40 * 1000); //segundos de delay&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;2.-El Servlet solo va a realizar dos operaciones registrar al cliente en el Comet y enviar notificaciones a todos los clientes conectado. Para enviar la notificación se debe enviar el parametro &lt;b&gt;notificar &lt;/b&gt;al Servlet. Para garantizar que un cliente no intenta conectarse dos veces, se crea una variable de sesión, conectado, que se comprueba que no exista antes de conectarse.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;protected void doPost(HttpServletRequest request, &lt;br /&gt;   HttpServletResponse response) &lt;br /&gt;   throws ServletException, IOException {&lt;br /&gt;  if (request.getParameter(&amp;quot;notificar&amp;quot;)==null&lt;br /&gt;     &amp;amp;&amp;amp; request.getSession().getAttribute(&amp;quot;conectado&amp;quot;)==null)&lt;br /&gt;  {//conecto el cliente al comet&lt;br /&gt;     response.setContentType(&amp;quot;text/html&amp;quot;);//muy importante&lt;br /&gt;     EjemploCometHandler handler = new EjemploCometHandler();&lt;br /&gt;     andler.attach(response.getWriter());&lt;br /&gt;     int handlerId = context.addCometHandler(handler);&lt;br /&gt;     request.getSession().setAttribute(&amp;quot;conectado&amp;quot;, &lt;br /&gt;          Integer.valueOf(handlerId));&lt;br /&gt;     response.getWriter().print(&amp;quot;Conectado al Commet&lt;br /&gt;&amp;quot;);&lt;br /&gt;     response.getWriter().flush();&lt;br /&gt;     //no cerramos la conexion.. que de eso se trata&lt;br /&gt;  }else if (request.getParameter(&amp;quot;notificar&amp;quot;)!=null){&lt;br /&gt;     context.notify(&amp;quot;Envio a todos los usuarios conectados al comet&lt;br /&gt;&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;  return;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3.- El CometHandler implementado para el ejemplo se limita a enviar los mensajes de notificación y a informar de la desconexión&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;public class EjemploCometHandler implements CometHandler&lt;printwriter&gt; {&lt;br /&gt;&lt;br /&gt;    private PrintWriter printWriter=null;&lt;br /&gt;&lt;br /&gt;    public void attach(PrintWriter printWriter) {&lt;br /&gt;        this.printWriter = printWriter;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void onEvent(CometEvent event) throws IOException {&lt;br /&gt;       printWriter.println(event.attachment());&lt;br /&gt;       printWriter.flush();        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void onInitialize(CometEvent event) throws IOException {&lt;br /&gt;        printWriter.println(&amp;quot;onInitialize&amp;quot;);&lt;br /&gt;        printWriter.flush();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void onTerminate(CometEvent event) throws IOException {&lt;br /&gt;        printWriter.println(&amp;quot;onTerminate&amp;quot;);&lt;br /&gt;        printWriter.flush();&lt;br /&gt;        printWriter.close();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void onInterrupt(CometEvent event) throws IOException {&lt;br /&gt;        printWriter.println(&amp;quot;onInterrup&amp;quot;);&lt;br /&gt;        printWriter.flush();&lt;br /&gt;        printWriter.close();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/printwriter&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Con esto ya tenemos desarrollada la parte del servidor, ahora vamos al cliente. Como decía al principio hay dos posibilidades AJAX o iframe. Todo apunta a que la mejor opción es la del iFrame, por varias razones:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Un navegador solo puede abrir dos conexiones HTTP desde una página/frame, por lo que si mantenemos una abierta para el Comet, solo nos queda una libre para realizar llamadas.&lt;/li&gt;&lt;li&gt;El iframe funciona en todos los navegadores mientras que AJAX en InternetExplorer parece tener problemas con Comet, ya que en este navegador AJAX no es consciente de la información que va llegando hasta que se cierra la conexión :-(&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Veamos el código del ejemplo del cliente con el iframe, por un lado tenemos el iframe que se conecta al comet. El boton realiza un llamada Ajax que actualiza el iframe de la misma página y la de todos los clientes conectados:&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Ejemplo Comet iFrame&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src=&amp;quot;prototype.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;iframe src=&amp;quot;subscription&amp;quot; name=&amp;quot;comet&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;script type=&amp;quot;text/javascript&amp;quot; language=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function notificarComet(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var url = 'subscription';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Ajax.Request( url, {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; method: 'get',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters: 'notificar=true'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ]]&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/script&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;lt;input type=&amp;quot;button&amp;quot; name=&amp;quot;a&amp;quot; value=&amp;quot;notificar&amp;quot; &lt;br /&gt;         onclick=&amp;quot;notificarComet();&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt; &lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
La &lt;a title="Prototype mailing list" target="_blank" href="http://groups.google.com/group/rubyonrails-spinoffs/browse_thread/thread/b24dc8757411ed8b/e4ac3c3195b203b7?lnk=gst&amp;amp;q=comet&amp;amp;rnum=3#e4ac3c3195b203b7"&gt;única forma que he encontrado&lt;/a&gt; para hacer los mismo con Prototype y sabiendo que solo funciona en firefox es la siguente, tras hacer la petición y conectar al Comet, es necesario introducir el cliente en un bucle que vaya comprobando si se ha enviado información desde el Comet:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Ejemplo Comet Ajax&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;script src=&amp;quot;prototype.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;script type=&amp;quot;text/javascript&amp;quot; language=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function comet(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var url = 'subscription';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var listener=null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Ajax.Request(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { onInteractive: function(xhr){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!listener){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener=new PeriodicalExecuter(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('update').update(xhr.responseText);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 /* check for changes every 1 second*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function notificarComet(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var url = 'subscription';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Ajax.Request( url, {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; method: 'get',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters: 'notificar=true&amp;amp;t='+new Date().getTime()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ]]&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/head&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;lt;body onload=&amp;quot;comet();&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;div id=&amp;quot;update&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;input type=&amp;quot;button&amp;quot; name=&amp;quot;a&amp;quot; value=&amp;quot;notificar&amp;quot; &lt;br /&gt;         onclick=&amp;quot;notificarComet();&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;p&gt;
No parece que Prototype se haya preparado para Comet. Sin embargo otro framework javascript muy conocido, &lt;a title="Javascript + AJAX framework" target="_blank" href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt;, esta muy integrado con un servidor Comet, www.cometd.org, y con el no hay que recurrir a trucos como en Prototype, ya que cuenta con la operación &lt;i&gt;&lt;code&gt;dojo.io.bind() &lt;/code&gt;&lt;/i&gt;que me temo habrá que probar en próximos capítulos. Mientras &lt;a title="Comet on glassfish Example" href="http://weblogs.javahispano.org/lasterra/resource/ejemplos/glassfish_comet.war_"&gt;os dejo el ejemplo&lt;/a&gt; para que lo probéis.&lt;/p&gt;
&lt;a title="In English" href="http://weblogs.javahispano.org/lasterra/entry/comet_in_glassfish_grizzly_with"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/English_language_icon.png" /&gt; Comet in Glassfish/Grizzly with Ajax or iframe&lt;/a&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/comet_en_glassfish_grizzly_con</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/servidores_virtuales_con_glassfish_y</id>
        <title type="html">Servidores Virtuales con Glassfish y/o Apache</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/IrIsAQCjGMI/servidores_virtuales_con_glassfish_y" />
        <published>2007-06-08T03:09:23+02:00</published>
        <updated>2007-06-15T03:12:18+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="grizzly" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="directoriovirtual" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="virtualhost" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ajp" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="mod_jk" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="apache" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="httpd" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="virtualdirectory" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Una de la razones por las que usuaria &lt;a href="https://glassfish.dev.java.net/" target="_blank" title="Glassfish JavaEE 5 RI"&gt;Glassfish &lt;/a&gt;en vez de &lt;a href="http://tomcat.apache.org" target="_blank" title="Contenedor de servlets Tomcat"&gt;Tomcat &lt;/a&gt;sería la posibilidad de eliminar &lt;a href="http://httpd.apache.org/" target="_blank" title="Servidor Web Apache"&gt;Apache &lt;/a&gt;y conseguir que mis aplicaciones corran completamente sobre la plataforma Java. A día de hoy todas mis aplicaciones usan Apache por la mejora de rendimiento al servir contenido estático y por la configuración de los VirtualHost de cada una de las aplicaciones. Si con Grizzly parece que el rendimiento del servicio HTTP/S de Glassfish parece que no va a ser un problema, veamos si su soporte de Virtual Hosts es suficiente.&lt;/p&gt;&lt;p&gt;Ya veíamos en el ultimo post que a través de la consola de administración podíamos configurar el servicio HTTP. Esta configuración se base en tres apartados:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;El propio Servicio HTTP donde podemos configurar:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;El sistema de logs de acceso a nuestras aplicaciones (rotado e información que se registra)&lt;/li&gt;&lt;li&gt;Configuración del tratamiento de peticiones HTTP entrantes (RequestProcessing)&lt;/li&gt;&lt;li&gt;Gestión de las conexiones &amp;quot;keep-alive&amp;quot; (configuración de timeouts, y limete de conexiones)&lt;/li&gt;&lt;li&gt;Configuración del Pool de conexiones HTTP que están a la espera de recibir peticiones&lt;/li&gt;&lt;li&gt;Definición de los valores por devolverá el servidor en las cabeceras HTTP&lt;/li&gt;&lt;li&gt;Configuración de la cache de contenido estático para mejorar el rendimiento&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Listeners HTTP son sockets (IP+Puerto) que estan a la escucha de peticiones HTTP. Además de esta configuración un listener puede estar asociado a un VirtualServer / VirtualHost por defecto y a varios nombres de máquina. Todos los listeners utilizan la configuración del Servicio HTTP de Glassfish. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Por último los Virtual Servers (Me gusta más el nombre de VirtualHost) son la configuración del direccionamiento de un dominio/host a uno o varios listeners. De esta forma asignamos la dirección de acceso de nuestras aplicaciones a una instancia de Glassfish. Un Virtual Server se puede asociar a una aplicación en concreto, por lo que al escribir el dominio se direccionaría a dicha aplicación montada como ROOT. Es importante destacar que tras cambiar la configuración de un Virtual Server no es necesario reiniciar Glassfish.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;
&lt;a title="Configuración Listener HTTP Glassfish" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/glassfish_virtualhost_1.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Configuración Listener HTTP Glassfish" src="http://weblogs.javahispano.org/lasterra/resource/glassfish_virtualhost_1.png" /&gt;&lt;/a&gt;
&lt;a title="Configuración Virtual Server Glassfish" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/glassfish_virtualhost_2.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Configuración Virtual Server Glassfish" src="http://weblogs.javahispano.org/lasterra/resource/glassfish_virtualhost_2.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;La verdad es que se pueden realizar las configuraciones básicas, yo diría que esta al mismo nivel del Tomcat pero con una administración más sencilla, pero sigo echando en falta algunas cosas que suelo usar en el Apache como por ejemplo la posibilidad de hacer redirecciones. Para solventar esto en glassfish podemos utilizar &lt;a href="http://tuckey.org/urlrewrite/" target="_blank" title="URL Rewrite Servlet Filter"&gt;URLRewriteFilter&lt;/a&gt;, que es muy completo y funciona a las mil maravillas.&lt;/p&gt;&lt;p&gt;En cualquier caso, si las funcionalidades de Glassfish como servidor Web no te parecen suficientes o si bien necesitas &lt;a href="http://httpd.apache.org/" target="_blank" title="Servidor Web Apache"&gt;Apache &lt;/a&gt;por otras razones, Glassfish soporta el protocolo AJP, por lo que puedes configurar el Apache con mod_jk por delante de el.&lt;/p&gt;&lt;p&gt;Para ello debemos seguir los &lt;a title="Apache Glassfish Post" target="_blank" href="http://weblogs.java.net/blog/amyroh/archive/2006/08/glassfish_suppo.html"&gt;siguientes pasos&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;1.- Añadir una propiedad al lanzar la JVM a través de la consola de administración,&lt;/p&gt;
&lt;p&gt;
&lt;a title="Añadir Opción JVM de conector JK en Glassfish" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/glassfish_virtualhost_3.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Añadir Opción JVM de conector JK en Glassfish" src="http://weblogs.javahispano.org/lasterra/resource/glassfish_virtualhost_3.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;o desde la consola&lt;br /&gt;
&lt;/p&gt;&lt;pre&gt;$GLASSFISH_HOME/bin/asadmin create-jvm-options &lt;br /&gt;-Dcom.sun.enterprise.web.connector.enableJK=8009 &lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;2.- Copiar desde Tomcat 5.5.x a %GLASSFISH%/lib las librerias&lt;/p&gt;&lt;ul&gt;&lt;li&gt;%TOMCAT%/server/lib/tomcat-ajp.jar &lt;br /&gt;&lt;/li&gt;&lt;li&gt;%TOMCAT%/server/lib/commons-modeler2.0.jar&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;3.- Copiar commons-logging.jar a %GLASSFISH%/lib&lt;/p&gt;
&lt;p&gt;4.- Opcionalmente, configurar el conector AJP con un fichero de propiedades mediante la variable de la JVM &lt;br /&gt;&lt;/p&gt;&lt;pre&gt;$GLASSFISH_HOME/bin/asadmin create-jvm-options &lt;br /&gt;-Dcom.sun.enterprise.web.connector.enableJK.propertyFile=&lt;br /&gt;/path/glassfish/domains/domain1/config/glassfish-jk.properties&amp;nbsp;&lt;/pre&gt;


&lt;p&gt;La verdad es que esperaba un paso más por parte de Glassfish en este sentido. Siguen trabajando en ello y para la v2 se ha introducido el soporte de &lt;a href="http://blogs.sun.com/jluehe/entry/new_support_for_virtual_directory" target="_blank" title="Soporte directorio virtual en Glassfish"&gt;directorios virtuales&lt;/a&gt;, pero Apache sigue dando mucha más versatilidad. Veremos si Grizzly ahora independiente de Glassfish tiene también algo que decir.&lt;/p&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/entry/virtual_servers_with_glassfish_and" title="In English"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/English_language_icon.png" /&gt; Virtual Servers with Glassfish and/or Apache&lt;/a&gt; &lt;br /&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/servidores_virtuales_con_glassfish_y</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/mi_primera_aplicacion_comet_en</id>
        <title type="html">Mi primera aplicacion Comet en Glassfish</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/ztK6B3u3aoA/mi_primera_aplicacion_comet_en" />
        <published>2007-06-07T01:43:22+02:00</published>
        <updated>2007-06-15T03:12:28+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="comet" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="grizzly" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="web20" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Grizzly es un framework de desarrollo de servidores Java. No vamos a desarrollar un servidor, ni mucho menos, pero vamos a intentar ver las posibilidades que nos ofrece Grizzly dentro de Glassfish.&lt;/p&gt;&lt;p&gt;Gracias a Grizzly nuevos proyectos nacidos recientemente como JRuby o Phobos cuentan con un rendimiento envidiable y una base solida y estable por su extenso uso en Glassfish como conector HTTP. Esta fue la idea inicial con la que nació, dar soporte HTTP al servidor de aplicaciones de Sun, por entonces el Sun Aplication Server 8.1, para que este pudiera funcionar de forma independiente sin servidor Web.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Grizzly, según sus autores, consigue excelentes rendimientos gracias a que usa la &amp;quot;nueva&amp;quot; librería de entrada/salida introducida en la JDK1.4: NIO. Esta librería además aportar facilidades para desarrollar servidores no bloqueantes (asincronos) lo cual puede resultar muy interesante como veremos a continuación.&lt;/p&gt;&lt;p&gt;Además de su rendimiento Grizzly es tremendamente &amp;quot;programable&amp;quot;. En el Weblog de &lt;a href="http://weblogs.java.net/blog/jfarcand/" target="_blank" title="Grizzly framework author"&gt;Jean-Francois Arcand&lt;/a&gt; podéis encontrar muchísima información pero de lo que yo he leído, destaco cosas tan sorprendentes como la capacidad de desarrollar un control de cuotas de ancho de banda o acceder a la capa de conexiones HTTP del servidor para poder realizar cosas tan novedosas como las aplicaciones &lt;a href="http://en.wikipedia.org/wiki/Comet_%28programming%29" target="_blank" title="Aplicaciones Commet Wikipedia"&gt;Comet&lt;/a&gt;. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Estas aplicaciones consisten en enviar datos desde el servidor al navegador sin necesidad de que se realicen peticiones por parte del cliente. Para que este envió &lt;i&gt;&lt;b&gt;push &lt;/b&gt;&lt;/i&gt;sea posible, el servidor debe registrar y mantener una conexión abierta con los usuarios que se subscriben a la información que será enviada. El ejemplo más claro es el de un chat web como el de GMail, donde el envío de un usuario se ve reflejado en la pantalla de todos los usuarios conectados al chat. &lt;/p&gt;&lt;p&gt;El primer paso para realizar una aplicación comet es configurar el listener-http. En la instalación por defecto de Glassfish V2 existen dos listener el http y el https, para el ejemplo hay que añadir la propiedad cometSupport al http-listener-1 con valor true y eliminar la propiedad proxiedProtocols, que parece que no se lleva muy bien con el soporte de Comet. (Lo estoy consultando)&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/resource/glassfish_grizzly_comet_1.png" rel="thumbnail" title="Configuración Listener HTTP ara aplicaciones Comet"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/glassfish_grizzly_comet_1.png" alt="Configuración Listener HTTP ara aplicaciones Comet" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Una vez nuestro servidor esta preparado vamos a utilizar un &lt;a href="http://weblogs.java.net/blog/jfarcand/archive/examples.jar" target="_blank" title="Comet Chat Example"&gt;ejemplo de chat &lt;/a&gt;desarrollado por Jean-Francoise y comentado en su &lt;a title="Writing a Comet" target="_blank" href="http://weblogs.java.net/blog/jfarcand/archive/2006/10/writting_a_come.html"&gt;blog&lt;/a&gt;. El servlet de una aplicación comet como el del ejemplo, debe instanciarse y ejecutar su método init al arrancar la aplicación, por lo que debemos añadir a su configuración en el &lt;a title="Web.xml del ejemplo" target="_blank" href="https://glassfish.dev.java.net/source/browse/*checkout*/glassfish/appserv-http-engine/examples/WEB-INF/web.xml?rev=1.2"&gt;web.xml&lt;/a&gt; la etiqueta &amp;lt;load-on-startup&amp;gt;0&amp;lt;/load-on-startup&amp;gt;. De esta forma obtenemos el contexto o ruta (CometContext) donde se van a esperar las conexiones antes de que la aplicación este funcionando. Podemos decir que el &lt;a href="https://glassfish.dev.java.net/source/browse/*checkout*/glassfish/appserv-http-engine/src/java/com/sun/enterprise/web/connector/grizzly/comet/CometContext.java" target="_blank" title="CometContext Source code"&gt;CometContext &lt;/a&gt;es el enlace del API de Comet con Grizzly.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;super.init(config);&lt;br /&gt;contextPath = config.getServletContext().getContextPath()+&amp;quot;/chat&amp;quot;;&lt;br /&gt;CometEngine cometEngine = CometEngine.getEngine();&lt;br /&gt;CometContext context = cometEngine.register(contextPath);    &lt;br /&gt;context.setExpirationDelay(20 * 1000);&amp;nbsp;&lt;/pre&gt;

&lt;p&gt;Una vez el servlet se ha iniciado y por tanto tenemos el contexto comet, los usuarios pueden acceder al chat. Cuando esto ocurre el ejemplo registra el nombre del usuario en la sessión y redirecciona a la página chat.jsp, compuesta por dos iframes.
&lt;/p&gt;
&lt;p&gt;El primero de ellos es la pantalla donde se muestran los mensajes de los usuarios del chat. Se puede decir que este iframe es el que muestra el uso de la tecnología comet. Para ello llama al servlet del ejemplo enviando el parametro &lt;b&gt;openchat&lt;/b&gt;. En el servlet al llegar esta petición se crea un &lt;a href="https://glassfish.dev.java.net/source/browse/*checkout*/glassfish/appserv-http-engine/src/java/com/sun/enterprise/web/connector/grizzly/comet/CometHandler.java" target="_blank" title="CometHandler Source code"&gt;CometHandler&lt;/a&gt;. Este interfaz que debemos implementar es el enlace entre nuestra aplicación y Grizzly. Se encarga de registrar el ciclo de vida y los eventos/notificaciones generados en el contexto. Además tiene la posibilidad de &lt;b&gt;adjuntar&lt;/b&gt; recursos de la aplicación para hacer uso de ellos al producirse estos eventos. El caso más habitual es adjuntar los streams de salida (HTTPServletResponse ó PrintWriter) para enviar los datos al cliente.&lt;br /&gt;
Una vez hemos creado el handler, debemos añadirlo al contexto vinculando así al usuario. mas concretamente a su conexión HTTP.&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;CometRequestHandler handler = new CometRequestHandler();&lt;br /&gt;handler.clientIP = request.getRemoteAddr();&lt;br /&gt;handler.attach(response.getWriter());&lt;br /&gt;cometContext.addCometHandler(handler);&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Todos los eventos que se produzcan en el contexto comet a partir de ahora mediante las llamadas a la operación &lt;b&gt;CometContext.notify() &lt;/b&gt;serán enviados como eventos al handler del usuario (Típica implementación del patrón Observer). Estos eventos se generan desde el segundo iframe, que se encarga de enviar los mensajes del chat. El servlet en este caso, traduce el mensajes de los usuarios en un evento lanzado a todos los usuarios vinculados al contexto mediante la ya nombrada operación &lt;b&gt;notify&lt;/b&gt; y por tanto generando una llamada a la operación onEvent del interfaz CometHandler. 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;cometContext.notify(&amp;quot;[ &amp;quot; + username + &amp;quot; ]  &amp;quot; + message + &amp;quot; &amp;quot;); &lt;br /&gt;&lt;/pre&gt;



&lt;p&gt;
La operación onEvent del Handler recibe como parámetro el último interfaz de esta pequeña API, el &lt;a href="https://glassfish.dev.java.net/source/browse/*checkout*/glassfish/appserv-http-engine/src/java/com/sun/enterprise/web/connector/grizzly/comet/CometEvent.java" target="_blank" title="CometEvent Source code"&gt;CometEvent&lt;/a&gt;. Bajo este interfaz se almacena toda la información del CometContext y el objeto adjunto a la notificación, en el ejemplo, el mensaje enviado por algún usuario. Como el handler ya tiene los recursos necesarios para enviar los datos al usuarios, tan solo debe redireccionar la información adjunta al evento hasta el cliente. &lt;br /&gt;&lt;/p&gt;&lt;pre&gt;printWriter.println(event.attachment());&lt;br /&gt;printWriter.flush();&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Y esto es todo, creo que merece la pena descargar el ejemplo y probarlo. Hace algunas cosas más de las que comento en el post, pero la basé es asi de simple: tres interfaces implementando un patron Observer. La verdad es que se me ocurren un par de ejemplos de donde usar esta técnologia... veremos si los pongo en práctica.&lt;/p&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/entry/my_first_comet_application_in" title="In English"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/English_language_icon.png" /&gt; My first Comet Application in Glassfish&lt;/a&gt; &lt;br /&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/mi_primera_aplicacion_comet_en</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/servicios_web_para_java_ee3</id>
        <title type="html">Servicios Web para Java EE 5 en Glassfish (4)</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/9Axx6dNQM4E/servicios_web_para_java_ee3" />
        <published>2007-06-05T02:12:05+02:00</published>
        <updated>2007-06-15T04:11:10+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="monitorizacion" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="monitoring" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javaee" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javaee5" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="jaxws" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="serviciosweb" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Finalizo la serie destinada a los &lt;a href="http://weblogs.javahispano.org/lasterra/tags/glassfish+jaxws" title="Glassfish JAX-WS"&gt;servicios web en glassfish&lt;/a&gt; con la monitorización. Glassfish ofrece múltiples opciones de monitorización que nos permiten conocer el rendimiento de nuestro servidor. En caso de que este rendimiento no sea el esperado, tendremos unos datos muy valiosos para poder cambiar la configuración del servidor y/o nuestra programación buscando mejoras en el mismo.&lt;/p&gt;&lt;p&gt;Por defecto estas opciones vienen desactivadas por lo que el primer paso será activarlas. Para ello dentro de la consola de administración, volvemos al apartado de servicios Web, seleccionamos el Servicio y en la ventana de la derecha nos dirigimos a la pestaña de &lt;strong&gt;Monitor--&amp;gt;Configuration&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_27.png" rel="thumbnail" title="Pestaña de configuración del Monitor de Servicios Web en Glassfish"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_27.png" alt="Pestaña de configuración del Monitor de Servicios Web en Glassfish" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;En esta pantalla cambiamos el nivel de monitorización fijándolo en &lt;strong&gt;High&lt;/strong&gt; y pulsamos guardar. A partir de este momento las llamadas al servicio Web serán monitorizadas. Arrancamos nuestra aplicación cliente, y ejecutamos varias veces las JSP que realiza la llamada al servicio Web.&lt;br /&gt;
Como resultado en la pestaña &lt;strong&gt;Mesagges&lt;/strong&gt; vemos un listado con todas las llamadas realizadas por nuestro cliente del servicio Web. Por cada una de las llamadas podemos ver el tiempo de respuesta, el tamaño, la dirección IP del cliente, y si el resultado ha sido correcto o no.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_28.png" rel="thumbnail" title="Listado de mensajes hacia el servicio Web monitorizados por Glassfish"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_28.png" alt="Listado de mensajes hacia el servicio Web monitorizados por Glassfish" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Si seleccionamos uno de estos mensajes, haciendo click sobre la fecha, vamos a la pantalla con toda la información sobre el mensaje. En esta pantalla además de los datos anteriores podemos ver las variables de cabecera que ha enviado el cliente, o los mensajes de error producidos por la respuesta. Además si pulsamos en los botones &lt;strong&gt;View Request XML/View Response XML&lt;/strong&gt; podemos ver los mensajes XML entrantes y salientes, algo que puede resultar muy útil en fases de desarrollo de la aplicación.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_29.png" rel="thumbnail" title="Propiedades de un mensaje monitorizado por Glassfish"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_29.png" alt="Propiedades de un mensaje monitorizado por Glassfish" /&gt;&lt;/a&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_30.png" rel="thumbnail" title="XML de mensaje entrante al servicio Web monitorizado por Glassfish"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_30.png" alt="XML de mensaje entrante al servicio Web monitorizado por Glassfish" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Por ultimo, el monitor de servicios Web nos ofrece unas estadísticas generales muy útiles. Datos relacionados con los tiempos de respuesta o el rendimiento medido en peticiones por segundos, nos pueden hacer ver la capacidad y los limites de nuestros servicios Web.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_31.png" rel="thumbnail" title="Estadísticas de un servicio Web monitorizado por Glassfish"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_31.png" alt="Estadísticas de un servicio Web monitorizado por Glassfish" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Vamos a dar un paso más en la monitorización accediendo al menú configuración, al apartado &lt;strong&gt;Monitoring&lt;/strong&gt;.En esta pantalla vemos todos los servicios que podemos monitorizar en Glassfish. Para el caso que nos aborda basta con activar la monitorización en la JVM, HTTP Service y Web Container.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_32.png" rel="thumbnail" title="Activación servicios Generales de Monitorización"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_32.png" alt="Activación servicios Generales de Monitorización" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Una vez activados los servicios de monitorización, vemos como en el listado de mensajes nos aparece un enlace llamado Call Flow. A través de este enlace podemos visualizar en que servicio dentro de la arquitectura interna de Glassfish se ha consumido el tiempo de respuesta del mensaje.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_33.png" rel="thumbnail" title="Enlace Call Flow en lista de mensajes de Servicio Web Glasfish"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_33.png" alt="Enlace Call Flow en lista de mensajes de Servicio Web Glasfish" /&gt;&lt;/a&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_34.png" rel="thumbnail" title="Detalles del call flow de un mensaje hacia el Servicio Web"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_34.png" alt="Enlace Call Flow en lista de mensajes de Servicio Web Glasfish" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;En el menú &lt;strong&gt;Application Server --&amp;gt; Monitor&lt;/strong&gt; se pueden ver estas y otras opciones de monitorización de las que se puede destacar:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Estadísticas de mensajes de nivel warning y error en los ficheros de logs del servidor. &lt;p&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_35.png" rel="thumbnail" title="Estadísticas de mensajes de nivel warning y error en los ficheros de logs del servidor"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_35.png" alt="EEstadísticas de mensajes de nivel warning y error en los ficheros de logs del servidor" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Situación del entorno (Runtime) mediante consulta de varibles JMX.&lt;p&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_36.png" rel="thumbnail" title="Situación del entorno (Runtime)"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_36.png" alt="Situación del entorno (Runtime)" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;nbsp;Estareis de acuerdo conmigo en que es un pequeño lujo tener todas estas opciones de serie al trabajar con Glassfish. En fin... Yo &lt;a href="http://java.sun.com/javaee/community/campaigns/gftv-052007/welcome.jsp" target="_blank" title="glasfish Flat Screen 52'"&gt;sigo de pesca&lt;/a&gt;, la próxima parada puede ser cluster o grizzly... lo consultare con la almohada&lt;/p&gt;&lt;a title="In English" href="../../lasterra/entry/web_services_for_java_ee3"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="../../lasterra/resource/English_language_icon.png" /&gt; Web services for Java EE 5 in Glassfish (4)&lt;/a&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/servicios_web_para_java_ee3</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/servicios_web_para_java_ee2</id>
        <title type="html">Servicios Web para Java EE 5 en Glassfish (3)</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/I4Ofz7HjzNE/servicios_web_para_java_ee2" />
        <published>2007-06-04T02:07:46+02:00</published>
        <updated>2007-06-15T04:11:30+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="javaee5" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="jaxws" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javaee" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="serviciosweb" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Ya hemos visto &lt;a title="Parte 1" target="_blank" href="http://weblogs.javahispano.org/lasterra/entry/servicios_web_para_java_ee"&gt;como se hace un servicio Web en JavaEE 5&lt;/a&gt; e incluso hemos &lt;a title="Parte 2" target="_blank" href="http://weblogs.javahispano.org/lasterra/entry/servicios_web_para_java_ee1"&gt;buceado un poco dentro de el código &amp;quot;no&amp;quot; generado&lt;/a&gt;. Ahora toca ver como realizar un cliente del servicio Web.&lt;/p&gt;&lt;p&gt;Para ello nos vamos a ayudar del &lt;a title="Netbeans 6.0 Download" target="_blank" href="http://www.netbeans.org/community/releases/60/index.html"&gt;netbeans 6&lt;/a&gt;. Gracias a el vamos a ver como generar un cliente de un servicio Web es una tarea extremadamente sencilla. No necesitamos conocer JSRs, ni especificaciones, tan solo necesitamos la dirección del servicio Web, del resto se encarga Netbeans y &lt;a title="Java Api for Web Services" target="_blank" href="https://jax-ws.dev.java.net/"&gt;JAX-WS&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;El cliente del servicio Web será otra aplicación Web, por lo que el primer paso es crear un nuevo proyecto. Una vez lo tenemos creado, mediante el asistente, creamos un cliente de un servicio Web:&lt;/p&gt;
&lt;p&gt;
&lt;a title="Inicio Asistente Cliente de Servicio Web con Netbeans 6" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_19.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Inicio Asistente Cliente de Servicio Web con Netbeans 6" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_19.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;El asistente nos da tres opciones para introducir la dirección del descriptor del servicio Web, el archivo WSDL. Si como en nuestro caso, servidor y cliente son proyectos de Netbeans, podemos seleccionar la primera opción, &lt;strong&gt;project&lt;/strong&gt;. Netbeans nos muestra la lista de proyectos con servicios Web, de la
cual debemos seleccionar el servicio Web para el que queremos generar
el cliente.&lt;/p&gt;
&lt;p&gt;
&lt;a title="Asistente Cliente de Servicio Web con Netbeans 6, selección descriptor en proyecto" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_20.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Asistente Cliente de Servicio Web con Netbeans 6, selección descriptor en proyecto" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_20.png" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;La otra opción, y la que más se suele usar, es la de introducir la dirección del descriptor del servicio Web. Para ello, como ya vimos en días anteriores, copiamos la dirección del servicio Web desde la consola de administración de Glassfish y la introducimos en el campo habilitado a tal efecto en el asistente:&lt;/p&gt;
&lt;p&gt;
&lt;a title="Dirección del WSDL en la consola de administración de Glassfish" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_21.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Dirección del WSDL en la consola de administración de Glassfish" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_21.png" /&gt;&lt;/a&gt;
&lt;a title="Pegar la dirección del WSDL en el campo del asistente y especificar el paquete" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_22.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Pegar la dirección del WSDL en el campo del asistente y especificar el paquete" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_22.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Debemos especificar a que paquete se asignará al código generado por el asistente, en mi caso escribo &lt;/p&gt;&lt;pre&gt;org.lasterra.glassfish.client&lt;/pre&gt;Al pulsar finalizar Netbeans lanza la tarea &lt;a title="wsimport jax-ws tool" target="_blank" href="https://jax-ws.dev.java.net/nonav/2.1.1/docs/wsimport.html"&gt;wsimport &lt;/a&gt;de JAX-WS y añade al proyecto una referencia al servicio Web&amp;nbsp;
&lt;p&gt;
&lt;a title="Generación de código a través de wsimport y visualización de referencia al servicio Web en el proyecto" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_23.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Generación de código a través de wsimport y visualización de referencia al servicio Web en el proyecto" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_23.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
Para finalizar el ejemplo solo nos queda localizar el lugar donde deseamos realizar la llamada a la operación del servicio Web. Para el ejemplo seleccionamos la JSP de inicio y arrastramos allí la operación &lt;strong&gt;sumar&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;a title="Arrastrar la operación del servicio Web al lugar donde realizar la llamada" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_24.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Arrastrar la operación del servicio Web al lugar donde realizar la llamada" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_24.png" /&gt;&lt;/a&gt;
&lt;a title="Código generado por Netbeans para realizar la llamada" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_25.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Código generado por Netbeans para realizar la llamada" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_25.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Solo falta asignar los valores a los parametros del servicio Web, y al ejecutar la llamada a la página JSP, obtenemos el resultado&lt;/p&gt;
&lt;p&gt;
&lt;a title="Resultado llamada a servicio Web Suma" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_25b.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Resultado llamada a servicio Web suma" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_25b.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Quiero recalcar que en esta ocasión si existe un código generado por el programa &lt;a title="wsimport jax-ws tool" target="_blank" href="https://jax-ws.dev.java.net/nonav/2.1.1/docs/wsimport.html"&gt;wsimport &lt;/a&gt;de JAX-WS. Este código Netbeans lo almacena en una carpeta que no se ve desde la vista principal del proyecto. No me gusta mucho esta idea de ocultar el código, pero lo cierto es que no tenemos ninguna necesidad de modificarlo. En cualquier caso su ubicación es la siguiente:&lt;/p&gt;
&lt;p&gt;
&lt;a title="Localización código generado por wsimport en Netbeans 6" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_26.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Localización código generado por wsimport en Netbeans 6" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_26.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Es interesante ver este código, también con anotaciones JSR-175, que esta compuesto por:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Una clase con anotacion @WebServiceClient, que hace los efectos de Stub cliente del servicio Web.&lt;/li&gt;
&lt;li&gt;Un interfaz del servicio Web, con anotacion @WebService&lt;/li&gt;
&lt;li&gt;Varias clases relacionadas con el mapeo Java-XML a través de JAXB&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estaréis de acuerdo conmigo en que es imposible hacerlo más fácil.&lt;/p&gt;&lt;a href="../../lasterra/entry/web_services_for_java_ee2" title="In English"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="../../lasterra/resource/English_language_icon.png" /&gt; Web services for Java EE 5 in Glassfish (3)&lt;/a&gt; &lt;br /&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/servicios_web_para_java_ee2</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/servicios_web_para_java_ee1</id>
        <title type="html">Servicios Web para Java EE 5 en Glassfish (2)</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/STJdlfQUJoY/servicios_web_para_java_ee1" />
        <published>2007-06-02T15:23:39+02:00</published>
        <updated>2007-06-15T03:12:56+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jsr175" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javaee5" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="serviciosweb" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="jaxws" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javaee" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;En la reciente &lt;a href="http://weblogs.javahispano.org/lasterra/entry/openjavaday" target="_blank" title="OpenJavaDay"&gt;OpenJavaDay &lt;/a&gt;de Madrid, y en particular, en la &lt;a href="http://javahispano.org/news.item.action?id=1482707098" target="_blank" title="Mesa Redonda javaHispano OpenJavaDay2007"&gt;mesa redonda&lt;/a&gt; que pude compartir con mis freak-friends, se hablo mucho sobre los lenguajes dinámicos y sobre el &lt;a href="http://jcp.org/en/jsr/detail?id=175" target="_blank" title="JSR 175 Metainformación con anotaciones"&gt;JSR-175&lt;/a&gt; (las famosas @) en JavaEE5.&lt;/p&gt;&lt;p&gt;Hemos visto como este nuevo JSR ha aportado mucha sencillez al desarrollo de aplicaciones Java Enterprise. Esta &amp;quot;copia&amp;quot; del antiguo XDoclet ha mejorado mucho por una razón, el código que se genera detrás de una anotación JSR-175 no se ve, y por tanto no se puede modificar.&lt;/p&gt;&lt;p&gt;Esto soluciona el problema que existía antes cuando a través de una anotación, generábamos código que muchas veces, por una u otra razón terminábamos modificando, con los consecuentes problemas que esto podía generar en el futuro al presentarse un cambio.&lt;/p&gt;&lt;p&gt;Vamos a adentrarnos en el código del &lt;a href="http://weblogs.javahispano.org/lasterra/entry/servicios_web_para_java_ee" target="_blank" title="Servicios Web para Java EE 5 en Glassfish"&gt;ejemplo anterior&lt;/a&gt; del servicio Web, para ver que realmente, un servicio Web JavaEE5 no genera ni una línea de código, y es &lt;a href="https://glassfish.dev.java.net/" target="_blank" title="Glassfish JavaEE 5 RI"&gt;Glassfish &lt;/a&gt;quien se encarga de ello.&lt;/p&gt;&lt;p&gt;En la primera imagen podemos ver que no existe ningún archivo generado, ni .java, ni .class en todo el proyecto.&lt;/p&gt;&lt;p&gt;&lt;a href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_12.png" rel="thumbnail" title="Vista de archivos del proyecto"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_12.png" alt="Vista de archivos del proyecto" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Aunque para mí lo más sorprendente es que tampoco existe ningún tipo de información relativa al servicio Web en el descriptor de la aplicación, el archivo web.xml&lt;/p&gt;
&lt;p&gt;
&lt;a title="Descriptor de aplicación Web con Servicios Web JavaEE5" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_13.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Descriptor de aplicación Web con Servicios Web JavaEE5" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_13.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;La primera vez que me di cuenta de esto, me extrañe muchísimo, ya que por ejemplo, esto oculta la dirección del Servicio Web. Pensé entonces que en el descriptor específico de Glassfish iba a encontrar algún dato, pero no fue así&lt;/p&gt;
&lt;p&gt;
&lt;a title="Descriptor de aplicación Web con Servicios Web JavaEE5 específico de Glassfish" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_14.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Descriptor de aplicación Web con Servicios Web JavaEE5 específico de Glassfish" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_14.png" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Tuve que ir a la consola de administración para ver la dirección del servicio y como en algún paso interno se había generado mucha información en tres archivos de configuración:&lt;br /&gt;&lt;br /&gt;
&lt;a title="Propiedades de un servicio Web en el panel de Glassfish v2" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_15.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Propiedades de un servicio Web en el panel de Glassfish v2" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_15.png" /&gt;&lt;/a&gt;

&lt;a title="Fichero webservices.xml de glassfish v2" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_16.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Fichero webservices.xml de glassfish v2" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_16.png" /&gt;&lt;/a&gt;

&lt;a title="Servlet del servicio Web en el fichero web.xml de glassfish v2" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_17.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Servlet del servicio Web en el fichero web.xml de glassfish v2" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_17.png" /&gt;&lt;/a&gt;

&lt;a title="Fichero sun-web.xml de glassfish v2" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_18.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Fichero sun-web.xml de glassfish v2" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_18.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;De esta generación de código y configuracón habrá gente a favor y en contra. Bajo mi punto de vista es una avance hacía la sencillez, que es muy positivo. También veo que aunque los IDEs cada vez nos ayudan más, en este caso lo que nos ayuda es la plataforma, que es la que se encarga de generar el código. Un aplauso para el &lt;a href="http://jcp.org/en/jsr/detail?id=175" target="_blank" title="JSR 175 Metainformación con anotaciones"&gt;JSR-175&lt;/a&gt;.&lt;/p&gt;

&lt;a href="http://weblogs.javahispano.org/lasterra/entry/web_services_for_java_ee1" title="In English"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/English_language_icon.png" /&gt; Web services for Java EE 5 in Glassfish (2)&lt;/a&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/servicios_web_para_java_ee1</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/openjavaday</id>
        <title type="html">OpenJavaDay</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/SRcQCG_MMUA/openjavaday" />
        <published>2007-06-01T00:17:34+02:00</published>
        <updated>2007-06-01T00:21:33+02:00</updated> 
        <category term="/javaHispano" label="javaHispano" />
        <category term="openjavaday" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javahispano" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Madrugon, Casi 900 Km de coche, 100 €uropas de gastos y después de todo creo que ha merecido la pena por varias razones:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Volver a ver en persona a mis compañeros de javahispano no tiene precio.&lt;/li&gt;&lt;li&gt;Conocer a 3-4 personas relacionadas con el entorno de la comunidad, tampoco. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ver 2 presentaciones de &lt;a href="http://blogs.sun.com/roumen/" target="_blank" title="Roman Strobl Weblog"&gt;Roman Strobl&lt;/a&gt; y una de &lt;a href="http://blogs.sun.com/jaimecid/" target="_blank" title="Weblog Jaime CID"&gt;Jaime Cid&lt;/a&gt; sobre Java EE y SE y netbeans en particular estan evolucionando hacia un destino donde todo parece más sencillo. Particularmente los avances en swing con  &lt;a href="http://jcp.org/en/jsr/detail?id=296" title="JSR 296"&gt;Swing Application Framework JSR-296&lt;/a&gt; y &lt;a target="_blank" title="JSR 295" href="http://jcp.org/en/jsr/detail?id=295"&gt;JSR 295: Beans Binding&lt;/a&gt; y la integración de este ultimo con JPA todo ello con matise, me ha dejado realmente impresionado. Por fin aplicaciones Swing tan fácil como en Visual Basic¡¡&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Una &amp;quot;mesa redonda&amp;quot; sobre la evolución de la plataforma Java y un bonito debate sobre la actividad de las comunidades en España. Supongo que de este punto hablaremos en javahispano estos días.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Repetiremos el año que viene, seguro.</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/openjavaday</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/servicios_web_para_java_ee</id>
        <title type="html">Servicios Web para Java EE 5 en Glassfish</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/mVo0yACl28c/servicios_web_para_java_ee" />
        <published>2007-05-30T04:10:31+02:00</published>
        <updated>2007-06-15T03:13:06+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jaxws" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javaee" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="serviciosweb" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javaee5" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Con la ya no tan nueva JDK 5.0 se introdujeron muchos cambios, uno de los más sonados fue el uso de las @ como metainformación dentro de nuestro codigo java. Los que llevamos en esto algunos años vimos nacer la idea con el mítico proyecto open source &lt;a href="http://xdoclet.sourceforge.net/" target="_self" title="XDoclet"&gt;XDoclet&lt;/a&gt; y esta idea vuelve a renacer en Java EE 5.&lt;/p&gt;&lt;p&gt;El estandar de servicios Web de Java EE 5, &lt;a href="https://jax-ws.dev.java.net/" title="Java Api for Web Services"&gt;JAX-WS&lt;/a&gt; (&lt;a href="http://jcp.org/en/jsr/detail?id=224" title="Java Specification Request 224"&gt;JSR-224&lt;/a&gt;), nacio con varios objetivos, entre los que destacaría:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Delegar en &lt;a href="https://jaxb.dev.java.net/" target="_blank" title="Java Api for XML Binding"&gt;JAXB &lt;/a&gt;el trabajo de traslación entre XML y JAVA.&lt;/li&gt;&lt;li&gt;Adapatarse completamente al estandard de &lt;a href="http://www.ws-i.org/" title="Web Services Interoperability"&gt;Interoperabilidad entre Servicios Web&lt;/a&gt; (WS-Interoperablity) y las nuevas versiones de SOAP (1.2) y WSDL (1.2-2.0). &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Uso del JSR-175 (las comentadas @) para facilitar el desarrollo.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Fueron tantos los cambios, que lo que iba a ser JAX-RPC2.0 paso a ser JAX-WS y la implementación de referencia se forjo alrededor de la comunidad &lt;a href="https://glassfish.dev.java.net/" target="_blank" title="Glassfish JavaEE 5 RI"&gt;glassfish&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Como veremos a continuación cada vez es más fácil crear un Servicio Web, sobre todo si estamos ayudados de herramientas de ultima generación. Para trabajar con glassfish el IDE recomendado no podía ser otro que el &lt;a href="http://netbeans.org/" title="Sun's Open Source Java IDE"&gt;Netbeans&lt;/a&gt;. Para el ejemplo voy a usar la ultima &lt;a title="Netbeans 6.0 Download" target="_blank" href="http://dlc.sun.com/netbeans/download/6.0/milestones/latest/"&gt;milestone&lt;/a&gt; de la versión 6.0. He descargado la versión completa, que además de incluir el servidor glassfish, incluye herramientas de desarrollo SOA y UML.&lt;/p&gt;&lt;p&gt;El primer paso es crear un proyecto web que albergue nuestro servicio Web.&amp;nbsp;&lt;/p&gt;&lt;p&gt;
&lt;a title="Nuevo Proyecto Netbeans" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_1.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_1.png" /&gt;&lt;/a&gt;
&lt;a title="Nuevo Proyecto Netbeans" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_2.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_2.png" /&gt;&lt;/a&gt;
&lt;a title="Nuevo Proyecto Netbeans" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_3.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_3.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Una vez tenemos el proyecto de aplicación Web empezamos el wizard para crear un nuevo servicio Web.&lt;/p&gt;
&lt;p&gt;
&lt;a title="Wizard Servicio Web" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_4.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_4.png" alt="Wizard Servicio Web" /&gt;&lt;/a&gt;
&lt;a title="Wizard Servicio Web" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_5.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Wizard Servicio Web" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_5.png" /&gt;&lt;/a&gt;
&lt;a title="Visor Diseño Servicios Web Netbeans" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_6.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Visor Diseño Servicios Web Netbeans" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_6.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Se puede ver en la ultima pantalla como se ha añadido un servicio web al proyecto. El editor del netbeans nos muestra la ventana del servicio Web a través de la cual podemos añadir nuevas operaciones a nuestro servicio Web. Pulsamos en el boton &lt;b&gt;Add Operation&lt;/b&gt; y rellenamos el formulario&lt;/p&gt;
&lt;p&gt;
&lt;a title="Nueva Operación Servicio Web" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_7.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Nueva Operación Servicio Web" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_7.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;El diseñador de Servicios Web nos muestra la nueva operacion &lt;a title="Visor Diseño Servicios Web Netbeans" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_8.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Visor Diseño Servicios Web Netbeans" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_8.png" /&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt; Pulsando en &lt;b&gt;Source&lt;/b&gt; vamos al código generado por el Wizard.&lt;/p&gt;&lt;p&gt;Del código se pueden resaltar varias cosas&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;@WebService identifica a la clase como un servicio Web. Al incluir este descriptor en la clase el editor del netbeans nos avisa que debemos importa la clase javax.jws.Webservice.&lt;/li&gt;&lt;li&gt;@WebMethod identifica a una operación como parte del servicio web. Al igual que con WebService se debe importar la clase WebMethod de mismo paquete.&lt;/li&gt;&lt;li&gt;@WebParam, asigna un nombre a los parametros de una operación. Son opcionales pero conviene utilizarlos para que el descriptor de nuestro servicio Web sea legible para los humanos.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Todo esto lo ha hecho por nosotros el netbeans a través del Wizard pero nunca esta de más saberlo. Por tanto solo nos queda implementar la operación (Si, gracias a Dios todavía esto no lo hace el IDE)&lt;/p&gt;
&lt;p&gt;&lt;a title="Implementación Servicio Web JAX-WS Java EE 5" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_9.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Implementación Servicio Web JAX-WS Java EE 5" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_9.png" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Una vez estamos aqui, podemos compilar la clase, si no hay errores arrancamo el proyecto. Esto nos arrancara el servidor glassfish que viene con el netbeans. Si accedemos a la direccion http://localhost:8080/AplicacionWeb/ClaseServicio&lt;b&gt;Service&lt;/b&gt;?wsdl podremos ver el descriptor de nuestro servicio Web para comprobar que el servicio Web se ha creado correctamente.&lt;/p&gt;&lt;p&gt;Aprovechando las funcionalidades de glassfish, podemos acceder a su administrador Web para visualizar los servicios Web instalados. Para ello accedemos a la dirección http://localhost:4848/ e introducimos el usuario admin y la clave adminadmin (puertos y usuarios son los asignados por defecto en la instalación). &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;
&lt;a title="Administración Web Glassfish" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_10.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Administración Web Glassfish" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_10.png" /&gt;&lt;/a&gt;
&lt;a title="Administración Web Glassfish / Servicios Web" rel="thumbnail" href="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_11.png"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" alt="Administración Web Glassfish / Servicios Web" src="http://weblogs.javahispano.org/lasterra/resource/servicios_web_javaee5_glassfish_netbeans_11.png" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;En el próximo post veremos como crear un cliente del servicio Web, y como se puede monitorizar el servicio web desde la consola de administración.&lt;/p&gt;
&lt;a title="In English" href="http://weblogs.javahispano.org/lasterra/entry/web_services_for_java_ee"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/English_language_icon.png" /&gt; Web services for Java EE 5 in Glassfish&lt;/a&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/servicios_web_para_java_ee</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/glassfish_update_center</id>
        <title type="html">Glassfish Update Center</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/9lsbwFfjP00/glassfish_update_center" />
        <published>2007-05-27T12:11:44+02:00</published>
        <updated>2007-06-15T03:14:27+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="instalar" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="updatecenter" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Leo en &lt;a title="Glassfish Blog" target="_blank" href="http://blogs.sun.com/theaquarium/"&gt;The Acuarium&lt;/a&gt; y más en cocreto &lt;a title="Nazrul Glassfish Blog" target="_blank" href="http://blogs.sun.com/nazrul/entry/introducing_glassfish_update_center"&gt;http://blogs.sun.com/nazrul/entry/introducing_glassfish_update_center &lt;/a&gt;sobre otra nueva característica que no conocía del Glassfish V2, el update center.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ya hemos visto que instalar glassafish es bastante sencillo, por lo que actualizarlo no debería ser un problema, pero se nos dan un administrador muy sencillo de usar, mejor que mejor. El administrador es muy similar al que ofrece netbeans, puedes seleccionar tanto modulos nuevos que deseas instalar, como actualizar aquello que han mejorado o solucionado fallos. &lt;/p&gt;&lt;p&gt;Si siguen por el buen camino, esta herramienta podrá ser especialmente util con Glassfish V3.Ya se ha visto en algún &lt;a title="Glassfish v3 screencast" target="_blank" href="http://blogs.sun.com/alexismp/resource/glassfishv3-1.html"&gt;screencast&lt;/a&gt; lo rápido que arranca, y esto es posible gracias a &lt;a title="Glassfish v3 hk2 microkernel" target="_blank" href="http://hk2.dev.java.net/"&gt;hk2&lt;/a&gt; el microkernel que permitirá que glassfish use solo los modulos que tu necesitas. Si consiguen que esta configuración se pueda realizar mediante el update center o alguna herramienta muy similar sería todo un tanto.&lt;/p&gt;&lt;p&gt;Para iniciar la herramienta ejecutamos &lt;br /&gt;&lt;/p&gt;&lt;pre&gt;%glassfish%/updatecenter/bin/updatemanager/updatetool &lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;La primera imagen, como os decía recuerda al update center del netbeans &lt;/p&gt;&lt;p&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/glassfish_updatecenter_1.png" alt="Glassfish Update Center" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;No tengo experiencia con ninguno de los módulos que ofrece para descarga, y ahora mismo no hay actualizaciones, así que tan solo voy a instalar la documentación y los ejemplos. Selecciones los 3 módulos y pulso el boton de instlar.&lt;/p&gt;&lt;p&gt;Tras aceptar la licencia, (que pesaos¡¡) el procesos de descarga e instalación comienza. Al finalizar, los tres módulos pasan a la pestaña de software instalado.&lt;/p&gt;&lt;p&gt;&lt;img vspace="0" hspace="0" border="0" align="left" src="http://weblogs.javahispano.org/lasterra/resource/glassfish_updatecenter_2.png" alt="Glassfish Update Center Installed Software" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Por ultimo la pestaña de preferencias invita a que en el futuro la comunidad pueda crear sus propios repositorios de software. Puede resultar una exagereción, pero quizás hasta podamos actualizar nuestras aplicaciones con esta herramienta.&lt;/p&gt;&lt;p&gt; Habrá que evaluar si resulta productivo o no, pero en cualquier caso es una ayuda extra a los administradores del servidor.&lt;br /&gt;&lt;/p&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/entry/glassfish_update_center1" title="In English"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/English_language_icon.png" /&gt; Glassfish UpdateCenter&lt;/a&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/glassfish_update_center</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/instalando_glassfish_en_ubuntu_feisty</id>
        <title type="html">Instalando Glassfish en Ubuntu Feisty</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/6B09-hGGamo/instalando_glassfish_en_ubuntu_feisty" />
        <published>2007-05-25T00:53:54+02:00</published>
        <updated>2007-06-15T03:14:39+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="feisty" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="ubuntu" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="instalar" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;Si ya era fácil instalar glassfish, más fácil lo es intalarlo desde el recientemente estrenado Ubuntu Feisty. La verdad es que el&amp;nbsp; paso que ha dado Sun Microsystem al liberar su implementación de Java, va a tener una repercusión increible en el mundo open source. Desde luego, como vamos a ver a continuación, hace que instalar todo un servidor Java EE sea cosa de niños.&lt;/p&gt;&lt;p&gt;Empezamos ejecutando ese grandioso invento llamado apt-get &lt;br /&gt;&lt;/p&gt;&lt;pre&gt;apt-get install glassfish &lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Apt-get calcula las dependencias y nos avisa que necesita instalar glassfish-bin, imq (sistema de mensajeria/JMS de Sun) y sunderby&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;root@www1:/home/lasterra# apt-get install glassfish&lt;br /&gt;Reading package lists... Done&lt;br /&gt;Building dependency tree       &lt;br /&gt;Reading state information... Done&lt;br /&gt;The following extra packages will be installed:&lt;br /&gt;  glassfish-bin imq sunwderby&lt;br /&gt;The following NEW packages will be installed:&lt;br /&gt;  glassfish glassfish-bin imq sunwderby&lt;br /&gt;0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.&lt;br /&gt;Need to get 0B/54,2MB of archives.&lt;br /&gt;After unpacking 65,6MB of additional disk space will be used.&lt;br /&gt;Do you want to continue [Y/n]?&amp;nbsp;&lt;/pre&gt;&lt;p&gt;Decimos que sí, tras las descarga de paquetes y el rápido proceso de instalación se nos muestra la licencia de Sun, la leemos detenidamente y nos aseguramos de que no vamos a desarrollar software para uso nuclear. No es mi caso, así que aceptamos.&lt;/p&gt;&lt;p&gt;El proceso de instalación comienza...pero se para al instante después de cambiar los permisos de los comandos de administración. La primera en la frente. Tras varios reintentos y dejandolo esperar un rato, el proceso me muestra un mensaje de error muy claro, el puerto 8080 ya esta ocupado y es le que utiliza glassfish.&lt;/p&gt;&lt;p&gt;Efectivamente un tomcat tenia ese puerto, lo cambio y vuelvo a lanzar el proceso de instalación con: &lt;br /&gt;&lt;/p&gt;&lt;pre&gt;dpkg --configure glassfih &lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Vuelvo a aceptar la licencia y ahora si, tras unos segundos de incertidumbre, el proceso de instalación finaliza y glassfish arranca autmaticamente. En la consola nos muestra los mismos logs que veiamos al instalar manualemente el servidor&lt;br /&gt; &lt;/p&gt;&lt;pre&gt;Using default port 7676 for JMS.&lt;br /&gt;Using default port 3700 for IIOP.&lt;br /&gt;Using default port 8181 for HTTP_SSL.&lt;br /&gt;Using default port 3820 for IIOP_SSL.&lt;br /&gt;Using default port 3920 for IIOP_MUTUALAUTH.&lt;br /&gt;Using default port 8686 for JMX_ADMIN.&lt;br /&gt;Domain domain1 created.&lt;br /&gt;Starting Domain domain1, please wait.&lt;br /&gt;Log redirected to /var/lib/sunappserver/domains/domain1/logs/server.log.&lt;br /&gt;Domain domain1 is ready to receive client requests. Additional services are being &lt;br /&gt;started in background. &lt;br /&gt;Domain [domain1] is running [Sun Java System Application Server Platform Edition &lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;9.0_01 (build b21)]&lt;/b&gt; with its configuration and logs at: [/var/lib/sunappserver/domains].&lt;br /&gt;Admin Console is available at [http://localhost:4848].&lt;br /&gt;Use the same port [4848] for &amp;quot;asadmin&amp;quot; commands.&lt;br /&gt;User web applications are available at these URLs:&lt;br /&gt;[http://localhost:8080 https://localhost:8181 ].&lt;br /&gt;Following web-contexts are available:&lt;br /&gt;[/web1 /asadmin ].&lt;br /&gt;Standard JMX Clients (like JConsole) can connect to JMXServiceURL:&lt;br /&gt;[service:jmx:rmi:///jndi/rmi://localhost:8686/jmxrmi] for domain management purposes.&lt;br /&gt;Domain listens on at least following ports for connections:&lt;br /&gt;[8080 8181 4848 3700 3820 3920 8686 ].&lt;/pre&gt;&lt;p&gt;Accediendo al puerto 80 podemos comprobar que el servidor esta ya funcionando correctamente. Fijaros que el build es el b21, la ultima versión estable de glassfish v1.&lt;/p&gt;
&lt;a title="In English" href="http://weblogs.javahispano.org/lasterra/entry/installing_glassfish_in_ubuntu_feisty"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/English_language_icon.png" /&gt; Installing Glassfish in Ubuntu Feisty&lt;/a&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/instalando_glassfish_en_ubuntu_feisty</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/instalando_glassfish</id>
        <title type="html">Instalando Glassfish</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/uJVNAyuZrI0/instalando_glassfish" />
        <published>2007-05-24T00:51:45+02:00</published>
        <updated>2007-06-15T03:15:00+02:00</updated> 
        <category term="/Java" label="Java" />
        <category term="glassfish_es" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="instalar" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="javaee5" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="glassfish" scheme="http://rollerweblogger.org/ns/tags/" />
        <category term="servidor" scheme="http://rollerweblogger.org/ns/tags/" />
        <content type="html">&lt;p&gt;&lt;a href="https://glassfish.dev.java.net/"&gt;Glassfish&lt;/a&gt; es la implementación de referencia de Java EE 5. La verdad es que Sun esta trabajando mucho en el servidor, todo open source, y ha llegado la hora de probar si ese trabajo es tan bueno como nos cuentan en sus &lt;a href="http://blogs.sun.com/theaquarium/"&gt;blogs&lt;/a&gt; y &lt;a href="http://blogs.sun.com/theaquarium_es/"&gt;bitacoras&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Son muchas las cosas que quiero ver: grizzly, las funciones del administrador Web y principalmente, jax-ws, la nueva implementación de servicios Web. En este campo he probado casi de todo menos xfire, y no me acaba de convencer nada de lo que he visto, creo que debería ser mucho más fácil hacer un servicio Web y quiero ver si este nuevo estándar aporta la solución que busco.&lt;/p&gt;
&lt;p&gt;Por ultimo, recordaros que el capitán que dirige el rumbo de glassfish casualmente es Español, &lt;a href="http://weblogs.java.net/blog/pelegri/"&gt;Eduardo Pelegri-Llopart&lt;/a&gt;. Tuve la oportunidad de conocerle en los Sun Tech Days de Madrid el pasado año y prometi escribir algo sobre el, así que, con retraso, pero vamos a ello.&lt;/p&gt;
&lt;p&gt;Por cierto, si alguién esta pensando que empiezo esta serie de post empujado por el monitor de 52 pulgadas que  dicén &lt;a href="http://java.sun.com/javaee/community/campaigns/gftv-052007/welcome.jsp"&gt;regalar&lt;/a&gt;, esta en lo cierto ;-)&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Pasos de la instalación&lt;/b&gt;:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://glassfish.dev.java.net/public/downloadsindex.html"&gt;Descarga de glassfish&lt;/a&gt;, yo me he ido a por la beta2, que para eso estamos de pruebas.&lt;/li&gt;
&lt;li&gt;Mientras descarga, comprobamos los requisitos, JAVA_HOME y ANT_HOME en las variables de entorno, y ANT_HOME/bin en el PATH&lt;/li&gt;
&lt;li&gt;Una vez descargado descomprimimos el jar con &lt;b&gt;java -Xmx256m -jar glassfish-installer-v2***.jar&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Una vez descomprimida ejecutamos el script de ANT de instalación. De primeras vamos a probar sin opciones de clustering haciendo &lt;b&gt;ant -f setup.xml dentro de la carpeta glasfish.&lt;/b&gt; Más adelante intentaremos ver las opciones de clustering &lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con esto ya tenemos glassfish instalado y todo preparado para empezar a jugar con el. &lt;/p&gt;&lt;p&gt;La primera particularidad de Glassfish frente al Tomcat son los &amp;quot;&lt;b&gt;domains&lt;/b&gt;&amp;quot;. Un dominio en glassfish es una configuración del servidor. Dentro de esta configuración hay una instancia de administración y N instancias de ejecución, pero todas bajo una misma configuración. De esta forma, con una instalación del servidor puedes tener varias configuraciones/dominios y cada uno de ellos puede tener una configuración distinta : &lt;b&gt;puertos, memoria asignada a la JVM, IIOP, &lt;/b&gt;. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Haciendo la analogía con el tomcat, cada dominio del glassfish es una instalación del tomcat con una instancia que tendría tan solo un &amp;quot;manager&amp;quot; (salvando las distancias) y N tomcats con sus respectivas aplicaciones. &lt;/p&gt;&lt;p&gt;Esta configuración puede ser util en entornos con varios administradores que compartan una instalación, aunque sinceramente, no lo acabo de ver, porque en mi pequeño mundo, en un servidor solo hay un administrador ;-)&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Al instalar el servidor se crea un dominio por defecto, &lt;b&gt;domain1&lt;/b&gt;. Para arrancarlo ejecutamos el comando de administración &lt;b&gt;c:\glassfish\bin\asadmin start-domain domain1&lt;/b&gt;. En la consola el servidor nos da información interesante:&lt;br /&gt;
&lt;/p&gt;&lt;pre&gt;asadmin start-domain domain1&lt;br /&gt;Starting Domain domain1, please wait.&lt;br /&gt;Log redirected to C:\glassfish\domains\domain1\logs\server.log.&lt;br /&gt;Redirecting output to C:/glassfish/domains/domain1/logs/server.log&lt;br /&gt;Domain domain1 is ready to receive client requests. Additional services are being &lt;br /&gt;started in background.&lt;br /&gt;Domain [domain1] is running [Sun Java System Application Server &lt;br /&gt;&lt;b&gt;9.1 (build b41d-beta2)&lt;/b&gt;] with its configuration and logs at: [C:\glassfish\domains].&lt;br /&gt;Admin Console is available at [http://localhost:4848].&lt;br /&gt;Use the same port [4848] for &amp;quot;asadmin&amp;quot; commands.&lt;br /&gt;User web applications are available at these URLs:&lt;br /&gt;[http://localhost:8080 https://localhost:8181 ].&lt;br /&gt;Following web-contexts are available:&lt;br /&gt;[/web1  /__wstx-services ].&lt;br /&gt;Standard JMX Clients (like JConsole) can connect to JMXServiceURL:&lt;br /&gt;[service:jmx:rmi:///jndi/rmi://localhost:8686/jmxrmi] for domain management purposes.&lt;br /&gt;Domain listens on at least following ports for connections:&lt;br /&gt;[8080 8181 4848 3700 3820 3920 8686 ].&lt;br /&gt;Domain does not support application server clusters and other standalone instances.&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Comprobamos que el servidor esta arrancado accediendo a http://localhost:8080/. Si vemos el &amp;quot;up and running&amp;quot; podemos instalar una aplicación Web para comprobar que todo es correcto. El manual nos propone la siguente aplicación &lt;a href="http://glassfish.dev.java.net/downloads/quickstart/hello.war"&gt;http://glassfish.dev.java.net/downloads/quickstart/hello.war&lt;/a&gt;. La descargamos y la copiamos al directorio &lt;b&gt;glassfish/domains/domain/autodeploy&lt;/b&gt; dentro del dominio (este viene a ser el directorio &lt;b&gt;webapps &lt;/b&gt;del tomcat).
&lt;/p&gt;
&lt;p&gt;Una vez copiada la aplicación debe aparecer en ese mismo directorio el archivo hello.war_deployed, si intentamos acceder a al aplicación antes obtendremos un error 404.&lt;/p&gt;
&lt;p&gt;Para acceder a la aplicación, http://localhost:8080/hello. Si todo es correcto ya podemos decir que la instalación ha sido correcta.&lt;/p&gt;
&lt;a href="http://weblogs.javahispano.org/lasterra/entry/installing_glassfish" title="In English"&gt;&lt;img vspace="0" hspace="0" border="0" align="bottom" src="http://weblogs.javahispano.org/lasterra/resource/English_language_icon.png" /&gt; Installing Glassfish&lt;/a&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/instalando_glassfish</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/burbuja_inmobiliaria</id>
        <title type="html">Burbuja inmobiliaria</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/91zPuNv5DYc/burbuja_inmobiliaria" />
        <published>2006-10-11T23:53:53+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Decir que se habla mucho de este tema es quedarse corto. Todo el mundo es consciente de que hemos llegado a un extremo en los que los precios ya no son buenos para casi nadie. Los más beneficiados, empiezan a darse cuenta, que ahora son sus hijos los más perjudicados con la ascensión de precios en la vivienda. 
&lt;/p&gt;
&lt;p&gt;De este grupo de beneficiados excluyo a los 4 mangantes sin escrúpulos que les importa un pimiento lo mal que lo pueda pasar el ciudadano de a pie. Mis nominados al Oscar de los mangantes inmobiliarios son: Inmobiliarias, Constructoras, Bancos y Expeculadores... and the winner is : Inmobiliarias. Seguramente son los que más han ganado, y los que menos tienen que perder si esto explota&lt;/p&gt;
&lt;p&gt;Todo esto viene en relación a una página web que he encontrado: &lt;a href="http://www.bombollaimmobiliaria.com/es/principal.php"&gt;http://www.bombollaimmobiliaria.com/es/principal.php&lt;/a&gt;
, que a su vez estaba &lt;i&gt;linkada&lt;/i&gt; con la página del mail que me ha despertado hoy &lt;a href="http://www.viviendadigna.org/foros/viewtopic.php?t=2292"&gt;http://www.viviendadigna.org/foros/viewtopic.php?t=2292 &lt;/a&gt;. Gracias Marcos (por la página y por despertarme ;-))&lt;br/&gt;&lt;br/&gt;
Esta claro que nos movemos en un mundo que los "mortales" desconocemos, pero he llegado a este página y en parelelo he leido dos noticias que ratifican dos puntos a los que los "mortales" no daríamos importancia
&lt;ul&gt;
&lt;li&gt;Hoy el IBEX35 marca su 2º máximo histórico, osea, la bolsa esta mejor que nunca para invertir&lt;/li&gt;
&lt;li&gt;Union Fenosa (Eléctrica) compra 11% de INDRA (tecnológica), ya no se invierte en inmobiliario, sino en otros frentes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;Yo intento hacer mis propios análisis de persona de apie: 
&lt;ul&gt;
&lt;li&gt;Coincido con bombollainmobiliairia en que la piramide social (esa que no enseñaban en 8º de EGB) ha pasado por su punto mas "ancho" por personas mayores de 30 años &lt;img src="http://www.eumed.net/cursecon/2/piramidespa.gif"/&gt;&lt;/li&gt;
&lt;li&gt;Nadie en españa pensaba que iban a venir tantos inmigrantes. Esto es una realidad que también se ha notado en el mundo inmobiliario, y que ha hecho ampliar más aún el número de compradores&lt;/li&gt;
&lt;li&gt;Sin duda el efecto euro (dinero negro al que mucho mangante tenía que dar sálida) y los tipos de intereses tan bajos, han ayudado a mucha gente a comprar casa. Los que tenían una, aprovecharon para cambiar a una mejor y de paso favorecerse de las ayudas fiscales&lt;/li&gt;
&lt;li&gt;El gobierno se ha favorecido de la buena marcha del sector inmobiliario, pero creo que no ha sido consciente de los pasos que se han dado. Desde luego debían haber cortado la escalada de precios mucho antes.
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;Y ahora que hacemos? Esta es la pregunta del millón. Si yo fuese ministro de vivienda (prefiero no serlo porque es toda una paleta) haría lo sgte:
&lt;ul&gt;
&lt;li&gt;Crearía una página llamada kellyfinder.com (es coña ;-)&lt;/li&gt;
&lt;li&gt;Penalizaría fiscalmente a los propietarios de casa vacias y/o a aquellos que tienen más de dos viviendas. No puede ser que en este país, con los problemas que se avecinan, haya personas que tengan 3 y 4 viviendas. Eso es un lujo que el país no se puede permitir y bajo mi punto de vista hay que penalizar a esas personas. Si no quieren asumir la penalización, deben vender las viviendas. Tenemos que eliminar la idea de especular con la vivienda al precio que sea.&lt;/li&gt;
&lt;li&gt;No estoy convencido de que las VPO sean la solución, es más, es una solución utópica. Las VPO son para personas de ingresos bajos, gente que no puede acceder a la compra de vivienda libre. Un porcentaje bastante alto: jovenes. Con el coste de 1000/2000 viviendas de VPO hay para financiar buena parte de muchisimos alquileres durante 3/5 años. Ahora estamos en una situación en la que, al que le toca una VPO es como si le tocase la loteróa (o mejor), y al que no, que se joda y que se busqué la vida. Ni tanto ni tan calvo, no?&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;Da gusto hacer de ministro desde este blog ;-) En fin.. que Dios nos coja confesados¡¡&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/burbuja_inmobiliaria</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/c%C3%B3digo_gratis_somos_tontos_es</id>
        <title type="html">Código Gratis, somos tontos?? es justo??</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/7sX-2YSSGP0/c%C3%B3digo_gratis_somos_tontos_es" />
        <published>2006-10-09T02:17:48+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Llevo mucho tiempo pensando y analizando las consecuencias que nos ha traido y traerá el código gratis. Y digo gratis que no es lo mismo que &lt;a href="http://en.wikipedia.org/wiki/Libre"&gt;libre&lt;/a&gt;. Empiezo por aquí un post que espero que leais para intentar crear debate. 
&lt;/p&gt;
&lt;p&gt;El Open Source, código abierto--&gt;libre, es un movimiento/filosofia que aboga por la libre distribución del código fuente de los programas. Dependiendo de la licencia aplicada al código este puede tener un coste o no. Ejemplos de código libre y gratis (LGPL/BSD): Servidor HTTP Apache, Jboss. Ejemplos de código libre pero no gratis en uso comercial(GPL): Librerías QT(KDE), j2mePolish. 
&lt;br/&gt; Por otro lado tenemos el software no libre, es aquel por el que se debe pagar y del que además no se dispone el código. El ejemplo que todos conoceis: Microsoft Windows.
&lt;/p&gt;
&lt;p&gt;Ya tenemos representadas las tres posibilidades del escenario actuál en lo que se refiere a costes de adquisición y filosofía de distribución de software. Alejemonos ahora del mundo del software y de todo aquello relacionado directamente con la informática, bajemos a la calle y empezemos a buscar negocios que distribuyan sus productos de forma gratuita y que además vengan acompañados con la explicación de todo el proceso de fabricación. Bien, podeis dejar de dar vueltas, no encontraréis ninguno&lt;/p&gt;
&lt;p&gt;Lo primero que estaréis pensando, es que &lt;b&gt;el mundo del software es diferente&lt;/b&gt;, que ahora lo que funciona es &lt;b&gt;cobrar por servicios&lt;/b&gt; y que &lt;b&gt;el open source gratuito ha ayudado a crear negocio&lt;/b&gt; y a &lt;b&gt;difundir tecnologías&lt;/b&gt; y en todo esto estoy de acuerdo con vosotros, pero, ¿porque gratis? ¿Porque no poner un precio justo?&lt;/p&gt;
&lt;p&gt;Sigamos con más ejemplos. Firefox, navegador libre y gratis. Hijo del mozilla, y nieto del netscape, esta ganando adeptos sobre todo en los ultimos dos años. ¿Lo usarías si tuvieras que pagar 10&amp;euro; por el? Si tu respuesta es &lt;b&gt;SI&lt;/b&gt;, seguramente aprecias y valoras el buen software. Si tu respuesta es &lt;b&gt;NO&lt;/b&gt;, seguramente el open source no te preocupa.&lt;/p&gt;
&lt;p&gt;Ya vamos colocando nuestra opinión, pero volvamos al principio, al &lt;b&gt;código&lt;/b&gt;. ¿Alguna vez has buceado por el código de tu servidor de aplicaciones para optimizarlo, corregir un fallo o simplemente comprender su funcionamiento? Si tu respuesta es &lt;b&gt;SI&lt;/b&gt; eres todo hacker y sabes sacar partido de usar estos productos libres. Si tu respuesta es &lt;b&gt;NO&lt;/b&gt;, tranquilo, estas con la mayoría. Lo usas porque funciona, igual que funciona el software propietario, pero además te aprovechas de una gran comunidad de usuarios con tus mismas dudas. Pero, ¿Porque no pagar por esto? ¿Realmente el Tomcat no vale 100&amp;euro;?
&lt;/p&gt;
&lt;p&gt;Hasta ahora, todo refleja al open source gratuito como algo positivo. Veamos otro ejemplo, Netbeans/Eclipse vs. IntellJ IDEA, la guerra de todas las mañanas en mi oficina. Soy usuario de Netbeans desde sus inicios. Utilize el Forte for Java en sus versiones "community=gratis" y desde la versión 4.0 he visto como se acercaba &lt;b&gt;descaradamente&lt;/b&gt; al IDEA y a las versiones que yo conocía del JBuilder. Desde hace un mes utilizo el IDEA gracias a un estupendo regalo the mis amigos &lt;a href="http://www.telamon.ru/"&gt;rusos&lt;/a&gt;. Sin duda es un entorno espectacular que aporta más de un extra si eres un programador experto.La pregunta es, ¿cuanto tiempo más va a aguantar el IDEA siendo competitivo?. Y digo competitivo, que no mejor. IDEA 450&amp;euro; licencia personal + 150&amp;euro; actualización. Netbeans 0&amp;euro; + 0&amp;euro; actualización. En su &lt;a href="http://www.jetbrains.com/company/people/team.html"&gt;Web&lt;/a&gt; aparecen 70 desarrolladores, que digo yo, como todo hijo de vecino, comeran, luego el coste parece justificado. Igual soy demasiado alarmista, pero si en un futuro cercano, un producto como el IDEA, superior para muchos a Netbeans y Eclipse, desaparece ante un producto peor, por el hecho de ser gratuito, creo que es preocupante. &lt;b&gt;Estamos pasando de usar el open source gratuito como opción a que la única opción sea la gratuita&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Veamos un último escenario. La semana pasada &lt;a href="http://blogs.sun.com/jonathan/entry/2_down_498_to_go"&gt;Jonathan Schwartz escribió en su blog&lt;/a&gt; como Sun había ganado un concurso de un supercomputador: &lt;i&gt;Sun won because we could supply general purpose infrastructure and open source software&lt;/i&gt;. Esta frase me parecio demasiado descarada. Vendo hardware con software open source gratis que es lo mismo que decir, gano dinero con el hardware y regalo el software con su código. Sin ser abogado me parece extraño que en Europa el Windows no pueda llevar preinstalado el windows media player pero Sun si pueda regalar sus productos por ser estos open source gratis. 
&lt;/p&gt;
&lt;p&gt;Quizás sea legal regalar software, pero no se si es &lt;b&gt;ético y práctico&lt;/b&gt;. El open source empezo por el nivel más cercano al hardware, los Sistemas Operativos. Después vinieron los servidores HTTP y Java, luego fueron cientos de APIs implementando estándares libres y herramientas del día a día de los informáticos. En el ambito doméstico existen ya muchas herramientas open source gratuitas para entornos windows: (grabo cds, edito documentos word y excell, leo el correo, creo bases de datos, comprimo, subo ficheros por FTP, etc, etc)
&lt;/p&gt;
&lt;p&gt;Mi pregunta y mi miedo es saber donde esta el limite de la gratuidad del software. Hasta ahora hemos vivido un claro monopolio de Microsoft. El 99% de las personas tiene Microsoft Windows pirateado en sus casas. Esto ha originado ventas de licencias en las empresas y todo un mundo alrededor del SO. ¿Acaso no es una situación parecida al software GPL? ¿Que pasaría si microsoft decide liberar el código fuente de Windows y Office bajo licencia GPL? ¿Instalarias el openoffice si Microsoft Office fuera open source gratuito? ¿No es esto una guerra en la que solo los más grandes ganan? ¿Si IBM decide invertir en un software open source gratuito que desarrolla webs a golpe de raton, tu trabajo peligraría? y en definitiva ¿Porque el mundo del software es el único donde la gratuidad es una opción?
&lt;/p&gt;
&lt;p&gt;Contarme que opinais porque yo no lo veo nada claro&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/c%C3%B3digo_gratis_somos_tontos_es</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/programadores_y_personas_que_hacen</id>
        <title type="html">Programadores y personas que hacen programas</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/kdN3n6Pv3-o/programadores_y_personas_que_hacen" />
        <published>2006-09-12T23:37:28+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Estos días estoy haciendo una de mis labores preferidas, &lt;b&gt;Refactorizar&lt;/b&gt;. El termino lo conocí hace años, cuando me interese por el &lt;i&gt;Extrem Programming&lt;/i&gt; y metodologías relacionadas. Cuando oí hablar de el me dí cuenta de que esa palabra significaba lo mismo que yo hacía cuando tenía tiempo de mejorar mis programas. Lo que no sabía era la cantodad de teoría escrita sobre el tema.
&lt;/p&gt;
&lt;p&gt;Decidí entonces comprarme el mítico libro &lt;b&gt;Refactoring&lt;/b&gt;, del también mítico Martin Fowler. Al libro le pondría un 7. Explicaba como hacer una refactorización y le daba nombres a muchas de las operaciones que todos hacemos habitualmente, pero esperaba que también te enseñara cuando y porque aplicar una refactorización. Hoy en día no sabría decir si gracias a los IDEs y sus modulos de refactorización (atención a Netbeans Jackpot) este libro ha pasado a la historía.
&lt;/p&gt;
&lt;p&gt;Otro libro del que guardo un buen recuerdo es &lt;b&gt;Java Design&lt;/b&gt; de Peter Coad, Mark Mayfield y Jon Kern. De este libro destaco especialmente sus primeros capítulos, donde te enseñan de forma muy clara &lt;b&gt;como diseñar software&lt;/b&gt;. Porque y cuando aplicar composición, herencias y sobre todo el uso de &lt;b&gt;interfaces&lt;/b&gt;. El libro dedica más de 80 páginas a explicar que es un interfaz. Siempre que cojo este libro se me revuelven las tripas al recordar la primera y única explicación que recuerdo haber recibido sobre interfaces en la universidad: El interfaz es un contrato que obligas a firmar a una Clase. Punto y final. Espero que el resto de mis 5 años se ofrecierá algo mejor al personal alguno de los días que no fuí a clase.
&lt;/p&gt;
&lt;p&gt;El interfaz es para mi, junto con la refactorización, las herramientas más avanzadas de un programador. Creo que una persona que trabaja en el mundo de la programación e ingeniería del software debería de conocer estas dos herramientas como la palma de su mano. Se de empresas que utilizan lenguajes orientados a objetos y no aplican estas dos herramientas y soy consciente de que Ingenieros en Informática salen a la &lt;b&gt;calle&lt;/b&gt; todos los años con escasos conocimientos de las mismas.&lt;/p&gt;

&lt;p&gt;Igual es ser un poco drástico, pero creo que si no dominas estas herramientas, no puede decirse que seas un programador, no al menos uno bueno. Tus programas funcionarán, serán incluso rápidos y pueden no tener errores, pero por hacer una &lt;b&gt;analogía con un &lt;i&gt;cuadro&lt;/i&gt;&lt;/b&gt;: solo te gustará a tí, no entrará en ningún marco, deslucirá la pared donde lo cuelgues, será un mal regalo para tu peor enemigo y si consigues que alguien lo acepte, acabará tirandolo y haciendolo de nuevo&lt;/p&gt;
&lt;br/&gt;&lt;br/&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/programadores_y_personas_que_hacen</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/tras_5_a%C3%B1os_juntos</id>
        <title type="html">Tras 5 años juntos...</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/45SBlPwWXBQ/tras_5_a%C3%B1os_juntos" />
        <published>2006-09-03T19:11:53+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Han sido 5 años y medio juntos. Al principio todo fue bonito, eras la mejor, la envídia de todos mis amigos. Recuerdo aquella época con verdadera nostálgia. Eran además mis primeros meses en NHT-Norwick y con mi sueldo de becario te podía comprar accesorios para resaltar tus excelentes cualidades&lt;/p&gt;

&lt;p&gt;Pasaron los años, creo recordar que fue al empezar el cuarto cuando empeze a notar que todo cambiaba. Ya no podía presumir de ti con mis amigos, es más, yo les miraba con envidia, pero aun creía en ella y miraba atrás viendo todo lo que habiamos hecho juntos&lt;/p&gt;

&lt;p&gt;Este último año ha sido muy difícil, las cosas se habían estancado, todo era muy lento. No podía soportar como el mundo a mi alrededor cambiaba y como veía de lejos, sobre todo en la oficina, lo bien que les iba a Roberto y Joel&lt;/p&gt;

&lt;p&gt;Así que tras un intento en el mes de agosto que salió mál, el viernes decidí hacer borrón y cuenta nueva, y me he &lt;i&gt;comprado&lt;/i&gt; otra.&lt;/p&gt;

&lt;p&gt;Mi nueva computadora (De que creiaís que hablaba?? ;-) ) será una Dell con procesador Core 2 duo E6400, 1Gb de Ram, 160Gb de HD y una tarjeta ATI 1300X. Viendo lo contentos que estan Joel, Rober y Ender y los buenos precios de esta semana, creo que ha sido todo un acierto. En total serán 750? que espero se amorticen en los próximos 5 años&lt;/p&gt;

&lt;p&gt;Estoy deseando que llegue para ver como es capaz de mover las aplicaciones Java el nuevo procesador de la casa Intel. Podré probar Glassfish. Podré sacar partido de la nueva tarjeta gráfica y poner XGL en mi ubuntu, en fin, &lt;b&gt;podré ponerme al día ;-)&lt;/b&gt;&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/tras_5_a%C3%B1os_juntos</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/ciclismo_un_deporte_de_valientes</id>
        <title type="html">Ciclismo, un deporte de valientes</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/Q92MChbx2vM/ciclismo_un_deporte_de_valientes" />
        <published>2006-07-17T02:22:50+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Todos hemos oido estos ultimos meses las noticias sobre el doping en el ciclismo. Los medios de comunicación han dado una imagen terrible de los ciclistas, dando a entender que para compertir en bici hay que comer algo más que arroz y pasta.&lt;/p&gt;
&lt;p&gt;La verdad es que es sorprendente ver la velocidad media que imprimen los ciclistas y las maratonianas etapas a las que les tienen acostumbrados. Cuando no son 200 kilometros "llanos" les ponen 160 con 4 puertos de primera. Increible.&lt;/p&gt;
&lt;p&gt;Pues si esto me parecia poco, este fin de semana me he enterado que un conocido decidio hace 50 días coger la bicicleta y emprender rumbo hacia turquia. A los que no somos tan valientes para emprender una aventura de estas no esta deleitando con un diario de su vieja, paradojicamente denominado &lt;a href="http://www.unavueltaenbicicleta.tk"&gt;una vuelta en bicicleta&lt;/a&gt; (Menos mal que era solo una vuelta...)
&lt;/p&gt;
&lt;p&gt;Valga este post para animar Oscar en su viaje y para demostrar que se puede andar en bici... y mucho.. sin doparse&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/ciclismo_un_deporte_de_valientes</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/actualizaci%C3%B3n_del_servidor_javahispano</id>
        <title type="html">Actualización del servidor javahispano</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/EDqECMpP6kk/actualizaci%C3%B3n_del_servidor_javahispano" />
        <published>2006-05-22T00:21:37+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/javaHispano" label="javaHispano" />
        <content type="html">&lt;p&gt;Como seguro que todos sabeis, la semana pasada tuvimos un problema bastante importante con el servidor de javahispano, más concretamente con algunas tablas de la base de datos del portal. Tras el consecuente enfado, y darle un vistazo a la configuración del servidor, decidí que era el momento de reinstalar el servidor.&lt;/p&gt;

&lt;p&gt;Anteriormente usabamos debian-stable (en sus inicios woody, los últimos meses sarge) pero ya que yo soy un feliz usuario de ubuntu, me animé probar suerte con la nueva versión dapper-server .&lt;/p&gt;

&lt;p&gt;Ubuntu server utiliza un kernel especialemente configurado para servidores y en su proceso de instalacion puedes elegir la opcion de instalar un servidor LAMP (Linux, Apache, Mysql y PHP), así que nos venía como anillo al dedo. El proceso fue de lo más sencillo, grabar la iso, introducir el CD, reiniciar, seleccionar LAMP y ya tenia Linux 2.6.15, apache 2.0.55, mysql 5 y php 5.(Este último fue el que más problemas me dio, ya que el paquete no tenia dependecencia con php-conf y tuve que instalarlo)&lt;/p&gt;

&lt;p&gt;Por supuesto, y gracias a la nueva licencia de distribución por fin pude hacer &lt;b&gt;apt-get install sun-java5-jdk&lt;/b&gt;, tema que debería de dar para otro hilo en este blog.

&lt;p&gt;Dentro de un par de semanas saldrá la versión final de ubuntu-dapper. Esperemos que no haya muchos cambios entre la versión beta y la final... aunque si os soy sincero, mi confianza en esta distribución es total. Anteriormente en este blo os recomendaba la ubuntu como distribución para el escritorio. Ahora tb puedo hacerlo si necesitais instalar un servidor.&lt;/p&gt;
&lt;br/&gt;&lt;br/&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/actualizaci%C3%B3n_del_servidor_javahispano</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/de_fon_a_garrafon</id>
        <title type="html">De Fon a GarraFON</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/FeKCLpX3aR0/de_fon_a_garrafon" />
        <published>2006-03-10T04:09:49+01:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Ayer os hablaba de la parte interesante de FON, la de compartir, la de poder usar internet en cualquier lugar, la de aprovechar los recursos, etc. Hoy leo otro punto de vista totalmente contrario. Merece la pena leer los dos para crear tu propia opinión &lt;br/&gt;&lt;br/&gt;

&lt;a href="http://www.despacho101.com/press/garrafon"&gt;garraFON by Despacho101&lt;/a&gt;

&lt;/p&gt;
&lt;br/&gt;&lt;br/&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/de_fon_a_garrafon</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/fon</id>
        <title type="html">FON</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/5YKVZzGfThk/fon" />
        <published>2006-03-09T03:13:51+01:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;
Ha pasado mucho tiempo desde la última vez que escribi en el blog y vuelvo para hablar de una iniciativa que dará mucho que hablar &lt;a href="http://es.fon.com/"&gt;FON&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;La idea es una evolución de las redes WIFI que se han ido extendiendo por las grandes ciudades pero jugando con ideas que siempre han funcionado como la asociación y el trueque. En FON tu te unoe a la iniciativa y te compremetes a compartir tu acceso a internet al resto de FONeros. A cambio tu podrás hacer lo mismo, y en tus viajes al extranjero, de camino a la oficina, o esperando en el coche a que tu novia baje de una vez, podrás estar navegando por internet de forma gratuita a través de la conexión de un FONero amigo.
&lt;/p&gt;
&lt;p&gt;Desde luego la idea es muy buena y viendo las personas relacionadas con el proyecto huele a exito, además, empresas como google se han interesado mucho por el proyecto. No estarán tan contentas operadoras móviles como  vodafone y movistar, ya que sus servicios de datos 3G/gprs se pueden ver afectados. Supongo que los operadores de internet ADSL/Cable verán la iniciativa con dos puntos vista: El bueno, sigo vendiendo lineas, el malo, quizás con esto venda alguna menos.
&lt;/p&gt;
&lt;p&gt;
Parece que la tecnología es la parte más compleja del proyecto, no todos los routers son validos, hay que instalar una aplicación en el router, etc. Desde la web puedes comprar routers WIFI ya configurados y a muy buen precio. Esta es una buena salida al proyecto porque lo que no veo es a mi padre y similares especimenes configurando routers para unirse a FON
&lt;/p&gt;
&lt;p&gt;
Lo que más me va a gustar de esta iniciativa es ver como el mercado va a aceptar este tipo de movimientos. Yo con mi blackberry tengo muchas de las ventajas que ofrece FON desde hace año y medio a cambio de pagar otra tarifa plana. Si acaso, pierdo el roaming internacional que me costaría una pasta... pero bueno... no es que viaje mucho y menos fuera de peninsula.
&lt;/p&gt;
&lt;p&gt;
En un futuro no muy lejano (espero) las operadoras moviles ofreceran una tarifa plana de datos 3G. Si lo hacen a un precio similar al de las conexiones a internet actuales creo que mucha gente preferiría esta opción a compartir su red. Internet estaría en tu "SIM", ya sea en tu portatil, router 3G o en tú movil ultima generación.
&lt;/p&gt;
&lt;p&gt;En cualquier caso, aplaudo la iniciativa, que cuando menos abre una nueva posibilidad de elección al consumidor
&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/fon</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/como_eliminar_el_html_de</id>
        <title type="html">Como eliminar el HTML de un string sin morir en el intento</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/8NBv4rswyYI/como_eliminar_el_html_de" />
        <published>2005-12-21T18:27:32+01:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/Java" label="Java" />
        <content type="html">&lt;br/&gt;
&lt;p&gt;Esto es lo que he programado, mejorable sobro todo por el procesado de los acentos y otros caracteres HTML. No me gustaria usar librerias externas, pero si alguien tiene una idea mejor...

&lt;pre&gt;
protected String removeHTML(String html){&lt;br/&gt;
        int body = html.indexOf("&amp;lt;BODY");&lt;br/&gt;
        if (body==-1){&lt;br/&gt;
            body = html.indexOf("&amp;lt;body");&lt;br/&gt;
        }        &lt;br/&gt;
        int endBody = html.indexOf("&amp;lt;/BODY&gt;");&lt;br/&gt;
        if (endBody==-1)&lt;br/&gt;
            endBody = html.indexOf("&amp;lt;/body&gt;");&lt;br/&gt;
        html = html.substring(body,endBody);       &lt;br/&gt;
        html = removeHtmlTag(html);&lt;br/&gt;
        html = html.replaceAll("\n","")&lt;br/&gt;
                   .replaceAll("\r","")&lt;br/&gt;
                   .replaceAll("&amp;nbsp;","")&lt;br/&gt;
                   .replaceAll("&amp; gt;","&gt;")&lt;br/&gt;
                   .replaceAll("&amp;euro;","?")&lt;br/&gt;
                   .replaceAll("&amp; lt;","&amp;lt;");&lt;br/&gt;
        return html;&lt;br/&gt;
    }&lt;br/&gt;
    
    protected String removeHtmlTag(String texto){&lt;br/&gt;
        int openTag = texto.indexOf("&amp;lt;");&lt;br/&gt;
        if (openTag&gt;-1){&lt;br/&gt;
            int closeTag = texto.indexOf("&gt;",openTag);&lt;br/&gt;
            String tag = texto.substring(openTag,closeTag);&lt;br/&gt;
            if (openTag&gt;0){&lt;br/&gt;
                texto = texto.substring(0,openTag)+texto.substring(closeTag+1);&lt;br/&gt;
            }else{&lt;br/&gt;
                texto = texto.substring(closeTag+1);&lt;br/&gt;
            }            &lt;br/&gt;
            if ("&lt;/p".equals(tag)){&amp;lt;br/&gt;
                texto +="\n\n";&lt;br/&gt;
            }else if ("&amp;lt;br/".equals(tag) || "&amp;lt;br".equals(tag)){&lt;br/&gt;
                texto += "\n";&lt;br/&gt;
            }&lt;br/&gt;
            return removeHtmlTag(texto);&lt;br/&gt;
        }else{&lt;br/&gt;
            return texto;&lt;br/&gt;
        }        &lt;br/&gt;
    }&lt;br/&gt;
&lt;/pre&gt;
&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/como_eliminar_el_html_de</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/nueva_version_de_roller</id>
        <title type="html">Nueva versión de Roller</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/0FKggLW_7jg/nueva_version_de_roller" />
        <published>2005-12-15T01:13:49+01:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/javaHispano" label="javaHispano" />
        <content type="html">&lt;p&gt;Seguro que antes de llegar aqui os habeís dado cuenta, pero por si sois daltónicos, estais ya usando la versión 2.0 de rollerweblogger&lt;/p&gt;

&lt;p&gt;Las principales novedades, al margen del diseño, son:
&lt;ol&gt;
&lt;li&gt;Podeis crear un blog comunitario, es decir, que varias personas pueden compartir el blog.&lt;/li&gt;
&lt;li&gt;La parte de administración es más rápida e intuitiva de manejar&lt;/li&gt;
&lt;li&gt;Tendremos que aprender a sumar para poner un comentario en los posts, esto nos librará del temido spam ;-)&lt;/li&gt;
&lt;li&gt;El &lt;a href="http://weblogs.javahispano.org/planet.do?rmik=tabbedmenu.planet.planetEntries"&gt;Planet&lt;/a&gt; parece funcionar mucho mejor, asi que espero recibir en breve vuestros feeds si poseeis un weblog en java fuera de este barrio&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;A postear todos¡&lt;/p&gt;

</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/nueva_version_de_roller</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/26_a%C3%B1os_y_subiendo</id>
        <title type="html">26 años y subiendo</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/MDdtJtcWQng/26_a%C3%B1os_y_subiendo" />
        <published>2005-12-12T00:45:13+01:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Pues sí, un añito mas viejo. Y parece que no pero... ya son 26. &lt;br/&gt;
Tengo una extraña sensación que me dice que los mejores años ya han pasado. ¿Será qué el alcohol ya no corre tanto por mis venas? jejeje.
La verdad que uno lleva esto con cierta filosofia a pesar de que Eva y Roberto me recuerden todos los días en el café de las 3 que mi carencia capilar se acentua. Que cabr....¡¡¡
&lt;/p&gt;

&lt;p&gt;Como mi cumpleaños y el fin de año son bastante cercanos siempre aprovecho para hacer algo de reflexión sobre lo mejor que me ha pasado este año y lo que espero del siguiente.&lt;br/&gt; Lo mejor de mi año 25 han sido mis de vacaciones en Lanzarote, el curioso nombramiento como java-champion y la notable mejora que hemos vivido en el trabajo. Durante el año 26 espero finalemente poder independizarme, o al menos dar los primeros pasos para poder hacerlo. Ya os contaré.
&lt;/p&gt;
</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/26_a%C3%B1os_y_subiendo</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/casualidad_no_simpre_pasa</id>
        <title type="html">Casualidad no, siempre pasa¡¡</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/4WhkZm0ODI0/casualidad_no_simpre_pasa" />
        <published>2005-10-21T00:32:55+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Después de mucho tiempo sin dar señales de vida vuelvo por estos lares para escribir algo de lo que siempre deberia acordarme (bueno tu también deberias recordarlo):&lt;br/&gt;
&lt;br/&gt;

&lt;h3&gt;&lt;i&gt;Cuando veas algo extraño en tu código, cuando tengas esas sensación de que algo que estas viendo parece que funciona pero tu subsconsciente te dice que esta mal. Cuando algo falla pero crees que la causa del problema es que el dia es impar. No te lo pienses, repasalo y asegurate, porque fijo que esta MAL y fijo que volverá a fllar cuando menos te lo esperes¡¡&lt;/i&gt;&lt;/h3&gt;&lt;/p&gt;

&lt;p&gt;Ejemplos de lo anterior acaecidos en el dia de hoy (bueno ayer)

Licurgo, la pasada madrugada en casa los nuevos test que estoy preparando dejaban las conexiones a base de datos abiertas despues del shutdown final. Como los test eran nuevos y ya teniamos funcionando licurgo en varios sitios, pense, bueno, pos' serán mis test que estan mal aunque no se porque. ERROR¡¡ Licurgo estaba mal y como no, despues de dos meses sin problemas en proyectos que usan licurgo, ayer uno de ellos dejo de funcionar porque no cerraba bien las conexiones. &lt;b&gt;Casualidad?&lt;/b&gt;
&lt;p/&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/casualidad_no_simpre_pasa</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/javaforge</id>
        <title type="html">JavaForge</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/HWhmvhB87-k/javaforge" />
        <published>2005-09-23T00:29:12+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/Java" label="Java" />
        <content type="html">&lt;p&gt;Llego a casa después de estar con Jbilbo, esa especie de JUG bilbaino que formamos Al,Woviux, Aitor y el que escribe. Entre risas por mi falta de habilidad para abrir el "kit Java Champion" (intentaré escribir en ingles sobre ello) le sigo bromeando a Alberto con mi idea de crear un JavaForge, un gestor de proyectos open source para proyectos Java, con cosas que usamos nosotros, no sé.. integración con ANT, JALOPY, JUnit, Cruise Control, y todas esas cosillas que nos ayudan en nuestros proyectos.&lt;/p&gt;

&lt;p&gt;Llego a casa, visita por weblogs y javahispano.org y ...... "Javaloby saca a la luz javaforge, un gestor de proyectos open source en java". Todo a traves de un producto propietario, pero para proyectos open source. &lt;p&gt;

&lt;p&gt;Casi se me han quitado las ganas de empezar con la idea, antes incluso de madurarla, pero bueno, mi idea era hacer algo open source, asi que aun veo alguna posibilidad. Llevo ya un par de años colaborando con proyectos que ha empezado Alberto, y tengo la espinita clavada de no tener mi "hijito".&lt;/p&gt;

&lt;p&gt;Yo creo q con lo que tenemos en cañamo-apps, no nos costaria mucho unir piezas y generar algo básico que permita integración con SVN, envio de emails a los miembros del proyecto, unos foros, noticias, upload de ficheros, gestion de errores y no mucho más.
&lt;/p&gt;

&lt;p&gt;En fin todo dependerá de las ganas y el tiempo disponible&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/javaforge</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/1024000_bps</id>
        <title type="html">1024000 bps</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/vHsWaeiV8DY/1024000_bps" />
        <published>2005-09-22T01:22:14+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Llevaba unos dias esperando y hoy por fin han duplicado la velocidad de mi ADSL.&lt;br/&gt;

Todavia no se puede decir que estemos en "europa" en lo q a lo tecnologico se refiere, pero bueno, hemos pasado de 256 a 1M en un año +/-. La verdad es que se nota "58963968 bytes (103.18 KB/s) - `netbeans-5_0-daily-bin-200509201800-linux-20_Sep_2005_ 1800.bin'"&lt;br/&gt;

Yo estoy esperando a que jazztel de servicio de 20 megas, y de escuchar algunas criticas sobre el para cambiarme.Pero vamos.. lo de hoy.. un pequeño paso para telfónica un gran paso para internet en españa

&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/1024000_bps</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/alias</id>
        <title type="html">Alias</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/4EIHsUYSSU4/alias" />
        <published>2005-09-18T11:47:23+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/Licurgo" label="Licurgo" />
        <content type="html">&lt;p&gt;No... no me refiero a la serie de televisión en la que &lt;a href="http://jen-garner.net/"&gt;Jennifer Garner&lt;/a&gt; salvaguarda al mundo de los malos. Me refiero a la posibilidad de dar diferentes nombres a los Types y sus Propiedades, o para no creyentes en SDO, a las tablas y sus campos&lt;/p&gt;

&lt;p&gt;Esto nos va a permitir utilizar nuestro código ya programado utilizando licurgo, contra bases de datos que no hemos creado nosotros o que lo hicimos sin pensar en el código actual. Por ejemplo, típica aplicación de noticias. La información estará en una tabla que en tu código se conoce como news, pero quieres utilizarlo para acceder a la tabla noticias que utiliza esa otra aplicación que hiciste hace un par de años.&lt;br/&gt;

La definición para la tabla noticias seria esta

&lt;pre&gt;
&amp;lt;dataobject name="noticias"&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;datasource="test"&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;primary-key="ID"&lt;br/&gt;               
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;auto="false"&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;alias="news"&lt;/b&gt;&lt;br/&gt;
&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;fields&amp;g;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;field name="noticia_id" &lt;b&gt;alias="ID"&lt;/b&gt; type="integer" size="4" default="0" nullable="false" /&lt;&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;field name="titulo" &lt;b&gt;alias="subject"&lt;/b&gt; type="varchar_ignorecase" size="4" default="name" nullable="true" /&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;field name="texto" &lt;b&gt;alias="text"&lt;/b&gt; type="varchar_ignorecase" size="15" default="description" nullable="true" /&amp;gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/fields&amp;gt;&lt;br/&gt;
&amp;lt;/dataobject&amp;gt;
&lt;/pre&gt;
&lt;br/&gt;
Con esta definicion del dataobject lo mismo puedes hacer &lt;b&gt;datasource.load("news","1")&lt;/b&gt; que &lt;/b&gt;datasource.load("noticias","1")&lt;/b&gt;. De igual forma esto es aplicable inserts, deletes o acceso directo al data object &lt;b&gt;dataobject.set("noticia_id","1")&lt;/b&gt; es igual que &lt;b&gt;dataobject.set("ID","2")&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;Aún tengo que consultar con la almohada, o en su defecto con &lt;a href="http://weblogs.javahispano.org/page/al"&gt;Al&lt;/a&gt; y &lt;a href="http://weblogs.javahispano.org/page/woviux"&gt;woviux&lt;/a&gt;, esta funcionalidad. Me queda un poco la sensación que en OREO estaba un poco mejor planteado. En OREO era obligatorio rellenar el "table_name" y "name" a nivel del dataobject, para que quedará bien claro que una cosa era el nombre de la tabla y otra el nombre del record/dataobject y que realmente el "name" era el que iba a ser usado en el código.&lt;br/&gt;
Otra cosa que se podia hacer con OREO era definir varios record/dataobject para una misma tabla con distintas configuraciones, por ejemplo para definir diferentes UIDGenerator en dos dataobjects que acceden a una misma tabla. Esto todavia en licurgo no se puede hacer aunque yo solo recuerdo haberlo hecho una vez con OREO&lt;/p&gt;
&lt;br/&gt;&lt;br/&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/alias</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/ubuntu_breezy</id>
        <title type="html">Ubuntu Breezy</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/BUMv6qsrj-E/ubuntu_breezy" />
        <published>2005-09-17T11:39:57+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/Linux-Debian" label="Linux-Debian" />
        <content type="html">&lt;p&gt;Una de las cosas que queria hacer este fin de semana era actulizar Ubuntu. El pasado fin de semana sacarón la versión release candidate asi que mas o menos preveia que todo iba a ser bastante fácil.&lt;/p&gt;

&lt;p&gt;Lo unico que necesitas es liberar un poco tu ancho de banda, la actualización a traves de apt descargo en mi caso unos 600MB. Esto fue lo que hice yo:
&lt;ol&gt;
&lt;li&gt;Sustituir en el /etc/apt/source.list todas las apariciones de hoary por breezy&lt;/li&gt;
&lt;li&gt;Elimine un par de lineas a repositorios para evitar problemas con programas que casi no uso&lt;/li&gt;
&lt;li&gt;Ejecutar apt-get dist-upgrade y espera tres horitas&lt;/li&gt;
&lt;li&gt;Al reiniciar la maquina le driver de nvidia parecia no funcionar. Ejecute dpkg-reconfigure xserver-xorg, volvi a configurar y nada. Seguia dando error, "No screens found". Decidi poner el driver libre, en vez de nvidia seleccionar nv y me arracao el servidor X a la primera&lt;li/&gt;
&lt;li&gt;Al iniciar gnome, no arracancaba ni veia ningun mensaje por consola. Ya me habia pasado esto alguna vez en los tiempos que usaba debian SID. Hice lo que solia hacer entonces, me cree un nuevo usuario e intente entrar. Perfecto gnome 2.12 cargado. Entonces decidi eliminar del home de mi usuario toda la configuración de gnome, a sabiendas que iba a perder algunos enlaces directos de los paneles de gnome. Nada que no pudiese solucionar en 5 minutos. Volvi a entrar y perfecto, gnome 2.12 funcionando&lt;/li&gt;
&lt;li&gt;Algunas textos los veia en ingles y otros en castellano. Fui al synaptic y encontre dos paquetes de traduccion de gnome, los instale y problema resuelto&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;
&lt;p&gt;De lo que ya había leido sobre gnome 2.12 me ha llamado la atención algo que creo q es una applicación propia de ubuntu, el instalador de aplicaciones. Es como el synaptic pero para usuarios menos expertos que no entienden de dependecias, paquetes, etc. Ademas te clasifica las aplicaciones que puedes instalar seguna apareceran en los menús. Con la tonteria he descubierto Gazpacho, una aplicación para diseñar interfaces de usuario GTK bastante intuitiva.&lt;br/&gt;
&lt;p&gt;Da gusto ver que las cosas ya no son tan dificiles y que poco a poco se va avanzando&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Update&lt;/b&gt; he tenido que isntalar usplash y hacer un dpkg-reconfigure kernel-image-'uname -r' para ver el famoso boot splash que en cuanto a diseño deja bastante que desear.&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/ubuntu_breezy</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/java_champion</id>
        <title type="html">java-champion</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/HzwH9eMzJx4/java_champion" />
        <published>2005-09-16T17:49:21+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/javaHispano" label="javaHispano" />
        <content type="html">&lt;p&gt;Some days ago, &lt;a href="http://weblogs.javahispano.org/page/al"&gt;Alberto&lt;/a&gt; proposed me to be a member of the &lt;a href="https://java-champions.dev.java.net/"&gt;Java-Champions&lt;/a&gt; program. Yestarday Aaron Houston send me an email telling me that the java-champions committee had approved my nomination, and today they publish it in their (our?) homepage.&lt;/p&gt;

&lt;p&gt;This still sounds incredible to me, and today I can only say thanks to many people around javaHispano.org and specially its directors. I said to Aaron and java champions' committee that any of the members of javaHispano could be a java-champion for they effors  (on his free time) in the last-four-years. I specially want to remark the efforts of:
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://weblogs.javahispano.org/page/al"&gt;Alberto&lt;/a&gt;, who created javaHispano when paradoxically he lived in Dresden and who has more merits than anyone to be a java-champion.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://weblogs.javahispano.org/page/mariscal"&gt;Mariscal&lt;/a&gt; and &lt;a href="http://fco.textdriven.com/"&gt;Aitor&lt;/a&gt; for the organization of the 2º javaHispano Congress. &lt;/li&gt;
&lt;li&gt;Abraham, &lt;a href="http://weblogs.javahispano.org/page/woviux"&gt;Woviux&lt;/a&gt; and Emilio for their day-to-day work.&lt;/li&gt;
&lt;li&gt;Eduardo for his work on javaHispano.net.&lt;/li&gt;
&lt;li&gt;Other members that now haven't time for javaHispano, like &lt;a href="http://jroller.com/page/mpermar"&gt;Martin&lt;/a&gt; who interviewed many members of the java-champion list for javaHispano.&lt;/li&gt;
&lt;li&gt;And of course, all the people who have sended articles, tutorials, translations, news, etc, etc. They make javaHispano more than a webpage, they make a communtty where you could share your knowledge and opinions with others.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I also want to give thanks to &lt;a href="http://nht-norwick.com"&gt;NHT-Norwick&lt;/a&gt; for give me time to work on javaHispano and becouse they choose to develop Open Source Software around javaHispano. There are not so many companies in Spain as "we".
&lt;/p&gt; 
&lt;p&gt;Finally, I hope this nomination will help the spanish-speaker java community in general and javaHispano in particular. By the way, now I will be part of the java-champion selection committee to help them with the spanish-speakers nominations&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;
</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/java_champion</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/netbeans_profiler_oooh_my_god</id>
        <title type="html">Netbeans profiler, oooh my god¡¡</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/Pu4wr0NiVSg/netbeans_profiler_oooh_my_god" />
        <published>2005-09-08T21:13:25+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Yo la verdad es que nunca había utilizado ninguna herramienta igual y llevo dos horas con la boca abierta, repitiendo los mismos vocablos monosilabos "ooohhg"&lt;/p&gt;
&lt;p&gt;Y es que me ha dado por ver si cáñamo, y las aplicaciones que hacemos en &lt;a href="www.nht-norwick.com"&gt;NHT-Norwick&lt;/a&gt; con el framework y sus applicaciones pierden aceite, o sea, memoria, ya que hemos tenido algun que otro "out of memory" usando el manager del tomcat&lt;/p&gt;

&lt;p&gt;A parte de comprobar que cáñamo esta perfecto en salud, netbeans profiler me ha demostrado la capacidad de Netbeans como plataforma y como IDE. Y esto no es ser rádical en mi apuesta por este IDE. Solo ahi que abrir los ojos y ver que el profiler es muy muy bueno (desde el punto de vista de un ignorante en este mundo). No se como estaran los productos comerciales, pero con todas las opciones que tiene, yo creo que no voy a necesitar nada más&lt;/p&gt;

&lt;p&gt;Como creo que teneis que probarlo, al menos para ver lo rápido que es vuestro código escribo un fast tutorial:
&lt;ol&gt;
&lt;li&gt;Necesitamos la &lt;a href="http://java.sun.com/j2se/1.5.0/download.jsp"&gt;jdk1.5_04&lt;/a&gt;, el &lt;a href="http://www.netbeans.info/downloads/download.php?type=4.1"&gt;netbeans 4.1&lt;/a&gt; y la ultima versión del &lt;a href="http://profiler.netbeans.org/download.html"&gt;profiler&lt;/a&gt;, ahora mismo esta por el milestone 8. Podeis matar los dos primeros pajaros de un tiro bajando el &lt;a href="http://java.sun.com/j2se/1.5.0/download-netbeans.html"&gt;bundle netbeans+jdk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Doble click, sgte sgte en tods los pasos y lo tenemos instalado tanto en windows como en linux. Si teneis varias jdks, aseguraros de elegir la 1.5_04 al instalar el netbeans&lt;/li&gt;
&lt;li&gt;Arrancamos el netbeans y nos aparece en el menu superior "Profiler". Lo primero de todo Hay que ir a Profile--&gt;Advanced Command--&gt;Run Profiler Calibration. Esto mide los tiempos de ejecucion de tú maquina para hacer las mediciones relativas a esta calibración. Este paso es obligatorio&lt;/li&gt;
&lt;li&gt;Yo lo he probado con una applicación web, y como desarrollo con netbeans, pues ya tenia el proyecto creado. Hacerlo es mu facil, simplemente File--&gt;New Project y seleccionais Web--&gt;Web app with existing sources (Se supone que ya teneis una y es la q quereis probar) De ahi en adelante seguir los pasos que no son dificiles, donde esta el codigo fuente.. donde las librerias.. nada raro para una persona que quiere ejecutar un profiler ;-)&lt;/li&gt;
&lt;li&gt;Ya tenemos el proyecto, ahora simplemente Profile --&gt; Profile Main Project. Ahi nos aparece la ventana de selección de tarea. &lt;br/&gt; Puedes elegir centrarte en la medición de memoria o en la velocidad o en le numero de hilos. Yo queria probar la memoria asi que he empezado por ahí. Al pulsar Run se arranca tu aplicación web dentro del tomcat. Por cierto muy chulo el efecto de desplazamiento del &lt;a href="http://profiler.netbeans.org/docs/help/img/profiling-panel.png"&gt;menú&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Esto tarda bastante, ya que tiene que arrancar el tomcat  con el profiler conectado. Daros cuenta que todas las llamadas que se hacen entre todos los métodos que se ejecutan dentro de la JVM pasan y se registran en el profiler. Asi que como para no ir lento&lt;/li&gt;
&lt;li&gt;A la izquierda os aparece el &lt;a href="http://profiler.netbeans.org/docs/help/img/new-cp.png"&gt;profiler control panel&lt;/a&gt;, toda una demostración de diseño del RCP de netbeans. De aquí en adelante no sigo, tocar, pinchar y ver toda la información que os ofrece la herramienta. El manual del profiler esta &lt;a href="http://profiler.netbeans.org/docs/help/index.html"&gt;aquí&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;
&lt;p&gt;Por cierto esto es lo que he visto yo en un par horas, hay muchas mas cosas, como ejecutar el profiler contra una JVM remota, medir el tiempo de un bloque concreo de codigo (from line-to line), etc, etc
&lt;br/&gt;&lt;br/&gt;
</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/netbeans_profiler_oooh_my_god</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/gnome_2_12</id>
        <title type="html">Gnome 2.12</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/SeabdAj900Y/gnome_2_12" />
        <published>2005-09-07T22:47:15+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Lo anunciarón para hoy dia 7, y aquí esta (No sé por que, pero como programador, a mi nunca me pasan estas cosas).&lt;/p&gt;
&lt;p&gt;El nuevo Gnome trae, como siempre, mejoras interesantes y nuevas aplicaciones GTK que pasaran a formar parte de la suite. Os enumero lo que mas me ha llamado la atención a mi de toda la lista de &lt;a href="http://www.gnome.org/start/2.12/notes/es/"&gt;Notas de lanzamiento&lt;/a&gt;&lt;br/&gt;
&lt;ol&gt;
&lt;li&gt;Nautilus trae cambios en la navegación por el arbol de ficheros, ahora puedes desplegar las carpetas de la lista de fichero y entrar en ellas solo cuando lo consideres necesario. Esto lo provee hace algun tiempo con ubutu breeze y se me hacia un poco extraño pero....&lt;/li&gt;
&lt;li&gt;Las aplicaciones se pueden encender en la lista de ventanas. Si, porfin me enterare cuando alguien me habla a traves del gaim en el trabajo&lt;/li&gt;
&lt;li&gt;Evince, visor de pdfs y ps y gnome cd ripper, nuevas apps de la suite&lt;/li&gt;
&lt;li&gt;Acerca de mí, o de tí. Ahora se pueden guardar datos personales sobre el usuario y cambiar su clae de acceso al sistema&lt;/li&gt;
&lt;li&gt;Editor de los menús, coloca tus aplicaciones facilemente en el menú. Soporta el estandard de freedesktop&lt;/li&gt;
&lt;li&gt;Administrador de servicios y visor de logs.&lt;/li&gt;
&lt;li&gt;Aún les ha quedado tiempo para pensar en el &lt;a href="http://www.gnome.org/start/2.12/notes/es/rnlookingahead.html"&gt;futuro&lt;/a&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt; Si señor, buen trabajo&lt;/p&gt;

&lt;br/&gt;&lt;br/&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/gnome_2_12</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/porque_no_lo_retrasaste_escoem</id>
        <title type="html">Porque no lo retrasaste escoem¡¡ (Ipod nano)</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/ofMyPj7Mqjo/porque_no_lo_retrasaste_escoem" />
        <published>2005-09-07T22:29:32+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;Joder (perdon), pantalla color, ligero, nano pequeño. Escoem.. si hubieras aguantado un poco más como soltero ahora tendrías &lt;a href="http://www.apple.com/ipodnano/"&gt;uno &lt;/a&gt; ;-)&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/porque_no_lo_retrasaste_escoem</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/nokia_este_si_es_el</id>
        <title type="html">Nokia, este sí es el camino</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/2qRzECi40LQ/nokia_este_si_es_el" />
        <published>2005-09-06T12:32:26+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;No hace mucho &lt;a href="http://weblogs.javahispano.org/page/woviux"&gt;Woviux&lt;/a&gt; tubo que preparar una pequeña aplicación programada en Symbian, sabía C++, asi que a nadie le temblaron las piernas cuando le dejaron un mes entero para preparar una pequeña aplicación. Maldito aquel día verdad?&lt;/p&gt;
&lt;p&gt;En ese mes descubrimos que Symbian no es C++, y por supuesto tampoco J2ME. Mandar un email era una odisea, control total tenias.. pero a que precio. Pero eso no era todo, los costes se disparaban, no solo por el tiempo de desarrollo, sino tb por el coste de certificación de la aplicaciones por parte de nokia. Por que sí... los finlandeses cobran algo mas que nosotros&lt;/p&gt;

&lt;p&gt;En fin, la demo concluyo, y algo presentamos, pero seguro que ningun cliente, al menos ninguno de &lt;a href="www.nht-norwick.com"&gt;NHT-Norwick&lt;/a&gt; estaría dispuesto a pagar el precio que costaba esa aplicación. Dificil veia yo el futuro de nokia por ese camino, a pesar de la calidad de sus dispositivos&lt;/p&gt;

&lt;p&gt;Casualmente hoy he visitado el blog de &lt;a href="http://www.russellbeattie.com"&gt;http://www.russellbeattie.com&lt;/a&gt; y leo algo que SÍ tiene sentido. Ni me había enterado de que nokia prevee sacar en breve un table pc, con pantalla táctil, resolución de 800 x 480, 230 gramos de peso WIFI y Bluetooth. Pero claro, todo esto necesita un sistema operativo de verdad y aplicaciones que le saquen partido, porque si tengo este cacharro, yo quiero ver la tele, escribir documentos, VoIP y demas. Y va a ser que Linux-Debian es el SO elegido.&lt;/p&gt;

&lt;p&gt;Por lo que he podido leer &lt;a href="http://www.maemo.org/"&gt;maEmo&lt;/a&gt; es el nombre de la plataforma. La 770 llevará un kernel 2.6 con Gnome, DBus y Gnome-VFS. Vamos completito. Han migrado ya bastante software para que se vea bn en esa resolución. Aplicaciones Gnome como Abiword y gnumeric estan ya disponibles, Opera sera el navegador elegido y supongo que sera cuestión de tiempo que aparezca aquella aplicación que usas y te gustaría tener en tu tablet-pc&lt;/p&gt;

&lt;p&gt;Russell dice que linux es el futuro en movilidad, yo no se si esto es llegar muy lejos, pero seguro que es un camino más correcto que nokia, principalmente por las libertades que nos aporta a las empresas y desarrolladores, como lo hace Java, pero además bajo el gran paragüas del open source. Toda una garantía de futuro&lt;/p&gt;

&lt;p&gt; Por cierto, el precio estará cerca de los 300&amp;euro;. Si estabais pensando en regalarme la PSP, prefiero que espereis al cacharro este ;-)&lt;/p&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/nokia_este_si_es_el</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/referencias_en_licurgo_tables</id>
        <title type="html">Referencias en licurgo-tables</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/uIaB_33qQ9g/referencias_en_licurgo_tables" />
        <published>2005-09-05T01:13:50+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/Licurgo" label="Licurgo" />
        <content type="html">&lt;p&gt;He aprovechado las ultimas horas del fin de semana para implementear el soporte de foreing-keys/references en el xml que define la metainformación&lt;/p&gt;
&lt;p&gt;En el commit que so contaba el otro dia tenia ya implementado el soporte de referencias en licurgo, ahora necesitaba que fuera el usuario el que tenga el control de definir cuales son esas relaciones. Esto es necesario cuando estas trabajando contra una base de datos que no tiene las relaciones definidas, por ejemplo MySQL, o por ejemplo cuando la base de datos contra la q trabajas no tiene definida ninguna restricción y todo se controla a nivel de la aplicación.&lt;/p&gt;
&lt;p&gt;El commit que acabo de realizar hace posible que&lt;br/&gt;
&lt;ol&gt;
&lt;li&gt;Licurgo en primera instancia recupera de la BD toda la metainformación&lt;/li&gt;
&lt;li&gt;Si en el para el data object--&gt;Tabla existe alguna etiqueta reference, se elimina la metainformación relacionada con las foreingKeys&lt;/li&gt;
&lt;li&gt;Una vez eliminada esa información, se crean asocian al data object las relaciones configuradas por el usuarios, esten estas o no definidas en la BD&lt;/li&gt;
&lt;li&gt;Si no existe ninguan etiqueta references, licurgo se fiara de la metainformación y la utilizara para establecer las relaciones entre tablas&lt;/li&gt;
&lt;/ol&gt;&lt;br/&gt;
El ejemplo del XML seria este&lt;br/&gt;
&lt;pre&gt;
&amp;lt;dataobject name="NUMBERS"&lt;br/&gt;
               datasource="test"&lt;br/&gt;
               primary-key="ID" &lt;br/&gt;     
               auto="false"&lt;br/&gt;
   &amp;gt;&lt;br/&gt;
        &amp;lt;fields&amp;gt;&lt;br/&gt;
            &amp;lt;field name="ID" type="integer" size="4" default="0" nullable="false" /&gt;&lt;br/&gt;
            &amp;lt;field name="NAME" type="varchar_ignorecase" size="4" default="name" nullable="true" /&gt;&lt;br/&gt;
            &amp;lt;field name="DESCRIPTION" type="varchar_ignorecase" size="15" default="description" nullable="true" /&gt;&lt;br/&gt;
            &lt;field name="USERS_ID" type="varchar_ignorecase" size="15" nullable="true" default="0"/&gt;    &lt;br/&gt;            
        &amp;lt;/fields&gt;&lt;br/&gt;
        &amp;lt;references&gt;&lt;br/&gt;
            &amp;lt;reference field="USERS_ID" target-type="USERS" target-property="ID"/&gt;&lt;br/&gt;
        &amp;lt;/references&gt;&lt;br/&gt;
&lt;br/&gt;
        &amp;lt;uid-generator class="org.licurgo.jdbc.uid.SequenceUIDGenerator"&lt;br/&gt;
                       type="java.lang.Integer"&lt;br/&gt;
        /&gt;&lt;br/&gt;
   &amp;lt;/dataobject&gt; &lt;br/&gt;&lt;br/&gt;
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;Hay q optimizar el proceso para que no se realicen muchas consultas, bien cacheando consulas o bien guardando el arbol de Data objects en memoria, aunque seguramente esto lo dejaré para un poco mas adelante, antes hay que introducir commons-loggin en licurgo para eliminar los temidos Systems.out
&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/referencias_en_licurgo_tables</feedburner:origLink></entry>
    <entry>
        <id>http://weblogs.javahispano.org/lasterra/entry/formato_para_documentar</id>
        <title type="html">Formato para documentar???</title>
        <author><name>lasterra</name></author>
        <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lasterra/~3/4lTRRL3dJqY/formato_para_documentar" />
        <published>2005-09-04T22:03:53+02:00</published>
        <updated>2007-05-09T00:18:39+02:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;p&gt;En javahispano hace algun tiempo intentamos crear un estandard XML para los articulos. La idea era buena y como resultado obteniamos artí­culos de formato/color uniforme en pdf y html. El problema era conseguir que las personas que nos enviaban los artí­culos los enviaran en este formato y traducir todo lo que nos enviaban era un arduo y espeso trabajo&lt;/p&gt;
&lt;p&gt;Ahora me encuentro ante el problema de elegir como documentar. Tengo varias opciones&lt;br/&gt;
&lt;ol&gt;
&lt;li&gt;Openoffice, los pros son que tengo un editor de verdad para insertar imagenes tipos de letra y crear plantillas. EL contra es que no veo forma de subir los binarios al CVS y hya muchas gente q no usa openoffice y q quizas no quiera instalarlo solo para documentar cáñamo&lt;/li&gt;
&lt;li&gt;HTML, me creo un pequeño css y escribo html usando algun editor tipo nvu o a pelo que total para poner brs y imgs no es muy dificil&lt;/li&gt;
&lt;li&gt;Emillan me hablo alguna vez de forrest, proyecto de apache, que genera web staticas y dinÃ¡micas basado en cocoon, que exporta a pdf y alguans cosillas más&lt;/li&gt;
&lt;li&gt;Docbook, esto parece que es lo mas estandard, pero parece demasiado complejo. Creo haber visto alguna vez algun plugin para el openoffice que permita crear documentos facilemente. Algo q ayudaria mucho.&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;
&lt;p&gt;Vosotros que usais??

&lt;/p&gt;

&lt;br/&gt;&lt;br/&gt;
</content>
    <feedburner:origLink>http://weblogs.javahispano.org/lasterra/entry/formato_para_documentar</feedburner:origLink></entry>
</feed>
