<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>3f blog &#187; grails</title>
	<atom:link href="http://blog.soluciones3f.com.ar/tag/grails/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.soluciones3f.com.ar</link>
	<description>Experiencias compartidas</description>
	<lastBuildDate>Tue, 01 Nov 2011 18:08:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Utilizar mockConfig en test de Grails</title>
		<link>http://blog.soluciones3f.com.ar/2011/05/24/utilizar-mockconfig-en-test-de-grails/</link>
		<comments>http://blog.soluciones3f.com.ar/2011/05/24/utilizar-mockconfig-en-test-de-grails/#comments</comments>
		<pubDate>Tue, 24 May 2011 05:38:42 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[grails]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[configuration holder]]></category>
		<category><![CDATA[configurationHolder]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[metaclass]]></category>
		<category><![CDATA[mock]]></category>
		<category><![CDATA[mockConfig]]></category>
		<category><![CDATA[mocking]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[test unitario]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=693</guid>
		<description><![CDATA[Necesitaba realizar test unitarios en una aplicación que estamos desarrollando y una de las clases que quería testear accedía, por medio del ConfigurationHolder a datos que debían ser cargados en el Config.groovy Una búsqueda rápida en google arrojó varios resultados sobre como utilizar la magia del metaClass de groovy para mockear manualmente los objetos y [...]]]></description>
			<content:encoded><![CDATA[<p>Necesitaba realizar test unitarios en una aplicación que estamos desarrollando y una de las clases que quería testear accedía, por medio del <strong>ConfigurationHolder</strong> a datos que debían ser cargados en el <strong>Config.groovy</strong></p>
<p>Una búsqueda rápida en google arrojó varios resultados sobre como utilizar la magia del metaClass de groovy para mockear manualmente los objetos y métodos necesarios, pero hay mejores maneras de hacerlo.</p>
<p>Desde no se que versión de Grails existe el método <strong>mockConfig</strong> de la clase <strong>GrailsUnitTestCase</strong> de la cual deberían heredar todos nuestros test unitarios.</p>
<p>Lamentablemente no encontré mucha información sobre como usar este método por ningún lado. Solo había encontrado <a href="http://little418.com/2009/07/mocking-configuration-in-grails-for-unit-testing.html">un blog llamado <em>418 I&#8217;m a teapo</em>t</a> (en un artículo medio viejito) en el cual decían que no lo habían logrado hacer funcionar y por eso continuaban utilizando metaclass</p>
<p>Por suerte haciendo algunas pruebas descubrí una forma de hacerlo trabajar para mis necesidades. El secreto es que este método no acepta la sintaxis <em>jerárquica</em> (perdón, no se el nombre técnico) en el config, sino que debemos hacer todo más sencillamente.</p>
<p>Por ejemplo, en lugar de escribir</p>
<pre class="brush: plain; title: ; notranslate">
mockDomain(&quot;&quot;&quot;
    grails {
        paypal {
            server = &quot;https://www.sandbox.paypal.com/&quot;
        }
    }
&quot;&quot;&quot;)
</pre>
<p>lo que debemos escribir es</p>
<pre class="brush: plain; title: ; notranslate">
mockDomain(&quot;&quot;&quot;
    grails.paypal.server = &quot;https://www.sandbox.paypal.com/&quot;
&quot;&quot;&quot;)
</pre>
<p>De esta manera, y accediendo a la configuración por medio del ConfigurationHolder en mi aplicación, no he tenido mayores problemas.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2011/05/24/utilizar-mockconfig-en-test-de-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programar Groovy y Grails con gedit (Ubuntu)</title>
		<link>http://blog.soluciones3f.com.ar/2011/05/22/programar-groovy-y-grails-con-gedit-ubuntu/</link>
		<comments>http://blog.soluciones3f.com.ar/2011/05/22/programar-groovy-y-grails-con-gedit-ubuntu/#comments</comments>
		<pubDate>Sun, 22 May 2011 18:13:44 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[gnu linux]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[gedit]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[mime]]></category>
		<category><![CDATA[syntax]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=449</guid>
		<description><![CDATA[Si bien he probado varios entornos de trabajo, a lo largo del tiempo, para desarrollar en Grails, siempre vuelvo a mi viejo amor: gedit (gnome-editor)) Por defecto, no tiene soporte para el lenguaje Groovy, pero es fácilmente configurable, e incluso sin necesidad de permisos de adminsitrador, permitiéndonos configurar nuestor ambiente de trabajo, sin modificar la [...]]]></description>
			<content:encoded><![CDATA[<p>Si bien he probado varios entornos de trabajo, a lo largo del tiempo, para desarrollar en Grails, siempre vuelvo a mi viejo amor: <strong>gedit</strong> <em>(gnome-editor))</em></p>
<p>Por defecto, no tiene soporte para el lenguaje Groovy, pero es fácilmente configurable, e incluso sin necesidad de permisos de adminsitrador, permitiéndonos configurar nuestor ambiente de trabajo, sin modificar la configuración de los demás usuarios.</p>
<p>Para esto debemos descargar el bundle con el coloreo de sintaxis, tipos mime y otras cosas del sitio http://www.grails.org/Gedit</p>
<p>En esa misma página podremos encontrar instrucciones para instalarlo, que requieren de permisos de administrador. Pero combinando un post anterior en este mismo blog, sobre como hacer que gedit abra archivos tpl como si fueran archivos php y algunos otros tips más, podremos instalarlo sin necesidad de permisos especiales.</p>
<p>Luego de descompactar el archivo descargado, copiamos los directorios plugins, snippets y styles a la carpeta ~/.gnome2/gedit</p>
<p>Para arreglar el coloreo de sintaxis y enseñarle a gedit la existencia de groovy debemos crear la carpeta (si no existe) ~/.local/share/gtksourceview-2.0/language-specs y copiar en ella los dos archivos terminados en .lang que descompactamos.</p>
<p>Despues creamos el archivo ~/.local/share/mime/packages/Overrides.xml (y las carpetas necesarias, si no existen) y agregamos en ese archivo el contenido de los dos archivos xml que se encuentran en el bundle.</p>
<p>El contenido final del archivo será similar a</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;mime-info xmlns=&quot;http://www.freedesktop.org/standards/shared-mime-info&quot;&gt;
	&lt;mime-type type=&quot;text/x-groovy&quot;&gt;
		&lt;sub-class-of type=&quot;text/x-java&quot;/&gt;
		&lt;comment&gt;Groovy Source File&lt;/comment&gt;
		&lt;glob pattern=&quot;*.groovy&quot;/&gt;
	&lt;/mime-type&gt;
	&lt;mime-type type=&quot;text/x-groovy++&quot;&gt;
		&lt;sub-class-of type=&quot;text/x-groovy&quot;/&gt;
		&lt;comment&gt;Groovy++ Source File&lt;/comment&gt;
		&lt;glob pattern=&quot;*.gpp;*.g++&quot;/&gt;
	&lt;/mime-type&gt;
	&lt;mime-type type=&quot;text/x-gsp&quot;&gt;
		&lt;sub-class-of type=&quot;text/html&quot;/&gt;
		&lt;comment&gt;Grails GSP File&lt;/comment&gt;
		&lt;glob pattern=&quot;*.gsp&quot;/&gt;
	&lt;/mime-type&gt;
&lt;/mime-info&gt;
</pre>
<p>Finalmente, para que el sistema reconozca nuestros cambios, debemos actualizar la base de datos de tipos mime, ejecutando el comando <em>update-mime-database ~/.local/share/mime</em></p>
<p>Con esto, al abrir el próximo archivo de groovy, deberíamos tener coloreo de sintaxis funcionando correctamente.</p>
<p>Se pueden seguir haciendo otras cosas como habilitar bash completion, pero lo dejaremos para otra oportunidad.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2011/05/22/programar-groovy-y-grails-con-gedit-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reflexiones y descubrimientos relacionados con mime-type, gedit y smarty</title>
		<link>http://blog.soluciones3f.com.ar/2011/02/16/reflexiones-y-descubrimientos-relacionados-con-mime-type-gedit-y-smarty/</link>
		<comments>http://blog.soluciones3f.com.ar/2011/02/16/reflexiones-y-descubrimientos-relacionados-con-mime-type-gedit-y-smarty/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 01:20:52 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[gnu linux]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[coloreo de sintaxis]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[editor de texto]]></category>
		<category><![CDATA[gedit]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mime type]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[syntax]]></category>
		<category><![CDATA[text editor]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=643</guid>
		<description><![CDATA[Siempre me molestó que para hacer que gedit reconozca un determinado tipo de archivos de una determinada manera, tenía que modificar archivos en el directorio /usr Particularmente lo que me molestaba tener que actualizar eran los tipos MIME que identifican un determinado archivo, con un determinado tipo y gedit como nautilus utilizan para saber como [...]]]></description>
			<content:encoded><![CDATA[<p>Siempre me molestó que para hacer que gedit reconozca un determinado tipo de archivos de una determinada manera, tenía que modificar archivos en el directorio /usr</p>
<p>Particularmente lo que me molestaba tener que actualizar eran los tipos MIME que identifican un determinado archivo, con un determinado tipo y gedit como nautilus utilizan para saber como abrir cada archivo, de que forma colorearlo, etc. Para modificar ese directorio se necesita permisos de administrador y siempre me pareció que debería haber una forma de hacerlo desde mi cuenta de usuario limitado.</p>
<p>Hoy, que estaba trabajado con PHP, queria abrir unos archivos de Smarty que tienen extensión tpl, y que se colorearan automáticamente como html, que es el lenguaje más cercano que reconoce (o al menos de los que vienen por defecto) y decidí buscar en internet una forma de hacerlo y encontré dos páginas, por un lado el blog de c3b en un artículo titulado <a href="http://www.c3b.co.uk/?p=32">Alternative method for opening Smarty templates with HTML syntax highlighting in gedit</a> y también en la página de gnome bajo el nombre <a href="http://library.gnome.org/admin/system-admin-guide/stable/mimetypes-modifying.html.en">Modifying MIME types</a></p>
<p>Combinando el conocimiento de ambos sitios, logré que al hacer doble-click sobre un archivo tpl, se me abra automáticamente el gedit (y no firefox!) y se me coloree automáticamente la sintaxis como PHP</p>
<p>¿Cual fue el procedimiento? Fácil.</p>
<p><span id="more-643"></span>Lo primero que hice fue crear la carpeta <em>~/.local/share/mime/packages</em></p>
<p>En esa carpeta creé un archivo llamado Overrides.xml con el siguiente contenido</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version='1.0' encoding='utf-8'?&gt;
&lt;mime-info xmlns=&quot;http://www.freedesktop.org/standards/shared-mime-info&quot;&gt;
    &lt;mime-type type=&quot;application/x-php&quot;&gt;
        &lt;glob pattern=&quot;*.tpl&quot;/&gt;
    &lt;/mime-type&gt;
&lt;/mime-info&gt;
</pre>
<p>Luego ejecuté el comando <em>update-mime-database ~/.local/share/mime</em></p>
<p>La lógica detras de este procedimiento, es que en el archivo Overrides.xml puedo crear nuevas asociaciones, o modificar exisntes. En este caso en particular, se le informa al sistema que los archivos .tpl son archivos PHP, y por lo tanto lo colorea automáticamente como PHP</p>
<p>Y todo esto sin usar sudo ni una sola vez <img src='http://blog.soluciones3f.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2011/02/16/reflexiones-y-descubrimientos-relacionados-con-mime-type-gedit-y-smarty/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mockear la misma clase que se esta testeando para realizar pruebas unitarias</title>
		<link>http://blog.soluciones3f.com.ar/2010/08/16/mockear-la-misma-clase-que-se-esta-testeando-para-realizar-pruebas-unitarias/</link>
		<comments>http://blog.soluciones3f.com.ar/2010/08/16/mockear-la-misma-clase-que-se-esta-testeando-para-realizar-pruebas-unitarias/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 05:31:40 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[grails]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[criterias]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[integration test]]></category>
		<category><![CDATA[mocking]]></category>
		<category><![CDATA[pruebas de integracion]]></category>
		<category><![CDATA[pruebas unitarias]]></category>
		<category><![CDATA[unit test]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=602</guid>
		<description><![CDATA[En el artículo anterior comenté que es aconsejable aislar en diferentes métodos aquellos fragmentos de código que no pueden ser testeados unitariamente (por ejemplo las consultas con Hibernate Criterias, o Hql) de tal manera que puedan ser mockeados y de esa manera poder testear el resto del código. Pero cuando intenté llevar a la práctica [...]]]></description>
			<content:encoded><![CDATA[<p>En el artículo anterior comenté que es aconsejable aislar en diferentes métodos aquellos fragmentos de código que no pueden ser testeados unitariamente (por ejemplo las consultas con Hibernate Criterias, o Hql) de tal manera que puedan ser mockeados y de esa manera poder testear el resto del código.</p>
<p>Pero cuando intenté llevar a la práctica esto, descubrí que no quería crear una clase nueva para tener estos métodos, sino que quería que estén en la misma clase. Esto me planteaba un problema. Necesitaba mocker el método que no quería que se ejecutara, pero no sabía si podía mockear una clase en la cual había un método que si quería testear.</p>
<p>La respuesta fácil es SI, se puede, pero hay una limitación. El método que se quiere mockear hay que hacerlo utilizando metaClass. No se puede utilizar demand, como con los mocks normales, sino que se debe si o si utilizar metaClass.</p>
<p>Uno puede decir, que para eso no hago ningún mock, y simplemente utilizo metaClass para pisar el método en cuestión, pero lamentablemente, como dicen en muchos otros blogs, hacer eso no es seguro, y puede afectar el resultado de otros tests. (de hecho en mi se veía el error en los test de integración que comenzaron a fallar y no entendía por qué)</p>
<p>Basta con llamar a mockFor sobre la clase que se quiera testear, y luego se puede utilizar metaClass tranquilamente para cambiar esa clase, que cuando se termine el test los cambios se revertirán normalmente.</p>
<p>Se que mucho tal vez no se entienda, asi que dejaré un pequeño ejemplo comentado aquí</p>
<p>Quiero testear el método agregar de la clase DestacadoService. Este método internamente llama al método buscarDestacado el cual utiliza bastante hql para realizar su función, el cual no funciona en pruebas unitarias, entonces para realizar el test de agregar se necesita hacer algo similar a lo siguiente:</p>
<pre class="brush: groovy; title: ; notranslate">
mockFor(DestacadoService)
DestacadoService.metaClass.buscarDestacado = { pais, tipo, id -&gt; return null; }

def service = new DestacadoService()
def r = service.agregar(pais.argentina, tipo.principal, 'mi destacado')
</pre>
<p>Como se puede apreciar, en la línea 1 llamamos a mockFor sobre la clase que queremos mockear<br />
En la línea 2, utilizamos metaClass para cambiar el método (y retornar algo estático que no use hql ni nada)<br />
En la siguiente línea de código instanciamos la clase que contiene el método que queremos testar<br />
Y finalmente, en la última lo ejecutamos</p>
<p>Haciendo esto nos aseguramos que luego del test el cambio sobre la clase causado por la modificación del metaClass sea revertido y no afecte al resto de los tests.</p>
<p>Exactamente lo mismo se debe hacer cuando se quieren modificar métodos que estén en clases de dominio. Solo que en lugar de utilizar mockFor se puede utilizar mockDomain</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2010/08/16/mockear-la-misma-clase-que-se-esta-testeando-para-realizar-pruebas-unitarias/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Como hacer pruebas unitarias con Grails que tienen método que acceden a la base de datos</title>
		<link>http://blog.soluciones3f.com.ar/2010/08/16/como-hacer-pruebas-unitarias-con-grails-que-tienen-metodo-que-acceden-a-la-base-de-datos/</link>
		<comments>http://blog.soluciones3f.com.ar/2010/08/16/como-hacer-pruebas-unitarias-con-grails-que-tienen-metodo-que-acceden-a-la-base-de-datos/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 04:44:31 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[grails]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[createcriteria]]></category>
		<category><![CDATA[gorm]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[integration test]]></category>
		<category><![CDATA[pruebas de integracion]]></category>
		<category><![CDATA[pruebas unitarias]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[unit testint]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=599</guid>
		<description><![CDATA[Una de las tareas mas importantes, y a la vez que más esquivamos hacer son los famosos tests, tan necesarios para las metodologías ágiles que nos gusta seguir. En grails hay principalmente dos tipos de tests. Unitarios y de Integración. Los primeros se ejecutan muy rápido pero no cuentan con todo el entorno de grails [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las tareas mas importantes, y a la vez que más esquivamos hacer son los famosos tests, tan necesarios para las metodologías ágiles que nos gusta seguir.</p>
<p>En grails hay principalmente dos tipos de tests. Unitarios y de Integración. Los primeros se ejecutan muy rápido pero no cuentan con todo el entorno de grails especialmente hibernate, y los segundos demoran mucho más en su ejecución, pero contamos con todas las funcionalidades de grails.</p>
<p>Según mi humilde opinión, debemos intentar hacer la mayor cantidad de tests posibles utilizando pruebas unitarias, ya que en mi experiencia por ser tan lentos los tests de integración, terminamos sin usarlos.</p>
<p>Pero nuestra intención de usar test unitarios lo más posible, se golpea contra un muro de concreto cuando intentamos testear métodos que utilizan Criterias o Hql, ya que al depender de hibernate, el cual no está disponible durante las pruebas unitarias no hay forma de hacerlos funcionar.</p>
<p>Un &#8220;tip&#8221; es intentar utilizar tan poco estas funciones como sea posible, y cuando no queda otro remedio que usarlas, intentar centralizar todo el código en algunos métodos que únicamente se encarguen de realizar estas consultas, los cuales serán probados con test de integración.</p>
<p>Si todo este código lo ponemos en una clase diferente, entonces podremos mockearla para las pruebas unitarias y el resto de nuestros métodos que no dependen de hql ni criterias, podrán ser testeados ya que se limitarán a invocar los métodos problemáticos sobre un mock, y problema resuelto.</p>
<p>Sin embargo a veces no queremos poner estos métodos en otra clase, sino que deseamos que sean métodos de la misma clase que estoy estoy testeando, o los métodos se encuentran en clases de dominio, y ahí se producen algunos otros problemillas que trataré en el <a href="http://blog.soluciones3f.com.ar/2010/08/16/mockear-la-misma-clase-que-se-esta-testeando-para-realizar-pruebas-unitarias/">siguiente post</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2010/08/16/como-hacer-pruebas-unitarias-con-grails-que-tienen-metodo-que-acceden-a-la-base-de-datos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizar packages en grails&#8230; una necesidad?</title>
		<link>http://blog.soluciones3f.com.ar/2010/02/10/utilizar-packages-en-grails-una-necesidad/</link>
		<comments>http://blog.soluciones3f.com.ar/2010/02/10/utilizar-packages-en-grails-una-necesidad/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 19:15:22 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[grails]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[controllers]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[gorm]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[namespace]]></category>
		<category><![CDATA[packages]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=483</guid>
		<description><![CDATA[Todos sabemos que en Java es una muy buena práctica la utilización de packages, a tal punto que para casi todo programador de Java es casi una obligatoriedad. El concepto de package en si es muy bueno, casi todos los lenguajes modernos lo tienen de una u otra manera, con un nombre u otro. Se [...]]]></description>
			<content:encoded><![CDATA[<p>Todos sabemos que en Java es una muy buena práctica la utilización de packages, a tal punto que para casi todo programador de Java es casi una obligatoriedad.</p>
<p>El concepto de package en si es muy bueno, casi todos los lenguajes modernos lo tienen de una u otra manera, con un nombre u otro. Se utilizan para evitar coliciones de nombres entre diferentes espacios de nombres.</p>
<p>De tal manera, que en el package paypal puede existir la clase Payment y en el package AlertPay tener otra clase con el mismo nombre Paypal sin ninguna relación con la anterior y cohexistir en el mismo proyecto. Cuando hay una duda (ambiguedad) sobre que clase se esta utilizando basta con escribir el nombre entero de la clase, incluido el package a la que pertenece y listo.</p>
<p>Diciendo esto cualquiera podria ver que tienen cierta utilidad especialmente cuando se comienzan a mezclar codigos desarrolaldos en diferentes lugares (ala plugins) en un mismo proyecto y no se puede tener control sobre que dos desarrolladores no elijan nombres que entren en conflicto.</p>
<p>¿Pero que sucede con grails? Desde la versión 1.2.0 cuando se crea cualquier artefact (ya sea un controller, un dominio, un servicio, etc) y no se le especifica un package, aparece un warning diciendo que es aconsejable utilizar siempre un package al cual hay que contestar con yes, para poder seguir adelante.</p>
<p>Eso es algo bueno, pero por la forma en que funciona Grails los packages pierden un poco su sentido.  No pueden haber dos clases de Dominio, ni dos clases Controllers que tengan el mismo nombre aunque esten definidas en packages diferentes! Se entiende esto dado que Grails utiliza los nombres de las cases para su &#8220;Convention Over Configuration&#8221; y de esa manera mapear facilmente los dominios a tablas con GORM, o las urls para acceder a los Controllers. (Aclaro que lo entiendo, y seguramente hay implicancias ténicas para que sea así, pero me gustaría se le encontrara alguna vuelta)</p>
<p>Mi caso puntual, que me motivo a escribir este post, es que estaba realizando un plugin para realizar pagos que tenía una clase de dominio llamada Payment, y debía utilizar este plugin en un proyecto que utiliza el plugin de Paypal el cual también tiene una clase de dominio llamada Payment.</p>
<p>Al incluir los dos plugins en un mismo proyecto y ejecutar la aplicación se genera el siguiente error:</p>
<p><code><br />
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.DuplicateMappingException: duplicate import: Payment refers to both com.soluciones3f.tpv.Payment and org.grails.paypal.Payment (try using auto-import="false")<br />
</code></p>
<p>No investigaré como resolver este problema, simplemente cambiaré el nombre de mi clase para salir del  paso y continuar sin problemas. Pero en todo caso es un problema latente que me gutaría encontrarle alguna solución.</p>
<p>Esto llevaría a pensar que, si igualmente voy a tener colision de nombres entre paquetes, ¿para que usar packages? El problema es que a veces queremos usar packages para order el código (dado que para usar packages se crean directorios.. esto lo ordena un poco y evita tener un unico directorio que mezcla Exceptions, Strategies, Utilites, etc en una sopa indistinguible)  pero si alguna de estas clases que SI pertenecen a un package necesita usar una clase de dominio, que por lo que dije antes decidí no poner en un package&#8230; ahí esta nuevamente el problema.</p>
<p>Grails, o groovy si vamos al caso, heredan la limitación de Java de no poder hacer un import del package (default). Aquel package al que van a parar todas las clases sin package. En consecuencia no tengo forma de usarlas. Entonces, nuevamente, es muy recomendable usar siempre packages a pesar de que grails le quite un poco de sentido.</p>
<p>Por lo pronto, recomiendo ponerle package a todo, ya que tal vez nos puede ahorrar un dolor de cabeza si despues aparece un package que necesita usar lo que ya habia hecho antes, y si bien voy a tener que seguir coordinándome con el resto del universo para no tener dos clases con el mismo nombre, el esfuero que representa usar packages no es tan grande como para no hacerlo y desear que algún día se resuelva este problema.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2010/02/10/utilizar-packages-en-grails-una-necesidad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clases de dominio de Grails y sus atributos</title>
		<link>http://blog.soluciones3f.com.ar/2009/08/26/clases-de-dominio-de-grails-y-sus-atributos/</link>
		<comments>http://blog.soluciones3f.com.ar/2009/08/26/clases-de-dominio-de-grails-y-sus-atributos/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 19:08:11 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[grails]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=410</guid>
		<description><![CDATA[Hace un tiempo estamos trabajando sobre un proyecto utilizando el framework Gralis para su desarrollo. Como creo que escribimos en un post anterior, este es un framework realmente comodo para Groovy que permite un desarrollo ágil, rápido y moderno que promueve una arquitectura MVC para el desarrollo de aplicaciones web. La clase central del modelo [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un tiempo estamos trabajando sobre un proyecto utilizando el framework Gralis para su desarrollo. Como creo que escribimos en un post anterior, este es un framework realmente comodo para Groovy que permite un desarrollo ágil, rápido y moderno que promueve una arquitectura MVC para el desarrollo de aplicaciones web.</p>
<p>La clase central del modelo esta representada por las <em>clases de dominio. </em>En estas clases uno define los atrbutos que tienen que tener, algunas reglas de constraints a cumplir antes de poder ser correctamente persistidas a la baes de datos y algunas otras relaciones con las demas clases de dominio que conforman todo mi modelo de datos.</p>
<p>Sin embargo hay que tener cuidado con algunos detalles a la hora de implementar estas clases.</p>
<ul>
<li>Al usar mucho groovy, uno se acostumbra a no definir tipos de datos, y usar siempre def. Sin embargo en las clases de dominio debemos siempre definir el tipo de datos de los atributos ya que es en base a esto el como mapea y genera la base de datos subyacente.</li>
<li>Por defaults un atributo no puede ser Null, entonces hay que recordar de agregarlo como nullable a la definición de contraints si es que puede darse el caso. Esto lo veo perfecto, por default la forma mas restrictiva, pero suele ser justo lo contrario a lo que estoy acostumbrado.</li>
<li>Hay que tener cuidado con los atributos transient</li>
</ul>
<p>Mas tarde escribiré sobre los atributos transient y los getters y setters en las clases de dominio. Pensaba hacerlo en este post, pero los problemas que traen aparejados ameritan una entrada por si misma.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2009/08/26/clases-de-dominio-de-grails-y-sus-atributos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Accediendo por Putty a cygwin 1.7 en Windows Vista (PuttyCyg)</title>
		<link>http://blog.soluciones3f.com.ar/2009/06/08/accediendo-por-putty-a-cygwin-17-en-windows-vista-puttycyg/</link>
		<comments>http://blog.soluciones3f.com.ar/2009/06/08/accediendo-por-putty-a-cygwin-17-en-windows-vista-puttycyg/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 20:57:36 +0000</pubDate>
		<dc:creator>fafa</dc:creator>
				<category><![CDATA[gnu linux]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[cygwin]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[putty]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=328</guid>
		<description><![CDATA[Creo que el título lo dice todo. Necesitábamos usar una linea de comando &#8220;confiable&#8221; para poder trabajar cómodamente con herramientas de arquitectura para el desarrollo (el ejemplo fácil es GRAILS, también hemos trabajado con Symfony). Yo siempre conocí el PuttyCyg (una variante de Putty que permite conectarse localmente a una instalación de CygWin). Por si [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.soluciones3f.com.ar/wp-content/uploads/2009/06/happy__mediano.jpg" rel="lightbox[328]"><img class="aligncenter size-medium wp-image-329" title="happy__mediano" src="http://blog.soluciones3f.com.ar/wp-content/uploads/2009/06/happy__mediano-300x225.jpg" alt="happy__mediano" width="300" height="225" /></a></p>
<p>Creo que el título lo dice todo. Necesitábamos usar una linea de comando &#8220;confiable&#8221; para poder trabajar cómodamente con herramientas de arquitectura para el desarrollo (el ejemplo fácil es <a href="http://grails.org">GRAILS</a>, también hemos trabajado con <a href="http://www.symfony-project.org">Symfony</a>). Yo siempre conocí el <a href="http://code.google.com/p/puttycyg/">PuttyCyg</a> (una variante de Putty que permite conectarse localmente a una instalación de <a href="http://www.cygwin.com">CygWin</a>).</p>
<p>Por si no saben, cygwin es una especie de emulación de librerías de *nix realizada por Red Hat; por ello, establece una infraestructura para ejecutar comandos que normalmente estarían en *nix. Putty es un cliente de consola que normalmente uno usa para conectarse remotamente a un máquina ejecutando un sistema operativo *nix (el típico ejemplo es un servidor SSH).</p>
<p>Entonces, lo interesante es que buscando un poco en internet encontramos la forma de usar una linea de comando, muy similar a la de *nix en un entorno Windows&#8230; Si! La forma de lograrlo es la siguiente:</p>
<ol>
<li>Incluir en el PATH el directorio donde esté el cygwin1.dll (ejemplo: <strong>c:\cygwin\bin</strong>).</li>
<li>Setear la variable de entorno NOCYGWIN=1 que le dice al PuttyCyg que no busque la configuración en la registry.</li>
<li>Ejecutar el Putty: <strong>putty.exe -cygterm -</strong></li>
<li>En el mejor de los casos, hacer un acceso directo con lo resaltado en el punto anterior.</li>
</ol>
<p>Listo! Ahora deberíamos ser capaces de usar cualquier cosa desde windows como si fuera *nix.</p>
<p>Una sugerencia adicional, cuando se quieren hacer &#8220;<strong>cd</strong>&#8221; recuerden que la forma en que se muestran los directorios en *nix no tiene unidades, sin embargo, al usar comillas automáticamente cygwin lleva ese comando al cmd &#8220;verdadero&#8221;. Por ello, <strong>cd &#8220;D:\grails&#8221;</strong> nos hará un internamente <strong>cd /cygdrive/d/grails</strong>.</p>
<p>Como para tenerlo en cuenta, espero que les sirva. Me basé en lo que encontré en: <a href="http://code.google.com/p/puttycyg/issues/detail?id=16">http://code.google.com/p/puttycyg/issues/detail?id=16</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2009/06/08/accediendo-por-putty-a-cygwin-17-en-windows-vista-puttycyg/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Actualización a Grails 1.1.1 cuando uno tiene configurado IVY</title>
		<link>http://blog.soluciones3f.com.ar/2009/05/20/actualizacion-a-grails-111-cuando-uno-tiene-configurado-ivy/</link>
		<comments>http://blog.soluciones3f.com.ar/2009/05/20/actualizacion-a-grails-111-cuando-uno-tiene-configurado-ivy/#comments</comments>
		<pubDate>Wed, 20 May 2009 19:56:54 +0000</pubDate>
		<dc:creator>fafa</dc:creator>
				<category><![CDATA[gnu linux]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[upgrade]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=320</guid>
		<description><![CDATA[Hace poco más de un mes, estamos trabajando fuertemente en el desarrollo de una (en realidad más de una) aplicación web construida con la herramienta de orquestación GRAILS. Es interesante como está construida porque, para los fanáticos de MAVEN (por ejemplo) da un paso más adelante y prepara una serie de cualidades en el entorno [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco más de un mes, estamos trabajando fuertemente en el desarrollo de una (en realidad más de una) aplicación web construida con la herramienta de <em>orquestación</em> GRAILS. Es interesante como está construida porque, para los fanáticos de MAVEN (por ejemplo) da un paso más adelante y prepara una serie de cualidades en el entorno que simplifica mucho a la hora de desarrollar. Para quienes no entienden del tema, tendrán más detalles en un POST <em>proximamente</em>.</p>
<p>Una de estas aplicaciones que estamos desarrollando con Grails tiene configurado el plugin de IVY; IVY es un manejador de dependencias que está dentro del <em>paquete</em> de herramientas de Apache; cuando intentamos hacer el upgrade (desde la versión 1.1 a 1.1.1) nos encontramos con una serie de errores:</p>
<pre>Error executing script Upgrade: : java.lang.NoSuchMethodError: org.apache.tools.ant.util.FileUtils.createTempFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;ZZ)Ljava/io/File;
gant.TargetExecutionException: : java.lang.NoSuchMethodError: org.apache.tools.ant.util.FileUtils.createTempFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;ZZ)Ljava/io/File;
        at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:331)
        at gant.Gant$_dispatch_closure6.doCall(Gant.groovy:334)
        at gant.Gant$_dispatch_closure6.doCall(Gant.groovy)
        at gant.Gant.withBuildListeners(Gant.groovy:344)
        at gant.Gant.this$2$withBuildListeners(Gant.groovy)
        at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
        at gant.Gant.dispatch(Gant.groovy:334)
        at gant.Gant.this$2$dispatch(Gant.groovy)
        at gant.Gant.invokeMethod(Gant.groovy)
        at gant.Gant.processTargets(Gant.groovy:495)
        at gant.Gant.processTargets(Gant.groovy:480)
Caused by: : java.lang.NoSuchMethodError: org.apache.tools.ant.util.FileUtils.createTempFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;ZZ)Ljava/io/File;
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:115)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:62)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at Upgrade$_run_closure1.doCall(Upgrade:82)
        at Upgrade$_run_closure2.doCall(Upgrade:261)
        at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:324)
        ... 10 more
Caused by: java.lang.NoSuchMethodError: org.apache.tools.ant.util.FileUtils.createTempFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;ZZ)Ljava/io/File;
        at org.apache.tools.ant.taskdefs.optional.ReplaceRegExp.doReplace(ReplaceRegExp.java:326)
        at org.apache.tools.ant.taskdefs.optional.ReplaceRegExp.execute(ReplaceRegExp.java:527)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
        ... 17 more</pre>
<p>Básicamente el problema es que el script que ejecuta GRAILS pone en classpath en primera instancia nuestro directorio <em>lib</em>, en condiciones normales esto sería lógico (porque nuestra aplicación puede usar una versión más nueva de algo que GRAILS no usa) pero en estas condiciones resulta en un error del script conocido como <strong>Upgrade.groovy</strong> es por eso que terminamos ese error.</p>
<p><strong>¿Cuál es la solución? </strong>Fácil, movemos a un directorio temporario <span style="text-decoration: underline;">todo</span> nuestro directorio lib, ejecutamos upgrade y volvemos a mover todo al lugar donde estaba <img src='http://blog.soluciones3f.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Tendremos la aplicación actualizada sin mayores problemas, jijiji.</p>
<p>La idea, no fue mía, fue obra y gracia de Google <img src='http://blog.soluciones3f.com.ar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Aquí el <a href="http://www.nabble.com/grails-upgrade-fails-with-NoSuchMethodException-for-createTemporaryFile()-td22957488.html">link</a> original.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2009/05/20/actualizacion-a-grails-111-cuando-uno-tiene-configurado-ivy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

