<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel><generator>http://textpattern.com/?v=4.0.6</generator>
<title>Informática, Internet y otras cosas del querer</title>
<link>http://www.frangarcia.net/txp/</link>


<pubDate>Thu, 16 Jul 2009 08:17:08 GMT</pubDate>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/InformticaInternetYOtrasCosasDelQuerer" type="application/rss+xml" /><item><title>Plantillas, etiquetas y estilos en Grails</title>
<description>
<![CDATA[<p>Como cualquier framework que utilice el Modelo Vista Controlador, la vista se utiliza para mostrar el contenido final que será visto por el usuario. Estos archivos de la vista utilizan plantillas y etiquetas para evitar la repetición de código y los fallos en la edición del mismo.</p>

	<p>En Grails los archivos de la vista tienen extensión .gsp y están alojados en el directorio <em>grails-app/views/</em>. Las plantillas tienen por convenio que el nombre del archivo empieza con un subrayado bajo. La típica plantilla que nos podemos encontrar en cualquier aplicación web se refiere al pie de la misma. Podríamos tener algo así:</p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Groovy:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div class="groovy" style="font-family: monospace;">&lt;span <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20class"><span style="color: #000000; font-weight: bold;">class</span></a>=<span style="color: #ff0000;">&quot;copyright&quot;</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; © <span style="color: #cc66cc;">2009</span> Groovy&amp;Grails: desarrollo rápido de aplicaciones&lt;br/&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Aplicación creada por Fran García<br />
&gt;/span&gt;</div></div></div></p>

	<p>Una vez creada la plantilla, el siguiente paso será insertarla en aquellas páginas donde la queramos mostrar. Para eso Grails dispone de la etiqueta <code>&lt;g:render/&gt;</code> a la que debemos pasarle el parámetro <em>template</em> con la ubicación y el nombre de la plantilla que acabamos de generar, con lo que tendríamos algo asi: <code>&lt;g:render template=&quot;/common/piedepagina&quot;/&gt;</code>. Como puedes comprobar, hemos obviado el subrayado bajo al inicio del nombre de la plantilla, puesto que aquello sólo era un convenio.</p>

	<p>Si queremos modificar la apariencia de nuestro pie de página, debemos modificar el archivo css ubicado en <em>web-app/css/main.css</em> y añadir o modificar los descriptores necesarios.</p>

	<h3>Etiquetas en Grails</h3>

	<p>Posiblemente hayamos visto una de las etiquetas más utilizadas en Grails como es <code>&lt;g:render/&gt;</code>. Sin embargo, ésta no es la única y Grails cuenta con etiquetas para realizar operaciones lógicas, de iteración, de asignación, relativas a enlaces, <span class="caps">AJAX</span>, de formularios, de interfaz de usuario y renderización de contenido y de validación. </p>

	<p>En la página oficial de Grails <a href="http://www.grails.org/GSP+Tag+Reference">http://www.grails.org/GSP+Tag+Reference</a> encontraréis un listado de completo de todas las etiquetas disponibles.</p>]]>
</description>
<link>http://feedproxy.google.com/~r/InformticaInternetYOtrasCosasDelQuerer/~3/-ketW1CQ18U/plantillas-etiquetas-y-estilos-en-grails</link>
<pubDate>Thu, 16 Jul 2009 08:14:27 GMT</pubDate>
<dc:creator>Fran García</dc:creator>
<guid isPermaLink="false">tag:www.frangarcia.net,2009-07-07:20247d2c1b33c92c828e77198a7808fa/d7c2059460cfdc64e3c32c3ad39686cf</guid>
<feedburner:origLink>http://www.frangarcia.net/txp/articles/325/plantillas-etiquetas-y-estilos-en-grails</feedburner:origLink></item>
<item><title>Scaffolding en Grails</title>
<description>
<![CDATA[<p>El scaffolding es un término utilizando en programación para designar la construcción automática de aplicaciones a partir del esquema de la base de datos. Está soportado por varios frameworks <span class="caps">MVC</span> y Grails no podía ser menos y también lo incluye entre sus características más importantes. La idea del scaffolding es, partiendo del esquema de la base de datos, generar el código necesario para implementar las cuatro operaciones básicas en cualquier aplicación, que son: creación, lectura, actualización y borrado. Este tipo de aplicaciones se las conoce como <span class="caps">CRUD</span> (create, read, update y delete).</p>

	<p>Vamos a desarrollar una aplicación ejemplo utilizando scaffolding. Esta aplicación sería un sistema tipo twitter y lo primero que vamos a hacer es crear la aplicación con el comando</p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Shell:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div style="font-family: monospace;">grails create-app twitter<br />
&nbsp;</div></div></div></p>

	<p>Nuestra aplicación ejemplo sólamente va a tener dos clases de dominio, <em>Usuario</em> y <em>Tweet</em> y la única relación existente entre ellos será que los usuarios van a poder publicar muchos tweets. Para crear estas dos clases de dominio podemos utilizar las siguientes comandos</p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Shell:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div style="font-family: monospace;">grails create-domain-class usuario<br />
grails create-domain-class tweet<br />
<br />
&nbsp;</div></div></div></p>

	<p>Este comando creará las clases de dominio necesarias para nuestra aplicación. Posteriormente debemos añadir las propiedades necesarias a estas.</p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Groovy:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div class="groovy" style="font-family: monospace;"><a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20class"><span style="color: #000000; font-weight: bold;">class</span></a> Usuario <span style="color: #66cc66;">&#123;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.google.de/search?as_q=String&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">String</span></a> username<br />
&nbsp; &nbsp; <a href="http://www.google.de/search?as_q=String&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">String</span></a> password<br />
&nbsp; &nbsp; <a href="http://www.google.de/search?as_q=String&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">String</span></a> fullname<br />
&nbsp; &nbsp; <a href="http://www.google.de/search?as_q=String&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">String</span></a> email<br />
<br />
&nbsp; &nbsp; <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20static"><span style="color: #000000; font-weight: bold;">static</span></a> hasMany = <span style="color: #66cc66;">&#91;</span>tweets:Tweet<span style="color: #66cc66;">&#93;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20static"><span style="color: #000000; font-weight: bold;">static</span></a> constraints = <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; username<span style="color: #66cc66;">&#40;</span><a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20size"><span style="color: #663399;">size</span></a>:<span style="color: #cc66cc;">6</span>..<span style="color: #cc66cc;">20</span>, blank:<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20false"><span style="color: #000000; font-weight: bold;">false</span></a>, unique:<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20true"><span style="color: #000000; font-weight: bold;">true</span></a><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; password<span style="color: #66cc66;">&#40;</span><a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20size"><span style="color: #663399;">size</span></a>:<span style="color: #cc66cc;">6</span>..<span style="color: #cc66cc;">20</span>, blank:<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20false"><span style="color: #000000; font-weight: bold;">false</span></a>, password:<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20true"><span style="color: #000000; font-weight: bold;">true</span></a><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fullname<span style="color: #66cc66;">&#40;</span>blank:<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20false"><span style="color: #000000; font-weight: bold;">false</span></a><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; email<span style="color: #66cc66;">&#40;</span>email:<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20true"><span style="color: #000000; font-weight: bold;">true</span></a><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
&nbsp;</div></div></div></p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Groovy:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div class="groovy" style="font-family: monospace;"><a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20class"><span style="color: #000000; font-weight: bold;">class</span></a> Tweet <span style="color: #66cc66;">&#123;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.google.de/search?as_q=String&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">String</span></a> text<br />
&nbsp; &nbsp; <a href="http://www.google.de/search?as_q=Date&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">Date</span></a> date<br />
<br />
&nbsp; &nbsp; Usuario usuario<br />
<br />
&nbsp; &nbsp; <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20static"><span style="color: #000000; font-weight: bold;">static</span></a> constraints = <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; text<span style="color: #66cc66;">&#40;</span><a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20size"><span style="color: #663399;">size</span></a>:<span style="color: #cc66cc;">0</span>..<span style="color: #cc66cc;">140</span>, blank:<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20false"><span style="color: #000000; font-weight: bold;">false</span></a><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
&nbsp;</div></div></div></p>

	<p>La relación entre los usuarios y los tweets la hemos especificado con la variable <em>hasMany</em>. También hemos añadido una serie de <a href="http://www.grails.org/Validation">validaciones</a> que deben cumplir cada uno de los campos. El siguiente paso será crear los controladores e indicarle que queremos hacer scaffolding de los mismos. Para crear los controladores debemos hacer</p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Shell:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div style="font-family: monospace;">grails create-controller usuario<br />
grails create-controller tweet<br />
&nbsp;</div></div></div></p>

	<p>Una vez creados, debemos indicarles que queremos hacer scaffolding de las clases de dominio asociadas a cada uno de los controladores. </p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Groovy:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div class="groovy" style="font-family: monospace;"><a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20class"><span style="color: #000000; font-weight: bold;">class</span></a> UsuarioController <span style="color: #66cc66;">&#123;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> scaffold = Usuario<br />
<span style="color: #66cc66;">&#125;</span><br />
&nbsp;</div></div></div></p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Groovy:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div class="groovy" style="font-family: monospace;"><a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20class"><span style="color: #000000; font-weight: bold;">class</span></a> TweetController <span style="color: #66cc66;">&#123;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> scaffold = Tweet<br />
<span style="color: #66cc66;">&#125;</span><br />
&nbsp;</div></div></div></p>

	<p>Si por último, arrancamos la aplicación mediante el comando </p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Shell:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div style="font-family: monospace;">grails run-app<br />
&nbsp;</div></div></div></p>

	<p>ya tendremos funcionando una primera versión de nuestra copia de twitter, a la que por supuesto le faltarán todavía muchas cosas, que iremos desarrollando en próximas entradas.</p>]]>
</description>
<link>http://feedproxy.google.com/~r/InformticaInternetYOtrasCosasDelQuerer/~3/EJpAQvil4Rk/scaffolding-en-grails</link>
<pubDate>Mon, 13 Jul 2009 11:08:02 GMT</pubDate>
<dc:creator>Fran García</dc:creator>
<guid isPermaLink="false">tag:www.frangarcia.net,2009-07-07:20247d2c1b33c92c828e77198a7808fa/57f45698072a5ee70f7d628bb3596a9d</guid>
<feedburner:origLink>http://www.frangarcia.net/txp/articles/324/scaffolding-en-grails</feedburner:origLink></item>
<item><title>Características de Grails [2]</title>
<description>
<![CDATA[<p>Grails es un framework para el desarrollo de aplicaciones web basado en el lenguaje de programación Groovy, que a su vez se basa en la Plataforma Java. Grails está basado en los paradigmas convención sobre configuración y <span class="caps">DRY</span> (don&#8217;t repite yourself) o no te repitas que permite al programador olvidarse en gran parte de los detalles de configuración.</p>

	<p>Como la mayoría de los framework de desarrollo web, Grails está basado en el patrón Modelo Vista Controlador (<span class="caps">MVC</span>). En Grails los modelos son tratados como clases de dominio que permiten a la aplicación mostrar los datos en la vista. A diferencia de en otros frameworks, las clases de dominio de Grails son automáticamente persistidas y es incluso posible generar el esquema de la base de datos. Los controladores por su parte, permiten gestionar las peticiones a la aplicación y organizar los servicios proporcionados. Por último, la vista por defecto en Grails son las Groovy Server Pages (<span class="caps">GSP</span>) y habitualmente nos muestra el contenido en formato <span class="caps">HTML</span>. </p>

	<p>Grails permite al programador olvidarse de gran parte de la configuración típico que incluyen los frameworks <span class="caps">MVC</span>. Además Grails se aprovecha de un lenguaje dinámico como Groovy para acortar los tiempos de desarrollo para simplemente dejarlos en escribir código, actualizar, testear y depuración de fallos. Esto hace que el desarrollo de la aplicación sea mucho más ágil que con otros frameworks <span class="caps">MVC</span>. </p>

	<p>Además, Grails es una plataforma completa, puesto que incluye también un contenedor web, bases de datos, sistemas de empaquetado de la aplicación y un completo sistema para la realización de tests sobre nuestra aplicación. De esta forma, no debemos perder el tiempo buscando y descargando un servidor web para nuestra futura aplicación o un gestor de base de datos. Ni tan siquiera será necesario escribir complicados scripts de configuración para el empaquetado de la aplicación. Todo esto se convierte en una tarea tan sencilla como instalar Grails. </p>

	<h3>Características principales de Grails</h3>

	<ul>
		<li><strong>Convención sobre configuración</strong></li>
	</ul>

	<p>En lugar de tener que escribir interminables archivos de configuración en formato <span class="caps">XML</span>, Grails se basa en una serie de convenciones para que el desarrollo de la aplicación sea mucho más rápido y productivo. Además, gracias al uso de convenciones, se refuerza el otro principio del que hablábamos anteriormente, <span class="caps">DRY</span> (don&#8217;t repite yourself) o no te repitas.</p>

	<ul>
		<li><strong>Tests</strong></li>
	</ul>

	<p>Uno de las partes más importantes en el desarrollo de software se refiere a los tests implementados que garantizan un software de calidad y el fácil mantenimiento de una aplicación. Gracias a estos tests, es muy sencillo detectar y solucionar fallos provocados por cambios en el código. Cada vez que se genera en Grails una clase de dominio o un controlador, paralelamente se genera también un test para comprobar la nueva clase o controlador.</p>

	<p>Grails distingue entre tests unitarios y tests de integración. Los tests unitarios son tests sin dependencias de ningún tipo, salvo algún que otro objeto mock. Por otro lado, los tests de integración tienen acceso completo al entorno de Grails, incluyendo la base de datos. Además, Grails permite también la creación de tests funcionales para comprobar la funcionalidad de nuestra aplicación web.</p>

	<ul>
		<li><strong>Scaffolding</strong></li>
	</ul>

	<p>Grails permite también utilizar scaffolding en nuestras aplicaciones. El scaffolding es una característica de determinados frameworks que permite la generación automática de código para las cuatro operaciones básicas de cualquier aplicación, que son la creación, lectura, edición y borrado, lo que en inglés se conoce como <span class="caps">CRUD</span> (create, read, update and delete). El scaffolding en Grails se consigue escribiendo muy pocas líneas de código, con lo que podemos centrarnos en especificar las propiedades, comportamientos y restricciones de nuestras clases de dominio.</p>

	<ul>
		<li><strong>Mapeado objeto-relacional</strong></li>
	</ul>

	<p>Grails incluye un potente framework para el mapeado objeto-relacional conocido como <span class="caps">GORM</span> (Grails Object Relational Mapping). Como cualquier framework de persistencia, <span class="caps">GORM</span> permite mapear objetos contra bases de datos relacionales y representar relaciones entre dichos objetos del tipo uno-a-uno o uno-a-muchos.</p>

	<ul>
		<li><strong>Plugins</strong></li>
	</ul>

	<p>Sin embargo, Grails no siempre es la solución a cualquier problema que se nos pueda plantear en el desarrollo de aplicaciones web. Para ayudarnos, Grails dispone de una arquitectura de plugins con una comunidad de usuarios detrás (cada vez más grande) que ofrecen plugins para seguridad, <span class="caps">AJAX</span>, testeo, búsqueda, informes y servicios web. Este sistema de plugins hace que añadir complicadas funcionalidades a nuestra aplicación se convierte en algo muy sencillo.</p>]]>
</description>
<link>http://feedproxy.google.com/~r/InformticaInternetYOtrasCosasDelQuerer/~3/LeWmn3YkAz4/caracteristicas-de-grails</link>
<pubDate>Mon, 06 Jul 2009 08:01:31 GMT</pubDate>
<dc:creator>Fran García</dc:creator>
<guid isPermaLink="false">tag:www.frangarcia.net,2009-06-03:20247d2c1b33c92c828e77198a7808fa/5f9d28225ccaee49c272b5a0b4bf9f68</guid>
<feedburner:origLink>http://www.frangarcia.net/txp/articles/320/caracteristicas-de-grails</feedburner:origLink></item>
<item><title>Los Builders de Groovy</title>
<description>
<![CDATA[<p>Los <a href="http://www.frangarcia.net/txp/groovy.codehaus.org/Builders">Builders de Groovy</a> se utilizan para realizar determinadas tareas que, por sencillas que parezcan, pueden llegar a convertirse en complejas, como por ejemplo la generación de archivos <span class="caps">XML</span>, la automatización de tareas con Ant se facilita o incluso el diseño de interfaces gráficas. Empecemos viendo como escribir archivos <span class="caps">XML</span> con el builder específico que <a href="http://groovy.codehaus.org">Groovy</a> pone a nuestra disposición. <img src="http://www.frangarcia.net/txp/images/97.jpg" align="right" alt="" width="140" height="182" /></p>

	<p>Los <a href="http://es.wikipedia.org/wiki/XML">archivos <span class="caps">XML</span></a> son un tipo de archivo ampliamente extendido para el intercambio de información entre aplicaciones. <a href="http://groovy.codehaus.org">Groovy</a> quiere ayudarnos en la generación de estos archivos, tratando que escribamos el código para construir esos archivos <span class="caps">XML</span> de la forma más sencilla y clara posible y el builder encargado de esa labor es MarkupBuilder, el cual nos ayudará a escribir tanto archivos <span class="caps">XML</span> como <span class="caps">HTML</span>.</p>

	<p>El ejemplo que vamos a ver consiste en crear un archivo <span class="caps">XML</span> referido a facturas de una empresa. Cada factura contendrá una serie de items, cada uno con un producto. El siguiente fragmento de código generaría el archivo <span class="caps">XML</span> de ejemplo:</p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Groovy:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div class="groovy" style="font-family: monospace;">writer = <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><span style="color: #000000; font-weight: bold;">new</span></a> <a href="http://www.google.de/search?as_q=StringWriter&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">StringWriter</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
builder = <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><span style="color: #000000; font-weight: bold;">new</span></a> groovy.<span style="color: #006600;">xml</span>.<span style="color: #006600;">MarkupBuilder</span><span style="color: #66cc66;">&#40;</span>writer<span style="color: #66cc66;">&#41;</span><br />
facturas = builder.<span style="color: #006600;">facturas</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20for"><span style="color: #b1b100;">for</span></a> <span style="color: #66cc66;">&#40;</span>dia <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20in"><span style="color: #b1b100;">in</span></a> <span style="color: #cc66cc;">1</span>..<span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; factura<span style="color: #66cc66;">&#40;</span>fecha: <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><span style="color: #000000; font-weight: bold;">new</span></a> <a href="http://www.google.de/search?as_q=Date&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">Date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">106</span>,<span style="color: #cc66cc;">0</span>,dia<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item<span style="color: #66cc66;">&#40;</span>id:dia<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; producto<span style="color: #66cc66;">&#40;</span>nombre: <span style="color: #ff0000;">'Teclado'</span>, euros:<span style="color: #cc66cc;">876</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
<br />
result = writer.<span style="color: #006600;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">replaceAll</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\r</span>&quot;</span>,<span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp;</div></div></div></p>

	<p>Lo que produciría el siguiente archivo <span class="caps">XML</span>.</p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Groovy:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div class="groovy" style="font-family: monospace;">&lt;facturas&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;factura fecha=<span style="color: #ff0000;">'Sun Jan 01 00:00:00 CET 2006'</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;item id=<span style="color: #ff0000;">'1'</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;producto nombre=<span style="color: #ff0000;">'Teclado'</span> euros=<span style="color: #ff0000;">'876'</span> /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/item&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/factura&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;factura fecha=<span style="color: #ff0000;">'Mon Jan 02 00:00:00 CET 2006'</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;item id=<span style="color: #ff0000;">'2'</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;producto nombre=<span style="color: #ff0000;">'Teclado'</span> euros=<span style="color: #ff0000;">'876'</span> /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/item&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/factura&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;factura fecha=<span style="color: #ff0000;">'Tue Jan 03 00:00:00 CET 2006'</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;item id=<span style="color: #ff0000;">'3'</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;producto nombre=<span style="color: #ff0000;">'Teclado'</span> euros=<span style="color: #ff0000;">'876'</span> /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/item&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/factura&gt;<br />
&lt;/facturas&gt;<br />
&nbsp;</div></div></div></p>

	<p>Como puedes comprobar, la limpieza del código escrito para generar el archivo <span class="caps">XML</span> es increíble y prácticamente, el código sigue el mismo tabulado que el posterior archivo <span class="caps">XML</span>, con lo que la lectura del código por terceras personas se facilita muchísimo.</p>

	<p>Otros buildes interesantes en <a href="http://groovy.codehaus.org">Groovy</a> son los que se refieren a la <a href="http://groovy.codehaus.org/api/groovy/util/AntBuilder.html">automatización de tareas con Ant</a> o el <a href="http://groovy.codehaus.org/Swing+Builder">diseño de interfaces gráficas</a>.</p>]]>
</description>
<link>http://feedproxy.google.com/~r/InformticaInternetYOtrasCosasDelQuerer/~3/PUiMCfLLDbM/los-builders-de-groovy</link>
<pubDate>Tue, 30 Jun 2009 12:08:11 GMT</pubDate>
<dc:creator>Fran García</dc:creator>
<guid isPermaLink="false">tag:www.frangarcia.net,2009-06-30:20247d2c1b33c92c828e77198a7808fa/decd178581f3559ed0f31b5d32a2cd2c</guid>
<feedburner:origLink>http://www.frangarcia.net/txp/articles/323/los-builders-de-groovy</feedburner:origLink></item>
<item><title>Groovy como lenguaje para escribir DSLs</title>
<description>
<![CDATA[<p>Una de las características que se resaltan de Groovy es que es un lenguaje perfecto para escribir <span class="caps">DSL</span>s. Pero, ¿qué son los <span class="caps">DSL</span>s?</p>

	<h3>¿Qué son los <span class="caps">DSL</span>s?</h3>

	<p>Un <a href="http://en.wikipedia.org/wiki/Domain_specific_language"><span class="caps">DSL</span></a> es un lenguaje de programación reducido que permite representar el conocimiento de un campo específico. Imaginemos que debemos desarrollar una aplicación que se encargue de la toma de decisiones en el entorno financiero. Para realizar la programación en Java o Groovy (o cualquier otro lenguaje), quien se encargue de la programación debería tener los conocimientos necesarios tanto del sistema financiero así como del lenguaje de programación utilizado. </p>

	<p>Utilizando un <span class="caps">DSL</span> nos ahorraremos las reglas específicas del lenguaje de programación, centrando nuestros objetivos en la especificación de las reglas financieras necesarias para el correcto funcionamiento del sistema. De esta forma, vamos a poder encargar la parte relacionada con las reglas financieras a algún experto en la materia.</p>

	<h3>¿Por que Groovy?</h3>

	<p>Pues simplemente porque es un lenguaje dinámico que nos proporciona mucha libertad a la hora de crear estructuras necesarias en un contexto particular. Las características de Groovy que lo hacen idóneo para escribir <span class="caps">DSL</span>s son:</p>

	<ul>
		<li>Los <a href="http://groovy.codehaus.org/Builders">Builders</a> nos permiten crear estructuras en forma de árbol estructurado</li>
		<li>Se pueden añadir nuevos métodos y propiedades a través de categorías y metaclases. Incluso se puede hacer esto con los números para especificar cosas como 4.veces o 24.horas</li>
		<li>La mayoría de los operadores se pueden sobrecargar para poder hacer cosas como totalMinutos = 4.dias + 12.horas</li>
		<li>Podemos utilizar un mapa como parámetro en un método, lo cual es muy intuitivo. Por ejemplo mover(x:500.metros, y:2:kilometros)</li>
		<li>También podemos crear nuevas estructuras de control utilizando los closures, como por ejemplo siFaltaMenosDeUnDia{&#8230;}</li>
	</ul>

	<h3>Ejemplo de <span class="caps">DSL</span></h3>

	<p>Un ejemplo de <span class="caps">DSL</span> puede ser <span class="caps">GORM</span> (Groovy Object Relational Mapping). <span class="caps">GORM</span> es el framework de persistencia utilizando en Grails. Basado en Hibernate, podemos utilizar <span class="caps">GORM</span> sin haber visto en nuestra vida nada sobre Hibernate, simplemente conociendo el modelo de datos. Imaginemos que tenemos una clase Persona mapeada contra una tabla de la base de datos. Gracias a <span class="caps">GORM</span>, podríamos acceder a los datos de la siguiente forma:</p>

	<p><div class="ske_geshi_highlighted_code"><div class="header">Groovy:</div><div class="codeblock" style="margin:10px; font-size: 12px;"><div class="groovy" style="font-family: monospace;"><a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20class"><span style="color: #000000; font-weight: bold;">class</span></a> Persona<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.de/search?as_q=Date&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">Date</span></a> fechaNacimiento<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.de/search?as_q=String&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">String</span></a> nombre<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.de/search?as_q=String&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">String</span></a> apellidos<br />
<span style="color: #66cc66;">&#125;</span>&nbsp; &nbsp; &nbsp; &nbsp;<br />
<br />
<span style="color: #808080; font-style: italic;">//Para acceder a los datos de las Personas con GORM se haría así</span><br />
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> lista = Persona.<span style="color: #006600;">findByNombre</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Manuel&quot;</span><span style="color: #66cc66;">&#41;</span><br />
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> lista = Persona.<span style="color: #006600;">findByNombreNotNull</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> lista = Persona.<span style="color: #006600;">findByNombreLike</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Ma%&quot;</span><span style="color: #66cc66;">&#41;</span><br />
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> lista = Persona.<span style="color: #006600;">findByFechaNacimientoBetween</span><span style="color: #66cc66;">&#40;</span>fecha1,fecha2<span style="color: #66cc66;">&#41;</span><br />
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> lista = Persona.<span style="color: #006600;">findByNombreLikeOrApellidoLike</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;M%&quot;</span>, <span style="color: #ff0000;">&quot;L%&quot;</span><span style="color: #66cc66;">&#41;</span></div></div></div></p>

	<p>Aquí os dejo un <a href="http://joesgroovyblog.blogspot.com/2007/09/and-miles-to-go-before-i-sleep.html">enlace donde se crea un <span class="caps">DSL</span> para realizar el cálculo de distancias</a></p>]]>
</description>
<link>http://feedproxy.google.com/~r/InformticaInternetYOtrasCosasDelQuerer/~3/1FfLNmXAgQs/groovy-como-lenguaje-para-escribir-dsls</link>
<pubDate>Wed, 24 Jun 2009 10:19:45 GMT</pubDate>
<dc:creator>Fran García</dc:creator>
<guid isPermaLink="false">tag:www.frangarcia.net,2009-06-24:20247d2c1b33c92c828e77198a7808fa/90ba9e4cd8e9a94dfd058bcb715bfef3</guid>
<feedburner:origLink>http://www.frangarcia.net/txp/articles/322/groovy-como-lenguaje-para-escribir-dsls</feedburner:origLink></item></channel>
</rss>
