<?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>Kudos Ltda. - Blog &#187; grails</title>
	<atom:link href="http://blog.gkudos.com/tag/grails/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gkudos.com</link>
	<description>.: Open Systems, Open Ideas :.</description>
	<lastBuildDate>Thu, 29 Apr 2010 23:25:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>gr8conf: Conferencia dedicada a Groovy, Grails y Griffon</title>
		<link>http://blog.gkudos.com/2009/06/25/gr8conf-conferencia-dedicada-a-groovy-grails-y-griffon/</link>
		<comments>http://blog.gkudos.com/2009/06/25/gr8conf-conferencia-dedicada-a-groovy-grails-y-griffon/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 05:00:19 +0000</pubDate>
		<dc:creator>juanmendez</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://blog.gkudos.com/?p=146</guid>
		<description><![CDATA[
En días pasados se realizó la conferencia gr8conf  dedicada por completo a los temas de Groovy, Grails y Griffon.
Griffon es un nuevo framework destinado al desarrollo de interfaces gráficas:
Although several options exist for interface development in Java, even popular UI toolkits like Swing have been notoriously complex and difficult to use. Griffon, an agile [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="http://www.gr8conf.org/images/gr8-full-banner.png" src="http://www.gr8conf.org/images/gr8-full-banner.png" alt="" width="397" height="66" /><br />
En días pasados se realizó la conferencia <a href="http://www.gr8conf.org/">gr8conf </a> dedicada por completo a los temas de Groovy, Grails y Griffon.<br />
<a href="http://www.manning.com/almiray/">Griffon </a>es un nuevo framework destinado al desarrollo de interfaces gráficas:</p>
<blockquote><p>Although several options exist for interface development in Java, even popular UI toolkits like Swing have been notoriously complex and difficult to use. Griffon, an agile framework that uses Groovy to simplify Swing, makes UI development dramatically faster and easier. In many respects, Griffon is for desktop development what Grails is for web development. While it&#8217;s based on Swing, its declarative style and approachable level of abstraction is instantly familiar to developers familiar with other technologies such as Flex or JavaFX.</p></blockquote>
<p>A continuación algunas de las presentaciones disponibles en Slideshare:</p>
<ul>
<li> <a href="http://www.slideshare.net/gr8conf/gr8conf-opening-keynote">Opening Keynote by Søren Berg Glasius and Guillaume Laforge </a></li>
<li><a href="http://www.slideshare.net/gr8conf/gr8conf-practical-groovy-dsl">Practical Groovy DSL by Guillaume Laforge</a></li>
<li><a href="http://www.slideshare.net/gr8conf/gr8conf-whats-new-in-groovy-16">What&#8217;s New in Groovy 1.6? by Guillaume Laforge</a></li>
<li><a href="http://www.slideshare.net/gr8conf/industrial-strength-groovy-by-paul-king">Industrial Strength Groovy by Paul King</a></li>
<li><a href="http://www.slideshare.net/gr8conf/groovy-in-fiance-case-study-by-jonathan-felch">Groovy Finance: Grid Computing and Computational Finance</a></li>
<li><a href="http://www.slideshare.net/gr8conf/the-grails-plugin-system-by-graeme-rocher">The Grails Plugin System by Graeme Rocher </a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.gkudos.com/2009/06/25/gr8conf-conferencia-dedicada-a-groovy-grails-y-griffon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recopilación de Enlaces con Documentación sobre Groovy y Grails</title>
		<link>http://blog.gkudos.com/2009/06/04/recopilacion-de-enlaces-con-documentacion-sobre-groovy-y-grails/</link>
		<comments>http://blog.gkudos.com/2009/06/04/recopilacion-de-enlaces-con-documentacion-sobre-groovy-y-grails/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 17:20:38 +0000</pubDate>
		<dc:creator>juanmendez</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://blog.gkudos.com/?p=144</guid>
		<description><![CDATA[Documentación sobre Groovy y Grails

Getting Started Guide
User Guide
Advanced usage guide
Groovy and Grails talk: http://www.slideshare.net/desistartups/groovy-and-grails-talk
Curso de Groovy: http://www.dosideas.com/cursos/course/view.php?id=9
Introducción a Groovy: http://www.asert.com/pubs/Groovy/Groovy.pdf
Creating “Hello World” Web Application Using the Grails Framework
Grails : Hello world
Getting Started with Grails :
GRAILS QUICK REFERENCE
http://www.slideshare.net/loffenauer/2007-09-10-fzi-training-groovy-grails-v-ws
http://www.slideshare.net/desistartups/groovy-and-grails-talk
http://www.slideshare.net/mjhugo/groovy-grails-devjam-jam-session-presentation

]]></description>
			<content:encoded><![CDATA[<h2>Documentación sobre Groovy y Grails</h2>
<ul>
<li><a href="http://groovy.codehaus.org/Getting+Started+Guide">Getting Started Guide</a></li>
<li><a href="http://groovy.codehaus.org/User+Guide">User Guide</a></li>
<li><a href="http://groovy.codehaus.org/Advanced+Usage+Guide">Advanced usage guide</a></li>
<li><a href="http://www.slideshare.net/desistartups/groovy-and-grails-talk">Groovy and Grails talk: http://www.slideshare.net/desistartups/groovy-and-grails-talk</a></li>
<li><a href="http://www.dosideas.com/cursos/course/view.php?id=9">Curso de Groovy: http://www.dosideas.com/cursos/course/view.php?id=9</a></li>
<li><a href="http://www.asert.com/pubs/Groovy/Groovy.pdf">Introducción a Groovy: http://www.asert.com/pubs/Groovy/Groovy.pdf</a></li>
<li><a href="http://beans.seartipy.com/2008/06/15/creating-hello-world-web-application-using-the-grails-framework/">Creating “Hello World” Web Application Using the Grails Framework</a></li>
<li><a href="http://www.noppanit.com/?p=114">Grails : Hello world</a></li>
<li><a href="http://docs.codehaus.org/display/GFS/GFS+Example+for+Grails+1.1">Getting Started with Grails :</a></li>
<li><a href="http://docs.codehaus.org/download/attachments/40788/grailsqr-1.1.0.pdf">GRAILS QUICK REFERENCE</a></li>
<li><a href="http://www.slideshare.net/loffenauer/2007-09-10-fzi-training-groovy-grails-v-ws">http://www.slideshare.net/loffenauer/2007-09-10-fzi-training-groovy-grails-v-ws</a></li>
<li><a href="http://www.slideshare.net/desistartups/groovy-and-grails-talk">http://www.slideshare.net/desistartups/groovy-and-grails-talk</a></li>
<li><a href="http://www.slideshare.net/mjhugo/groovy-grails-devjam-jam-session-presentation">http://www.slideshare.net/mjhugo/groovy-grails-devjam-jam-session-presentation</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.gkudos.com/2009/06/04/recopilacion-de-enlaces-con-documentacion-sobre-groovy-y-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducción al Desarrollo de Aplicaciones con Groovy y Grails (Parte 6)</title>
		<link>http://blog.gkudos.com/2009/06/03/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-6/</link>
		<comments>http://blog.gkudos.com/2009/06/03/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-6/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 16:51:06 +0000</pubDate>
		<dc:creator>juanmendez</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.gkudos.com/?p=140</guid>
		<description><![CDATA[Generación de RSS con Grails
En esta sección del tutorial utilizaremos un plugin para la generación de RSS utilizando grails.  (Puede encontrar una lista de los plugins existentes en la siguiente ubicación: http://grails.org/plugin/home
El plugin que utilizaremos para la generación de rss se llama Feeds.  Para instalarlo ejecutamos el siguiente comando (tenga en cuenta estar ubicado en [...]]]></description>
			<content:encoded><![CDATA[<h2>Generación de RSS con Grails</h2>
<p>En esta sección del tutorial utilizaremos un plugin para la generación de RSS utilizando grails.  (Puede encontrar una lista de los plugins existentes en la siguiente ubicación: <a href="http://grails.org/plugin/home">http://grails.org/plugin/home</a></p>
<p>El plugin que utilizaremos para la generación de rss se llama <a href="http://grails.org/plugin/feeds">Feeds</a>.  Para instalarlo ejecutamos el siguiente comando (tenga en cuenta estar ubicado en la carpeta de su proyecto)</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt; F:\dev\issuetracker&gt;grails install-plugin feeds</span></p>
<p>Cuando aparezca en la consola el mensaje &#8220;<strong>Plugin feeds-1.4 installed</strong>&#8221; podemos seguir al siguiente paso del tutorial.</p>
<p>Vamos a crear un feed rss con los issues creados en el sistema. Primero procedemos a ubicar el archivo <strong>/issuetracker/grails-app/controllers/IssueController.groovy</strong> y adicionamos el siguiente método:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">def</span> feed <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
        render<span style="color: #66cc66;">&#40;</span>feedType:<span style="color: #ff0000;">&quot;rss&quot;</span>, feedVersion:<span style="color: #ff0000;">&quot;2.0&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            title <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Mi feed de prueba &quot;</span>
            link <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;http://localhost:8080/issuetracker/issue/feed&quot;</span>
            description <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Issues Grails news feed&quot;</span>
&nbsp;
            Issue.<span style="color: #006600;">list</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #663399;">each</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> 
            	issue <span style="color: #66cc66;">-&gt;</span> entry<span style="color: #66cc66;">&#40;</span>issue.<span style="color: #006600;">submitter</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> 
            		link <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;http://your.test.server/article/${issue.id}&quot;</span> 
            		issue.<span style="color: #006600;">description</span> <span style="color: #808080; font-style: italic;">// return the content </span>
            	<span style="color: #66cc66;">&#125;</span> 
            <span style="color: #66cc66;">&#125;</span> 
        <span style="color: #66cc66;">&#125;</span> 
    <span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>Si digitamos la dirección <strong>http://localhost:8080/issuetracker/issue/feed</strong> podremos ver generado el siguiente feed:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;rss</span> <span style="color: #000066;">xmlns:content</span>=<span style="color: #ff0000;">&quot;http://purl.org/rss/1.0/modules/content/&quot;</span> <span style="color: #000066;">xmlns:rdf</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;</span> <span style="color: #000066;">xmlns:itunes</span>=<span style="color: #ff0000;">&quot;http://www.itunes.com/dtds/podcast-1.0.dtd&quot;</span> <span style="color: #000066;">xmlns:dc</span>=<span style="color: #ff0000;">&quot;http://purl.org/dc/elements/1.1/&quot;</span> <span style="color: #000066;">xmlns:taxo</span>=<span style="color: #ff0000;">&quot;http://purl.org/rss/1.0/modules/taxonomy/&quot;</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;2.0&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;channel<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Mi feed de prueba<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;link<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://localhost:8080/issuetracker/issue/feed<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/link<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Issues Grails news feed<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>User 1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;link<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://your.test.server/article/5<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/link<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;content:encoded<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>My report from error<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/content:encoded<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;guid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://your.test.server/article/5<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/guid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>User 2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;link<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://your.test.server/article/6<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/link<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;content:encoded<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>This component does not work in firefox<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/content:encoded<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;guid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://your.test.server/article/6<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/guid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/channel<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/rss<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Si queremos incluir el enlace para la visualización del RSS en nuestra página de listado de Issues podemos adicionar el siguiente código al archivo <strong>/issuetracker/grails-app/views/issue/list.gsp</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">   &lt;div &gt;
	&lt;a href=&quot;${createLinkTo(dir:'issue/feed', file:'')}&quot;&gt;View RSS&lt;/a&gt;
   &lt;/div&gt;</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.gkudos.com/2009/06/03/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducción al Desarrollo de Aplicaciones con Groovy y Grails (Parte 5)</title>
		<link>http://blog.gkudos.com/2009/06/03/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-4-2/</link>
		<comments>http://blog.gkudos.com/2009/06/03/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-4-2/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 16:20:51 +0000</pubDate>
		<dc:creator>juanmendez</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.gkudos.com/?p=131</guid>
		<description><![CDATA[Modificación de las Vistas Generadas por Grails
En muchas ocasiones no es suficiente la funcionalidad que genera automáticamente el marco de trabajo Grails.  En la presente sección realizaremos algunas modificaciones a las pantallas generadas por la herramienta.
Vamos a la carpeta &#8216;grails-app/views&#8216;, notese que hay una carpeta por cada tabla creada, en estas carpetas estará en código [...]]]></description>
			<content:encoded><![CDATA[<h2>Modificación de las Vistas Generadas por Grails</h2>
<p>En muchas ocasiones no es suficiente la funcionalidad que genera automáticamente el marco de trabajo Grails.  En la presente sección realizaremos algunas modificaciones a las pantallas generadas por la herramienta.</p>
<p>Vamos a la carpeta &#8216;<strong>grails-app/views</strong>&#8216;, notese que hay una carpeta por cada tabla creada, en estas carpetas estará en código seudo-HTML para cada una de nuestras vistas en la aplicación.</p>
<p>El siguiente paso es modificar algunas de las vistas para ver su funcionamiento, para nuestro ejemplo vamos a modificar la vista que muestra la lista de<strong> “issues”</strong>, abrimos el archivo &#8216;<strong>grails-app/views/issue/list.gsp</strong>&#8216;, pero, primero vamos a crear un nuevo tag dinamico para nuestra aplicación (ud puede ver mas de los tags en <a href="http://grails.org/Dynamic+Tag+Libraries">http://grails.org/Dynamic+Tag+Libraries</a>).</p>
<p>Teniendo como base la carpeta de nuestro proyecto ejecutamos el comando:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;"> </span><span style="color: #0000ff;">&gt; grails create-tag-lib Misc</span></p>
<p>Una vez ejecutado este comando se creara el archivo &#8216;<strong>grails-app/taglib/MiscTagLib.groovy</strong> &#8216; y a este le vamos a añadir las siguientes líneas de código:</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/grails_taglibs/Imagen1.jpg" src="http://static.gkudos.com/blog/grails_taglibs/Imagen1.jpg" alt="" width="563" height="168" /></p>
<p>Descargamos la siguiente imagen: <a href="http://openclipart.org/people/hrum/hrum_cocktail.png">http://openclipart.org/people/hrum/hrum_cocktail.png</a> y la copiamos en la carpeta <strong>issuetracker\web-app\images</strong> (es recomendable reducir el tamaño de la imagen para una mejor visualización).</p>
<p>Ahora modificamos   el archivo &#8216;<strong>grails-app/views/issue/list.gsp</strong> &#8216; de la siguiente forma: (Nótense las líneas 27, y 39 a la 43.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
</pre></td><td class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #66cc66;">&lt;</span>html<span style="color: #66cc66;">&gt;</span>
    <span style="color: #66cc66;">&lt;</span>head<span style="color: #66cc66;">&gt;</span>
        <span style="color: #66cc66;">&lt;</span>meta http<span style="color: #66cc66;">-</span>equiv<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-Type&quot;</span> content<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=UTF-8&quot;</span>/<span style="color: #66cc66;">&gt;</span>
        <span style="color: #66cc66;">&lt;</span>meta name<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;layout&quot;</span> content<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;main&quot;</span> /<span style="color: #66cc66;">&gt;</span>
        <span style="color: #66cc66;">&lt;</span>title<span style="color: #66cc66;">&gt;</span>Issue List<span style="color: #66cc66;">&lt;</span>/title<span style="color: #66cc66;">&gt;</span>
    <span style="color: #66cc66;">&lt;</span>/head<span style="color: #66cc66;">&gt;</span>
    <span style="color: #66cc66;">&lt;</span>body<span style="color: #66cc66;">&gt;</span>
        <span style="color: #66cc66;">&lt;</span>div <span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;nav&quot;</span><span style="color: #66cc66;">&gt;</span>
            <span style="color: #66cc66;">&lt;</span>span <span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;menuButton&quot;</span><span style="color: #66cc66;">&gt;&lt;</span>a <span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;home&quot;</span> href<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${resource(dir:'')}&quot;</span><span style="color: #66cc66;">&gt;</span>Home<span style="color: #66cc66;">&lt;</span>/a<span style="color: #66cc66;">&gt;&lt;</span>/span<span style="color: #66cc66;">&gt;</span>
            <span style="color: #66cc66;">&lt;</span>span <span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;menuButton&quot;</span><span style="color: #66cc66;">&gt;&lt;</span>g:link <span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;create&quot;</span> action<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;create&quot;</span><span style="color: #66cc66;">&gt;</span>New Issue<span style="color: #66cc66;">&lt;</span>/g:link<span style="color: #66cc66;">&gt;&lt;</span>/span<span style="color: #66cc66;">&gt;</span>
        <span style="color: #66cc66;">&lt;</span>/div<span style="color: #66cc66;">&gt;</span>
        <span style="color: #66cc66;">&lt;</span>div <span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;body&quot;</span><span style="color: #66cc66;">&gt;</span>
            <span style="color: #66cc66;">&lt;</span>h1<span style="color: #66cc66;">&gt;</span>Issue List<span style="color: #66cc66;">&lt;</span>/h1<span style="color: #66cc66;">&gt;</span>
            <span style="color: #66cc66;">&lt;</span>g:<span style="color: #b1b100;">if</span> test<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${flash.message}&quot;</span><span style="color: #66cc66;">&gt;</span>
            <span style="color: #66cc66;">&lt;</span>div <span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;message&quot;</span><span style="color: #66cc66;">&gt;</span>$<span style="color: #66cc66;">&#123;</span>flash.<span style="color: #006600;">message</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&lt;</span>/div<span style="color: #66cc66;">&gt;</span>
            <span style="color: #66cc66;">&lt;</span>/g:if<span style="color: #66cc66;">&gt;</span>
            <span style="color: #66cc66;">&lt;</span>div <span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;list&quot;</span><span style="color: #66cc66;">&gt;</span>
                <span style="color: #66cc66;">&lt;</span>table<span style="color: #66cc66;">&gt;</span>
                    <span style="color: #66cc66;">&lt;</span>thead<span style="color: #66cc66;">&gt;</span>
                        <span style="color: #66cc66;">&lt;</span>tr<span style="color: #66cc66;">&gt;</span>
                   	        <span style="color: #66cc66;">&lt;</span>g:sortableColumn <span style="color: #000000; font-weight: bold;">property</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;id&quot;</span> title<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Id&quot;</span> /<span style="color: #66cc66;">&gt;</span>
                   	        <span style="color: #66cc66;">&lt;</span>th<span style="color: #66cc66;">&gt;</span>Component<span style="color: #66cc66;">&lt;</span>/th<span style="color: #66cc66;">&gt;</span>
                   	        <span style="color: #66cc66;">&lt;</span>g:sortableColumn <span style="color: #000000; font-weight: bold;">property</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;type&quot;</span> title<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Type&quot;</span> /<span style="color: #66cc66;">&gt;</span>
                   	        <span style="color: #66cc66;">&lt;</span>g:sortableColumn <span style="color: #000000; font-weight: bold;">property</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submitter&quot;</span> title<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Submitter&quot;</span> /<span style="color: #66cc66;">&gt;</span>
                   	        <span style="color: #66cc66;">&lt;</span>g:sortableColumn <span style="color: #000000; font-weight: bold;">property</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;description&quot;</span> title<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Description&quot;</span> /<span style="color: #66cc66;">&gt;</span>
                   	        <span style="color: #66cc66;">&lt;</span>g:sortableColumn <span style="color: #000000; font-weight: bold;">property</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;status&quot;</span> title<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Status&quot;</span> /<span style="color: #66cc66;">&gt;</span>
                   	        <span style="color: #66cc66;">&lt;</span>g:sortableColumn <span style="color: #000000; font-weight: bold;">property</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;bounty&quot;</span> title<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Bounty&quot;</span> /<span style="color: #66cc66;">&gt;</span>
                        <span style="color: #66cc66;">&lt;</span>/tr<span style="color: #66cc66;">&gt;</span>
                    <span style="color: #66cc66;">&lt;</span>/thead<span style="color: #66cc66;">&gt;</span>
                    <span style="color: #66cc66;">&lt;</span>tbody<span style="color: #66cc66;">&gt;</span>
                    <span style="color: #66cc66;">&lt;</span>g:<span style="color: #663399;">each</span> <span style="color: #b1b100;">in</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${issueInstanceList}&quot;</span> status<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;i&quot;</span> var<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;issueInstance&quot;</span><span style="color: #66cc66;">&gt;</span>
                        <span style="color: #66cc66;">&lt;</span>tr <span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${(i % 2) == 0 ? 'odd' : 'even'}&quot;</span><span style="color: #66cc66;">&gt;</span>
                            <span style="color: #66cc66;">&lt;</span>td<span style="color: #66cc66;">&gt;&lt;</span>g:link action<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;show&quot;</span> id<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${issueInstance.id}&quot;</span><span style="color: #66cc66;">&gt;</span>$<span style="color: #66cc66;">&#123;</span>fieldValue<span style="color: #66cc66;">&#40;</span>bean:issueInstance, field:<span style="color: #ff0000;">'id'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&lt;</span>/g:link<span style="color: #66cc66;">&gt;&lt;</span>/td<span style="color: #66cc66;">&gt;</span>
                            <span style="color: #66cc66;">&lt;</span>td<span style="color: #66cc66;">&gt;</span>$<span style="color: #66cc66;">&#123;</span>fieldValue<span style="color: #66cc66;">&#40;</span>bean:issueInstance, field:<span style="color: #ff0000;">'component'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&lt;</span>/td<span style="color: #66cc66;">&gt;</span>
                            <span style="color: #66cc66;">&lt;</span>td<span style="color: #66cc66;">&gt;</span>$<span style="color: #66cc66;">&#123;</span>fieldValue<span style="color: #66cc66;">&#40;</span>bean:issueInstance, field:<span style="color: #ff0000;">'type'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&lt;</span>/td<span style="color: #66cc66;">&gt;</span>
                            <span style="color: #66cc66;">&lt;</span>td<span style="color: #66cc66;">&gt;</span>$<span style="color: #66cc66;">&#123;</span>fieldValue<span style="color: #66cc66;">&#40;</span>bean:issueInstance, field:<span style="color: #ff0000;">'submitter'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&lt;</span>/td<span style="color: #66cc66;">&gt;</span>
                            <span style="color: #66cc66;">&lt;</span>td<span style="color: #66cc66;">&gt;</span>$<span style="color: #66cc66;">&#123;</span>fieldValue<span style="color: #66cc66;">&#40;</span>bean:issueInstance, field:<span style="color: #ff0000;">'description'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&lt;</span>/td<span style="color: #66cc66;">&gt;</span>
                            <span style="color: #66cc66;">&lt;</span>td<span style="color: #66cc66;">&gt;</span>$<span style="color: #66cc66;">&#123;</span>fieldValue<span style="color: #66cc66;">&#40;</span>bean:issueInstance, field:<span style="color: #ff0000;">'status'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&lt;</span>/td<span style="color: #66cc66;">&gt;</span>
                            <span style="color: #66cc66;">&lt;</span>td<span style="color: #66cc66;">&gt;</span>
                            	<span style="color: #66cc66;">&lt;</span>g:repeat <span style="color: #993399;">times</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${issueInstance.bounty}&quot;</span><span style="color: #66cc66;">&gt;</span>  
   									<span style="color: #66cc66;">&lt;</span>img src<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${createLinkTo(dir:'images', file:'hrum_cocktail.png')}&quot;</span> alt<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${issueInstance.bounty} beers&quot;</span>/<span style="color: #66cc66;">&gt;</span>  
   								<span style="color: #66cc66;">&lt;</span>/g:repeat<span style="color: #66cc66;">&gt;</span>  
                            <span style="color: #66cc66;">&lt;</span>/td<span style="color: #66cc66;">&gt;</span>
                        <span style="color: #66cc66;">&lt;</span>/tr<span style="color: #66cc66;">&gt;</span>
                    <span style="color: #66cc66;">&lt;</span>/g:each<span style="color: #66cc66;">&gt;</span>
                    <span style="color: #66cc66;">&lt;</span>/tbody<span style="color: #66cc66;">&gt;</span>
                <span style="color: #66cc66;">&lt;</span>/table<span style="color: #66cc66;">&gt;</span>
            <span style="color: #66cc66;">&lt;</span>/div<span style="color: #66cc66;">&gt;</span>
            <span style="color: #66cc66;">&lt;</span>div <span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;paginateButtons&quot;</span><span style="color: #66cc66;">&gt;</span>
                <span style="color: #66cc66;">&lt;</span>g:paginate total<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${issueInstanceTotal}&quot;</span> /<span style="color: #66cc66;">&gt;</span>
            <span style="color: #66cc66;">&lt;</span>/div<span style="color: #66cc66;">&gt;</span>
        <span style="color: #66cc66;">&lt;</span>/div<span style="color: #66cc66;">&gt;</span>
    <span style="color: #66cc66;">&lt;</span>/body<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;</span>/html<span style="color: #66cc66;">&gt;</span></pre></td></tr></table></div>

<p>Ahora nuestro listado de Issues se verá de la siguiente forma:</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/grails_taglibs/img_list_modified.jpg" src="http://static.gkudos.com/blog/grails_taglibs/img_list_modified.jpg" alt="" width="704" height="300" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gkudos.com/2009/06/03/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-4-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introducción al Desarrollo de Aplicaciones con Groovy y Grails (Parte 4)</title>
		<link>http://blog.gkudos.com/2009/06/02/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-4/</link>
		<comments>http://blog.gkudos.com/2009/06/02/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-4/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 22:49:08 +0000</pubDate>
		<dc:creator>juanmendez</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.gkudos.com/?p=120</guid>
		<description><![CDATA[Pruebas Unitarias de Proyectos Grails
Grails soporta los conceptos de &#8220;Pruebas Unitarias&#8221; y &#8220;Pruebas de Integración&#8220;.
Las &#8220;pruebas unitarias&#8221; se orientan a pruebas pequeñas de ejecución rápida que no soportan carga de Componentes.  Las &#8220;pruebas de integración&#8221; se encargan de evalular el ambiente en el que se ejecuta el aplicativo.

Para nuestro ejemplo vamos a modificar el archivo [...]]]></description>
			<content:encoded><![CDATA[<h2>Pruebas Unitarias de Proyectos Grails</h2>
<p>Grails soporta los conceptos de &#8220;<strong>Pruebas Unitarias</strong>&#8221; y &#8220;<strong>Pruebas de Integración</strong>&#8220;.<br />
Las &#8220;<strong>pruebas unitarias</strong>&#8221; se orientan a pruebas pequeñas de ejecución rápida que no soportan carga de Componentes.  Las &#8220;<strong>pruebas de integración</strong>&#8221; se encargan de evalular el ambiente en el que se ejecuta el aplicativo.</p>
<p><span id="more-120"></span></p>
<p>Para nuestro ejemplo vamos a modificar el archivo &#8220;<strong>ProjectTests.groovy</strong>&#8220;  (Este archivo se encuentra dentro de la carpeta   &#8220;<strong>\issuetracker\test\unit\</strong>&#8221; .  Grails crea automáticamente Archivos de pruebas para las entidades del dominio creadas previamente) :</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">grails.test.*</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ProjectTests <span style="color: #000000; font-weight: bold;">extends</span> GrailsUnitTestCase <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #993333;">void</span> setUp<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006600;">setUp</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #993333;">void</span> tearDown<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006600;">tearDown</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">//Test sin errores</span>
    <span style="color: #993333;">void</span> testSomething<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    	Project hs <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Project<span style="color: #66cc66;">&#40;</span>name:<span style="color: #ff0000;">&quot;hello world&quot;</span><span style="color: #66cc66;">&#41;</span>
        assertEquals <span style="color: #ff0000;">&quot;hello world&quot;</span>, hs.<span style="color: #006600;">name</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">//Test con errores</span>
    <span style="color: #993333;">void</span> testSomethingFails<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    	Project hs <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Project<span style="color: #66cc66;">&#40;</span>name:<span style="color: #ff0000;">&quot;hello world&quot;</span><span style="color: #66cc66;">&#41;</span>
        assertEquals <span style="color: #ff0000;">&quot;hello world failed&quot;</span>, hs.<span style="color: #006600;">name</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>En este ejemplo vemos dos pruebas <strong>testsomething</strong> y <strong>testsomethingfails</strong>.</p>
<p>Para ejecutar el conjunto de pruebas unitarias del proyecto ejecutamos el comando:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt;&gt; F:\dev\issuetracker&gt;grails test-app</span></p>
<p>Para nuestro ejemplo la consola debería mostrar un mensaje similar al siguiente:</p>
<pre style="padding-left: 30px;">Starting unit tests ...
Running tests of type 'unit'
-------------------------------------------------------
Running 4 unit tests...
Running test ComponentTests...PASSED
Running test IssueTests...PASSED
Running test ProjectTests...
                    testSomethingFails...FAILED
Tests Completed in 312ms ...
-------------------------------------------------------
Tests passed: 3
Tests failed: 1
-------------------------------------------------------</pre>
<p>Adicionalmente grails genera un reporte en la siguiente ruta: <strong>F:\dev\issuetracker\test\reports\html\index.html</strong>. A continuación un pantallazo del reporte:</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/test.jpg" src="http://static.gkudos.com/blog/eclipse_grails/test.jpg" alt="" width="742" height="515" /></p>
<h2>Pruebas Funcionales de Proyectos Grails</h2>
<p>Además de pruebas unitarias , Grails también soporta pruebas funcionales utilizando <a class="pageLink" href="http://webtest.canoo.com/">Canoo WebTest</a>. (Canoo WebTest es una herramienta de software libre destinada para la automatización de pruebas de aplicaciones web.)</p>
<p>Para instalar el plugin de pruebas funcionales ejecutamos el siguiente comando:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">F:\dev\issuetracker&gt;grails install-plugin webtest</span></p>
<p>(<strong>Nota:</strong> Durante la instalación del plugin el instalador pedirá también la instalación de WebTest)</p>
<p>Para crear una prueba funcional de nuestra clase de dominio Project, ejecutamos el siguiente comando:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">F:\dev\issuetracker&gt;grails create-webtest Project</span></p>
<p>Grails creará el siguiente archivo: &#8220;<strong>/issuetracker/webtest/tests/ProjectTest.groovy</strong>&#8220;  con el siguiente contenido:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> ProjectTest <span style="color: #000000; font-weight: bold;">extends</span> grails.<span style="color: #006600;">util</span>.<span style="color: #006600;">WebTest</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">// Unlike unit tests, functional tests are sometimes sequence dependent.</span>
    <span style="color: #808080; font-style: italic;">// Methods starting with 'test' will be run automatically in alphabetical order.</span>
	<span style="color: #808080; font-style: italic;">// If you require a specific sequence, prefix the method name (following 'test') with a sequence</span>
	<span style="color: #808080; font-style: italic;">// e.g. test001ProjectListNewDelete</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">def</span> testProjectListNewDelete<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            invoke      <span style="color: #ff0000;">'project'</span>
            verifyText  <span style="color: #ff0000;">'Home'</span>
&nbsp;
            verifyListSize <span style="color: #cc66cc;">0</span>
&nbsp;
            clickLink   <span style="color: #ff0000;">'New Project'</span>
            verifyText  <span style="color: #ff0000;">'Create Project'</span>
            clickButton <span style="color: #ff0000;">'Create'</span>
            verifyText  <span style="color: #ff0000;">'Show Project'</span>, description:<span style="color: #ff0000;">'Detail page'</span>
            clickLink   <span style="color: #ff0000;">'List'</span>, description:<span style="color: #ff0000;">'Back to list view'</span>
&nbsp;
            verifyListSize <span style="color: #cc66cc;">1</span>
&nbsp;
            group<span style="color: #66cc66;">&#40;</span>description:<span style="color: #ff0000;">'edit the one element'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                showFirstElementDetails<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
                clickButton <span style="color: #ff0000;">'Edit'</span>
                verifyText  <span style="color: #ff0000;">'Edit Project'</span>
                clickButton <span style="color: #ff0000;">'Update'</span>
                verifyText  <span style="color: #ff0000;">'Show Project'</span>
                clickLink   <span style="color: #ff0000;">'List'</span>, description:<span style="color: #ff0000;">'Back to list view'</span>
            <span style="color: #66cc66;">&#125;</span>
&nbsp;
            verifyListSize <span style="color: #cc66cc;">1</span>
&nbsp;
            group<span style="color: #66cc66;">&#40;</span>description:<span style="color: #ff0000;">'delete the only element'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                showFirstElementDetails<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
                clickButton <span style="color: #ff0000;">'Delete'</span>
                verifyXPath xpath:  <span style="color: #ff0000;">&quot;//div[@class='message']&quot;</span>,
                            text:   /.<span style="color: #66cc66;">*</span>Project.<span style="color: #66cc66;">*</span>deleted.<span style="color: #66cc66;">*</span>/,
                            regex:  <span style="color: #000000; font-weight: bold;">true</span>
            <span style="color: #66cc66;">&#125;</span>
&nbsp;
            verifyListSize <span style="color: #cc66cc;">0</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #aaaadd; font-weight: bold;">String</span> ROW_COUNT_XPATH <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;count(//div[@class='list']//tbody/tr)&quot;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">def</span> verifyListSize<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> <span style="color: #663399;">size</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        ant.<span style="color: #006600;">group</span><span style="color: #66cc66;">&#40;</span>description:<span style="color: #ff0000;">&quot;verify Project list view with $size row(s)&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            verifyText  <span style="color: #ff0000;">'Project List'</span>
            verifyXPath xpath:      ROW_COUNT_XPATH,
                        text:       <span style="color: #663399;">size</span>,
                        description:<span style="color: #ff0000;">&quot;$size row(s) of data expected&quot;</span>
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">def</span> showFirstElementDetails<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        clickLink   <span style="color: #ff0000;">'1'</span>, description:<span style="color: #ff0000;">'go to detail view'</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Para ejecutar la prueba escribimos el comando:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt; F:\dev\issuetracker&gt;grails run-webtest</span></p>
<p>Se generará un reporte como el siguiente:</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/webtest.jpg" src="http://static.gkudos.com/blog/eclipse_grails/webtest.jpg" alt="" width="805" height="379" /></p>
<p>Puede encontrar un listado de completo para pruebas de canoo en la siguiente ubicación: <a href="http://webtest.canoo.com/webtest/manual/manualOverview.html">http://webtest.canoo.com/webtest/manual/manualOverview.html</a></p>
<p>Adicionalmente puede utilizar la herramienta <a href="http://webtestrecorder.canoo.com/">WebTestRecorder</a>.</p>
<p><strong>Enlaces Relacionados:</strong></p>
<ul>
<li><a href="http://www.grails.org/Unit+Testing">Grails Unit Testing</a></li>
<li><a href="http://www.grails.org/Testing+Controllers">Testing Controllers</a></li>
<li><a href="http://www.grails.org/Testing+Services">Testing Services</a></li>
<li><a href="http://www.grails.org/Testing+Domain+Classes">Testing Domain Classes</a></li>
<li><a href="http://www.grails.org/Functional+Testing">Grails Functional Testing</a></li>
<li><a href="Mastering Grails: Testing your Grails application">Mastering Grails: Testing your Grails application</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.gkudos.com/2009/06/02/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducción al Desarrollo de Aplicaciones con Groovy y Grails (Parte 3)</title>
		<link>http://blog.gkudos.com/2009/06/02/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-3/</link>
		<comments>http://blog.gkudos.com/2009/06/02/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-3/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 21:05:15 +0000</pubDate>
		<dc:creator>juanmendez</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.gkudos.com/?p=99</guid>
		<description><![CDATA[Configuración de Eclipse con soporte para Groovy y Grails
A continuación se describirá el proceso para configurar el entorno de Eclipse con las opciones para edición de Código Groovy y soporte para aplicaciones Grails.  (Eclipse es un entorno de desarrollo múltiplataforma de código abierto. Más información en esta dirección: http://es.wikipedia.org/wiki/Eclipse_(software)  ) .
Primero abrir eclipse y [...]]]></description>
			<content:encoded><![CDATA[<h2>Configuración de Eclipse con soporte para Groovy y Grails</h2>
<p style="margin-bottom: 0in;">A continuación se describirá el proceso para configurar el entorno de <a href="http://www.eclipse.org/">Eclipse</a> con las opciones para edición de Código Groovy y soporte para aplicaciones Grails.  (Eclipse es un entorno de desarrollo múltiplataforma de código abierto. Más información en esta dirección: <a href="http://es.wikipedia.org/wiki/Eclipse_(software) ">http://es.wikipedia.org/wiki/Eclipse_(software) </a> ) .</p>
<p style="margin-bottom: 0in;">Primero abrir eclipse y seleccionar en el menú la opción  <strong>help → software updates</strong>.   Esta opción abrirá una nueva pantalla. En esta seleccionamos la opción  <strong>Avaliable Software: </strong><span id="more-99"></span></p>
<p style="margin-bottom: 0in;"><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/Imagen1.JPG" src="http://static.gkudos.com/blog/eclipse_grails/Imagen1.JPG" alt="" width="663" height="464" /></p>
<p>Seleccionamos el botón <strong>Add Site</strong> y en la url añadimos <a href="http://dist.codehaus.org/groovy/distributions/updateDev/">http://dist.codehaus.org/groovy/distributions/updateDev/</a> y damos clic en OK.</p>
<p>Ahora agregamos el siguiente sitio, repitiendo el paso anterior <a href="http://dist.codehaus.org/groovy/distributions/update/">http://dist.codehaus.org/groovy/distributions/update/</a></p>
<p>Y seleccionamos los plugins a instalar de la siguiente forma  (Tener en cuenta exactamente las versiones seleccionadas para el <strong>&#8220;Groovy Feature</strong>&#8221; y el &#8220;<strong>Grails Eclipse Feature</strong>&#8221; :</p>
<p style="text-align: center;"><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/Imagen3.JPG" src="http://static.gkudos.com/blog/eclipse_grails/Imagen3.JPG" alt="" width="751" height="526" /></p>
<p>Seleccionamos la opción &#8220;<strong>Install</strong>&#8221; y aceptamos los términos de la licencia.  Luego de terminada la descarga  automática de los plugins seleccionados  debemos proceder a reiniciar Eclipse.</p>
<h2>Configuración de Variables de Entorno de Eclipse</h2>
<p>Ahora vamos a añadir la variable de entorno <strong>GRAILS_HOME</strong> en eclipse. Vamos a <strong>Windows → Preferences</strong>, buscamos <strong>Java → Build Path → Classpath Variables</strong>:</p>
<p style="text-align: center;"><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/Imagen4.JPG" src="http://static.gkudos.com/blog/eclipse_grails/Imagen4.JPG" alt="" width="647" height="688" /></p>
<p>Damos clic en la opción <strong>New, </strong></p>
<p style="padding-left: 30px;"><strong>Name:</strong> GRAILS_HOME<br />
<strong>Path:</strong> <em>(La ruta donde esta instalado grails, ej: C:\grails)</em></p>
<p>Ahora importemos un proyecto grails a eclipse.<br />
Vamos a <strong>File → Import</strong>, ahí escogemos <strong>General</strong> → <strong>Existing Projects into Workspace</strong>, y le damos <strong>Next:</strong></p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/Imagen5.JPG" src="http://static.gkudos.com/blog/eclipse_grails/Imagen5.JPG" alt="" width="491" height="564" /></p>
<p>Ahora buscamos el directorio donde esta nuestro proyecto grails y hacemos clic en finish:</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/Imagen5.JPG" src="http://static.gkudos.com/blog/eclipse_grails/Imagen5.JPG" alt="" width="491" height="564" /></p>
<p>Ahora vamos a modificar  las propiedades del configuración del proyecto Eclipse. Hacemos Click derecho sobre el proyecto → <strong>properties </strong>y seleccionamos la opción<strong> &#8220;groovy project properties&#8221; </strong>(Modificamos los valores de las variables según como muestra la imagen)</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/Imagen7.JPG" src="http://static.gkudos.com/blog/eclipse_grails/Imagen7.JPG" alt="" width="642" height="564" /></p>
<p>Para ejecutar la aplicación podemos utilizar la combinación de teclas  <strong>CTRL+F11</strong>, o la opción  <strong>Run → Run</strong> en el menú. Seleccionamos la primera opción, para nuestro ejemplo issuetracker y la opción  OK.</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/Imagen8.JPG" src="http://static.gkudos.com/blog/eclipse_grails/Imagen8.JPG" alt="" width="375" height="370" /></p>
<p>Cuando en la consola de eclipse aparezca  <strong><em> Server running. Browse to http://localhost:8080</em><em>/issuetracker,</em></strong> podremos iniciar la aplicación  en el explorador.</p>
<h2>Configuración para Depuración (Debug) de Grails en Eclipse</h2>
<p>Para que el depurador de Eclipse funcione con Grails, debemos verificar en las propiedades del proyecto  que la opción <strong>Disable Groovy Compiler Generating File</strong>s esté habilitada  y en <strong>Groovy compiler output</strong> location este la ruta “<strong>web-app/WEB-INF/classe</strong>s”.</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/Imagen7.JPG" src="http://static.gkudos.com/blog/eclipse_grails/Imagen7.JPG" alt="" width="642" height="564" /></p>
<p>Para nuestro ejemplo, vamos a hacer un debug para la clase “<strong>ComponentController.groovy</strong>”</p>
<p>Abrimos la clase “<strong>ComponentController.groovy</strong>” y ponemos un break point en cualquier linea, para nuestro ejemplo en la linea 9, Hacemos clic en el botón debug, o F11, saldrá una pantalla similar a esta:</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/img01.jpg" src="http://static.gkudos.com/blog/eclipse_grails/img01.jpg" alt="" width="480" height="246" /></p>
<p>Habilitamos la casilla “<strong>Don&#8217;t tell me again</strong>” y OK.<br />
Ahora vemos la aplicación en el navegador, y hacemos clic en el vinculo <strong>ComponentController</strong> ,y el debug es activado en eclipse.</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/Imagen10.JPG" src="http://static.gkudos.com/blog/eclipse_grails/Imagen10.JPG" alt="" width="717" height="284" /></p>
<p>Damos clic derecho en el proyecto en la pantalla <strong>debug</strong> y vamos a <strong>Edit Source Lookup</strong>, damos click en el botón <strong>add</strong>, seleccionamos la opción <strong>Workspace Folder</strong>,</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/Imagen11.JPG" src="http://static.gkudos.com/blog/eclipse_grails/Imagen11.JPG" alt="" width="516" height="534" /></p>
<p>Buscamos la ruta <strong>web-app/ WEB-INF/classes</strong>, habilitamos la opción <strong>Search subfolders </strong>y la opción <strong>OK</strong>.  Adicionalmente, seleccionamos de nuevo la opción  <strong>add</strong>, y agregamos la ruta <strong>grails-app</strong>, también habilitamos la opción Search subfolders y OK.</p>
<p>En este momento ya tenemos habilitado  entorno de eclipse para depuración de aplicaciones <strong>Groovy / Grails</strong>.</p>
<p><a href="http://static.gkudos.com/blog/eclipse_grails/Imagen12.JPG"><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/Imagen12.JPG" src="http://static.gkudos.com/blog/eclipse_grails/Imagen12.JPG" alt="" width="924" height="576" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gkudos.com/2009/06/02/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducción al Desarrollo de Aplicaciones con Groovy y Grails (Parte 2)</title>
		<link>http://blog.gkudos.com/2009/05/31/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-2/</link>
		<comments>http://blog.gkudos.com/2009/05/31/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-2/#comments</comments>
		<pubDate>Sun, 31 May 2009 13:23:31 +0000</pubDate>
		<dc:creator>juanmendez</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.gkudos.com/?p=82</guid>
		<description><![CDATA[Creando una Clase del Dominio del Problema
Para nuestro ejemplo vamos a crear los siguientes modelos de dominio: Project, Component, and Issue.
La clase &#8220;Project&#8221; que representa el proyecto de software para el cual vamos a registrar incidencias (Bugs).
Un Project puede tener uno o más Componentes (Ejm: gui, documentación, etc)
Un Componente solo está asociado a un proyecto [...]]]></description>
			<content:encoded><![CDATA[<h2>Creando una Clase del Dominio del Problema</h2>
<p>Para nuestro ejemplo vamos a crear los siguientes modelos de dominio: Project, Component, and Issue.<br />
La clase &#8220;Project&#8221; que representa el proyecto de software para el cual vamos a registrar incidencias (Bugs).<br />
Un Project puede tener uno o más Componentes (Ejm: gui, documentación, etc)<br />
Un Componente solo está asociado a un proyecto y puede tener cero o más Issues asociados.<br />
Un objeto Issue está asociado a un Componente.</p>
<p><span id="more-82"></span></p>
<p>Con el siguiente comando creamos la entidad Project:</p>
<p style="padding-left: 30px;">
<p><span style="color: #0000ff;">&gt;  D:\dev\issuetracker&gt;grails create-domain-class  Project</span></p>
<p>Si el comando se ejecuta satisfactoriamente debería obtenerse una respuesta similar a la<br />
siguiente:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt;  Welcome to Grails 1.1.1 &#8211; http://grails.org/<br />
&gt;  Licensed under Apache Standard License 2.0<br />
&gt;  Grails home is set to: C:\dev\grails-1.1.1<br />
&gt;  Base Directory: D:\dev\issuetracker<br />
&gt;  Running script C:\dev\grails-1.1.1\scripts\CreateDomainClass.groovy<br />
&gt;  Environment set to development<br />
&gt;  Created DomainClass for Project<br />
&gt;  Created Tests for Project</span></p>
<p>grails automáticamente crea el archivo    %PROJECT_HOME%\grails-app\domain\Project.groovy     con la siguiente estructura</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Project <span style="color: #66cc66;">&#123;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">static</span> constraints <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<h2>Qué es una Clase de Dominio?</h2>
<p>Una clase de dominio es un artefacto persistente para el cual todas sus propiedades  son persistidas<br />
en la base de datos (Más información en  GORM http://www.grails.org/GORM (Grails Object Relational Mapping) )</p>
<p>Para nuestro ejemplo editamos el archivo Project.groovy de la siguiente forma:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Project <span style="color: #66cc66;">&#123;</span>
  <span style="color: #808080; font-style: italic;">// relaciones</span>
  <span style="color: #000000; font-weight: bold;">static</span> hasMany <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span>components: <span style="color: #aaaadd; font-weight: bold;">Component</span><span style="color: #66cc66;">&#93;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// campos</span>
<span style="color: #aaaadd; font-weight: bold;">String</span> name
&nbsp;
<span style="color: #aaaadd; font-weight: bold;">String</span> toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #000000; font-weight: bold;">return</span> name
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// restricciones</span>
<span style="color: #000000; font-weight: bold;">static</span> constraints <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
name<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
components<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>Como se puede ver en la clase Project, por lo general una clase de dominio de GORM se compone de relaciones con otras entidades,<br />
campos (Columnas en la base de datos), y restricciones.</p>
<p>Para nuestro sistema de ejemplo debemos crear también las clases de dominio Issue y Component:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt;  D:\dev\issuetracker&gt;grails create-domain-class  Component<br />
&gt;  D:\dev\issuetracker&gt;grails create-domain-class  Issue</span></p>
<p>y las editamos de la siguiente forma:</p>
<p style="padding-left: 30px;"><strong>Component.groovy</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> <span style="color: #aaaadd; font-weight: bold;">Component</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #808080; font-style: italic;">// relationships</span>
<span style="color: #000000; font-weight: bold;">static</span> belongsTo <span style="color: #66cc66;">=</span> Project
<span style="color: #000000; font-weight: bold;">static</span> hasMany <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span>issues: Issue<span style="color: #66cc66;">&#93;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// fields</span>
Project project
<span style="color: #aaaadd; font-weight: bold;">String</span> name
&nbsp;
<span style="color: #808080; font-style: italic;">// override for nice display</span>
<span style="color: #aaaadd; font-weight: bold;">String</span> toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #000000; font-weight: bold;">return</span> “<span style="color: #0000ff;">$<span style="color: #66cc66;">&#123;</span>project<span style="color: #66cc66;">&#125;</span></span> <span style="color: #66cc66;">-</span> <span style="color: #0000ff;">$<span style="color: #66cc66;">&#123;</span>name<span style="color: #66cc66;">&#125;</span></span>”
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// constraints</span>
<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">def</span> constraints <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #808080; font-style: italic;">//’empty’ constraints</span>
<span style="color: #808080; font-style: italic;">//garantizan el orden como apareceran los campos en la forma</span>
name<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
project<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
issues<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p style="padding-left: 30px;"><strong>Issue.groovy</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Issue <span style="color: #66cc66;">&#123;</span>
<span style="color: #808080; font-style: italic;">// relationships</span>
<span style="color: #000000; font-weight: bold;">static</span> belongsTo <span style="color: #66cc66;">=</span> <span style="color: #aaaadd; font-weight: bold;">Component</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// fields</span>
<span style="color: #aaaadd; font-weight: bold;">Component</span> component
<span style="color: #aaaadd; font-weight: bold;">String</span> type
<span style="color: #aaaadd; font-weight: bold;">String</span> submitter
<span style="color: #aaaadd; font-weight: bold;">String</span> description
<span style="color: #aaaadd; font-weight: bold;">String</span> status <span style="color: #66cc66;">=</span> “<span style="color: #000000; font-weight: bold;">New</span>”
<span style="color: #aaaadd; font-weight: bold;">Integer</span> bounty
<span style="color: #aaaadd; font-weight: bold;">Date</span> dateCreated
<span style="color: #aaaadd; font-weight: bold;">Date</span> lastUpdated
&nbsp;
<span style="color: #808080; font-style: italic;">// constraints</span>
<span style="color: #000000; font-weight: bold;">static</span> constraints <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
component<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">//restringe una lista de valores</span>
type<span style="color: #66cc66;">&#40;</span>inList: <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;Defect&quot;</span>, <span style="color: #ff0000;">&quot;Feature&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
submitter<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
description<span style="color: #66cc66;">&#40;</span><span style="color: #663399;">size</span>: 0..5000<span style="color: #66cc66;">&#41;</span>
status<span style="color: #66cc66;">&#40;</span>inList: <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;New&quot;</span>, <span style="color: #ff0000;">&quot;Accepted&quot;</span>, <span style="color: #ff0000;">&quot;Closed&quot;</span>, <span style="color: #ff0000;">&quot;Won't Fix&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
bounty<span style="color: #66cc66;">&#40;</span>range:0..12<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>En los siguientes enlaces puede encontrarse información mucho más detallada sobre el funcionamiento de <strong>GORM:</strong><br />
<strong>Mapeo de Entidades: </strong><a href="http://www.grails.org/GORM+-+Mapping+DSL">http://www.grails.org/GORM+-+Mapping+DSL</a><br />
<strong>Relaciones: </strong><a href="http://www.grails.org/GORM+-+Defining+relationships">http://www.grails.org/GORM+-+Defining+relationships</a><br />
<strong>Colecciones: </strong> <a href="http://www.grails.org/GORM+-+Collection+Types">http://www.grails.org/GORM+-+Collection+Types</a><br />
<strong>Operaciones de Crud: </strong> <a href="http://www.grails.org/GORM+-+CRUD">http://www.grails.org/GORM+-+CRUD</a></p>
<h2>Creación de Datos de Prueba</h2>
<p>Muchas veces se requieren datos de ejemplo para realizar pruebas al sistema.<br />
Grails nos permite la creación inicial de datos de la siguiente forma:</p>
<p>Ubicar el archivo    %PROJECT_HOME%\grails-app\conf\BootStrap.groovy   y modificarlo de la siguiente forma:</p>
<p style="padding-left: 30px;"><span style="color: #000080;">class BootStrap {</span></p>
<p style="padding-left: 30px;"><span style="color: #000080;">def init = { servletContext -&gt;<br />
// Create some test data<br />
new Project(name:&#8221;Widget para Facebook&#8221;).save()<br />
new Project(name:&#8221;Simple Issue Tracker&#8221;).save()<br />
new Project(name:&#8221;Extensión para Openlayers&#8221;).save()<br />
}<br />
def destroy = {<br />
}<br />
}</span></p>
<p>En este ejemplo creamos tres objetos Project como datos de prueba.</p>
<h2>Creación de Controladores y Vistas</h2>
<p>Dado que ya disponemos de nuestras clases de dominio, podemos ejecutar los siguientes comandos que se<br />
encargarán de generar los controladores y vistas para nuestras entidades:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt;D:\dev\issuetracker&gt;grails generate-all Project<br />
&gt;D:\dev\issuetracker&gt;grails generate-all Component<br />
&gt;D:\dev\issuetracker&gt;grails generate-all Issue</span></p>
<p>El comando <strong>generate-all</strong> genera el código necesario para habilitar el CRUD de las entidades Project, Component e Issue.</p>
<p>Para ejecutar la aplicación podemos utilizar el comando:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt; D:\dev\issuetracker&gt;grails run-app</span></p>
<p>Una vez  se ha inicializado el servidor, puede ingresar a la aplicación a través del siguiente url:  <span style="color: #0000ff;">http://localhost:8080/issuetracker</span></p>
<p>En la pantalla de inicio podrá ver lo siguiente:<br />
<img class="aligncenter" title="http://pwp.007mundo.com/jcmendez/kudos/WelcomeGrails_1243741628743.png" src="http://pwp.007mundo.com/jcmendez/kudos/WelcomeGrails_1243741628743.png" alt="" width="591" height="242" /></p>
<p>Si selecciona la opción ProjectController podrá ver el listado de los proyectos:<br />
<img class="aligncenter" title="http://pwp.007mundo.com/jcmendez/kudos/Project_List.png" src="http://pwp.007mundo.com/jcmendez/kudos/Project_List.png" alt="" width="332" height="281" /></p>
<p>A continuación la pantalla donde se muestra el detalle de un Component:</p>
<p style="text-align: center;"><img class="aligncenter" title="http://pwp.007mundo.com/jcmendez/kudos/Show_Component.png" src="http://pwp.007mundo.com/jcmendez/kudos/Show_Component.png" alt="" width="364" height="341" /></p>
<p>Si desea crear un nuevo Issue, grails ha generado para usted la siguiente pantalla:<br />
<img class="aligncenter" title="http://pwp.007mundo.com/jcmendez/kudos/CreateIssue.png" src="http://pwp.007mundo.com/jcmendez/kudos/CreateIssue.png" alt="" width="446" height="634" /></p>
<p>Nótese que con muy poco esfuerzo hemos logrado crear una aplicación completa de CRUD para administrar nuestras entidades Project, Component e Issue.  En las siguientes partes del tutorial se incluirán  funcionalidades adicionales y personalización de la visualización.</p>
<p>Puede descargar el código completo de la parte 2 desde <a href="http://pwp.007mundo.com/jcmendez/kudos/issuetracker_parte_2.zip">esta ubicación</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gkudos.com/2009/05/31/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducción al Desarrollo de Aplicaciones con Groovy y Grails (Parte 1)</title>
		<link>http://blog.gkudos.com/2009/05/30/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-1/</link>
		<comments>http://blog.gkudos.com/2009/05/30/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-1/#comments</comments>
		<pubDate>Sun, 31 May 2009 04:39:45 +0000</pubDate>
		<dc:creator>juanmendez</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.gkudos.com/?p=73</guid>
		<description><![CDATA[
Introducción:
Grails es un marco de trabajo para el desarrollo de aplicaciones web que se basa en las ideas de
&#8220;Codificación a través de Convenciones&#8221; (coding by convention) y DRY (don&#8217;t repeat yourself) utilizando el lenguaje de programación Groovy.
Grails se ejecuta sobre una máquina virtual de Java, teniendo acceso completo a la plataforma y librerías Java.
Con Grails [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="http://www.grails.org/images/grails-logo.png" src="http://www.grails.org/images/grails-logo.png" alt="" width="285" height="148" /></p>
<h2><strong>Introducción:</strong></h2>
<p>Grails es un marco de trabajo para el desarrollo de aplicaciones web que se basa en las ideas de<br />
&#8220;<em>Codificación a través de Convenciones</em>&#8221; (<em>coding by convention</em>) y DRY (<em>don&#8217;t repeat yourself</em>) utilizando el lenguaje de programación Groovy.</p>
<p>Grails se ejecuta sobre una máquina virtual de Java, teniendo acceso completo a la plataforma y librerías Java.</p>
<p>Con Grails pueden crearse fácilmente aplicaciones web gracias a:</p>
<ul>
<li> Ofrece un Entorno completo para el desarrollo y publicación de aplicaciones: Todas las dependencias y configuración requeridas para ejecutar las aplicaciones web son proporcionadas por Grails.  Usted debe solamente preocuparse por el código particular de su aplicación.</li>
<li>Incluye un servidor Jetty embebido.</li>
<li>El modo de desarrollo automáticamente recarga los cambios realizados al código de la aplicación sin tener que reiniciar el servidor web.</li>
<li>Ofrece mapeo de persistencia automàtico para las clases del Dominio del problema, así como también manejo automàtico de las relaciones entre las entidades.</li>
<li>Ofrece <a href="http://technologysource.org/extra/389/definition/2/">scaffolding</a> para el acceso a datos, ofreciendo posibilidades para el desarrollo rápido de operaciones CRUD (Create, Read, Update, Delete).</li>
<li>Soporte de tecnologías para la implementación de vistas de datos utilizando &#8220;dynamic tag libraries&#8221; y &#8220;Groovy Server Pages (GSP)&#8221;</li>
<li>Extensibilidad a través de la utilización de plugins.</li>
</ul>
<p><span id="more-73"></span></p>
<p>Grails puede usarse como un entorno de desarrollo autónomo que esconde todos los detalles de configuración así como también permite integrar lógica de negocio escrita en Java.  Entre los objetivos de Grails está el hacer el desarrollo web lo más simple y atractivo posible de tal forma que un amplio segmento de desarrolladores puedan utilizarlo.</p>
<h2>Tutorial &#8220;Escribir un Manejador de Incidencias Utilizando Grails&#8221;</h2>
<p>El tutorial a desarrollar a continuación se basa en el artículo &#8220;<em>Writing a Simple Issue Tracker in Grails</em>&#8221; <a href="http://josh-in-antarctica.blogspot.com/2008/04/writing-simple-issue-tracker-in-grails.html">Part 1</a> y   <a href="http://josh-in-antarctica.blogspot.com/2008/05/writing-simple-issue-tracker-in-grails.html">Part 2<br />
</a></p>
<h2>Cómo Obtener el Framework Grails?</h2>
<p>Usted puede descargar la última versión del framework desde la siguiente ubicación: <a href="http://www.grails.org/Download">http://www.grails.org/Download</a></p>
<h2>Instalación</h2>
<p>Una vez ha obtenido y descomprimido el framework debe adicionar a su sistema operativo la variable de entorno GRAILS_HOME.</p>
<p>Si utiliza windows puede configurar las variables de entorno de la siguiente forma:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt; set GRAILS_HOME=C:\download\grails<br />
&gt; echo %GRAILS_HOME%<br />
C:\download\grails<br />
&gt; set PATH=%GRAILS_HOME%\bin;%PATH%</span></p>
<p>(Información adicional:  <a href="http://support.microsoft.com/kb/310519/es">Administrar variables de entorno en Windows XP</a> )</p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/win_env_variab.jpg" src="http://static.gkudos.com/blog/eclipse_grails/win_env_variab.jpg" alt="" width="440" height="520" /></p>
<p><img class="aligncenter" title="http://static.gkudos.com/blog/eclipse_grails/win_env_variab_2.jpg" src="http://static.gkudos.com/blog/eclipse_grails/win_env_variab_2.jpg" alt="" width="413" height="506" /></p>
<p>O si utiliza sistemas basados en linux puede utilizar los siguientes comandos:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt; set GRAILS_HOME=~/download/grails<br />
&gt; export GRAILS_HOME<br />
&gt; echo ${GRAILS_HOME}<br />
~/download/grails<br />
&gt; cd ${GRAILS_HOME}<br />
&gt; chmod a+x bin/grails<br />
&gt; set PATH=${GRAILS_HOME}/bin:${PATH}<br />
&gt; export PATH</span></p>
<p>(No olvide configurar también la variable JAVA_HOME apuntando a la carpeta donde reside su instalación<br />
particular de Java (JDK <a href="http://java.sun.com/javase/downloads/index.jsp">http://java.sun.com/javase/downloads/index.jsp</a>).<br />
<a href="http://www.it.uc3m.es/tlp/guia/guiaWinXP.html"> Configuración de Java en Windows</a><br />
<a href="http://www.keopx.net/ubuntu/configurar-java_home-en-gnulinux/"> Configuración de Java en Unix</a>)</p>
<p>para comprobar su instalación de grails puede digitar el siguiente comando</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt; grails</span></p>
<p>debe aparecer como respuesta un mensaje similar al siguiente:</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt; C:\Documents and Settings\user&gt;grails<br />
&gt; Welcome to Grails 1.1.1 &#8211; http://grails.org/<br />
&gt; Licensed under Apache Standard License 2.0<br />
&gt; Grails home is set to: C:\dev\grails-1.1.1<br />
&gt; No script name specified. Use &#8216;grails help&#8217; for more info or &#8216;grails interactive&#8217; to enter interactive mode</span></p>
<h2>Creando el proyecto Con Grails</h2>
<p>Para crear nuestro  proyecto Grails debe utilizar el siguiente comando</p>
<p style="padding-left: 30px;"><span style="color: #0000ff;">&gt; D:\dev&gt;grails  create-app issuetracker</span></p>
<p>este comando creará una carpeta con la siguiente estructura de directorios:<br />
(Para nuestro ejemplo la carpeta <strong>%PROJECT_HOME% </strong>es representada por la carpeta <strong>D:\dev\issuetracker</strong>)</p>
<p><img class="alignleft" title="http://pwp.007mundo.com/jcmendez/kudos/grails_estructura_proyecto.jpg" src="http://pwp.007mundo.com/jcmendez/kudos/grails_estructura_proyecto.jpg" alt="" width="702" height="385" /></p>
<h2>Configuración de la Base de Datos</h2>
<p>Para nuestro ejemplo utilizaremos el motor de bases de datos relacionales PostgreSql. (Debemos crear<br />
una instancia y usuario en la base de datos. Para este caso creamos la base de datos &#8220;issues&#8221; con<br />
su usuario relacionado &#8220;issuetracker&#8221; con clave &#8220;issuetracker&#8221;)</p>
<p>Primero necesitamos descargar el driver Jdbc disponible en la siguiente ubicación: <a href="http://jdbc.postgresql.org/download.html">http://jdbc.postgresql.org/download.html</a><br />
(Para nuestro ejemplo descargamos el jar <em>postgresql-8.3-604.jdbc4.jar</em> )<br />
El jar obtenido debe ser copiado en la carpeta %PROJECT_HOME%/lib</p>
<h2>Configuración del Datasource</h2>
<p>Una de las grandes ventajas de Grails es la facilidad para el manejo de la configuración del proyecto.</p>
<p>Por ejemplo el comando ejecutado &#8220;create-app&#8221;  entre otros archivos crea uno llamado  DataSource.groovy (En la carpeta %PROJECT_HOME%grails-app/conf/ ).<br />
Este archivo nos permite especificar diferentes ambientes (<em>Development, TestData y Production</em>)<br />
para el manejo de la fuente de datos del proyecto.  Como opción por omisión utiliza el manejador de datos<br />
<em>HSQLDB</em>.</p>
<p>Para modificar la configuración del entorno &#8220;<em>Development</em>&#8221; utilizando postgresql debemos modificar el archivo DataSource.groovy de la siguiente forma:</p>
<p><code>development {<br />
dataSource {<br />
driverClassName = "org.postgresql.Driver"<br />
dbCreate = "create-drop" // one of 'create', 'create-drop','update'<br />
url = "jdbc:postgresql://localhost:5432/issues"<br />
dialect = org.hibernate.dialect.PostgreSQLDialect<br />
username = "issuetracker"<br />
password = "issuetracker"<br />
}<br />
}</code></p>
<p>(Más información en <a href="http://hartsock.blogspot.com/2008/07/postgresql-and-grails.html">http://hartsock.blogspot.com/2008/07/postgresql-and-grails.html</a> )</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gkudos.com/2009/05/30/introduccion-al-desarrollo-de-aplicaciones-con-groovy-y-grails-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Geographical Visualization of Government Contracts In Colombia &#8211; VGICC</title>
		<link>http://blog.gkudos.com/2008/07/31/geographical-visualization-of-government-contracts-in-colombia-vgicc/</link>
		<comments>http://blog.gkudos.com/2008/07/31/geographical-visualization-of-government-contracts-in-colombia-vgicc/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 15:40:15 +0000</pubDate>
		<dc:creator>juanmendez</dc:creator>
				<category><![CDATA[Rich Internet Applications]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Google Earth Browser Plugin]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Information Visualization]]></category>
		<category><![CDATA[KML]]></category>
		<category><![CDATA[postgis]]></category>
		<category><![CDATA[web mapping]]></category>

		<guid isPermaLink="false">http://blog.gkudos.com/?p=35</guid>
		<description><![CDATA[
Project Description: (You can read the spanish version of this article here)

VGICC is a Proof of concept using the new Google Earth Browser Plug-in. This application takes advantage of the plug-in to visualize and interact with statistical and geographical information of government contracts in Colombia.
(Note: The information available in this application is only for testing [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" title="Kudos Ltda. - VGICC" src="http://static.gkudos.com/flash/contract/kudos_contrato_03.jpg" alt="" width="537" height="302" /></p>
<p><strong>Project Description: </strong>(You can read the spanish version of this article <a href="http://blog.gkudos.com/2008/07/28/visualizacion-geografica-de-informacion-contractual-colombiana-vgicc/">here</a>)<strong><br />
</strong></p>
<p>VGICC is a Proof of concept using the new Google Earth Browser Plug-in. This application takes advantage of the plug-in to visualize and interact with statistical and geographical information of government contracts in Colombia.</p>
<p>(<strong>Note:</strong> The information available in this application is only for testing purposes. Official data can be found at the Official Contracting Site of Colombia, “PUC, Portal Único de Contratación” <a href="http://www.contratos.gov.co/puc" target="_blank">http://www.contratos.gov.co/puc</a>/ )</p>
<p><strong>Online Links</strong></p>
<ul>
<li><a href="http://www.gkudos.com/contract/" target="_blank">Launch Application </a> (This application requires Google Earth’s Browser Plug-in. You can download it from this location::  <a href="http://code.google.com/apis/earth/" target="_blank">http://code.google.com/apis/earth/</a>)</li>
<li>Screencast 1: <a href="http://static.gkudos.com/flash/contract/swf/kudos_contrato_01.html" target="_blank">3D Visualization of contract statistics using Google Earth Browser Plug-in.</a></li>
<li>Screencast 2:<a href="http://static.gkudos.com/flash/contract/swf/kudos_contrato_02.html" target="_blank"> Browsing Contracts using VGICC </a></li>
</ul>
<p><strong>Project Challenge:</strong></p>
<p>Provide an interactive Geographic Rich Internet Application that allows users to visually explore and discover new relations of Government’s investments using spatial, statistical and public contract information of Colombia.</p>
<p>This Geographic Rich Internet Application uses Interactive Web Mapping techniques as an alternative tool to explore PUC´s data. (Current search engine is based solely on plain text filters).</p>
<p style="text-align: center;"><img class="aligncenter" title="Kudos Ltda - VGICC" src="http://static.gkudos.com/flash/contract/kudos_contrato_01.jpg" alt="" width="579" height="325" /></p>
<p><strong>Technical Challenge:</strong><br />
During development stages of this proof of concept some technical challenges must be confronted:</p>
<ul>
<li> <strong>Information Extraction:</strong>Although PUC (<a href="http://www.contratos.gov.co/puc/">http://www.contratos.gov.co/puc/</a>) lets public search options for general users, it doesn’t provide any free Web Service, RSS or interoperable API that could be integrated with external systems. However, thanks to the implementation of <a href="http://en.wikipedia.org/wiki/Web_scraping" target="_blank">Web Scrapping</a> techniques it was possible to automatically extract information from web pages published at PUC’s search portal.</li>
</ul>
<ul>
<li><strong>Transformation, Georreferencing and Data Loading:</strong> Once information extraction was accomplished, it was necessary to transform and georeference each one of the contracts against the available database of political-administrative divisions of Colombia. Furthermore, all data was stored in a geographic database managed by Postgres and Postgis.</li>
</ul>
<ul>
<li><strong>Interactive Visualization of Geographical and Statistical Information through Internet:</strong> May one of the biggest technical challenges of the VGICC was related to the implementation of the web visualization of geographical and statistical data using modern web technologies and tools.  Firstly, Google’s brand new “<a href="http://code.google.com/apis/earth/" target="_blank">Google Earth Browser Plug-in</a>”  was used to enable web browser based geographic visualization of data. One of the most interesting features of Google Earth and KML is the possibility of draw 3D objects over the earth globe. In this case, 3D objects are used to represent the amount of government investment in a particular state or county.  Secondly, it was possible to programmatically interact with the GE plug-in using JavaScript and KML (perhaps this is the most appealing feature of the plug-in for programmers and system integrators).  Finally, to provide a single and unified user experience based on Html it was necessary to use different JavaScript/Ajax techniques and tools.  This framework, as a whole, proved to be a suitable alternative for the implementation of geospatial browser based applications.</li>
</ul>
<p style="text-align: center;"><img class="alignnone" title="Kudos Ltda.  - VGICC" src="http://static.gkudos.com/flash/contract/kudos_contrato_04.jpg" alt="" width="602" height="336" /></p>
<p><strong>Basic Features:</strong><br />
Basically, the application allows geographic visualization of consolidated data by State and County.  There are two basic interactions:</p>
<ul>
<li>State selection using lists: A user selects a State using a combo box and the application dynamically loads Kml data from the server side and shows the results using the Google Earth Browser Plug-in. Camera views are relocated according to the selected State.</li>
</ul>
<ul>
<li>Contract search by feature selection on the map: A user can search a specific list of contracts related to a County. (State and County polygons are shown on the Google Earth Plug-in). Each balloon attached to a placemark on the map shows the amount of investment and quantity of contracts that take place in the given region and a link to the detailed list of contracts.  Such list also provides links to detailed information for each contract as well as a reference to the official related site at <a href="http://www.contratos.gov.co/puc/" target="_blank">http://www.contratos.gov.co/puc/</a>.</li>
</ul>
<p style="text-align: center;"><img class="aligncenter" title="Kudos Ltda - VGICC" src="http://static.gkudos.com/flash/contract/kudos_contrato_05.jpg" alt="" width="600" height="341" /></p>
<p><strong>Benefits:</strong><br />
Provide alternative ways of data discovery and exploration of PUC’s data (Portal Único de Contratación de Colombia) using techniques based on Rich Internet Applications, geographic information and 3D visualization.</p>
<p><strong>Tools:</strong></p>
<ul>
<li><a href="http://code.google.com/apis/earth/" target="_blank">Google Earth Browser Plugin</a></li>
<li>Javascript, Ajax, <a href="http://www.adobe.com/devnet/spry/" target="_blank">Adobe Spry Framework for Ajax</a></li>
<li><a href="http://grails.org" target="_blank">Java, Grails</a></li>
<li>Postgresql, Postgis</li>
</ul>
<p><strong>Lessons Learned:</strong><br />
Nevertheless the amazing features of Google Earth Browser plug-in, there are some issues related to rendering that affect visualization in some computers.   For example,  this is an extract of the correct visualization of the application for a particular State in Colombia:</p>
<p style="text-align: left;"><img class="aligncenter" src="http://static.gkudos.com/flash/contract/ge_ok_plugin.jpg" alt="" width="598" height="350" /><br />
In other machines polygons are not rendered correctly:</p>
<p style="text-align: center;"><img class="aligncenter" title="Kudos Google Earth plugin error" src="http://static.gkudos.com/flash/contract/ge_error1.jpg" alt="" width="570" height="332" /></p>
<p>Or even in other machines rendering is completely different:</p>
<p style="text-align: center;"><img class="aligncenter" title="Kudos - Google Earth Plugin Error" src="http://static.gkudos.com/flash/contract/ge_error2.jpg" alt="" width="586" height="343" /></p>
<p>Such issue was reported at Google Groups. So far the issue stills open. (For more information look at <a href="http://groups.google.com/group/google-earth-browser-plugin/browse_thread/thread/699d6dad2a345210/fac604a4226d39c5" target="_blank">Google Earth Browser Plugin: Polygons don&#8217;t render correctly</a> )</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gkudos.com/2008/07/31/geographical-visualization-of-government-contracts-in-colombia-vgicc/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Visualización Geográfica de Información Contractual Colombiana (VGICC)</title>
		<link>http://blog.gkudos.com/2008/07/28/visualizacion-geografica-de-informacion-contractual-colombiana-vgicc/</link>
		<comments>http://blog.gkudos.com/2008/07/28/visualizacion-geografica-de-informacion-contractual-colombiana-vgicc/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 20:16:44 +0000</pubDate>
		<dc:creator>juanmendez</dc:creator>
				<category><![CDATA[Rich Internet Applications]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Google Earth Browser Plugin]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[Information Visualization]]></category>
		<category><![CDATA[KML]]></category>
		<category><![CDATA[postgis]]></category>
		<category><![CDATA[web mapping]]></category>

		<guid isPermaLink="false">http://blog.gkudos.com/?p=22</guid>
		<description><![CDATA[
Descripción del Proyecto: (You can read the english version of this article here)
Prueba de concepto del Google Earth Browser Plugin donde se utilizan sus posibilidades como motor de visualización de Información Geográfica y estadística  a través de la creación de un aplicativo que permite explorar de forma interactiva la información de contratación estatal de Colombia [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" title="Kudos Ltda. - VGICC" src="http://static.gkudos.com/flash/contract/kudos_contrato_03.jpg" alt="" width="537" height="302" /></p>
<p><strong>Descripción del Proyecto:</strong> (You can read the english version of this article <a href="http://blog.gkudos.com/2008/07/31/geographical-visualization-of-government-contracts-in-colombia-vgicc/">here</a>)</p>
<p>Prueba de concepto del Google Earth Browser Plugin donde se utilizan sus posibilidades como motor de visualización de Información Geográfica y estadística  a través de la creación de un aplicativo que permite explorar de forma interactiva la información de contratación estatal de Colombia publicada en el Portal Único de Contratación (PUC, <a href="http://www.contratos.gov.co/puc/" target="_blank">http://www.contratos.gov.co/puc/</a>).</p>
<p>(<strong>Nota:</strong> La información publicada en este aplicativo es únicamente para efectos de prueba. Los datos oficiales del PUC puede encontrarlos en la dirección <a href="http://www.contratos.gov.co/puc/" target="_blank">http://www.contratos.gov.co/puc/</a> )</p>
<p><strong>Enlaces en Línea</strong></p>
<ul>
<li><a href="http://www.gkudos.com/contract/" target="_blank">Ver Aplicación en Línea </a> (Requiere el plugin de google earth que puede ser descargado en la siguiente ubicación:  <a href="http://code.google.com/apis/earth/" target="_blank">http://code.google.com/apis/earth/</a>)</li>
<li>Screencast 1: <a href="http://static.gkudos.com/flash/contract/swf/kudos_contrato_01.html" target="_blank">Visualización de Estadísticas en 3D</a></li>
<li>Screencast 2:<a href="http://static.gkudos.com/flash/contract/swf/kudos_contrato_02.html" target="_blank"> Consulta de Contratos </a></li>
</ul>
<p><strong>Desafíos del Proyecto:</strong><br />
Proveer un sistema de consultas interactivo basado en mapas y gráficos para el Portal Único de Contratación de Colombia  de manera que los usuarios puedan explorar y visualizar la información de contratación teniendo en cuenta la ubicación geográfica de las inversiones realizadas en el país.</p>
<p>Esta prueba de concepto de un sistema de consultas interactivas para el PUC permitiría a los usuarios una forma más eficiente para visualizar la información de contratación de Colombia en comparación a las búsquedas que actualmente existen donde únicamente se limitan a filtros por criterios alfanuméricos.</p>
<p style="text-align: center;"><img class="aligncenter" title="Kudos Ltda - VGICC" src="http://static.gkudos.com/flash/contract/kudos_contrato_01.jpg" alt="" width="579" height="325" /></p>
<p><strong>Desafío Técnico:</strong><br />
Para el desarrollo del proyecto se presentaron múltiples desafíos técnicos en diferentes temas:</p>
<ul>
<li> <strong>Extracción de Información: </strong>Aunque la información del Portal Único de Contratación puede ser consultada  libremente por los usuarios en la página http://www.contratos.gov.co/puc/, no existe en el momento un Servicio Web, RSS o Interfaz de programación abierto que permita su comunicación  con otros sistemas externos.  Para que nuestro sistema VGICC  pudiera utilizar la información del PUC  fue necesaria la implementación de técnicas de Web Scrapping (http://en.wikipedia.org/wiki/Web_scraping) que permitieran la extracción automática la información publicada en el Portal Único de Contratación.</li>
</ul>
<ul>
<li><strong>Transformación, Georreferenciación y Carga de Datos:</strong> Una vez extraída la información del PUC fue necesaria la transformación y Georreferenciación de la ubicación  de los contratos respecto a la división política de Colombia por Municipios.  Posteriormente dicha información fue cargada  en una base de datos espacial publicada en el motor Postgresql / Postgis.</li>
</ul>
<ul>
<li><strong>Visualización Interactiva de Información Geográfica y Estadísticas a través de Internet:</strong> Uno de los principales desafíos técnicos del VGICC fue el de permitir herramientas Web interactivas de fácil uso para la visualización de información geográfica y estadística.  Con el fin de suplir esta necesidad se valió de las utilidades de representación geográfica y 3D que presta el recientemente publicado servicio de Google Earth Browser Plugin (http://code.google.com/apis/earth/).  Dicho plugin permite la interacción con el motor de visualización de Google Earth a través de técnicas de programación basadas en KML, Javascript/AJAX.  Gracias a este marco de trabajo (tal como se demuestra en la prueba de concepto) es posible realizar aplicaciones Web que permitan explorar la información ya sea desde el punto de vista alfanumérico como el Geográfico.</li>
</ul>
<p style="text-align: center;"><img class="alignnone" title="Kudos Ltda.  - VGICC" src="http://static.gkudos.com/flash/contract/kudos_contrato_04.jpg" alt="" width="602" height="336" /></p>
<p><strong>Funcionalidades Básicas Implementadas:</strong><br />
Permite visualizar de manera geográfica información consolidada por Departamento y Municipio. Se implementaron dos formas básicas de interacción:</p>
<ul>
<li>Selección de Departamentos a través de Listas: Seleccionando un Departamento de una lista se hace un acercamiento al área que este cubre. Sobre el centroide de cada municipio de muestra una barra que es proporcional al monto total de contratación que ha tenido el municipio.</li>
</ul>
<ul>
<li>Filtros de Consulta a través de Selección en el Mapa: El usuario tiene la posibilidad de interactuar con la información de los municipios disponible en el Mapa de Google Earth.  En los globos de información de Google Earth se despliega la información de cuantos contratos y el monto de los contratos que afectan al municipio seleccionado. De la misma forma se habilita un link de “Ver contratos”,  que permite la consulta de todos los contratos que afectan a dicha región. Dicho listado a su vez permite ver la información detallada para cada uno de los contratos así como también el link a la información oficial publicada en el PUC (Portal único de Contratación).</li>
</ul>
<p style="text-align: center;"><img class="aligncenter" title="Kudos Ltda - VGICC" src="http://static.gkudos.com/flash/contract/kudos_contrato_05.jpg" alt="" width="600" height="341" /></p>
<p><strong>Beneficios:</strong><br />
Permitir a los usuarios que consultan el Portal Único de Contratación formas alternativas de exploración y descubrimiento de información de las inversiones estatales realizadas en Colombia  a través de técnicas de Visualización en 3D y representación espacial / geográfica de la información de los contratos estatales desarrollados en el país.</p>
<p><strong>Herramientas:</strong></p>
<ul>
<li><a href="http://code.google.com/apis/earth/" target="_blank">Google Earth Browser Plugin</a></li>
<li>Javascript, Ajax, <a href="http://www.adobe.com/devnet/spry/" target="_blank">Adobe Spry Framework for Ajax</a></li>
<li><a href="http://grails.org" target="_blank">Java, Grails</a></li>
<li>Postgresql, Postgis</li>
</ul>
<p><strong>Lecciones Aprendidas:</strong><br />
No obstante las grandes virtudes que posee actualmente la herramienta Google Earth Browser Plugin, durante el desarrollo del VGICC  se encontraron algunos bugs de renderización del plugin entre diferentes versiones de navegador.</p>
<p>Por ejemplo se tiene el siguiente segmento de visualización para el departamento de Boyacá:</p>
<p style="text-align: left;"><img class="aligncenter" src="http://static.gkudos.com/flash/contract/ge_ok_plugin.jpg" alt="" width="598" height="350" /><br />
Sin embargo en algunas máquinas los polígonos se muestran de forma incompleta:</p>
<p style="text-align: center;"><img class="aligncenter" title="Kudos Google Earth plugin error" src="http://static.gkudos.com/flash/contract/ge_error1.jpg" alt="" width="570" height="332" /></p>
<p>O incluso en otros equipos la renderización es completamente inconsistente:</p>
<p style="text-align: center;"><img class="aligncenter" title="Kudos - Google Earth Plugin Error" src="http://static.gkudos.com/flash/contract/ge_error2.jpg" alt="" width="586" height="343" /></p>
<p>Dicha inconsistencia fue reportada en los foros de Google Groups pero hasta el momento no se ha dado una solución satisfactoria a la incidencia (Para más información ver <a href="http://groups.google.com/group/google-earth-browser-plugin/browse_thread/thread/699d6dad2a345210/fac604a4226d39c5" target="_blank">Google Earth Browser Plugin: Polygons don&#8217;t render correctly</a> )</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gkudos.com/2008/07/28/visualizacion-geografica-de-informacion-contractual-colombiana-vgicc/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
