<?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; Artículos</title>
	<atom:link href="http://www.madeinflex.com/categoria/articulos/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>El Futuro de Adobe Flex</title>
		<link>http://www.madeinflex.com/2011/11/17/el-futuro-de-adobe-flex/</link>
		<comments>http://www.madeinflex.com/2011/11/17/el-futuro-de-adobe-flex/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 10:17:41 +0000</pubDate>
		<dc:creator>Carlos Rovira</dc:creator>
				<category><![CDATA[Artículos]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2356</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->Los últimos días han sido de especial movimiento en lo que respecta a Adobe por su cambio de dirección con respecto a Flash en los navegadores móviles, los despidos masivos y finalmente el futuro de Flex.
Os dejo una reflexión sobre el análisis de todos los cambios que están ocurriendo.]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>Los últimos días han sido de especial movimiento en lo que respecta a Adobe por su cambio de dirección con respecto a Flash en los navegadores móviles, los despidos masivos y finalmente el futuro de Flex.</p>
<p><a href="http://www.carlosrovira.com/blog/2011/11/adobe-y-el-futuro-de-flex/">Os dejo una reflexión sobre el análisis de todos los cambios que están ocurriendo</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2011/11/17/el-futuro-de-adobe-flex/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>Flex Hero Mobile (III): ActionBar y Text Components</title>
		<link>http://www.madeinflex.com/2010/12/30/flex-hero-mobile-iii-actionbar-y-text-components/</link>
		<comments>http://www.madeinflex.com/2010/12/30/flex-hero-mobile-iii-actionbar-y-text-components/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 13:06:28 +0000</pubDate>
		<dc:creator>Sergi Dote Teixidor</dc:creator>
				<category><![CDATA[Artículos]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2110</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->En este post hablaremos de la ActionBar, un componente que ayuda a la navegación de las aplicaciones Mobile hechas con Hero. También trataremos los TextComponents que nos proporciona el framework para tratar elementos de texto.

ActionBar
Descripción detallada
ActionBar es un SkinnableComponent que proporciona navegación, además de permitirmos añadir el título y las acciones relacionadas con el ViewNavigator. [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>En este post hablaremos de la ActionBar, un componente que ayuda a la navegación de las aplicaciones Mobile hechas con Hero. También trataremos los TextComponents que nos proporciona el framework para tratar elementos de texto.<br />
<span id="more-2110"></span></p>
<h2 id="toc-actionbar"><strong>ActionBar</strong></h2>
<h2 id="toc-descripcion-detallada">Descripción detallada</h2>
<p>ActionBar es un SkinnableComponent que proporciona navegación, además de permitirmos añadir el título y las acciones relacionadas con el ViewNavigator. </p>
<p>ActionBar tiene las siguientes propiedades:  </p>
<ul>
<li>ActionBarSkin: la skin po defecto</li>
<li>Opcional: tenemos como opcional el titleDisplay, para mostrar el título, navigationGroup, titleGroup y actionGroup.</li>
</ul>
<p>A continuación vemos las distintas partes de la ActionBar:<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2010/12/ActionBarDiagram.png"><img src="http://www.madeinflex.com/wp-content/uploads/2010/12/ActionBarDiagram-300x156.png" alt="ActionBarDiagram" title="ActionBarDiagram" width="300" height="156" class="aligncenter size-medium wp-image-2111" /></a></p>
<h4 id="toc-title-group">Title Group</h4>
<p>Si el titleContent no es nulo, reemplaza a titleGroup. En caso contrario, ActionBar insertará el titleDisplay, si existe, como titleGroup.</p>
<h4 id="toc-action-group">Action Group</h4>
<p>El actionContent es un proxy para el contenido del actionGroup. A diferencia de titleGroup, no tiene preferencias para el caso de contenido nulo.</p>
<h4 id="toc-navigation-group">Navigation Group</h4>
<p>De la misma manera, navigationContent es un proxy para en contenido de navigationGroup. </p>
<h2 id="toc-interaccion-entre-la-actionbar-las-vistas-y-el-viewnavigator"><strong>Interacción entre la ActionBar, las vistas y el ViewNavigator</strong></h2>
<p>Tanto las vistas como el ViewNavigator definen proxies para las 6 propiedades de la  ActionBar. Cuando el ViewNavigator añade una nueva vista, comprueba los valores para estas propiedades y da el contenido a la ActionBar. Si la vista activa no define estos valores, ActionBar da sus valores para estas propiedades. De esta manera los developers pueden determinar contenido por defecto en la zona del navigationContent, como puede ser el Home Button.</p>
<p>El ViewNavigator controla el contenido de la ActionBar cada vez que un evento de navegación ocurre. ViewNavigator escucha los cambios de las propiedades cuando una vista es activada, con la finalidad de actualizar la ActionBar. Cuando se desactiva la vista, ViewNavigator quita los listeners de la vista y escucha la nueva vista activa.</p>
<p>Debajo vemos diferentes modalidades de la ActionBar.<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2010/12/ActionBarExamples.png"><img src="http://www.madeinflex.com/wp-content/uploads/2010/12/ActionBarExamples-300x300.png" alt="ActionBarExamples" title="ActionBarExamples" width="300" height="300" class="aligncenter size-medium wp-image-2115" /></a></p>
<p>Podeis encontrar más información y ejemplos en este <a href="http://opensource.adobe.com/wiki/display/flexsdk/Mobile+ActionBar">link</a>.</p>
<h2 id="toc-text-components"><strong>Text Components</strong></h2>
<h2 id="toc-descripcion-detallada1">Descripción detallada</h2>
<p>Tienen como objetivos los siguientes: </p>
<ul>
<li>Disponer de los componentes de texto típicos como: Label, TextInput y TextArea</li>
<li>Proporcionar el máximo rendimiento en áreas críticas, como skins o items renderers</li>
<li>Proporcionar una predicción de texto nativa y de edición</li>
</ul>
<h4 id="toc-caracteristicas">Características</h4>
<p>Los componentes de texto para mobile, por motivos de rendimiento, extienden de TextField. Esto hará que la performance sea mejor, aunque si queremos optimizar al máximo en ciertos escenarios, como en la creación de item renderers, podemos mirar la especificación de estos elementos.</p>
<p>Además nos proporcionan: </p>
<ul>
<li>Una nueva primitiva llamada StyleableTextField: extiende de TextField y nos da soporte para estilos. También implementa IDisplayText y IEditableText. No implementa IUIComponent o ILayoutElement, por lo que no puede usarse como child de un container. Está pensada para usarse en skins y en item renderers. </li>
<li>Dos nuevas primitivas, IDisplayText y IEditableText:  definen el contrato entre un text display y un editable text. Las skin parts de Texto en los componentes Spark han sido actualizadas para usar estas interfaces en lugar de TextBase y RichEditableText. </li>
<li>Nuevas skins para los componentes TextInput y  TextArea: estos componentes usan la nueva primitiva StyleableTextField. </li>
</ul>
<h4 id="toc-teclado-y-focus">Teclado y Focus</h4>
<p>Los TextInput y las  TextArea editables han sido pensadas para que pueda introducirse texto, de manera que no se permite que el teclado se superponga encima de ellos. Cuando uno de estos componentes recibe el foco, el típico rectángulo de color los envuelve. </p>
<p>Mas información <a href="http://opensource.adobe.com/wiki/display/flexsdk/Mobile+Text+Components">aquí</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2010/12/30/flex-hero-mobile-iii-actionbar-y-text-components/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flex Hero Mobile (II): ViewNavigator</title>
		<link>http://www.madeinflex.com/2010/12/29/flex-hero-mobile-ii-viewnavigator/</link>
		<comments>http://www.madeinflex.com/2010/12/29/flex-hero-mobile-ii-viewnavigator/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 20:11:18 +0000</pubDate>
		<dc:creator>Sergi Dote Teixidor</dc:creator>
				<category><![CDATA[Artículos]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2092</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->En el segundo post de Hero en cuanto a Mobile veremos el componente ViewNavigator, que actúa como core del modelo de navegación de las aplicaciones mobile hechas con Hero.

Introducción
El concepto View y view navigator son conceptos del nuevo framework Hero que nos permite crear y navegar dinámicamente por el contenido de la aplicación. ViewNavigator es [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>En el segundo post de Hero en cuanto a Mobile veremos el componente ViewNavigator, que actúa como core del modelo de navegación de las aplicaciones mobile hechas con Hero.<br />
<span id="more-2092"></span></p>
<h2 id="toc-introduccion">Introducción</h2>
<p>El concepto View y view navigator son conceptos del nuevo framework Hero que nos permite crear y navegar dinámicamente por el contenido de la aplicación. ViewNavigator es un componente que trata la creación y presentación de las vistas. ViewNavigator usa una pila de vistas, que hace que solo sea visible la que se situa en el top de la pila. El developer puede usar los métodos como pushView y popView para ir a una vista o retornar a una vista previa.</p>
<h2 id="toc-objetivos">Objetivos</h2>
<ul>
<li>Mostrar dinámicamente el contenido de una área específica</li>
<li>Dar la habilidad para navegar por distintas vistas</li>
<li>Proporcionar un sistema de datos para dar la información necesaria a una vista cuando se crea</li>
<li>Soportar diferentes políticas de destrucción</li>
<li>Proporcionar una Infrastructura para rellenar automáticamente la ActionBar con los datos relacionados con la vista activa</li>
</ul>
<h2 id="toc-relacion-con-viewstack">Relación con ViewStack</h2>
<p>ViewNavigator es similar al componente mx:ViewStack: pueden cambiar rápidamente el contenido visual. La mayor diferencia entre ellos es el sistema de navegación: ViewStack solo puede cambiar entre estados predefinidos, mientras que ViewNavigator permite al developer activar dinámicamente un número de vistas y saltar rápidamente entre ellas, según el flujo que defina el usuario. Esto significa que ViewNavigator crea y mantiene un historial de navegación y representa mejor el modelo de navegación. Además ViewNavigator contiene un modelo de datos con la habilidad de persistir los datos y estados entre diferentes sesiones de la aplicación.</p>
<h2 id="toc-relacion-con-los-states">Relación con los States</h2>
<p>ViewNavigator no se puede considerar un reemplazo de los States de Flex. Aún y así, las vistas y los states son similares en tanto que permiten al developer cambiar el contenido bajo demanda, pero hay diferencias: los states son un subsistema que se concentra en el cambio de subpartes de componentes y propiedades en el mismo instante de tiempo, controlados por un solo thread; mientras que las vistas centralizan toda la lógica y el contenido relacionado en un único componente, el cual es reemplazado totalmente al navegar a otra vista. </p>
<h2 id="toc-descripcion-detallada"><strong>Descripción detallada</strong></h2>
<h4 id="toc-estructura-del-componente">Estructura del componente</h4>
<p>A continuación vemos este componente:<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2010/12/viewNavigatorParts.png"><img src="http://www.madeinflex.com/wp-content/uploads/2010/12/viewNavigatorParts-300x256.png" alt="viewNavigatorParts" title="viewNavigatorParts" width="300" height="256" class="aligncenter size-medium wp-image-2099" /></a></p>
<p>La content area es el contenendor principal de la vista actual. Cuando se crea una vista, automáticamente es añadida a este contenedor. La ActionBar nos permite mostrar la información contextual a la vista actual.</p>
<h4 id="toc-control-de-las-vistas">Control de las vistas</h4>
<p>Como hemos dicho, ViewNavigator usa una pila para controlar las vistas, concretamente tiene un vector de objetos llamado navigation stack, donde el primer elemento es el que estará activo y visible. ViewNavigator nos proporciona un sistema de push y pop de vistas. Es importante destacar que no proporciona ningún mecanismo para poder mostrar una vista específica de la navigation stack.</p>
<p><a href="http://www.madeinflex.com/wp-content/uploads/2010/12/singleSectionNavigation.png"><img src="http://www.madeinflex.com/wp-content/uploads/2010/12/singleSectionNavigation-300x180.png" alt="singleSectionNavigation" title="singleSectionNavigation" width="300" height="180" class="aligncenter size-medium wp-image-2101" /></a><br />
 En la imagen anterior vemos como al seleccionar un elemento de la vista de búsqueda, accedemos a la vista de detalle. Esto provoca la destrucción de la vista de búsqueda y la vista de detalle pasa a ser la activa y visible.</p>
<h4 id="toc-vistas">Vistas</h4>
<p>Una vista (View) es la clase base de todas las vistas de la aplicación y es una subclase de Group. Una vista tiene una propiedad data que será usada para representar su contenido y estado. Este objeto es automáticamente serializado, persistido y restaurado por el view navigator cuando una vista se activa o desactiva.</p>
<h4 id="toc-politicas-de-destruccion">Políticas de destrucción</h4>
<p>La implementación incial de ViewNavigator solo permite una vista visible. Cuando una vista pasa a ser activa, los componentes de la anterior se destruyen. De esta manera tenemos una mejor gestión de memoria.<br />
También es cierto que en determinados escenarios es más costoso destruir una vista y volverla a crear cuando sea necesario. Para tratar esto, las vistas tienen una propiedad llamada destructionPolicy que determina que debe pasar cuando la vista es reemplazada en la pila. Por defecto se destruyen, pero podemos determinar que se mantengan en memoria.</p>
<h4 id="toc-modelo-de-datos-de-la-vista">Modelo de datos de la vista</h4>
<p>Las vistas también tiene soporte para la persistencia de datos. Estos datos se guardan en un objeto y se settean a la propiedad data de la vista cuando se hace la llamada de pushView(). Des esta manera se asegura que la vista contenga los datos que necesita. Cuando una nueva vista se pone como activa, los datos de la anterior son guardados.</p>
<h4 id="toc-ciclo-de-vida-de-una-vista">Ciclo de vida de una vista</h4>
<p>ViewNavigator sigue el flujo típico de invalidación de las aplicaciones Flex para hacer la transición entre vistas. Así un developer puede ejecutar operaciones de navegación en un solo frame. Todas las operaciones de navegación pueden ser canceladas. </p>
<p>A continuación el diagrama de acciones y eventos que suceden cuando se solicita una nueva vista:<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2010/12/viewLifeCycle.png"><img src="http://www.madeinflex.com/wp-content/uploads/2010/12/viewLifeCycle-175x300.png" alt="viewLifeCycle" title="viewLifeCycle" width="175" height="300" class="aligncenter size-medium wp-image-2104" /></a></p>
<h4 id="toc-visibilidad-de-la-actionbar">Visibilidad de la ActionBar</h4>
<p>Disponemos de dos layouts para la action bar dentro del navegador. El developer puede cambiar entre ellos usando la propiedad overlayControls de la vista y del ViewNavigator. Con overlayControls a false, la ActionBar usa como layout vertical. SI tiene valor true, el área de vista se expande al width y height del navegador. La ActionBar se pone encima aplicando un alpha determinado.<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2010/12/overlayModes.png"><img src="http://www.madeinflex.com/wp-content/uploads/2010/12/overlayModes-300x159.png" alt="overlayModes" title="overlayModes" width="300" height="159" class="aligncenter size-medium wp-image-2106" /></a></p>
<h4 id="toc-orientacion">Orientación</h4>
<p>ViewNavigator soporta las orientaciones de portrait y landscape. Debemos usar los siguientes skin states del ViewNavigator:</p>
<ul>
<li>portrait: Las vistas se muestran en layout portrait y con la ActionBar con el layout por defecto</li>
<li>landscape: Las vistas se muestran en layout landscape y con la ActionBar con el layout por defecto</li>
<li>portraitAndOverlay:  Las vistas se muestran en layout portrait y con la ActionBar se superpone a la content area</li>
<li>landscapeAndOverlay: Las vistas se muestran en layout landscape y con la ActionBar se superpone a la content area</li>
</ul>
<h4 id="toc-transiciones">Transiciones</h4>
<p>Podemos definir transiciones para pasar de una vista a la siguiente. Podemos pasar un objeto de tipo ViewTransition para determinar que transición queremos aplicar.<br />
ViewNavigator tiene dos skin parts opcionales: defaultPushTransition y defaultPopTransition. </p>
<p>Más información y ejempos <a href="http://opensource.adobe.com/wiki/display/flexsdk/View+and+ViewNavigator">aquí</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2010/12/29/flex-hero-mobile-ii-viewnavigator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flex Hero Mobile (I): MobileApplication</title>
		<link>http://www.madeinflex.com/2010/12/28/flex-hero-mobile-i-mobileapplication/</link>
		<comments>http://www.madeinflex.com/2010/12/28/flex-hero-mobile-i-mobileapplication/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 15:34:00 +0000</pubDate>
		<dc:creator>Sergi Dote Teixidor</dc:creator>
				<category><![CDATA[Artículos]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2069</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->Igual que hicimos comentando las novedades de Hero para desktop, vamos a postear una serie para explicar, a grosso modo, lo que nos ofrecerá Hero para Mobile. En este primer post veremos una visión global centrada en la clase MobileApplication.

MobileApplication
Esta clase permite crear aplicaciones enfocadas a dispositivos móviles. Una aplicación mobile típica se divide en [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>Igual que hicimos comentando las novedades de Hero para desktop, vamos a postear una serie para explicar, a grosso modo, lo que nos ofrecerá Hero para Mobile. En este primer post veremos una visión global centrada en la clase MobileApplication.<br />
<span id="more-2069"></span></p>
<h2 id="toc-mobileapplication"><strong>MobileApplication</strong></h2>
<p>Esta clase permite crear aplicaciones enfocadas a dispositivos móviles. Una aplicación mobile típica se divide en diferentes vistas que se van mostrando u ocultando según el flujo de la aplicación. Este modelo de aplicación se conoce como view-based. Una aplicación mobile saca partido del componente ViewNavigator, que ya veremos, para gestionar estas vistas. </p>
<p>Por otro lado, una aplicación mobile debe estar integrada con los eventos que nos puede lanzar el dispositivo, como la gestión de teclado o el control de la orientación.</p>
<p>A continuación vemos el típico flujo de una aplicación mobile (click para ampliar):<br />
<a href="http://www.madeinflex.com/wp-content/uploads/2010/12/applicationSession.png"><img src="http://www.madeinflex.com/wp-content/uploads/2010/12/applicationSession-300x86.png" alt="applicationSession" title="applicationSession" width="300" height="86" class="aligncenter size-medium wp-image-2079" /></a></p>
<p>La metodología usada para desarrollar aplicaciones mobile es diferente a la que usamos para aplicaciones desktop. Una aplicación mobile se suele usar durante poco tiempo y a menudo interrumpida por otras acciones: mensajes, llamadas u otras aplicaciones. Se espera que al abrir una aplicación mobile, se hayan guardado los datos y estado anteriores, lo que implica que debemos persistirlos cada vez que la usamos. </p>
<p>Para poder conseguir este objetivo, Flex Hero nos proporciona apis de persistencia de datos para guardar los datos de las vistas. Esto permite a los developers guardar de forma rápida y sencilla los diferentes datos y estados entre sesiones. </p>
<p>MobileApplication no está pensada para ser usada para aplicaciones desktop o web, requiere AIR 2.5 SDK y swcs exclusivos de Flex Mobile (mobileComponents y mobileTheme).</p>
<h2 id="toc-objetivos-de-mobileapplication">Objetivos de MobileApplication</h2>
<ul>
<li>Crear una aplicación mobile con una plantilla simple, que exponga los diferentes aspectos de UI comunes en las applicaciones mobile</li>
<li>Automatizar el control de los eventos de orientación que se lanzan en runtime</li>
<li>Automatizar el manejo de eventos de hardware, menu y búsqueda que se pueden dar en runtime</li>
<li>La creación de un manager simple de persistencia que permita guardar los datos y recuperarlos bajo demanda</li>
<li>La implementación de una skin básica para la aplicación</li>
</ul>
<h2 id="toc-descripcion">Descripción</h2>
<h4 id="toc-creacion-de-interficie-de-usuario">Creación de Interficíe de Usuario</h4>
<p>La clase MobileApplication provee una manera fácil y rápida de crear  UI para móviles. Este componente extiende a SkinnableContainer y contiene una estructura muy específica definida con skin parts opcionales. Los componentes estándar de la UI son:</p>
<ul>
<li>ViewNavigator: usado par tratar la navegación a través de las vistas dentro de la aplicación. Se expande por todo el área libre de la pantalla del dispositivo. Nos proporciona acceso a una ActionBar, responsable de mostrar el título y los componentes contextuales de la vista actual.</li>
<li>Menú de la aplicación: Se muestra en respuesta a un click a una acción sobre el menu del dispositivo.</li>
</ul>
<p>Debido a que MobileApplication usa ViewNavigator para navegar a través de sus vistas, no podemos añadir directamente hijos al componente MobileApplication. El developer necesitará usar la propiedad firstView o invocar manualmente la llamada pushView() del navigator para definir que objeto visual se instancia al inicializar la aplicación.</p>
<h4 id="toc-menu-de-aplicacion">Menú de aplicación</h4>
<p>Muchos dispositivos móviles usan un menu de aplicación. Con este menu se muestran las acciones globales o contextuales relacionadas con cada estado de la aplicación.</p>
<h4 id="toc-atajos-de-teclado">Atajos de teclado</h4>
<p>Se suelen usar en muchos dispositivos y también se ha aplicado a dispositivos que soportan Flex Mobile. La clase MobileApplication proporciona automáticamente un botón de retorno (back button) para gestionar la navegación principal de la aplicación. Cuando la tecla de retorno se pulsa, la clase MobileApplication comprueba cuantas vistas están en la pila. En el caso de que se esté gestionando más de una vista, mobile application llama el método popView() sobre el navigator para que muestre la vista anterior. Si no hay ninguna vista empilada o sólo se está gestionando la actual, al pulsar back retornamos a la vista principal de la aplicación.<br />
La clase MobileApplication nos expone apis sencillas para que los developers puedan sobreescribir está funcionalidad si nos interesa otro comportamiento. </p>
<h4 id="toc-soporte-para-la-orientacion">Soporte para la orientación</h4>
<p>Las clases MobileApplication y ViewNavigator tienen comunicación estrecha para controlar la orientación del dispositivo. El developer puede usar la propiedad de la clase MobileApplication llamada landscapeOrientation, que es solo de lectura, y permite determinar la orientación del dispositivo. Cuando cambia la orientación del dispositivo, la clase MobileApplication capturará la orientación del stage y automáticamente actualize esta propiedad. Para cambiar la orientación física del dispositivo debemos usar las apis de la clase Stage.<br />
La clase ViewNavigator soporta los estados de landscape y portrait. </p>
<h4 id="toc-propiedades-de-vista-a-nivel-de-aplicacion">Propiedades de vista a nivel de aplicación</h4>
<p>A continuación mostramos propiedades interesantes de la clase MobileApplication. Estas propiedades se usan como proxy para usarlas sobre la clase ViewNavigator que contiene los mismos valores y definirlos si no han sido setteados en la vista actual.</p>
<ul>
<li>firstView: define la primera vista cuando no se ha definido ninguna sección</li>
<li>firstViewData: el objeto de datos que se debe settear a la primera vista de la aplicación</li>
</ul>
<h4 id="toc-propiedades-de-la-actionbar">Propiedades de la ActionBar</h4>
<ul>
<li>title: el título usado en la action bar</li>
<li>titleContent: los UIComponents que deberían ser visualizados en la ActionBar</li>
<li>titleLayout: el layout por defecto de la zona de titleContent</li>
<li>navigationContent: los UIComponents que se deben mostrar en la zona de navegación de la ActionBar</li>
<li>navigationLayout: el layout de la zona de navegación de la ActionBar</li>
<li>actionContent: los UIComponents a mostrar dentro de la zona de acción de la ActionBar</li>
<li>actionLayout: el layout que se aplica dentro de la zona de acción de la ActionBar</li>
</ul>
<h2 id="toc-persistencia-de-datos-entre-las-sesiones-de-la-aplicacion">Persistencia de datos entre las sesiones de la aplicación</h2>
<p>Flex Mobile framework introduce un nuevo manager que nos permite guarda datos mediante una API muy sencilla. Este manager se llama PersistenceManager e implementa la interface IPersistenceManager. Nos da una lista de apis para que el developer pueda usar para guardar y tratar los datos de la aplicación. </p>
<h4 id="toc-persistencia-automatica-del-estado-de-la-aplicacion">Persistencia automática del estado de la aplicación</h4>
<p>Usando PersistenceManager, la clase MobileApplication automáticamente guarda y restaura la información del estado de la aplicación para que dispongamos de ella cuando la aplicación se suspende y se relanza. MobileApplication tiene la propiedad sessionCachingEnabled que una vez habilitada hace que la aplicación guarde automáticamente su estado. Usa los siguientes parámetros para hacer este guardado:<br />
versión de la aplicación, un timestamp para saber el momento es que se ha guardado y el estado de la navegación. Todo esto se guarda en la pila del navegador principal. </p>
<p>Debemos tener en cuenta que el objeto compartido que PersistenceManager usa para guardar los datos no está ni encriptado ni protegido. Se guarda con un formato fácilmente legible. Esto implica tener cuidado con lo datos que el developer guarda. El developer siempre tiene la posibilidad de implementar su propio manager de persistencia para crear una mejor manera de guardar los datos, si lo cree necesario.</p>
<p><a href="http://opensource.adobe.com/wiki/display/flexsdk/Mobile+Application">Aquí</a> encontrareis más información y ejemplos.</p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2010/12/28/flex-hero-mobile-i-mobileapplication/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Servicios Personalizados de Pimento</title>
		<link>http://www.madeinflex.com/2010/12/22/servicios-personalizados-de-pimento/</link>
		<comments>http://www.madeinflex.com/2010/12/22/servicios-personalizados-de-pimento/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 07:37:32 +0000</pubDate>
		<dc:creator>Nono F. Carballo Escalona</dc:creator>
				<category><![CDATA[Artículos]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=1952</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->En los artículos anteriores dedicados a Pimento Data Service exploramos el uso de la clase EntityManager para invocar operaciones CRUD y la funcionalidad de “lazy loading”. Esta vez vamos a tratar el uso de los servicios personalizados y lo haremos como siempre a través de un ejemplo.



El ejemplo
Conclusiones


Habiamos mencionado en el primer artículo que Pimento [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>En los artículos anteriores dedicados a Pimento Data Service exploramos el uso de la clase EntityManager para invocar operaciones CRUD y la funcionalidad de “lazy loading”. Esta vez vamos a tratar el uso de los servicios personalizados y lo haremos como siempre a través de un ejemplo.<br />
<span id="more-1952"></span></p>
<div class="toc">
<ol>
<li><a href="http://www.madeinflex.com/2010/12/22/servicios-personalizados-de-pimento/#toc-el-ejemplo">El ejemplo</a></li>
<li><a href="http://www.madeinflex.com/2010/12/22/servicios-personalizados-de-pimento/#toc-conclusiones">Conclusiones</a></li>
</ol>
</div>
<p>Habiamos mencionado en el primer artículo que Pimento Data Services ofrece dos modelos de programación, uno basado en la clase EntityManager y el otro basado en los servicios personalizados. Con este último se crean clases de Java que asemejan a la capa de servicios de una arquitectura multicapa, y se exponen como servicios remotos de Cinnamon, el framework que implementa AMF y que soporta tareas “ant” que facilitan la creación de “proxies” en ActionScript de estas clases Java. </p>
<p>El uso de este modelo de programación permite también aprovechar las facilidades de Pimento en cuanto a que entidades que hayan sido cargadas por un servicio personalizado pueden ser gestionadas por el framework, o sea, se cargarán en el “cache” del cliente, se gestionará su llave primaria cuando se haga persistente una nueva instancia, etc. Esto quiere decir que los dos modelos se pueden complementar entre sí para adaptarse a los requerimientos.</p>
<h4 id="toc-el-ejemplo">El ejemplo</h4>
<p>El ejemplo que desarrollaremos será el mismo que en el artículo dedicado al “lazy loading”, pero en este caso, en vez de hacer la carga inicial de la entidad “Project” utilizando la clase EntityManager lo haremos utilizando un servicio personalizado, la asociación “One To Many” la cargaremos a través del método “initialize”, de EntityManager, lo que probará la integración de ambos modelos de programación.</p>
<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: CustomPimentoServer</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 “CustomPimentoServer/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”, “pimento-core” y ”pimento-generator”. Necesitamos copiar también “freemarker” y “paranamer” de la carpeta “server/lib” y el paquete “javassist”, este lo podemos encontrar en la distribución de Spring con dependencias. La carpeta “generatorTemplate” la copiamos en la raíz del proyecto.</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=1952&#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=1952&#038;no=0&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>En este caso el servicio personalizado se define en el archive service-spring.xml, cuyo contenido 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=1952&#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=1952&#038;no=1&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Las entidades con que trabajaremos son:</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=1952&#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=1952&#038;no=2&#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=1952&#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=1952&#038;no=3&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Estas son entidades de JPA con anotaciones del framework que indica que serán gestionadas por éste.</p>
<p>El servicio personalizado se concibe como una clase que implementa una interface donde se definen todas las operaciones. El código es el siguiente:</p>
<p>ProjectService<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=1952&#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=1952&#038;no=4&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Nótese aquí la anotación “@CinnamonService” que indica un servicio a ser invocado remotamente.</p>
<p>ProjectServiceImpl<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=1952&#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=1952&#038;no=5&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Esta es una clase que utiliza JPA del modo tradicional donde de realiza la carga de la entidad Project.  Para poder utilizar esta clase desde Flex a través de Pimento debemos generar el “proxy” para ActionScript, lo cual haremos mediante las tareas “ant” suministradas por el framework para esto:</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=1952&#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=1952&#038;no=6&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Antes de proseguir con el cliente cargaremos algunos datos iniciales 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=1952&#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=1952&#038;no=7&#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: CustomPimentoClient</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 CustomPimentoServer que creamos anteriormente.</li>
</ul>
<p>Nuestra interface de usuario será la misma que en el artículo anterior:</p>
<p><a href="http://www.madeinflex.com/wp-content/uploads/2010/11/11.png"><img src="http://www.madeinflex.com/wp-content/uploads/2010/11/11.png" alt="1" title="1" width="321" height="232" class="aligncenter size-full wp-image-1953" /></a></p>
<p>Inicialmente cargaremos una instancia de Project, pero esta vez utilizando el servicio personalizado, 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=1952&#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=1952&#038;no=8&#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=1952&#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=1952&#038;no=9&#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=1952&#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=1952&#038;no=10&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>Para configurar el servicio personalizado creamos una instancia de ProjectServiceImp y lo registramos en el framework a través del método “addService”. Al final cargamos la entidad basado en su Id.</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=1952&#038;no=11&#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=1952&#038;no=11&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>El código fuente del proyecto se puede descargar desde <a href="http://www.madeinflex.com/wp-content/uploads/2010/11/CustomPimentoServiceDemo.zip">aquí</a>.</p>
<h4 id="toc-conclusiones">Conclusiones</h4>
<p>Hemos visto el modelo de programación de Pimento que permite utilizar servicios personalizados, que no son más que clases de Java expuestas como destinos remotos que toman entidades como parámetros o devuelven entidades como retorno. Estas entidades pueden ser gestionadas por Pimento lo que permite que este modelo coexista con el otro que se basa en la clase EntityManager, dando gran flexibilidad a la aplicación.</p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2010/12/22/servicios-personalizados-de-pimento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex Hero: Size Report, OSMF y RSLs</title>
		<link>http://www.madeinflex.com/2010/12/19/flex-heroiv/</link>
		<comments>http://www.madeinflex.com/2010/12/19/flex-heroiv/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 16:28:26 +0000</pubDate>
		<dc:creator>Sergi Dote Teixidor</dc:creator>
				<category><![CDATA[Artículos]]></category>

		<guid isPermaLink="false">http://www.madeinflex.com/?p=2046</guid>
		<description><![CDATA[<!-- matched  --><!-- final 0 -->Acabaremos esta serie de Hero para desktop con este post, hablando de estos tres aspectos importantes: Size Report, Open Source Media Framework (OSMF) y mejoras en cuanto a las Run Shared Libraries (RSL).


Hero Size Report

El tamaño final de las aplicaciones siempre es un aspecto determinante para cualquier proyecto. En este apartado veremos las mejoras que [...]]]></description>
			<content:encoded><![CDATA[<!-- matched  --><!-- final 0 --><p>Acabaremos esta serie de Hero para desktop con este post, hablando de estos tres aspectos importantes: Size Report, Open Source Media Framework (OSMF) y mejoras en cuanto a las Run Shared Libraries (RSL).<br />
<span id="more-2046"></span></p>
<p><strong><br />
<h2 id="toc-hero-size-report">Hero Size Report</h2>
<p></strong></p>
<p>El tamaño final de las aplicaciones siempre es un aspecto determinante para cualquier proyecto. En este apartado veremos las mejoras que ha realizado Hero en este ámbito.</p>
<p>El compilador de Flex 3.x y 4.0 nos proporciona la opción  -link-report , que genera un report XML, detallando el tamaño aproximado en bytes todas las clases ActionScript incluidas en el SWF final. Nos puede ayudar a ver durante el desarrollo, las areas que contribuyen, en mayor mesura, a tener una película demasiado pesada. </p>
<p>También disponemos de la utilidad swfdump utility, que proporciona un report de alto nivel, pero no lo suficientemente adecuado para ver las áreas problemáticas relacionadas con el tamaño de la película.<br />
Flex 4.5 mejora la opción -size-report para tener un total del peso de cada tipo dentro del SWF (script, media, fonts, etc).</p>
<h4 id="toc-uso">Uso</h4>
<p>Cuando usamos mxmlc o compc -size-report <filename>, se obtiene un reprot XML como podría ser 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="150" 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=150&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2046&#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="150" name="ftf_wp" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="w=500&#038;h=150&#038;file=http://www.madeinflex.com/index.php&#038;ftf=true&#038;postID=2046&#038;no=0&#038;def=http://www.madeinflex.com./wp-content/plugins/FlashTextFormatter/definitions/as2.xml&#038;auto=true&#038;" />
		</object></p>
<p>El tag principal report, contiene un subtag llamado swf que nos da el tamaño en bytes del SWF, tanto comprimido como no comprimido. </p>
<h4 id="toc-otra-informacion">Otra información</h4>
<p>Este report también nos da información importante como puede ser:</p>
<ul>
<li>Sumario por frame:Nos proporciona un sumario de todos los scripts y tags a nivel de frame. </li>
<li>Actionscript: Datos ActionScript asociados con el SWF.</li>
<li>Frame data: Datos adicionales a las definiciones de los frames relacionados al SWF.</li>
<li>Bitmap data: Los bitmap data embebidos en la aplicación.</li>
<li>Fonts: Todas las Fuentes embebidas. </li>
<li>Sprite: Datos a nivel de Sprite.</li>
<li>Datos de los Shapes</li>
<li>Datos binarios: Datos binarios relacionados con el SWF, como pueden ser shaders, Pixel Bender u otros tipos de datos embebidos.</li>
<li>Datos de sonido</li>
<li>Datos de video </li>
</ul>
<p>Más información sobre esta característica <a href="http://opensource.adobe.com/wiki/display/flexsdk/Size+Report">aquí</a>.</p>
<p><strong><br />
<h2 id="toc-integracion-de-osmf-1-0">Integración de OSMF 1.0</h2>
<p></strong></p>
<p>Flex Hero actualiza la version de OSMF a 1.0. Con esta actualización se añado soporte para HTTP Streaming. Podemos usar esta funcionalidad para proporcionar recursos bajo demanda, como streamming dinámico mediante el componente Spark VideoPlayer.</p>
<p>Dos enlaces para más información:<br />
<a href="http://www.adobe.com/products/httpdynamicstreaming/">HTTP Streaming</a><br />
<a href="http://opensource.adobe.com/wiki/display/flexsdk/OSMF+Integration">Información</a></p>
<p><strong><br />
<h2 id="toc-mejoras-de-hero-en-cuanto-a-rsls">Mejoras de Hero en cuanto a RSLs</h2>
<p></strong></p>
<p>Se ha hecho un esfuerzo para poder usar las RSLs de manera mucho más fácil y más efectiva.<br />
El uso de las RSLs en la caché de Flash Player se introdujo en Flex 3. Flex 3 solo tenía 3 RSLs y solo se cargaba por defecto la RSL del framework. La opción RSL linkage estaba desactivada por defecto.<br />
En Flex 4 se hizo el cambio para que se cargaran todas las RSLs y para permitir que pudieran ser debuggadas, aunque no se cambió la manera de cómo se configuraban y cargaban. Se cargaban 6 RSLs para cada aplicación.<br />
Las RSLs se definieron de manera muy simple: especificando el SWC que se quiere como librería externa y luego cargando la RSL desde la URL que contiene todas las clases necesarias para que la aplicación funcione. </p>
<h4 id="toc-historial-de-las-rsls">Historial de las RSLs</h4>
<p>1. El número de RSLs aumentó en el paso de Flex 3 a Flex 4. La carga de todas las RSLs retarda el inicio de la aplicación, ya que las RSLs deben cargarse aunque no se usen en la aplicación. </p>
<p>2. En Flex 4 se espera que las sub-aplicaciones y modules usen las RSLs cargadas por la aplicación primcipal. Pero hay módulos que necesitan custom RSLs. Podemos pensar que la aplicación principal cargará estas custom RSLs, pero no es así. </p>
<p>3. Podemos crear RSLs para sobreescribir clases de las RSLs del SDK, pero el proceso es complicado.</p>
<p>4. Se está creando un set de componentes Spark como análogos de los componentes mx. En muchos casos no hace falta usar componentes mx. Si incluimos la RSL del framework, se cargan todos los components mx y provoca más consumo de memoria. </p>
<p>En relación a todo esto, Hero aplica las siguientes soluciones:</p>
<p>1. El compilador elimina las RSLs que no son usadas por la aplicación, usando una nueva opción de compilación:  “remove-unused-rsls”. </p>
<p>2. Si una sub-aplicación o módulo intenta cargar una RSL que ya ha sido cargada, la ignora. </p>
<p>3. Para poder sobreescribir RSLs, podemos incluir una opción de compilador para que incluya sólo la herencia de dependencias en un SWC que serán usadas por la RSL sobreescrita. </p>
<p>4. Se han movido los componentes mx a una RSL separada para poder descartarla si no la usamos.</p>
<h4 id="toc-rendimiento">Rendimiento</h4>
<p>El rendimiento usando RSLs ha mejorado en Flex 4.5 comparado con Flex 4.0. Las mejoras se deben a no cargar las RSLs que no se necesitan y la reducción de tamaño de la RSL del framework.<br />
Se han hecho tests con una aplicación simple, la típica &#8220;Hello World&#8221; para demostrar las mejoras de rendimiento.<br />
La aplicación ha sido complada en 4.0 y en 4.5 con la opción de compilador &#8220;remove-unused-rsls&#8221;.  El resultado es que se han quitado RSL que no se usan, como osmf o rpc y se ha conseguido reducir el tamaño de la RSL del framework de 608 KB a 310 KB.<br />
Con una velocidad de bajada de 1500 kbps, se optienen estos resultados:<br />
para la versión de SDK 4.5 el tiempo de inicialización es de 9 segundos y la memoria de sistema necesaria es de 14 MB, mientras que para el SDK 4.0 se precisan 15 segundos de inicialización y 17.4 MB de memoria.<br />
Así observamos que hay una reducción considerable en cuanto a tiempo y a memoria. </p>
<p>Más info en estos dos links:<br />
<a href="http://opensource.adobe.com/wiki/display/flexsdk/RSL+Enhancements">RSL enhancements</a><br />
<a href="http://opensource.adobe.com/wiki/display/flexsdk/Linking+RSLs+by+Default">Linking RSLs</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.madeinflex.com/2010/12/19/flex-heroiv/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

