<?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>MadeInFlex &#187; Flex 4</title>
	<atom:link href="http://www.madeinflex.com/categoria/flex4/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.madeinflex.com</link>
	<description>Creando Soluciones RIA...</description>
	<lastBuildDate>Wed, 30 Nov 2011 16:04:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Flash Player 11, AIR 3 y Flash Builder 4.6</title>
		<link>http://www.madeinflex.com/2011/09/21/flash-player-11-air-3-y-flash-builder-4-6/</link>
		<comments>http://www.madeinflex.com/2011/09/21/flash-player-11-air-3-y-flash-builder-4-6/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 07:08:29 +0000</pubDate>
		<dc:creator>Sergi Dote Teixidor</dc:creator>
				<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[Flex Builder]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2332</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->Se ha hecho oficial el anuncio de Player 11, AIR 3, Flex 4.6 y  Flash Builder 4.6. Se estima que estarán disponibles a partir de octubre.
Os dejo a continuación dos links para que podáis haceros una idea de lo que esto implicará:
link 1
link 2]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>Se ha hecho oficial el anuncio de Player 11, AIR 3, Flex 4.6 y  Flash Builder 4.6. Se estima que estarán disponibles a partir de octubre.<br />
Os dejo a continuación dos links para que podáis haceros una idea de lo que esto implicará:<br />
<a href="http://www.adobe.com/devnet/flex/articles/whats-new-flex-flash-builder-46.html">link 1</a><br />
<a href="http://blog.digitalbackcountry.com/2011/09/flash-player-11-air-3-and-flexflash-builder-4-6/">link 2</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2011/09/21/flash-player-11-air-3-y-flash-builder-4-6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mobile ItemRenderer en ActionScript (Parte 1)</title>
		<link>http://www.madeinflex.com/2011/05/18/mobile-itemrenderer-en-actionscript-parte-1/</link>
		<comments>http://www.madeinflex.com/2011/05/18/mobile-itemrenderer-en-actionscript-parte-1/#comments</comments>
		<pubDate>Wed, 18 May 2011 21:09:33 +0000</pubDate>
		<dc:creator>Edgar Parada</dc:creator>
				<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[dispositivos]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2274</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->Recientemente un viejo conocido de la comunidad Flex hispana (Nahuel Foronda) ha publicado una serie de interesantes posts sobre Optimización de Flex para Móviles que iremos posteando traducidos al español, previa autorización   
Si estás comenzando a hacer desarrollo móvil y estás acostumbrado a crear todos los ItemRenderers en MXML, habrás notado que pequeños [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>Recientemente un viejo conocido de la comunidad Flex hispana (<a href="http://twitter.com/#!/nahuel_es">Nahuel Foronda</a>) ha publicado una serie de interesantes posts sobre <strong>Optimización de Flex para Móviles</strong> que iremos posteando traducidos al español, previa autorización <img src='http://www.madeinflex.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  </p>
<p>Si estás comenzando a hacer desarrollo móvil y estás acostumbrado a crear todos los <em>ItemRenderers</em> en <em>MXML</em>, habrás notado que pequeños dispositivos como teléfonos y tabletas no tienen un desempeño tan bueno como en escritorio y necesitarás buscar diferentes maneras de optimizar tu aplicación.<br />
<span id="more-2274"></span><br />
Una de las formas de optimizar tu aplicación móvil es crear tus <em>ItemRenderers</em> con ActionScript. <a href="http://twitter.com/#!/rictus">Narciso Jaramillo</a> escribió un <a href="http://www.adobe.com/devnet/flex/articles/mobile-development-flex-flashbuilder.html">buen artículo para Devnet</a> con buenos tips para el desarrollo móvil y uno de los puntos es precisamente eso, mantener tus <em>ItemRenderers</em> en puro ActionScript.</p>
<p>Narciso menciona que el Framework de Flex viene con dos <em>ItemRenderers</em> uno es <strong>LabelItemRenderer</strong> que extiende a <strong>UIComponent</strong> y el otro es <strong>IconItemRenderer</strong> que extiende a <strong>LabelItemRenderer</strong>. Esas clases son buenas, pero a veces tenemos un diferente caso de uso que necesita una serie diferente de clases. así que en los ejemplos, no utilizaré esos rendereres. En su lugar, extenderemos directamente desde <strong>UIComponent</strong> o desde <strong>SpriteVisualElement</strong> para tener inclusive una clase más ligera que <strong>UIComponent</strong>.</p>
<p>Para el propósito de este tutorial, estoy planeando una serie de entradas explicando las bases y pasar a <em>renderers</em> con mayor dificultad.</p>
<h2 id="toc-ejemplo-basico">Ejemplo Básico</h2>
<p>Comencemos con el <em>renderer</em> más simple, un <strong>TextField</strong> que muestre algún texto. Para hacerlo sencillo, extenderemos desde <strong>UIComponent</strong> e implementaremos la interfaz <strong>IDataRenderer</strong> requerida por <strong>List</strong>.</p>
<p>Pero antes de hablar sobre el renderer, hablemos de otros elementos.</p>
<h3 id="toc-application">Application</h3>
<p>Necesitas crear un proyecto tipo Mobile. En este ejemplo, usaré el más simple de los contenedores raíz, ese es un Application, no las subclases TabbedApplication o ViewBasedApplication. Agregaremos un List que se expanda al 100% como único elemento.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="300" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=300&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2274&#038;no=0&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="300" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=300&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2274&#038;no=0&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<h3 id="toc-estilos">Estilos</h3>
<p>Agregué una hoja de estilos externa donde tenemos todos los estilos para el <em>ItemRenderer</em>:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2274&#038;no=1&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2274&#038;no=1&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<h3 id="toc-itemrenderer">ItemRenderer</h3>
<p>Tenemos una clase simple que extiende a <strong>UIComponet</strong> que nos da algunos métodos útiles y la habilidad de participar en el framework de CSS.</p>
<p>Estos 3 métodos de <strong>UIComponent</strong> que utilizaremos son los siguientes:</p>
<p><strong>measure</strong> donde nosotros leemos el tamaño mínimo del <em>renderer</em> desde la hoja de estilos. Esto se vuelve útil porque dispositivos con diferentes resoluciones dpi necesitan diferentes medidas.</p>
<p><strong>createChildren</strong> donde nosotros creamos el <strong>TextField</strong>, establecemos los estilos y si hay datos disponibles, configuramos el texto en el <strong>TextField</strong> a ser mostrado.</p>
<p><strong>updateDisplayList</strong> donde posicionamos los elementos y dibujamos cada línea separadora para cada <em>ItemRenderer</em>.</p>
<p>Adicionalmente a estos métodos, tenemos la propiedad <strong>data</strong>, que es la implementación de la iterfaz <strong>IDataRenderer</strong>. Esa interfaz es el contrato con <strong>List</strong> y es la forma en la que los datos son empujados hacia el <em>ItemRenderer</em>. Si el <strong>TextField</strong> existe al momento de configurar los datos, entonces configuramos el texto dentro del TextField, de otra manera, lo guardamos para después.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="300" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=300&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2274&#038;no=2&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="300" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=300&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2274&#038;no=2&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Como pueden ver escribir un ItemRenderer en ActionScript no es tan difícil como suena.</p>
<p>Estoy planeando mostrar otros ejemplos en el futuro con múltiples elementos, fondos, estados, manipulación de texto, columnas múltiples y más.</p>
<p><a href="http://www.asfusion.com/assets/content//tutorialFiles/renderers/renderers_1.zip">El código fuente esta disponible para descargar.</a></p>
<p>Nota: Este artículo está traducido en MadeInFlex con autorización previa del autor, si quieren consultar la fuente original <a href="http://www.asfusion.com/blog/entry/mobile-itemrenderer-in-actionscript-part-1">aquí tienen el enlace.</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2011/05/18/mobile-itemrenderer-en-actionscript-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clear Toolkit ahora con soporte para Spring</title>
		<link>http://www.madeinflex.com/2011/03/15/clear-toolkit-ahora-con-soporte-para-spring/</link>
		<comments>http://www.madeinflex.com/2011/03/15/clear-toolkit-ahora-con-soporte-para-spring/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 08:43:51 +0000</pubDate>
		<dc:creator>Nono F. Carballo Escalona</dc:creator>
				<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2242</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->Tal como habiamos anunciado Farata Systems ha liberado una nueva versión de su herramienta Clear Toolkit, esta vez con soporte para Spring.
Durante la creación del proyecto se puede elegir si se incluye soporte para Spring o no, y en tal caso todas las clases generadas se cargan como beans gestionados por el contenedor y se [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>Tal como habiamos anunciado Farata Systems ha liberado una nueva versión de su herramienta Clear Toolkit, esta vez con soporte para Spring.</p>
<p>Durante la creación del proyecto se puede elegir si se incluye soporte para Spring o no, y en tal caso todas las clases generadas se cargan como beans gestionados por el contenedor y se hacen disponibles a la aplicaciopn flex a traves del paquete de integración de Spring con BlazeDS.</p>
<p>El proyecto sigue hospedado en <a href="https://sourceforge.net/projects/cleartoolkit/">sourceforge</a>, pero ahora estrena un nuevo <a href="http://www.cleartoolkit.com/dokuwiki/doku.php">sitio</a> con toda la documentación necesaria para comenzar a usar esta herramienta.</p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2011/03/15/clear-toolkit-ahora-con-soporte-para-spring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clear Toolkit para el desarrollo de aplicaciones Flex</title>
		<link>http://www.madeinflex.com/2011/02/15/clear-toolkit-para-el-desarrollo-de-aplicaciones-flex/</link>
		<comments>http://www.madeinflex.com/2011/02/15/clear-toolkit-para-el-desarrollo-de-aplicaciones-flex/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 08:53:01 +0000</pubDate>
		<dc:creator>Nono F. Carballo Escalona</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Flex 4]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2219</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->En Febrero  del 2009 Farata Systems  anunció en su blog que comenzaba el proceso de liberación bajo licencia de código abierto su producto Clear Toolkit.

En aquel momento estaba en la versión 3.1 y estaba compuesto por:

Clear Data Builder 3.1: Un plugin de eclipse que permitía la generación de código para hacer operaciones CRUD, [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>En Febrero  del 2009 <a href="http://www.faratasystems.com/">Farata Systems</a>  anunció en su <a href="http://flexblog.faratasystems.com/">blog</a> que comenzaba el proceso de liberación bajo licencia de código abierto su producto <a href="http://sourceforge.net/projects/cleartoolkit/">Clear Toolkit</a>.<br />
<span id="more-2219"></span><br />
En aquel momento estaba en la versión 3.1 y estaba compuesto por:</p>
<ul>
<li>Clear Data Builder 3.1: Un plugin de eclipse que permitía la generación de código para hacer operaciones CRUD, tomando como base una sentencia SQL o una clase Java (DTO).</li>
<li>DTO2Fx: una utilidad que permite la generación de las clases en ActionScript partiendo de una clase correspondiente en Java.</li>
<li>Log4Fx: Un plugin para Eclipse que automatiza y hace más amigable la generación de trazas en la aplicación.</li>
<li>Fx2Ant: Una utilidad que genera scripts ant basado en el proyecto Flex</li>
<li>clear.swc: Una biblioteca de componentes Flex que incluye componentes que hacen facilitan la implementación de las funcionalidades CRUD en los proyectos.</li>
</ul>
<p>Específicamente sobre la biblioteca clear.swc se han escrito varios artículos explicando su funcionamiento y cómo se usa en los proyectos:</p>
<ul>
<li><a href="http://www.developria.com/2009/03/introducing-enhanced-flex-comp.html">Introducing Enhanced Flex Components from Clear Toolkit Framework</a></li>
<li><a href="http://www.developria.com/2009/05/chapter-preview-building-an-en.html">Building an Enterprise Framework &#8211; Enterprise Development with Flex, Part 1</a></li>
<li><a href="http://www.developria.com/2009/05/building-an-enterprise-framewo.html">Building an Enterprise Framework &#8211; Enterprise Development with Flex, Part 2</a></li>
<li><a href="http://www.developria.com/2009/05/building-an-enterprise-framewo-1.html">Building an Enterprise Framework &#8211; Enterprise Development with Flex, Part 3</a></li>
</ul>
<p>El producto ha evolucionado, en la actualidad se encuentra en la versión 4.1 y se continúa desarrollando. Esta versión permite la generación del código necesario para realizar las operaciones CRUD, utilizando Hibernate, partiendo de clases  Java (DTO) y de interfaces  en las cuales se incluyen anotaciones propias del framework, y que al ser compiladas provocan la generación del código. Ofrece también una solución a la sincronización de datos, funcionalidad que no está presente en BlazeDS y sí en LiveCycle Data Services.</p>
<p>Las diferencias entre BlazeDS+Clear Toolkit y LiveCycle Data Services se abordan en el artículo <a href="http://flexblog.faratasystems.com/2010/03/15/open-source-alternatives-to-livecycle-data-servcies">Open source alternatives to LiveCycle Data Servcies</a>.</p>
<p>Otra de las funcionalidades presentes en esta última versión es la posibilidad de hacer “lazy loading” desde flex. Para esto se incluye en la clase Java una anotación que indica la relación (One-to-Many o Many-to-One) y el framework genera todo el código necesario tanto en Java como en ActionScript para esta funcionalidad.</p>
<p>Existen dos screencast que muestran muy claramente cómo se utiliza esta funcionalidad, estos videos se pueden encontrar en:</p>
<ul>
<li><a href="http://www.cleartoolkit.com/videos/cdb4.1/Episode1UsingEntities/">http://www.cleartoolkit.com/videos/cdb4.1/Episode1UsingEntities/</a></li>
<li><a href="http://www.cleartoolkit.com/videos/cdb4.1/Episode2HierarchicalCollectionsWithEntities/">http://www.cleartoolkit.com/videos/cdb4.1/Episode2HierarchicalCollectionsWithEntities/</a></li>
</ul>
<p>Los desarrolladores trabajan en la integración con Spring, lo que seguramente estará disponible en versiones futuras.</p>
<p>La documentación de las clases tanto de la biblioteca clear.swc como de java se puede leer en:</p>
<ul>
<li><a href="http://help.faratasystems.com/en_US/cleartoolkit/reference/flex/4/">http://help.faratasystems.com/en_US/cleartoolkit/reference/flex/4/</a></li>
<li><a href="http://help.faratasystems.com/en_US/cleartoolkit/reference/BlazeDS/4/">http://help.faratasystems.com/en_US/cleartoolkit/reference/BlazeDS/4/</a></li>
</ul>
<p>El proyecto continúa hospedado en <a href="http://sourceforge.net/projects/cleartoolkit/">Sourceforge</a> desde donde se puede descargar la última versión del producto así como acceder a la documentación, a los fórums y al código fuente.</p>
<p>Les recomiendo que lo prueben, una vez que se conoce como funciona se ahorra mucho tiempo en la implementación de la funcionalidad CRUD en los proyectos.</p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2011/02/15/clear-toolkit-para-el-desarrollo-de-aplicaciones-flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Skinning detallado con Flex 4</title>
		<link>http://www.madeinflex.com/2011/02/08/skinning-detallado-con-flex-4/</link>
		<comments>http://www.madeinflex.com/2011/02/08/skinning-detallado-con-flex-4/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 08:33:19 +0000</pubDate>
		<dc:creator>Sergi Dote Teixidor</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Flex 4]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2175</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->Uno de los ámbitos fuertes de Spark es el mecanismo de skinning de componentes. Nos ofrece un control total sobre el look and feel de nuestras aplicaciones. En este artículo veremos en profundidad como funciona este aspecto tan importante de Flex 4, acompañado de un proyecto de ejemplo.

Introducción
La nueva arquitectura de skinning que nos ha [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>Uno de los ámbitos fuertes de Spark es el mecanismo de skinning de componentes. Nos ofrece un control total sobre el look and feel de nuestras aplicaciones. En este artículo veremos en profundidad como funciona este aspecto tan importante de Flex 4, acompañado de un proyecto de ejemplo.<br />
<span id="more-2175"></span></p>
<h2 id="toc-introduccion"><strong>Introducción</strong></h2>
<p>La nueva arquitectura de skinning que nos ha aportado Flex 4, proporciona una separación clara y precisa entre la lógica y los elementos visuales de un componente. De esta manera se consigue que los  componentes en Flex 4 no contengan ninguna información sobre su representación gráfica. Esta información es contenida en el fichero que compone la skin. Mediante FXG y estados, podemos crear skins con mxml únicamente.<br />
Uno de los conceptos más importantes son las skin parts, que nos describen todas las partes de un componente y definen el contrato que el componente establece con la skin. Las skin parts pueden ser dinámicas o estáticas. El tipo de skin part nos determina el tipo de instanciación que tendrá. Además, las skin parts pueden ser requeridas o no.</p>
<h2 id="toc-el-proyecto-de-ejemplo"><strong>El proyecto de ejemplo</strong></h2>
<p>Es un componente que nos permite seleccionar el sexo y rango de edad de una persona:<br />
<img src="http://www.madeinflex.com/wp-content/uploads/2011/02/snapshot.png" width="257" height="165" class="aligncenter size-full wp-image-2177" /><br />
<a href='http://www.madeinflex.com/wp-content/uploads/2011/02/sexAndAgeSelector.zip'>Descarga</a></p>
<h2 id="toc-static-y-dynamic-skin-parts"><strong>static y dynamic skin parts</strong></h2>
<p>Al crear un componente custom, lo primero que debemos hacer es mirar que partes lo constituirán. En este momento decidimos que partes serán opcionales, cuantas instancias tendremos de cada una de ellas y si se crearán en el inicio de la skin o durante el ciclo de vida de ésta.<br />
Las partes estáticas se crean con la skin y son siempre accesibles. Sólo tendremos una instancia de cada una de estas partes.<br />
Las partes dinámicas se instancian cuando se necesitan.</p>
<p>En el componente definimos las partes que lo comprenden, la lógica específica de la vista y listeners de eventos a los que responde, a parte del control del estado de esta vista y de sus elementos.<br />
En cambio, en la skin determinamos de distribución del layout y los elementos gráficos que la compondrán.</p>
<p>Esta tabla resume las diferencias entre las static y dynamic skin parts (click para maximizar):<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2011/02/skin-parts.png"><img src="http://www.madeinflex.com/wp-content/uploads/2011/02/skin-parts-300x133.png" width="300" height="133" class="aligncenter size-medium wp-image-2180" /></a></p>
<p>Un ejemplo es el siguiente, VSlider, tiene thumb y track como skin parts estáticas debido a que sólo tendremos una instancia y dataTip que es dinámica debido a que su creación será deferida. </p>
<p>Como se resume en la tabla, es adecuado usar una dynamic skin part cuando habrá múltiples instancias de ésta o cuando será instanciada a posteriori y no en el momento de creación de la skin. Son muy útiles cuando en tiempo de compilación no sabemos cuántas instancias vamos a necesitar: por ejemplo, puede ser que tengamos que ir modificando el número de instancias según el valor de una propiedad que modifica el usuario o cuando tenemos que mostrar resultados de una query a la base de datos y no sabemos cuántos resultados nos devolverá.</p>
<p>Trabajar con dynamic skin parts es distinto a hacerlo con static parts, debido sobre todo a que seremos nosotros los encargados de instanciarlas y no el framework.</p>
<h4 id="toc-declaracion-de-las-skin-parts-en-el-componente"><strong>Declaración de las skin parts en el componente</h4>
<p></strong><br />
En nuestro componente de selección de sexo y edad, tenemos los botones de selección de tangos de edad que serán dinámicos. Con el metadata tag [SkinPart] definimos una skin part, tanto dinámica como estática. En el caso de las dinámicas, la variable, en lugar de ser fuertemente tipada, se declara de tipo IFactory, aunque en el parámetro type del tag definimos con el tipo que será instanciada:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="100" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=100&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2175&#038;no=0&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="100" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=100&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2175&#038;no=0&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Tenemos el parámetro required para especificar si esta skin part es requerida o no, en la mayoría de skin parts dinámicas, required tendrá como valor true.</p>
<h4 id="toc-definicion-de-las-skin-parts-en-la-skin"><strong>Definición de las skin parts en la skin</h4>
<p></strong><br />
El siguiente paso es la definición de las partes dentro de la skin. Para las static skin parts, directamente ponemos elementos gráficos y otros controles en la skin. Las dynamic skin parts se declaran dentro del tag de Declarations de la skin, debido a que no sabemos cuántas instancias necesitaremos:<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2175&#038;no=1&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2175&#038;no=1&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Al definir una dynamic skin part debemos declarar el componente dentro del tag Component y este Component debe tener como id el mismo valor que le hemos dado a la skin part dentro de la Clase del componente.</p>
<h4 id="toc-creacion-de-una-instancia-de-una-dynamic-skin-part"><strong>Creación de una instancia de una dynamic skin part</strong></h4>
<p>Las dynamic skin parts son declaradas como IFactory. Es por eso que debemos usar el método createDynamicPartInstance() de la clase SkinnableComponent. Este método usa un mecanismo de caching. Aquí vemos un ejemplo de creación:<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="300" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=300&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2175&#038;no=2&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="300" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=300&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2175&#038;no=2&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Vemos que una vez instanciada, la variable tiene que ser casteada para poder ser usada. Además debemos añadirla a la parte del layout que le corresponda, en este caso en el container dropDown.</p>
<h4 id="toc-control-sobre-las-parts"><strong>Control sobre las parts</strong></h4>
<p>Tanto para las static como para las dynamic parts, Flex invoca automáticamente el método partAdded(), cada vez que se crea una parte. Es sobrescribiendo este método cuando añadiremos comportamiento específico a cada una de las partes, si es necesario:<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="300" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=300&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2175&#038;no=3&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="300" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=300&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2175&#038;no=3&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Cuando una part se elimina, automáticamente se llama el método partRemoved(). En él deberemos quitar el comportamiento que le habíamos asignado, si es necesario, como, por ejemplo, eliminar event listeners:<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="300" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=300&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2175&#038;no=4&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="300" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=300&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2175&#038;no=4&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Podemos eliminar intencionadamente una parte usando el método removeDynamicPartInstance() .<br />
Para acceder a una dynamic part que hemos creado, tenemos dos maneras:</p>
<ul>
<li>Mediante createDynamicPartInstance(skinPart:String)</li>
<li>Mediante getDynamicPartAt(partName:String, index:int)</li>
</ul>
<h4 id="toc-cambio-de-skin-en-tiempo-de-ejecucion"><strong>Cambio de skin en tiempo de ejecución</strong></h4>
<p>Puede interesarnos cambiar la skin de un componente en runtime. Esto implica que debemos guardar el estado de las dynamic parts dentro del código, ya que Flex no se encarga de hacerlo. Es recomendable hacer esto que hemos comentado dentro de los métodos attachSkin() y detachSkin(), ya que estos métodos se llaman cuando la skin se carga y se descarga respectivamente.</p>
<h2 id="toc-codigo-en-la-skin-o-en-el-componente"><strong>¿Código en la skin o en el componente?</strong></h2>
<p>En general, la lógica que atañe a la vista, debería estar en la declaración de ésta, es decir, en el componente, pero esta regla no siempre es la más adecuada, depende de los escenarios: </p>
<ul>
<li>Si un código de un componente debe ser el mismo independientemente de la skin que se le aplique, vemos claramente que debe estar en el componente.</li>
<li>Si un código atañe a una determinada representación, este debe estar en la skin. </li>
</ul>
<h2 id="toc-sobrescritura-de-metodos-de-skinnablecomponent"><strong>Sobrescritura de métodos de SkinnableComponent</strong></h2>
<p>Todos los componentes visuales de la arquitectura extienden la clase SkinnableComponent. Por lo tanto, heredan sus métodos, propiedades, eventos y demás atributos de esta clase.<br />
Puede ser que para crear una determinado componente custom, debamos sobrescribir métodos como commitProperties(), createChildren(), measure(), updateDisplayList(), attachSkin(), detachSkin(), partAdded(), partRemoved() o getCurrentSkinState().</p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2011/02/08/skinning-detallado-con-flex-4/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Cairngorm 3 Overview</title>
		<link>http://www.madeinflex.com/2011/01/22/cairngorm-3-overview/</link>
		<comments>http://www.madeinflex.com/2011/01/22/cairngorm-3-overview/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 10:15:57 +0000</pubDate>
		<dc:creator>Sergi Dote Teixidor</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex 4]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2136</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->Ahora que Cairngorm 3  desde hace un tiempo ya es una realidad, on este artículo queremos mostrar que es, que nos aporta respecto a sus versiones anteriores y daremos un vistazo a su evolución.

Las versiones anteriores de Cairngorm se basaban en una implementación específica del patrón Model-View-Controller, en cambio Cairngorm 3, debido a la [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>Ahora que Cairngorm 3  desde hace un tiempo ya es una realidad, on este artículo queremos mostrar que es, que nos aporta respecto a sus versiones anteriores y daremos un vistazo a su evolución.<br />
<span id="more-2136"></span></p>
<p>Las versiones anteriores de Cairngorm se basaban en una implementación específica del patrón Model-View-Controller, en cambio Cairngorm 3, debido a la experiencia, quiere darnos una serie de guías, buenas prácticas y nos aporta unas librerías y herramientas para ayudarnos en el desarrollo.<br />
Esto implica que el paso de Cairngorm 2 a 3 no sea un simple un cambio de versión si no un cambio de paradigma.</p>
<p>El objetivo de Cairngorm 3 es dar unas bases para conseguir unos desarrollos limpios, consistentes, testeables y fácilmente escalables.</p>
<h2 id="toc-arquitectura-de-cairngorm"><strong>Arquitectura de Cairngorm</strong></h2>
<p>Para aproximarnos a un diseño simple y testeable, Cairngorm recomienda una arquitectura concreta para las aplicaciones Flex. Esta arquitectura tiene como objetivo que la estructura de la aplicación se desglose en pequeñas unidades de funcionalidad.</p>
<p>Antes de ver la separación arquitectural, entendamos como concibe Cairngorm una aplicación. Está compuesta de 3 capas de alto nivel: </p>
<ul>
<li>Capas de arquitectura: responsables de separar las clases según su responsabilidad</li>
<li>Áreas funcionales: agrupan clases que atañen el mismo ámbito funcional</li>
<li>Patrones de diseño: nos permiten coordinar los objetos de manera consistente</li>
</ul>
<h2 id="toc-capas-de-arquitectura"><strong>Capas de Arquitectura</strong></h2>
<p>Las clases con diferentes tipos de responsabilidad en las diferentes capas, pueden cambiarse separadamente por otras. De esta manera, si el diseño visual necesita ser ajustado, la mayoría de los cambios se limitan a clases de la capa de presentación y no a otras partes del código. </p>
<p>Cairngorm recomienda esta separación de capas según la responsabilidad general de cada una de ellas:</p>
<ul>
<li>Presentation: se encarga de la apariencia visual y del comportamiento de la presentación. Cairngorm recomienda el uso del patrón de presentación Presentation Model, que se encarga de controlar el estado y comportamiento de la capa de visualización.</li>
<li>Application: coordina la presentación y la infraestructura de componentes. Coordina los componentes de distintas capas y los enlaza con los Domain Objects mediante el concepto de Controller que ya veremos.</li>
<li>Domain: se centra en las tareas sobre el modelo de negocio. Representa una abstracción del mundo real mediante un modelo de datos. Sus responsabilidades suelen ser: la validación, cálculos sobre los datos, filtro, ordenación y formateo de datos…</li>
<li>Infrastructure: coordina los objetos y su integración con otros sistemas, como el servidor y sus servicios remotos.</li>
</ul>
<p>En la siguiente figura vemos la jerarquía de capas. De arriba hacia abajo, la comunicación entre una capa y su contigua es directa; en dirección contraria, la comunicación se realiza mediante eventos, callback functions u otras soluciones similares.<br />
<img src="http://www.madeinflex.com/wp-content/uploads/2011/01/layers.png" alt="layers" title="layers" width="186" height="193" class="aligncenter size-full wp-image-2140" /></p>
<h4 id="toc-areas-funcionales">Áreas funcionales</h4>
<p>Las aplicaciones se suelen dividir en diferentes áreas funcionales. La codificación de cada área funcional suele estar agrupada y separada de otras áreas funcionales, para que así sean desarrolladas y probadas de manera independiente. Podemos tener una aplicación de ejemplo que esté compuesta por tres áreas funcionales: contactos, mensajes y gastos. Entonces, cada una de estas áreas es subdividida según las distintas capas de arquitectura, según sea conveniente, como podemos ver en la siguiente imagen:<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2011/01/areas-funcionales.png"><img src="http://www.madeinflex.com/wp-content/uploads/2011/01/areas-funcionales-300x162.png" alt="areas-funcionales" title="areas-funcionales" width="300" height="162" class="aligncenter size-medium wp-image-2143" /></a></p>
<p>Cada área funcional suele estar contenida en un package. Ciertas áreas funcionales, según su grado de relación, pueden estar contenidas en un proyecto separado y así extraerse en  módulos. El código que suele usarse en diferentes partes de la aplicación, como componentes, suelen ponerse dentro de un proyecto de librería.</p>
<p>Las áreas funcionales suelen tener sus capas de presentación y aplicación. A menudo contienen sus propias capas de dominio, pero otras veces comparten conocimiento del modelo de dominio de otras áreas. En este caso, estos modelos de dominio suelen ser encapsulados en proyectos de librería. Las áreas funcionales pueden interactuar con otras mediante interfaces y eventos AS3. </p>
<h2 id="toc-capa-de-presentacion"><strong>Capa de presentación</strong></h2>
<h4 id="toc-presentation-model">Presentation Model</h4>
<p>Una de las cosas que nos recomienda Cairngorm 3 es tender a minimizar el código dentro de los mxml. Si es posible debemos intentar no tener código ni funciones, así las vistas reducen su tamaño y se centran solo en la disposición de sus componentes; haciendo más fácil la lectura. </p>
<p>La manera de hacerlo es extrayendo las variables y funciones que estarían en el Script-block en presentation models.<br />
Cada componente o vista MXML significativa debe tener su propio presentation model. El PM se centra en el estado y comportamiento requeridos para representar los datos en la vista.</p>
<p>Un PM no debe saber nada de otro, ni de la vista relacionada ni de qué sirve a la aplicación. Un PM no debe tener referencia a la vista a la cual sirve, sino que es la vista que observa al PM relacionado. La comunicación entre ambos se realiza mediante Bindings o eventos. </p>
<p>Con esta aproximación minimizamos los errores en la vista y la lógica se localiza en el PM, que es fácilmente testeable.</p>
<h2 id="toc-coordinacion-entre-pms"><strong>Coordinación entre PMs</strong></h2>
<p>Cairngorm nos muestra dos entidades para coordinar los presentation models con otras entidades: Presenter y Controller. A continuación los vemos con mayor detalle.</p>
<h4 id="toc-presenters">Presenters</h4>
<p>Su ámbito se centra en la capa de presentación. Se encarga de la coordinación local entre Presentation Models de una misma área funcional o de una región de ésta. Entendemos pues que su rol está por encima de los PMs. </p>
<p>Sus principales objetivos son:</p>
<p>Desacoplar la presentación del Dominio<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2011/01/presenter1.png"><img src="http://www.madeinflex.com/wp-content/uploads/2011/01/presenter1-300x210.png" alt="presenter1" title="presenter1" width="300" height="210" class="aligncenter size-medium wp-image-2150" /></a></p>
<p>Coordinación de PMs<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2011/01/presenter2.png"><img src="http://www.madeinflex.com/wp-content/uploads/2011/01/presenter2-300x202.png" alt="presenter2" title="presenter2" width="300" height="202" class="aligncenter size-medium wp-image-2151" /></a><br />
Como vemos en la figura anterior, reducen el acoplamiento entre PMs y los domains, escuchando eventos procedentes de los domains y comunicándolos a los PMs. </p>
<p>También son usados para manejar los eventos procedentes de PMs y delegarlos a otros PMs.<br />
Las razones que nos pueden motivar a usar Presenters son:</p>
<ul>
<li>Facilitan la lectura y control a alto nivel de la coordinación entre PMs</li>
<li>Se encargan de asegurar el orden en la gestión de los eventos lanzados por los distintos PMs, ya que los mecanismos de mensajería, normalmente no suelen definir un orden</li>
<li>Evitan el código de gestión de eventos (event-handling) en cada PM para escuchar a las peticiones de los otros</li>
</ul>
<h4 id="toc-controllers">Controllers</h4>
<p>Los Controllers se sitúan en la capa de Application. Tienen la responsabilidad de gestionar la coordinación general de los Presenters, no en un ámbito local, sino más global de un grupo específico de PMs. Se encargan de:</p>
<ul>
<li>Traducir los eventos procedentes de un área funcional a eventos de otras áreas funcionales</li>
<li>Interceptar eventos a nivel de aplicación</li>
<li>Traducir los eventos de aplicación a llamadas de la API de dominio con la finalidad de mantener los objetos de dominio libres de cualquier conocimiento relacionado con otras capas arquitecturales</li>
</ul>
<p><a href="http://www.madeinflex.com/wp-content/uploads/2011/01/controller.png"><img src="http://www.madeinflex.com/wp-content/uploads/2011/01/controller-218x300.png" alt="controller" title="controller" width="218" height="300" class="aligncenter size-medium wp-image-2152" /></a></p>
<p>En situaciones determinadas, los PMs pueden comunicarse directamente con los objetos de dominio y recibir sus cambios mediante eventos, como podemos ver en la siguiente figura:<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2011/01/pm-dm.png"><img src="http://www.madeinflex.com/wp-content/uploads/2011/01/pm-dm-300x196.png" alt="pm-dm" title="pm-dm" width="300" height="196" class="aligncenter size-medium wp-image-2153" /></a></p>
<h2 id="toc-aplicaciones-modulares"><strong>Aplicaciones Modulares</strong></h2>
<p>La modularidad va más allá de los conceptos de Flex Module y ModuleLoader. Implica la separación de aplicaciones en unidades pequeñas que pueden ser desarrolladas y testeadas independientemente. </p>
<h4 id="toc-beneficios-de-la-modularizacion">Beneficios de la Modularización</h4>
<ul>
<li>Un modulo puede ser desarrollado, y probado con una relativa independencia</li>
<li>Los tiempos de compilación se minimizan, ya que los cambios en un módulo no requieren de otros módulos</li>
<li>Los módulos pueden ser cargados bajo demanda, lo que hace que la carga inicial de la aplicación es mucho menor</li>
<li>Si un usuario no usa un determinado módulo, no es necesario cargarlo</li>
<li>Se pueden cargar diferentes módulos para distintos usuarios, según sus privilegios</li>
<li>Un modulo es más fácil de entender y mantener que una aplicación monolítica, consiguiendo una mejor cohesión funcional</li>
<li>La interacción entre módulos puede determinarse con APIs, independientemente del crecimiento de la aplicación</li>
</ul>
<h4 id="toc-modularizacion-y-cairngorm-3">Modularización y Cairngorm 3</h4>
<p>Como hemos visto, una de las claves de Cairngorm 3 es separa las aplicaciones en diferentes áreas funcionales que pueden ser desarrolladas independientemente; viene a ser una arquitectura modular, donde cada área funcional sería un módulo. Cairngorm recomienda que la comunicación entre las distintas áreas funcionales se haga mediante APIs definidas por interfaces, eventos y DTOs. Así minimizamos las dependencias entre las distintas áreas.</p>
<h2 id="toc-tendencia-hacia-el-bajo-acoplamiento"><strong>Tendencia hacia el bajo acoplamiento</strong></h2>
<p>Cairngorm 3 da mucha importancia a que las capas arquitecturales tengan un mínimo acoplamiento, asumiendo que cada capa cambia por motivos diferentes. Con un bajo acoplamiento en las distintas capas, éstas pueden tolerar mejor el cambio. Por otro lado, el bajo acoplamiento tiene un precio: cuanto menos acoplado esté un objeto a otro, se incrementa la dificultad de lectura.<br />
Hay distintas opciones para conseguir un bajo acoplamiento que los desarrolladores deben tener en cuenta.</p>
<h2 id="toc-opciones-para-construir-recuperar-y-aislar-objetos"><strong>Opciones para construir, recuperar y aislar objetos</strong></h2>
<p>La manera en que creamos, recuperamos o aislamos los objetos en una aplicación Flex, es un aspecto importante.<br />
Por ejemplo, creando un objeto de dominio dentro de un PM, provocamos una dependencia directa. Implica que el objeto queda aislado y si otra parte de la aplicación requiere este objeto, no tendrá acceso directo para consultarlo.</p>
<p>Además con esta dependencia forzada con el objeto de modelo dentro del PM, estamos atando fuertemente la capa de presentación a una implementación concreta del dominio. Con una interface del dominio y usando eventos, podemos bajar el acoplamiento, desacoplando las capas arquitecturales.</p>
<p>La implementación de un objeto de dominio no puede cambiarse sin cambiar la implementación del PM, lo cual puede restringir la flexibilidad de la aplicación.<br />
Los objetos de modelo tienen un significado a más alto nivel que el PM. Cuando el dominio puede abstraerse y controlarse con objetos de más alto nivel, conseguimos una inversión de control, que se opone a la aproximación usual de que objetos de bajo nivel controlan a otros.</p>
<h4 id="toc-opciones-de-separacion-de-la-construccion-y-comportamiento-de-los-objetos">Opciones de separación de la construcción y comportamiento de los objetos</h4>
<p>Puede ser muy incómodo para el PM substituir el objeto de dominio con una implementación diferente cuando el PM crea al objeto de dominio. Puede también ser muy incómodo el hecho de recuperar una misma instancia del dominio en un determinado lugar de la aplicación. Tenemos diferentes opciones de separar la creación del comportamiento de un objeto para simplificarlo, a continuación mostramos las dos más comunes.</p>
<ul>
<li>Aproximación transversal: El modelo de dominio se instancia en el PM o Vista de más alto nivel y se va propagando jerárquicamente a las subvistas o PMs relacionados.</li>
<li>Aproximación con framework de IoC: Se responsabilizan de la construcción de los objetos. El desarrollador especifica los objetos que se necesitan en el container de IoC.<br />
Así el framework IoC puede proporcionar estos objetos mediante inyección de dependencias o dependency lookup.</li>
</ul>
<h2 id="toc-librerias-que-nos-proporciona-cairngorm"><strong>Librerías que nos proporciona Cairngorm</strong></h2>
<p>Cairngorm 3 proporciona diferentes librerías, alguna de ellas construidas sobre frameworks existentes como Parsley, Swiz y Spring ActionScript.<br />
Estas librerías son interesantes, tenemos librerías para validación, para la gestión de popups, de navegación, gestión de módulos, etc. Recomiendo que leáis este apartado para que veáis que nos proporciona. </p>
<p>Para entender más como funciona Cairgorm 3 y los distintos conceptos, es necesario mirar y analizar un poco el código de las aplicaciones de ejemplo. </p>
<p>La información de Cairngorm 3 está en este <a href="http://sourceforge.net/adobe/cairngorm/home/">link</a>. </p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2011/01/22/cairngorm-3-overview/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flex Hero Mobile (IV): List, Scroller, Mobile Splash Screen y Mobile View Menu</title>
		<link>http://www.madeinflex.com/2011/01/08/flex-hero-mobile-iv-list-scroller-mobile-splash-screen-y-mobile-view-menu/</link>
		<comments>http://www.madeinflex.com/2011/01/08/flex-hero-mobile-iv-list-scroller-mobile-splash-screen-y-mobile-view-menu/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 14:58:57 +0000</pubDate>
		<dc:creator>Sergi Dote Teixidor</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Flex 4]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2120</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->En este último post de la serie Flex Hero Mobile, veremos cuatro elementos importantes y necesarios en las aplicaciones Mobile: List, Scroller, Mobile Splash Screen y Mobile View Menu. Daremos una ojeada a vista de pájaro de estos elementos.
 
List y Scroller
Los componentes List y Scroller de Flex 4 fueron pensados para usar en pcs. [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>En este último post de la serie Flex Hero Mobile, veremos cuatro elementos importantes y necesarios en las aplicaciones Mobile: List, Scroller, Mobile Splash Screen y Mobile View Menu. Daremos una ojeada a vista de pájaro de estos elementos.<br />
<span id="more-2120"></span> </p>
<h2 id="toc-list-y-scroller"><strong>List y Scroller</strong></h2>
<p>Los componentes List y Scroller de Flex 4 fueron pensados para usar en pcs. El hecho de usar estos componentes en dispositivos mobile, implica modificarlos para adaptarse al modelo de interacción del usuario y conseguir un mejor rendimiento y suavidad del movimiento. Han habido los siguientes refactorings:</p>
<ul>
<li>Modificación del componente Scroller para conseguir nuevas funcionalidades a través de una nueva API.</li>
<li>Modificación de la list de Spark para un mayor rendimiento en cuanto a scrolling e inicialización, y una mejor utilización de los ítem renderers y el rendimiento que saca de éstos.</li>
</ul>
<h2 id="toc-eventos-de-mouse-vs-eventos-touch">Eventos de Mouse vs eventos Touch</h2>
<p>Flash Player tiene tres tipos de eventos asociados a las pantallas táctiles: mouse events, touch events y gesture events. Los mouse events sobre todo son mantenidos para no perder retro compatibilidad con las versiones anteriores del framework. Son lanzados con el primer toque sobre la pantalla. Los touch events pueden ser lanzados por muchos toques y son asociados mediante un touch id. </p>
<p>Los gesture events son eventos de nivel superior, como el zoom o la rotación. Son, primeramente, lanzados mediante el sistema operativo y después los relanza Flash. No todos los SO soportan estos eventos.</p>
<p>Dependiendo del input que recibe Flash Player, lanza uno de los eventos descritos. </p>
<h2 id="toc-item-renderers">Item Renderers</h2>
<p>El rendimiento siempre debe tenerse en cuenta. No hay nada tan pesado como tratar una lista en un dispositivo mobile y que ésta vaya a trompicones. La mayoría de veces se debe a la mala implementación de los item renderers. Es por eso, que se recomienda crear los item renderers mediante ActionScript. Una de las respuestas al “por qué“, que podemos preguntarnos es  que la primitiva de texto más ligera, por ejemplo,  está disponible solamente en ActionScript y es mucho más rápida y fácil de renderizar que una Label Spark.</p>
<h4 id="toc-mobileitemrenderer">MobileItemRenderer </h4>
<p>facilita el trabajo que requiere un item renderer. Es el item renderer aplicado por defecto. Extiende a UIComponent e implementa IItemRenderer. Contiene un componente de texto.</p>
<h4 id="toc-mobileiconitemrenderer">MobileIconItemRenderer</h4>
<p> este ítem renderer tiene 4 partes opcionales: un icono a la izquierda, una línea sobre el icono, un texto multilínea al lado del icono y un decorador a la derecha. </p>
<h2 id="toc-mobile-splash-screen"><strong>Mobile Splash Screen</strong></h2>
<p>Proporciona una Splash Screen preloader (pantalla de carga de la aplicación) por defecto para las aplicaciones Flex Mobile. Nos permite especificar un recurso embebido, así como aplicar opciones de redimensionado y aplicarse a pantalla completa, si se desea. </p>
<p>Se ha añadido una nueva clase: spark.preloaders.SplashScreen, que proporciona las siguientes propiedades: </p>
<ul>
<li>splashScreenImage: permite poner una imagen como child.</li>
<li>splashScreenScaleMode: controla el tamaño y posición de la imagen.</li>
<li>splashScreenMinimumDisplayTime: permite especificar el tiempo mínimo que se tiene que mostrar la splash screen. El valor por defecto es 1000 ms.</li>
<li>Esta clase está pendiente de los cambios de orientación o redimensión.</li>
<li>No se necesita hacer trabajo extra para hacer que se comporte a full-screen.</li>
</ul>
<h2 id="toc-mobile-view-menu"><strong>Mobile View Menu</strong></h2>
<p>ViewMenu es un SkinnableContainer con un layout customizado e incluye interacción con el teclado. Este componente aparece cuando el usuario pulsa el botón de menú.</p>
<p>Un ViewMenu expone un conjunto de acciones para interactuar con la vista activa. Cada vista tiene una propiedad llamada ViewMenuItems que nos permite especificar la lista de elementos que mostrará ViewMenu cuando esta vista esté activa. </p>
<p>El flujo de interacción que sigue el ViewMenu es el siguiente: cuando el usuario pulsa el botón de menú, la MobileApplication crea un ViewMenu, lo popula con la vista activa y lo muestra usando PopUpManager. Cuando el usuario selecciona un ítem, este ViewMenuItem lanza un evento de click y la MobileApplication cierra el ViewMenu. </p>
<h4 id="toc-viewmenuitem">ViewMenuItem</h4>
<p>Es una  subclase de ButtonBase. Contiene la propiedad label y un icono. </p>
<h4 id="toc-viewmenuitemskin">ViewMenuItemSkin</h4>
<p>ViewMenuItemSkin extiende ButtonSkin. </p>
<h4 id="toc-viewmenulayout">ViewMenuLayout</h4>
<p>Extiende LayoutBase. En posición vertical permite hasta un máximo de 3 columnas y en horizontal, un máximo de 6. En cada fila pone elementos del mismo tamaño.</p>
<p>Más info en estos enlaces:<br />
<a href="http://opensource.adobe.com/wiki/display/flexsdk/Mobile+List%2C+Scroller+and+Touch">List y Scroller</a><br />
<a href="http://opensource.adobe.com/wiki/display/flexsdk/Mobile+Splash+Screen">Mobile Splash Screen</a><br />
<a href="http://opensource.adobe.com/wiki/display/flexsdk/ViewMenu+Spec">ViewMenu</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2011/01/08/flex-hero-mobile-iv-list-scroller-mobile-splash-screen-y-mobile-view-menu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lazy loading desde Flex con Pimento y Cinnamon</title>
		<link>http://www.madeinflex.com/2010/12/09/lazy-loading-desde-flex-con-pimento-y-cinnamon/</link>
		<comments>http://www.madeinflex.com/2010/12/09/lazy-loading-desde-flex-con-pimento-y-cinnamon/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 07:08:13 +0000</pubDate>
		<dc:creator>Nono F. Carballo Escalona</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=1947</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->El ejemplo
Conclusiones


El framework Pimento Data Services nos permite realizar el “lazy loading” de una asociación que haya sido configurada como “lazy” en JPA. Para ese tipo de asociación el framework envía al cliente solamente “proxies”, no los datos reales, los datos reales serán cargados en el momento que se invoque el método “initialize” de la [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p><span id="more-1947"></span><br />
<!--noteaser--></p>
<div class="toc">
<ol>
<li><a href="http://www.madeinflex.com/2010/12/09/lazy-loading-desde-flex-con-pimento-y-cinnamon/#toc-el-ejemplo">El ejemplo</a></li>
<li><a href="http://www.madeinflex.com/2010/12/09/lazy-loading-desde-flex-con-pimento-y-cinnamon/#toc-conclusiones">Conclusiones</a></li>
</ol>
</div>
<p>El framework Pimento Data Services nos permite realizar el “lazy loading” de una asociación que haya sido configurada como “lazy” en JPA. Para ese tipo de asociación el framework envía al cliente solamente “proxies”, no los datos reales, los datos reales serán cargados en el momento que se invoque el método “initialize” de la clase EntityManager, y no obtendremos una excepción del tipo LazyInitializationException. Veamos cómo funciona a través de un ejemplo.</p>
<h4 id="toc-el-ejemplo">El ejemplo</h4>
<p>Lo primero será descargar el framework de <a href="http://www.spicefactory.org/pimento/download.php">aquí</a>. Luego creamos un proyecto de tipo “Dynamic Web Project” con las siguientes características:</p>
<ul>
<li>Nombre del proyecto: LazyPimentoServer</li>
<li>Target Runtime: En nuestro caso usaremos Apache Tomcat 6, pero puede utilizarse  cualquier otro que se haya configurado.</li>
<li>Versión del módulo Web Dinámico: 2.5</li>
<li>Configuración: Configuración por defecto para Apache Tomcat 6.0</li>
<li>Cambiamos la carpeta donde se compilarán las clases a “LazyPimentoServer/WebContent/WEB-INF/classes”.</li>
</ul>
<p>Una vez creado el proyecto copiamos el contenido de la carpeta “server/web/WEB-INF/lib” de la distribución del framework en “WebContent/WEB-INF/lib” de nuestro proyecto. Sustituimos el archivo de HSQLDB por el controlador JDBC de MySQL, y copiamos de la carpeta “server/release” los archivos “cinnamon-core”, “cinnamon-reflect” y “pimento-core”. Necesitamos copiar también el paquete “javassist”, este lo podemos encontrar en la distribución de Spring con dependencias.</p>
<p>Creamos una carpeta denominada “config” dentro de “WebContent/WEB-INF” de nuestro proyecto y copiamos los archivos “jpa-spring.xml” y “pimento-spring.xml” en “server/web/WEB-INF/config” en la distribución del framework; también copiamos el archivo “dp.properties.template.mysql” de “server/web/WEB-INF/config/db-templates” como “db.properties” en “WebContent/WEB-INF/config” de nuestro proyecto y ajustamos los valores de la conexión a la base de datos. Como estamos en fase de desarrollo ponemos “hibernate.hbm2ddl.auto=update”.</p>
<p>Finalmente el archivo “web.xml” de nuestro proyecto queda así:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=0&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=0&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Seguidamente crearemos las entidades asociadas:</p>
<p>Project</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=1&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=1&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Task<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=2&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=2&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Como vemos son dos entidades JPA con anotaciones de Pimento que indican que serán gestionadas por éste. La entidad “Project” tiene una asociación con la entidad “Task” de tipo OneToMany configurada como “lazy”, lo que implica que cuando se cargue una instancia de “Project” no se cargarán en ese instante las instancias de “Task” asociadas con ésta. En este caso el framework enviará al cliente “proxies” que serán utilizados para cargar los datos reales. Veamos cómo funciona esto desde la UI, pero primero cargaremos algunos datos en la base de datos:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=3&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=3&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Creamos un proyecto Flex con las siguientes características:</p>
<ul>
<li>Nombre del proyecto: LazyPimentoClient</li>
<li>Tipo de aplicación: Web</li>
<li>Seleccionamos el SDK por defecto</li>
<li>Como tecnología del servidor no seleccionamos ninguna</li>
<li>Como carpeta de salida seleccionamos la carpeta WebContent del proyecto LazyPimentoServer que creamos anteriormente.</li>
</ul>
<p>Nuestra interface de usuario sería algo como esto:</p>
<p><a href="http://www.madeinflex.com/wp-content/uploads/2010/11/1.png"><img src="http://www.madeinflex.com/wp-content/uploads/2010/11/1.png" alt="1" title="1" width="281" height="203" class="aligncenter size-full wp-image-1948" /></a></p>
<p>Inicialmente cargaremos una instancia de Project e inspeccionaremos el contenido de su propiedad “tasks”, luego cargaremos las instancias de “Task” asociadas mediante el método “initialize” de la clase EntityManager, las cuales mostraremos en el “DataGrid”.</p>
<p>Para estructurar mejor el proyecto nos auxiliaremos del framework Robotlegs. Lo primero que haremos será incluir en el proyecto las librerías del framework Pimento y Cinnamon. Copiamos en la carpeta “libs” del proyecto los archivos “cinnamon-1.1.0.swc” y “pimento-1.1.0.swc” que se encuentran en la carpeta “client\release” de la distribución, incluimos también “spicelib-core-2.0.1.swc” y “spicelib-reflect-2.0.1.swc” de la carpeta “client\lib” y la librería del framework Robotlegs.</p>
<p>Creamos luego las clases en ActionScript que representan las entidades:</p>
<p>Project<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=4&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=4&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Task<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=5&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=5&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>La configuración del framework en el cliente comienza con la creación de una instancia de la clase “PimentoConfig”, a través de la cual podemos obtener el “EntityManager” que usaremos para invocar las operaciones de persistencia. La clase PimentoConfig necesita conocer el URL de la aplicación JEE que a través de Cinnamon recibirá las solicitudes del cliente para invocar las operaciones de persistencia, específicamente el URL al servlet “service”. En nuestro caso cargaremos esta información de un archivo xml externo. El comando que hace todo esto y además carga la instancia de “Project” que insertamos en la base de datos es el siguiente:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=6&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=6&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Si corremos la aplicación con el “debugger” y nos paramos dentro del método loadResult veremos que el tipo de la propiedad “tasks” de Project no es un “Array” como está definido sino de tipo “ArrayProxy”.</p>
<p><a href="http://www.madeinflex.com/wp-content/uploads/2010/11/2.png"><img src="http://www.madeinflex.com/wp-content/uploads/2010/11/2.png" alt="2" title="2" width="504" height="248" class="aligncenter size-full wp-image-1949" /></a></p>
<p>Una vez cargada la instancia de Project, ante el evento “Click” del botón se ejecuta el comando que carga los datos de la asociación:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=7&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1947&#038;no=7&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>El método que carga los datos de la asociación es “initialize”, de “EntityManager”, se le pasa como argumento la propiedad “tasks” de la instancia de “Project” previamente cargada.</p>
<p>Una vez más, si corremos la aplicación con el “debugger” y nos paramos dentro del método “initializeResult” veremos que el tipo de la propiedad “tasks” ha cambiado de “ArrayProxy” a “Array”, conteniendo las instancias de “Tasks” asociadas.</p>
<p><a href="http://www.madeinflex.com/wp-content/uploads/2010/11/3.png"><img src="http://www.madeinflex.com/wp-content/uploads/2010/11/3.png" alt="3" title="3" width="514" height="123" class="aligncenter size-full wp-image-1950" /></a></p>
<p>El código fuente del la aplicación, cliente y servidor se puede descargar de <a href='http://www.madeinflex.com/wp-content/uploads/2010/11/LazyPimentoCinnamonDemo.zip'>aquí</a>.</p>
<h4 id="toc-conclusiones">Conclusiones</h4>
<p>Hemos visto como Pimento Data Services nos permite hacer “lazy loading” de entidades directamente desde ActionScript de una forma verdaderamente simple. Tan solo debemos poner las anotaciones en la entidad Java y el framework se encarga del resto, es una lástima que Pimento y Cinnamon no soporten ninguna funcionalidad que permita hacer sincronización de datos entre varios clientes. ¿Alguien se anima?</p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2010/12/09/lazy-loading-desde-flex-con-pimento-y-cinnamon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Operaciones CRUD desde Flex con Pimento y Cinnamon</title>
		<link>http://www.madeinflex.com/2010/11/27/operaciones-crud-desde-flex-con-pimento-y-cinnamon/</link>
		<comments>http://www.madeinflex.com/2010/11/27/operaciones-crud-desde-flex-con-pimento-y-cinnamon/#comments</comments>
		<pubDate>Sat, 27 Nov 2010 10:44:08 +0000</pubDate>
		<dc:creator>Nono F. Carballo Escalona</dc:creator>
				<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[Flex Builder]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=1935</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->¿Qué es Pimento Data Services y qué funcionalidades ofrece?
El ejemplo
Conclusiones


¿Qué es Pimento Data Services y qué funcionalidades ofrece?
Cuando utilizamos JPA e Hibernate para ejecutar operaciones CRUD en nuestra aplicación creamos las entidades con sus correspondientes anotaciones, luego creamos una capa DAO en la cual invocamos las operaciones de persistencia y finalmente una capa de servicios [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p><span id="more-1935"></span><br />
<!--noteaser--></p>
<div class="toc">
<ol>
<li><a href="http://www.madeinflex.com/2010/11/27/operaciones-crud-desde-flex-con-pimento-y-cinnamon/#toc-que-es-pimento-data-services-y-que-funcionalidades-ofrece">¿Qué es Pimento Data Services y qué funcionalidades ofrece?</a></li>
<li><a href="http://www.madeinflex.com/2010/11/27/operaciones-crud-desde-flex-con-pimento-y-cinnamon/#toc-el-ejemplo">El ejemplo</a></li>
<li><a href="http://www.madeinflex.com/2010/11/27/operaciones-crud-desde-flex-con-pimento-y-cinnamon/#toc-conclusiones">Conclusiones</a></li>
</ol>
</div>
<h4 id="toc-que-es-pimento-data-services-y-que-funcionalidades-ofrece">¿Qué es Pimento Data Services y qué funcionalidades ofrece?</h4>
<p>Cuando utilizamos JPA e Hibernate para ejecutar operaciones CRUD en nuestra aplicación creamos las entidades con sus correspondientes anotaciones, luego creamos una capa DAO en la cual invocamos las operaciones de persistencia y finalmente una capa de servicios desde la cual invocamos los métodos del DAO y encapsulamos la lógica de negocios. Si ejecutamos todo este código en una aplicación JEE que implemente AMF podremos invocar estos métodos desde Flex utilizando Remote Objects. Pero en caso que decidamos dotar de más inteligencia a la aplicación Flex podemos trasladar la capa de servicios al cliente y en este caso necesitaríamos invocar directamente a la capa DAO o a las operaciones de persistencia.</p>
<p>Pimento Data Services nos permite, desde ActionScript, invocar las operaciones de persistencia definidas por JPA en el servidor, a través de la clase EntityManager, homóloga de la de JPA, pero adaptada a este tipo de cliente. A través de esta clase podemos invocar las operaciones “load”, “persist”, “remove” y “merge”, además de ejecutar consultas utilizando JPAQL y “Named Query”.</p>
<p>El framework almacena en un “cache” en el cliente las entidades cargadas del servidor, asegurando que exista una sola instancia de cada entidad, y este “cache” se utiliza para enviar al servidor solamente las propiedades que cambien cuando se realice una operación “merge” o para restablecer el estado original de la entidad, también ofrece métodos para eliminar objetos del “cache” e inspeccionar si un objeto ya existe en el “cache”.</p>
<p>Pimento ofrece también funcionalidades que permiten realizar “lazy loading” de entidades. Para todas las asociaciones y colecciones marcadas como “lazy” que no han sido inicializadas en el momento de la carga, el servidor envía solamente “proxies” al cliente, y en el momento necesario, utilizando el método “initialize” de la clase EntityManager se cargarán el resto de los datos.</p>
<p>Ante una operación “merge” de una entidad se compara el estado de la misma con la que se encuentra en el “cache” y se envía al servidor solamente aquellas propiedades que hayan cambiado, este proceso ocurre recursivamente cuando las propiedades son colecciones.</p>
<p>El framework también se ocupa de gestionar las llaves primarias de las entidades, al hacer persistente una nueva entidad se devuelve la misma entidad con el valor correspondiente de su llave primaria inyectada.</p>
<p>Si tenemos propiedades en nuestra entidad en el servidor que no deseamos que lleguen al cliente o que no sean modificadas en éste, anotamos las mismas usando anotaciones propias del framework.<br />
En el servidor podemos interceptar todas las operaciones iniciadas en el cliente y controlar el valor de las propiedades de las entidades involucradas en las operaciones.</p>
<p>Pimento Data Services se compone de dos partes, una se incluye en el cliente y otra en el servidor. La parte que se incluye en el servidor utiliza Spring para inyectar dependencias en todas las clases que reciben las entidades enviadas por el cliente. La parte correspondiente en el cliente incluye librerías que se añaden al proyecto.</p>
<p>El framework ofrece dos modelos de programación para trabajar con entidades persistentes: uno utilizando la clase EntityManager de AS3 y otro utilizando servicios personalizados, cada uno tiene sus ventajas y desventajas. El modelo más simple es el que utiliza el EntityManager de AS3, con este modelo creamos las entidades y le incluimos las anotaciones propias de JPA, luego añadimos la anotación “@Managed” a aquellas entidades que queremos que sean gestionadas por Pimento, se crean las clases AS3 equivalentes a las entidades gestionadas, se inicializa el cliente y se invocan las operaciones CRUD, opcionalmente se pueden crear interceptores.</p>
<p>Los servicios personalizados por su parte son equivalente a las capa de servicios que mencionábamos anteriormente, son clases Java gestionadas por Spring y que se exponen al cliente para que sean invocadas remotamente. El framework incluye tareas ant para generar los “proxies” de esas clases en el cliente.</p>
<p>Desde el punto de vista de flexibilidad los servicios personalizados son más convenientes si planeamos que nuestra aplicación tenga múltiples clientes (Web, de escritorio, Web Service, etc.), pero si el único cliente es Flex entonces la solución más simple es usar el EntityManager de AS3, en este caso solamente tenemos que crear en el servidor las entidades con sus anotaciones correspondientes.<br />
El framework se soporta sobre Cinnamon Remoting, una aplicación JEE que implementa el protocolo AMF3, como BlazeDS, pero a diferencia de éste no soporta mensajería, por lo que se hace un poco complejo implementar la sincronización de datos.</p>
<p>En este artículo veremos a través de un ejemplo como ejecutar operaciones CRUD desde Flex con Pimento Data Services utiizando el EntityManager de AS3. En artículos futuros veremos la funcionalidad de “lazy loading” y los servicios personalizados.</p>
<h4 id="toc-el-ejemplo">El ejemplo</h4>
<p>En el ejemplo que desarrollaremos partimos del hecho que queremos gestionar una entidad denominada User y contamos con un servidor de bases de datos MySQL. </p>
<p>Luego de descargar el framework desde <a href="http://www.spicefactory.org/pimento/download.php">aquí</a> lo primero que haremos será crear la aplicación JEE que utilice Cinnamon y donde crearemos las entidades. Para esto creamos un proyecto de tipo “Dynamic Web Project” con las siguientes características:</p>
<ul>
<li>Nombre del proyecto: PimentoServer</li>
<li>Target Runtime: En nuestro caso usaremos Apache Tomcat 6, pero puede utilizarse  cualquier otro que se haya configurado.</li>
<li>Versión del módulo Web Dinámico: 2.5</li>
<li>Configuración: Configuración por defecto para Apache Tomcat 6.0</li>
<li>Cambiamos la carpeta donde se compilarán las clases a “PimentoServer/WebContent/WEB-INF/classes”.</li>
</ul>
<p>Una vez creado el proyecto copiamos el contenido de la carpeta “server/web/WEB-INF/lib” de la distribución del framework en “WebContent/WEB-INF/lib” de nuestro proyecto. Sustituimos el archivo de HSQLDB por el controlador JDBC de MySQL, y copiamos de la carpeta “server/release” los archivos “cinnamon-core”, “cinnamon-reflect” y “pimento-core”. Necesitamos copiar también el paquete “javassist”, este lo podemos encontrar en la distribución de Spring con dependencias.</p>
<p>Creamos una carpeta denominada “config” dentro de “WebContent/WEB-INF” de nuestro proyecto y copiamos los archivos “jpa-spring.xml” y “pimento-spring.xml” en “server/web/WEB-INF/config” en la distribución del framework; también copiamos el archivo “dp.properties.template.mysql” de “server/web/WEB-INF/config/db-templates” como “db.properties” en “WebContent/WEB-INF/config” de nuestro proyecto y ajustamos los valores de la conexión a la base de datos. Como estamos en fase de desarrollo ponemos “hibernate.hbm2ddl.auto=update”.</p>
<p>Finalmente el archivo “web.xml” de nuestro proyecto queda así:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=0&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=0&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>A continuación crearemos la entidad que vamos a gestionar desde el cliente:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=1&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=1&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Aquí la única anotación propia de Pimento es “@Managed”, que indica que la entidad será gestionada por el framework, o sea, será incluida en el “cache” del cliente cuando sea cargada, su llave primaria será inyectada al hacer persistente una instancia de la clase, se enviarán solamente las propiedades que cambien al realizar una operación “merge” y su estado podrá ser gestionado a través del EntityManager.</p>
<p>Desplegamos la aplicación en Tomcat y arrancamos el servicio, pero antes creamos la base de datos según quedó configurada en el archivo “db.properties”. Al iniciar la aplicación se creará la tabla que representa la entidad en la base de datos. Llenamos esta tabla con información inicial para poder efectuar la autenticación en la UI.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=2&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=2&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Esto es todo lo que haremos en el servidor, a continuación crearemos la UI.</p>
<p>Creamos un proyecto Flex con las siguientes características:</p>
<ul>
<li>Nombre del proyecto: PimentoClient</li>
<li>Tipo de aplicación: Web</li>
<li>Seleccionamos el SDK por defecto</li>
<li>Como tecnología del servidor no seleccionamos ninguna</li>
<li>Como carpeta de salida seleccionamos la carpeta WebContent del proyecto PimentoServer que creamos anteriormente.</li>
</ul>
<p>La interface de usuario contiene un ViewStack con dos elementos, en uno pondremos un panel de autenticación:</p>
<p><a href="http://www.madeinflex.com/wp-content/uploads/2010/11/login.jpg"><img src="http://www.madeinflex.com/wp-content/uploads/2010/11/login.jpg" alt="login" title="login" width="175" height="85" class="aligncenter size-full wp-image-1944" /></a></p>
<p>Al introducir un nombre de usuario y contraseña válidos pasaremos al segundo elemento del  View Stack, en el cual se realizará la gestión de la entidad:</p>
<p><a href="http://www.madeinflex.com/wp-content/uploads/2010/11/crud.jpg"><img src="http://www.madeinflex.com/wp-content/uploads/2010/11/crud.jpg" alt="crud" title="crud" width="274" height="211" class="aligncenter size-full wp-image-1945" /></a></p>
<p>Para estructurar mejor el proyecto nos auxiliaremos del framework Robotlegs. Lo primero que haremos será incluir en el proyecto las librerías del framework Pimento y Cinnamon. Copiamos en la carpeta “libs” del proyecto los archivos “cinnamon-1.1.0.swc” y “pimento-1.1.0.swc” que se encuentran en la carpeta “client\release” de la distribución, incluimos también “spicelib-core-2.0.1.swc” y “spicelib-reflect-2.0.1.swc” de la carpeta “client\lib” y la librería del framework Robotlegs.</p>
<p>Luego procedemos a crear el equivalente AS3 de la entidad creada en java:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=3&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=3&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Como podemos ver, no se incluye el metadata “RemoteClass”, que normalmente utilizamos para indicar la clase equivalente a ésta en el servidor, Pimento y Cinnamon se encargan de registrar la clase y realizar todo el proceso de serialización/deserialización entre AS3 y Java de las instancias cuando viajan de cliente a servidor y viceversa.</p>
<p>La configuración del framework en el cliente comienza con la creación de una instancia de la clase “PimentoConfig”, a través de la cual podemos obtener el “EntityManager” que usaremos para invocar las operaciones de persistencia. La clase PimentoConfig necesita conocer el URL de la aplicación JEE que a través de Cinnamon recibirá las solicitudes del cliente para invocar las operaciones de persistencia, específicamente el URL al servlet “service”. En nuestro caso cargaremos esta información de un archivo xml externo. El comando que hace todo esto queda así:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=4&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=4&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>El contenido del archivo “config.xml” que se encuentra en la carpeta “src/config” del proyecto Flex es el siguiente:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=5&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=5&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Cuando el usuario introduzca un nombre de usuario y contraseña válidos se ejecutará el comando que realiza la autenticación, que es éste:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=6&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=6&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Como vemos en el método “execute”, el modo de uso de la clase EntityManager de Pimento es muy similar a su homóloga de JPA, pero con la característica distintiva que las operaciones de persistencia son asincrónicas, de ahí que debamos registrar manejadores para obtener los resultados y los posibles errores.</p>
<p>De forma similar el código para realizar las operaciones CRUD queda así:</p>
<p>Adicionar<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=7&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=7&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Modificar<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=8&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=8&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Eliminar<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=9&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=9&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Listar<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="500" height="200" id="ftf_wp" align="middle">
		  <param name="movie" value="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" />
		  <param name="quality" value="high" />
		  <param name="scale" value="noscale" />
		  <param name="bgcolor" value="#ffffff" />
		  <param name="flashvars" value="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=10&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		  <embed src="http://www.madeinflex.com/./wp-content/plugins/FlashTextFormatter/ftf_wp.swf" quality="high" scale="noscale" bgcolor="#ffffff" width="500" height="200" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=200&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=1935&#038;no=10&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>El código fuente de los proyectos del servidor y el cliente se puede descargar de <a href="http://www.madeinflex.com/wp-content/uploads/2010/11/PimentoCinnamonDemo.zip">aquí</a>.</p>
<h4 id="toc-conclusiones">Conclusiones</h4>
<p>Hemos visto el modelo de programación más simple de Pimento Data Services, este modelo nos permite trasladar al cliente la lógica de la capa de servicios e invocar directamente desde éste las operaciones de persistencia de JPA en el servidor. Hemos dejado fuera las funcionalidades del “lazy loading” y los servicios personalizados, que serán tratados en artículos futuros.</p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2010/11/27/operaciones-crud-desde-flex-con-pimento-y-cinnamon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex Hero: nuevos componentes para Desktop(II): Spark Form y Spark Formatters</title>
		<link>http://www.madeinflex.com/2010/11/26/flex-hero-nuevos-componentes-para-desktopii-spark-form-y-spark-formatters/</link>
		<comments>http://www.madeinflex.com/2010/11/26/flex-hero-nuevos-componentes-para-desktopii-spark-form-y-spark-formatters/#comments</comments>
		<pubDate>Fri, 26 Nov 2010 14:04:46 +0000</pubDate>
		<dc:creator>Sergi Dote Teixidor</dc:creator>
				<category><![CDATA[Flex 4]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=1998</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->En este post veremos dos de los nuevos componentes que nos trae esta release de Hero, Spark Form y Spark Formatters.

El Spark Form
Mantiene la funcionalidad del MX Form y añade mejoras para adaptarse a diseños más modernos, debido a que es totalmente customizable por ser un SkinnableContainer con estados visuals asociados. Su costumización se hace [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>En este post veremos dos de los nuevos componentes que nos trae esta release de Hero, Spark Form y Spark Formatters.<br />
<span id="more-1998"></span></p>
<h2 id="toc-el-spark-form"><strong>El Spark Form</strong></h2>
<p>Mantiene la funcionalidad del MX Form y añade mejoras para adaptarse a diseños más modernos, debido a que es totalmente customizable por ser un SkinnableContainer con estados visuals asociados. Su costumización se hace en la skin del componente.</p>
<p>La mejora más importante de este componente respecto a su predecesor es la madurez de su layout. El Spark Form usa restricciones basadas en un grid para posicionar cada FormItem. Además, el layout nos permite tratar las filas y columnas de forma más dinámica: las columnas y filas pueden incrementar o decrementar su amaño en tiempo de ejecución para adaptarse al contenido de la información y los errores de texto de ayuda o de validación, se pueden mostrar bajo demanda. Spark Form viene con dos layouts: por defecto el horizontal y también el llamado stacked, que distribuye los elementos verticalmente. En las imágenes vemos estos dos tipos de layout:<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2010/11/fig02.jpg"><img src="http://www.madeinflex.com/wp-content/uploads/2010/11/fig02-300x207.jpg" width="300" height="207" class="alignleft size-medium wp-image-1999" /></a><br />
<a href="http://www.madeinflex.com/wp-content/uploads/2010/11/fig03.jpg"><img src="http://www.madeinflex.com/wp-content/uploads/2010/11/fig03.jpg" width="277" height="273" class="alignleft size-full wp-image-2000" /></a></p>
<p><strong>Clases relacionadas con el componente</strong><br />
Tenemos unas clases que se relacionan con el Spark Form y debemos tener en cuenta:</p>
<ul>
<li>Form – el componente SkinnableContainer que define el Form propiamente dicho</li>
<li>FormItem &#8211; SkinnableContainer que define cada uno de los form items del form</li>
<li>FormHeading – Sección de texto que nos denota el inicio de una sección en el formulario</li>
<li>FormLayout &#8211; layout asociado al Form</li>
<li>FormItemLayout – restricción basada en distribución tabular para posicionar cada FormItem</li>
<li>FormSkin – la skin por defecto del Form</li>
<li>FormItemSkin &#8211; la skin por defecto del FormItem  con layout horizontal</li>
<li>StackedFormItemSkin &#8211; la skin por defecto del  FormItem con layout vertical</li>
<li>FormHeadingSkin &#8211; la skin del FormHeading</li>
</ul>
<p><strong>Aspectos importantes de la clase FormItemLayout</strong><br />
FormItemLayout extiende a ConstraintLayout, una clase equivalente a las restricciones del mx Canvas. FormItemLayout usa los métodos internos getMeasuredColumnWidths y setLayoutColumnWidths para alinear las columnas de los FormItem. En este momento ConstraintLayout soporta las siguientes restricciones: left, right, top, bottom y baseline.</p>
<p>El comportamiento general de ConstraintLayout es el de un grid para definir el layout en regiones. Los elementos que constituyen el Layout se pueden alinear con las filas y columnas usando restricciones. También es possible hacer que los elementos del Layout se expandan a través de multiples filas y columnas para dar un major comportamiento y flexibilidad del posicionamiento.</p>
<p><strong>ConstraintColumns y ConstraintRows</strong></p>
<p>Las regiones dentro de un ConstraintLayout se definen con instancias de ConstraintColumn y ConstraintRow definidas dentro de dos propiedades de tipo vector, llamdas constraintColumns y constraintRows respectivamente. Cada ConstraintColumn y ConstraintRow puede tener o no un tamaño definido a nivel de píxel. Una columna de tamaño fijo no cambiará de tamaño aunque su contenido lo haga. Si un componente se expande a través de diferentes columnas, el espacio se distribuirá a través de las columnas. Se prevé que ConstraintColumn y ConstraintRow permitan determinar el tamaño porcentualmente en futuras releases.</p>
<p><strong>Restricciones</strong><br />
Ya hemos comentado las restricciones que se pueden determinar. Cada elemento puede especificar restricciones respecto al contenedor principal, por ejemplo (left=&#8221;5&#8243;) , o respecto a una columna o fila, por ejemplo (left=&#8221;col1:5&#8243;).<br />
Las restricciones left, right, top, and bottom, definen las fronteras del elemento respecto a la región o container. La restricción de baseline define el desplazamiento entre la línea de base definida por la fila que establece la restricción y la posición del elemento.</p>
<p><strong>Estados del elemento FormItem </strong><br />
Los estados que nos define el elemento FormItem son: normal, disabled, required, requiredAndDisabled y requiredAndError.<br />
El estado de error se da cuando el contenido del FormItem tiene valor INVALID (fallo de la validación). El estado required ocurre cuando el FormItem se especifica como requerido.</p>
<p><strong>Error Handling en la validación</strong><br />
Un FormItem está pendiente de los eventos FlexEvent.VALID y FlexEvent.INVALID de los elementos que contiene. La propiedad elementErrorStrings contiene un Vector de errorStrings sobre los elementos del FormItem.</p>
<p>Para ver más:<br />
<a href="http://opensource.adobe.com/wiki/display/flexsdk/Spark+Form">Especificación</a><br />
<a href="http://tv.adobe.com/watch/adc-presents/flex-sdk-hero-spark-form/">Video</a></p>
<h2 id="toc-spark-formatters"><strong>Spark Formatters</strong></h2>
<p>Flash Player 10.1 lleva implícito un Nuevo conjunto de APIs para tratar la globalización de los datos, como el formateo de fechas, horas, números o monedas. Hero, usando estas APIs ha desarrollado los nuevos Spark Formatters. Estos formatean los datos basados en la configuración regional definida por el sistema operativo.<br />
Esta versión de Hero nos proporciona 3 formatters para tartar la información correctamente:  CurrencyFormatter, NumberFormatter y DateTimeFormatter:<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2010/11/fig05.jpg"><img src="http://www.madeinflex.com/wp-content/uploads/2010/11/fig05-300x77.jpg" width="300" height="77" class="alignleft size-medium wp-image-2005" /></a></p>
<p>Otro aspecto importante son las nuevas clases de Sort y SortField añadidas para tratar el comportamiento específico para ordenar los datos según la configuración regional. La nueva clase de Sort aprovecha el tratamiento de la configuración regional específica que trae Flash Player 10.1 para comparar strings, parsear números y monedas para ordenar debidamante.</p>
<p><strong>Conceptos importantes</strong></p>
<p>Para entender bien los nuevos formatters debemos tener en cuenta estos conceptos:</p>
<ul>
<li>flash.globalization:  es el nuevo package añadido a Flash player 10 para acceder a las configuraciones locales que proporciona el SO en el que se está ejecutando el Flash player. Proporciona la siguiente funcionalidad:<br />
- Formateo de fechas, horas, numeros y monedas según la configuración regional.<br />
- Parseo de numeros y monedas según la configuración regional.<br />
- Comparación de strings según la configuración regional.<br />
- Conversion de strings a mayúsculas o minúsculas según la configuración regional.<br />
- Proceso y parseo del Locale ID.</li>
<li>Locale data: los datos necesarios par poder tratar cada tipo de datos según las convenciones culturales de la región.</li>
<li>Locale: se refiere al lenguaje, la escritura, y la región para los cuales el SO tiene un conjunto de reglas para tratar correctamente los datos.</li>
<li>Locale ID: nos permite identificar el locale. Por ejemplo en_US o es_ES.</li>
<li>Collation Order: Los datos se suelen ordenar alfabéticamente. Para ello ActionScript usa una comparación de los códigos Unicode. Otros idiomas utilizan otras maneras de ordenación. De aquí que se necesita otra forma de ordenacion.</li>
</ul>
<p><strong>Comparación entre MX formatters  y Spark formatters</strong><br />
Una diferencia importante es el uso que hacen los Spark formatters del package flash.globalization para mejorar su funcionalidad. Los MX formatters usan el ResourceManager de Flex para acceder a la configuración regional y usar los datos adecuados.<br />
Como consecuencia, los Spark formatters proporcionan un comportamiento adecuado al sistema operativo y tienen acceso a todas la localizaciones que este soporta, aunque este comportamiento puede variar según la plataforma en que se use. Por otro lado, los MX formatters tienen el mismo comportamiento en relación a los SO, pero limitados a los “locales” proporcionados por el developer.<br />
Más información en:</p>
<p><a href="http://opensource.adobe.com/wiki/display/flexsdk/Spark+Formatters">Especificación</a><br />
<a href="http://tv.adobe.com/watch/adc-presents/flex-sdk-hero-spark-form/">Video</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2010/11/26/flex-hero-nuevos-componentes-para-desktopii-spark-form-y-spark-formatters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

