<?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>.:: Seam City ::.</title>
	<atom:link href="http://seamcity.madeinxpain.com/feed" rel="self" type="application/rss+xml" />
	<link>http://seamcity.madeinxpain.com</link>
	<description>Sobre programación en general, y Seam en particular</description>
	<lastBuildDate>Thu, 22 Jan 2009 15:35:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Performance: Porqué usar @Factory en vez de getters</title>
		<link>http://seamcity.madeinxpain.com/archives/performance-%c2%bfpor-que-usar-factory-en-vez-de-getters</link>
		<comments>http://seamcity.madeinxpain.com/archives/performance-%c2%bfpor-que-usar-factory-en-vez-de-getters#comments</comments>
		<pubDate>Thu, 22 Jan 2009 13:59:57 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=59</guid>
		<description><![CDATA[Cuando JSF resuelve una #{EL Expression} no cachea los resultados. Esto quiere decir que por cada expresión como #{user.name}, se hará una llamada al método User.getName(). Esto por sí mismo no es peligroso. Pero analicemos este caso típico @Name&#40;"userManager"&#41; public class UserManager &#123; &#160; &#160; public List getUserList&#40;&#41; &#123; &#160; &#160; &#160; &#160; return createUserList&#40;&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando JSF resuelve una #{EL Expression} no cachea los resultados. Esto quiere decir que por cada expresión como #{user.name}, se hará una llamada al método User.getName().</p>
<p>Esto por sí mismo no es peligroso. Pero analicemos este caso típico</p>
<div class="syntax_hilite">
<div id="java-6">
<div class="java">@<a href="http://www.google.com/search?q=allinurl%3AName+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">Name</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"userManager"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UserManager <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AList+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">List</span></a> getUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> createUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<div class="syntax_hilite">
<div id="xml-7">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;h</span> :dataTable <span style="color: #000066;">value</span>=<span style="color: #ff0000;">"#{userManager.userList}"</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">"user"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; #{user.name}<br />
&nbsp; &nbsp; ...<br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/h<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p></p>
<p>En este caso por cada fila de la tabla, se hará una llamada al método UserManager.getUserList() para obtener el usuario actual. Si el método UserManager.getUserList() implica una llamada a la base de datos, el tiempo de carga crece imcreíblemente.</p>
<p>Una primera solución es usar el patrón de diseño Carga Perezosa (LazyLoad).</p>
<div class="syntax_hilite">
<div id="java-8">
<div class="java">@<a href="http://www.google.com/search?q=allinurl%3AName+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">Name</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"userManager"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UserManager <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?q=allinurl%3AList+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">List</span></a> list;</p>
<p>&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AList+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">List</span></a> getUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">list</span> == <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">list</span> = createUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> list;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
De esta forma la lista no se crea cada vez que se la llama desde la página JSF. Pero aún así se sigue invocando el método getUserList() multitud de veces.</p>
<p>La mejor solución es poner la lista en el contexto de la página, y acceder a ella directamente por su nombre en el contexto en vez de por el componente al que pertenece.<br />
Esto se puede hacer mediante la anotación @Out o la anotación @Factory</p>
<div class="syntax_hilite">
<div id="java-9">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UserManager <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; @Factory<span style="color: #66cc66;">&#40;</span>value = <span style="color: #ff0000;">"userList"</span>, scope = ScopeType.<span style="color: #006600;">PAGE</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AList+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">List</span></a> getUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">list</span> == <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">list</span> = createUserList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> list;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<div class="syntax_hilite">
<div id="xml-10">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;h</span> :dataTable <span style="color: #000066;">value</span>=<span style="color: #ff0000;">"#{userList}"</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">"user"</span><span style="font-weight: bold; color: black;">&gt;</span></span> // invocamos la variable userList directamente<br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; #{user.name}<br />
&nbsp; &nbsp; ...<br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/h<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/performance-%c2%bfpor-que-usar-factory-en-vez-de-getters/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo obtener un componente de seam sin usar la anotacion @In</title>
		<link>http://seamcity.madeinxpain.com/archives/como-obtener-un-componente-de-seam-sin-usar-la-anotacion-in</link>
		<comments>http://seamcity.madeinxpain.com/archives/como-obtener-un-componente-de-seam-sin-usar-la-anotacion-in#comments</comments>
		<pubDate>Thu, 22 Jan 2009 13:16:27 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>
		<category><![CDATA[Add new tag]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=57</guid>
		<description><![CDATA[En seam, la forma más fácil de obtener un componente es usando la inyección de dependencias mediante la anotación @In. Sin embargo, las anotaciones para la bijection solo funcionan si se utilizan desde otro componente de Seam marcado mediante la anotación @Name. Es decir, si en una clase 'normal' (sin la anotación @Name) utilizas un [...]]]></description>
			<content:encoded><![CDATA[<p>En seam, la forma más fácil de obtener un componente es usando la inyección de dependencias mediante la anotación @In. Sin embargo, las anotaciones para la bijection solo funcionan si se utilizan desde otro componente de Seam marcado mediante la anotación @Name.</p>
<p>Es decir, si en una clase 'normal' (sin la anotación @Name) utilizas un @In o un @Out o cualquier otra anotación propia de Seam, esta será ignorada. Aun así,  la API de Seam nos permite obtener instancias de otros componentes directamente, buscándolos a través de su nombre o de su clase.</p>
<div class="syntax_hilite">
<div id="java-12">
<div class="java"><span style="color: #808080; font-style: italic;">// Obtiene una instancia de un componente a través de su clase</span><br />
<a href="http://www.google.com/search?q=allinurl%3AComponent+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">Component</span></a>.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">Class</span> clazz<span style="color: #66cc66;">&#41;</span></p>
<p><span style="color: #808080; font-style: italic;">// Obtiene una instancia de un componente a través de su nombre</span><br />
<a href="http://www.google.com/search?q=allinurl%3AComponent+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">Component</span></a>.<span style="color: #006600;">getInstance</span><span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">String</span></a> name<span style="color: #66cc66;">&#41;</span></div>
</div>
</div>
<p>
El metodo getInstance también admite <a href="http://docs.jboss.org/seam/latest/api/org/jboss/seam/Component.html" onclick="javascript:pageTracker._trackPageview('article_out/docs.jboss.org');" target="_blank">otros parametros</a> para indicar si hay que crear el elemento, su contexto, etc..</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/como-obtener-un-componente-de-seam-sin-usar-la-anotacion-in/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cambiar el usuario y password de subversion en eclipse</title>
		<link>http://seamcity.madeinxpain.com/archives/cambiar-el-usuario-y-password-de-subversion-en-eclipse</link>
		<comments>http://seamcity.madeinxpain.com/archives/cambiar-el-usuario-y-password-de-subversion-en-eclipse#comments</comments>
		<pubDate>Fri, 09 Jan 2009 16:36:58 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=54</guid>
		<description><![CDATA[Si estas usando eclipse con el plugin de subversion subclipse, el usuario y el password con el que te conectas se queda almacenado, y el plugin no te da opciones para cambiarlo. Tampoco sirve de nada eliminar el repositorio (repository location) y volverlo a crear, porque el usuario y password se quedan almacenados en un [...]]]></description>
			<content:encoded><![CDATA[<p>Si estas usando eclipse con el plugin de subversion <strong>subclipse</strong>, el usuario y el password con el que te conectas se queda almacenado, y el plugin no te da opciones para cambiarlo.</p>
<p>Tampoco sirve de nada eliminar el repositorio (repository location) y volverlo a crear, porque el usuario y password se quedan almacenados en un archivo del disco y están asociados a la url del repositorio.</p>
<p>La solución consiste en eliminar/modificar el archivo desde el que el plugin  lee los usuarios. Este archivo es distinto según el cliente del svn interface que estés usando (mirar en Window - Preferences - Team  - SVN : SVN Interface).</p>
<p>Si usas el cliente <strong>JavaHL </strong>el archivo esta en una de las subcarpetas de  ~/.subversion/auth  (probablemente ~/.subversion/auth/svn.simple), y hay un archivo de texto plano para cada repositorio svn.</p>
<p>Si usas el cliente <strong>SVNKit</strong>, eclipse usa el keyring general, que está en $ECLIPSE_HOME/configuration/.keyring. Lo malo que este archivo no está en texto plano y hay que eliminarlo. La próxima vez que te intentes conectar, te pedirá el usuario y el password.</p>
<p>Probablemente tengas que eliminar el repository location desde el plugin (Discard location) y reiniciar el eclipse tras modificar el archivo para que tenga efecto</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/cambiar-el-usuario-y-password-de-subversion-en-eclipse/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eventos en Seam</title>
		<link>http://seamcity.madeinxpain.com/archives/eventos-en-seam</link>
		<comments>http://seamcity.madeinxpain.com/archives/eventos-en-seam#comments</comments>
		<pubDate>Sat, 06 Sep 2008 04:07:32 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>
		<category><![CDATA[aop]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=53</guid>
		<description><![CDATA[Durante su funcionamiento, Seam lanza una serie de eventos predefinidos al realizar ciertas. Estos eventos pueden ser escuchados por nuestra aplicación y actuar en consecuencia. Algunos eventos interesantes son: org.jboss.seam.validationFailed : Se lanza cuando hay un fallo de validación org.jboss.seam.postCreate.&#60;name&#62; : Se lanza cuando el componente con nombre &#60;name&#62; se instancia. Se puede usar de [...]]]></description>
			<content:encoded><![CDATA[<p>Durante su funcionamiento, Seam lanza una serie de eventos predefinidos al realizar ciertas.<br />
Estos eventos pueden ser escuchados por nuestra aplicación y actuar en consecuencia.<br />
Algunos eventos interesantes son:</p>
<ul>
<li><em><strong>org.jboss.seam.validationFailed</strong></em> : Se lanza cuando hay un fallo de validación</li>
<li><em><strong>org.jboss.seam.postCreate.&lt;name&gt;</strong></em> : Se lanza cuando el componente con nombre <em> &lt;name&gt;</em> se instancia. Se puede usar de forma similar a la anotación <em>@Create</em> de los EJBs</li>
<li><em><strong>org.jboss.seam.exceptionNotHandled</strong></em> : Se lanza cuando salta una excepción que no es manejada por Seam.</li>
<li><em><strong>org.jboss.seam.beforePhase y org.jboss.seam.afterPhase</strong></em> : Se lanzan respectivamente antes del inicio y después del final de cada fase JSF. Este evento es lanzado con el parámetro PhaseEvent, que indica la fase que empieza/acaba</li>
</ul>
<p>La lista completa de eventos puede verse en el <a title="Contextual Events" href="http://docs.jboss.com/seam/2.0.1.GA/reference/en/html/events.html#d0e4167" onclick="javascript:pageTracker._trackPageview('article_out/docs.jboss.com');" target="_blank">manual</a></p>
<p>Para escuchar eventos en Seam debemos usar la anotación <em><strong>@Observe</strong></em> para anotar un método que se ejecutará en respuesta al evento. Este método deber ser siempre público y, en el caso de los eventos predefinidos, sin argumentos (con alguna excepcion).<br />
Hay que tener en cuenta que estos métodos se ejecutan en el mismo hilo que la traza principal, de forma que hasta que no terminen de ejecutarse la aplicación no continuará, por lo que hay que tener cuidado.</p>
<div class="syntax_hilite">
<div id="java-18">
<div class="java">@Observe<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"nombre-del-evento"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> metodoEscuchador<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #808080; font-style: italic;">// do domething</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Pero aparte de los eventos predefinidos, también podemos lanzar y escuchar nuestros propios eventos.<br />
Disponemos de varias formas de lanzar nuestros eventos personalizados:</p>
<ul>
<li><strong>Etiqueta <em>@RaiseEvent</em></strong><br />
Al ejecutar un método anotado con la etiqueta @RaiseEvent, se lanzará el evento indicado</p>
<div class="syntax_hilite">
<div id="java-19">
<div class="java">@RaiseEvent<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">String</span></a> confirmarVenta<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; <span style="color: #808080; font-style: italic;">// cuerpo del metodo</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
</li>
<li><strong>Fichero de navegación <em>pages.xml</em></strong><br />
Puedes lanzar un evento mediante la etiqueta &lt;raise-event&gt;</p>
<div class="syntax_hilite">
<div id="xml-20">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;navigation</span> <span style="color: #000066;">from-action</span>=<span style="color: #ff0000;">"#{manager.confirmarVenta}"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;rule</span> <span style="color: #000066;">if-outcome</span>=<span style="color: #ff0000;">"success"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;raise</span> -event <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"venta-confirmada"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;redirect</span> <span style="color: #000066;">view-id</span>=<span style="color: #ff0000;">"home"</span><span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/navigation<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p>
</li>
<li><strong>Mediante el componente <em>Events</em></strong><br />
Este componente permite lanzar eventos <strong>síncronos</strong> o <strong>asíncronos</strong> de manera programática.<br />
Los eventos lanzados de forma asíncrona se ejecutan en un hilo paralelo, por lo que son ideales para tareas pesadas o susceptibles de fallo que no deberían afectar al resto del sistema, como envío de emails, estadísticas...</p>
<p>Las ventajas de usar esta manera de lanzar eventos es que, aparte de poder lanzar eventos asíncronos, se pueden añadir <strong>parámetros</strong> al evento, que serán pasados como argumentos a la función que los observe en el orden en el que se añaden. Por ello, la función observadora debe tener como máximo el mismo número de argumentos de los que se envían al lanzar el evento, y siempre el mismo tipo.<br />
También permite lanzar eventos al cabo de un determinado tiempo o lanzarlos al final de la transacción en curso.</p>
<p>Aquí vemos un ejemplo que ejecuta un método a través de eventos cada vez que se confirma una venta.</p>
<div class="syntax_hilite">
<div id="java-21">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">String</span></a> confirmarVenta<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; Events.<span style="color: #006600;">instance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">raiseEvent</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span>, idVenta<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></p>
<p>@Observe<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> observarVentaConfirmada<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// do domething</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
También podemos optar por lanzar el evento de forma asíncrona y/o añadir más parámetros al evento, los cuales serán ignorado por las funciones observadoras con menor numero de argumentos</p>
<div class="syntax_hilite">
<div id="java-22">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">String</span></a> confirmarVenta<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; Events.<span style="color: #006600;">instance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">raiseEvent</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span>, idVenta, idVendedor<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></p>
<p>@Observe<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> registraVenta<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// solo nos interesa el identificador de venta</span><br />
<span style="color: #66cc66;">&#125;</span></p>
<p>@Observe<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"venta-confirmada"</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">String</span></a> otorgaComisionAlVendedor<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> idVenta, <span style="color: #993333;">int</span> idVendedor<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Obtenemos ambos parámetros</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/eventos-en-seam/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEO-friendly URLs con Seam II</title>
		<link>http://seamcity.madeinxpain.com/archives/seo-friendly-urls-con-seam-ii</link>
		<comments>http://seamcity.madeinxpain.com/archives/seo-friendly-urls-con-seam-ii#comments</comments>
		<pubDate>Fri, 25 Jul 2008 08:55:12 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[seam]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=52</guid>
		<description><![CDATA[Vamos a ampliar la información del post anterior con conceptos más avanzados. Partimos de la base de que tenemos configurado y funcionando el módulo UrlRewrite. El primer problema con el que me topé es que mi aplicación usaba identificadores numéricos, tipo .../product.seam?idProduct=123. Por lo tanto necesitaba traducir el identificador numerico a una palabra descriptiva del [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a ampliar la información del post anterior con conceptos más avanzados.<br />
Partimos de la base de que tenemos configurado y funcionando el módulo UrlRewrite.</p>
<p>El primer problema con el que me topé es que mi aplicación usaba identificadores numéricos, tipo .../product.seam?idProduct=123. Por lo tanto necesitaba traducir el identificador numerico a una palabra descriptiva del producto, como .../product/silla o .../product/mesa.</p>
<p>
Afortunadamente con Seam eso no presenta mucha dificultad y puede emplearse una EL Expression tipo #{rewriter.fromNameToId('silla')}.<br />
Por desgracia, en el archivo urlrewrite.xml no pueden incluirse EL Expressions.
</p>
<p>
Para solucionarlo, creé una 'página virtual' en el pages.xml que recogía los parámetros como String de la url y mediante una llamada a un componente de Seam los traducía en el correspondiente identificador numérico, aprovechando que en el archivo pages.xml sí que se pueden usar EL Expressions.</p>
<ul>
<li>Fichero urlrewrite.xml
<div class="syntax_hilite">
<div id="xml-26">
<div class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;urlrewrite<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;from<span style="font-weight: bold; color: black;">&gt;</span></span></span>^/pruduct/([A-Za-z]*)$<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/from<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;to</span> <span style="color: #000066;">last</span>=<span style="color: #ff0000;">"true"</span><span style="font-weight: bold; color: black;">&gt;</span></span>/virtual_product.seam?name=$1<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/to<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/urlrewrite<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p>
        </li>
<li>Fichero pages.xml
<div class="syntax_hilite">
<div id="xml-27">
<div class="xml">.....<br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;page</span> <span style="color: #000066;">view-id</span>=<span style="color: #ff0000;">"/virtual_product.xhtml"</span> <span style="color: #000066;">action</span>=<span style="color: #ff0000;">"#{product.init}"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"name"</span><span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;navigation<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;redirect</span> <span style="color: #000066;">view-id</span>=<span style="color: #ff0000;">"/product.seam"</span><span style="font-weight: bold; color: black;">&gt;</span></span>&nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"idProduct"</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">"#{urlRewriter.idProductFromName(name)}"</span><span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/redirect<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/navigation<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/page<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
.....</div>
</div>
</div>
<p>
         </li>
<li>Componente rewrite
<div class="syntax_hilite">
<div id="java-28">
<div class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> idProductFromName<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?q=allinurl%3AString+java.sun.com&amp;bntl=1" onclick="javascript:pageTracker._trackPageview('article_out/www.google.com');"><span style="color: #aaaadd; font-weight: bold;">String</span></a> name<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Consulta en la bbdd para halar </span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// el id del producto a partir del nombre</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/seo-friendly-urls-con-seam-ii/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEO-friendly URLs con Seam</title>
		<link>http://seamcity.madeinxpain.com/archives/seo-friendly-urls-con-seam</link>
		<comments>http://seamcity.madeinxpain.com/archives/seo-friendly-urls-con-seam#comments</comments>
		<pubDate>Thu, 17 Jul 2008 06:36:53 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[seam]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=51</guid>
		<description><![CDATA[Hoy en día están muy de moda las aplicaciones web y blogs con URLs amigables, tipo http://seamcity.madeinxpain.com/archives/category/seam. Estas URLs además de ser más intuitivas y agradables a la vista, también son más agradables para buscadores de internet como google (o podríamos decir más agradables para EL BUSCADOR de internet).Esta es una de las técnicas seo [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy en día están muy de moda las aplicaciones web y blogs con URLs amigables, tipo http://seamcity.madeinxpain.com/archives/category/seam.</p>
<p>Estas URLs además de ser más intuitivas y agradables a la vista, también son más agradables para buscadores de internet como google (o podríamos decir más agradables para EL BUSCADOR de internet).Esta es una de las <a href="http://es.wikipedia.org/wiki/Barnizagaitas" onclick="javascript:pageTracker._trackPageview('article_out/es.wikipedia.org');" target="_blank">técnicas seo</a> más simples, destinadas a mejorar tu posicionamiento en buscadores.</p>
<p>En Seam podemos obtener estas URLs sencillas a través del filtro URLrewrite. Este filtro básicamente se encarga de traducir URLs, y es muy muy fácil de usar.<br />
Una de las principales ventajas es que es una capa independiente que se coloca por encima de la aplicación. No es necesario modificar ni una línea de código ya existente, simplemente definir cómo se van a traducir las direcciones.</p>
<ol>
<li>Añadir el archivo <strong>urlrewrite.jar</strong> que viene incluido en la distribución de Seam en la carpeta WEB-INF/lib del proyecto. La mejor forma de hacerlo es mediante el archivo de ant que crea el seam-gen</li>
<li><strong>Configurar el filtro</strong> UrlRewrite en el web.xml tal y como se indica <a href="http://tuckey.org/urlrewrite/" onclick="javascript:pageTracker._trackPageview('article_out/tuckey.org');">aqui</a></li>
<li>Crear el fichero <strong>urlrewrite.xml</strong> que contiene las reglas de traduccion de urls en la carpeta WEB-INF. Aqui pongo el  fichero del ejemplo <em>seambay</em>, pero lo mejor es mirar la <a href="http://tuckey.org/urlrewrite/manual/3.0/" onclick="javascript:pageTracker._trackPageview('article_out/tuckey.org');">documentacion oficial</a>
<div class="syntax_hilite">
<div id="xml-30">
<div class="xml"><span style="color: #00bbdd;">&lt;!DOCTYPE urlrewrite<br />
&nbsp; &nbsp; PUBLIC &quot;-//tuckey.org//DTD UrlRewrite 3.0//EN&quot;<br />
&nbsp; &nbsp; &quot;http://tuckey.org/res/dtds/urlrewrite3.0.dtd&quot;&gt;</span></p>
<p><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;urlrewrite<span style="font-weight: bold; color: black;">&gt;</span></span></span></p>
<p>&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;from<span style="font-weight: bold; color: black;">&gt;</span></span></span>^/feedback/([A-Za-z0-9]*)$<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/from<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;to</span> <span style="color: #000066;">last</span>=<span style="color: #ff0000;">"true"</span><span style="font-weight: bold; color: black;">&gt;</span></span>/feedback.seam?member=$1<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/to<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;from<span style="font-weight: bold; color: black;">&gt;</span></span></span>^/itemdetail/([0-9]*)$<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/from<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;to</span> <span style="color: #000066;">last</span>=<span style="color: #ff0000;">"true"</span><span style="font-weight: bold; color: black;">&gt;</span></span>/auction.seam?id=$1<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/to<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;rule<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;from<span style="font-weight: bold; color: black;">&gt;</span></span></span>^/bidhistory/([0-9]*)$<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/from<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;to</span> <span style="color: #000066;">last</span>=<span style="color: #ff0000;">"true"</span><span style="font-weight: bold; color: black;">&gt;</span></span>/bidhistory.seam?id=$1<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/to<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/rule<span style="font-weight: bold; color: black;">&gt;</span></span></span></p>
<p><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/urlrewrite<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</div>
</div>
<p></li>
</ol>
<p>En otro post esplicaré con más detalle las posibilidades del fichero urlrewrite.xml, cómo usar parámetros, cómo traducir de nombres a identificadores numéricos, y cómo conseguir que las urls amigables las pueda generar nuestra aplicación tras el envío de formularios o acciones.</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/seo-friendly-urls-con-seam/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Marcas de Google Maps con menu contextual</title>
		<link>http://seamcity.madeinxpain.com/archives/marcas-de-google-maps-con-menu-contextual</link>
		<comments>http://seamcity.madeinxpain.com/archives/marcas-de-google-maps-con-menu-contextual#comments</comments>
		<pubDate>Fri, 04 Jul 2008 08:34:49 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[google-maps]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=45</guid>
		<description><![CDATA[En un post anterior hablaba de como añadir un tooltip personalizado a nuestras marcas de google maps, que permitia mostrar cualquier objeto DOM como si fuese un tooltip de la marca. Siguiendo la misma idea, podemos hacer un menu contextual para las marcas, que se active al hacer click sobre ellas, y contenga acciones a [...]]]></description>
			<content:encoded><![CDATA[<p>En un <a href="http://http://seamcity.madeinxpain.com/archives/marcas-de-google-maps-con-tooltip-personalizado" >post anterior</a> hablaba de como añadir un tooltip personalizado a nuestras marcas de google maps, que permitia mostrar cualquier objeto DOM como si fuese un tooltip de la marca.</p>
<p>Siguiendo la misma idea, podemos hacer un menu contextual para las marcas, que se active al hacer click sobre ellas, y contenga acciones a ejecutar sobre la marca en cuestion.</p>
<p>Para ello seguiremos los siguientes pasos:</p>
<ol>
<li>Crear el menu y sus acciones</li>
<li>Asignar el menu a la marca, y una referencia de la marca al menu para poder ejecutar acciones sobre ella</li>
<li>Mostrar el menu con el evento onclick y ocultarlo al seleccionar una opción</li>
</ol>
<p><a href="http://seamcity.madeinxpain.com/examples/gmap/menu.html" >ver ejemplo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/marcas-de-google-maps-con-menu-contextual/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Marcas de Google Maps con tooltip personalizado</title>
		<link>http://seamcity.madeinxpain.com/archives/marcas-de-google-maps-con-tooltip-personalizado</link>
		<comments>http://seamcity.madeinxpain.com/archives/marcas-de-google-maps-con-tooltip-personalizado#comments</comments>
		<pubDate>Tue, 01 Jul 2008 06:12:33 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[google-maps]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=44</guid>
		<description><![CDATA[Al situar el ratón encima de una imagen o cualquier elemento del DOM, éste es capaz de mostrar en un tooltip el texto de su atributo 'title', ejemplo En las marcas de Google Maps este efecto puede conseguirse especificando el atributo 'title' en el constructor de la marca. var coords = new GLatLng&#40;41.647471, -0.885569&#41;; var [...]]]></description>
			<content:encoded><![CDATA[<p>Al situar el ratón encima de una imagen o cualquier elemento del DOM, éste es capaz de mostrar en un tooltip el texto de su atributo 'title',</p>
<div style="display:inline;padding:2px 5px 2px 5px;background-color:#ccaaaa" title="texto de ejemplo">ejemplo</div>
<p>En las marcas de Google Maps este efecto puede conseguirse especificando el atributo 'title' en el constructor de la marca.</p>
<div class="syntax_hilite">
<div id="javascript-32">
<div class="javascript"><span style="color: #003366; font-weight: bold;">var</span> coords = <span style="color: #003366; font-weight: bold;">new</span> GLatLng<span style="color: #66cc66;">&#40;</span><span style="color: #CC0000;">41</span>.<span style="color: #CC0000;">647471</span>, -<span style="color: #CC0000;">0</span>.<span style="color: #CC0000;">885569</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #003366; font-weight: bold;">var</span> mark = <span style="color: #003366; font-weight: bold;">new</span> GMarker<span style="color: #66cc66;">&#40;</span>coords,&nbsp; <span style="color: #66cc66;">&#123;</span>title:<span style="color: #3366CC;">'texto de ejemplo'</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span></div>
</div>
</div>
<p>
<a href="http://seamcity.madeinxpain.com/examples/gmap/basic.html" >ver ejemplo</a></p>
<p>El problema es que esta opción es muy limitada, ya que se restringe al uso de texto plano. Lo ideal sería poder mostrar cualquier elemento del DOM que queramos, con su HTML y su CSS.<br />
Para conseguirlo vamos a seguir estos pasos:</p>
<ol>
<li>Crear el nodo del DOM que queramos mostrar o coger un nodo ya existente y ponerlo como un atributo de la marca</li>
<li>Al escuchar el evento mouseover de la marca, añadir el nodo al div contenedor del mapa en el la posición en la que se encuentra la marca</li>
<li>Al escuchar el evento mouseout de la marca, eliminar el nodo del div contenedor del mapa para ocultarlo.</li>
</ol>
<p><a href="http://seamcity.madeinxpain.com/examples/gmap/tooltip.html" >ver ejemplo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/marcas-de-google-maps-con-tooltip-personalizado/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo limitar el zoom y el desplazamiento en Google Maps</title>
		<link>http://seamcity.madeinxpain.com/archives/como-limitar-el-zoom-y-el-desplazamiento-en-google-maps</link>
		<comments>http://seamcity.madeinxpain.com/archives/como-limitar-el-zoom-y-el-desplazamiento-en-google-maps#comments</comments>
		<pubDate>Fri, 20 Jun 2008 08:43:58 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[google-maps]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=46</guid>
		<description><![CDATA[En ocasiones nos interesa restringir el desplazamiento del usuario sobre el mapa a un área determinada, o limitar los niveles de zoom máximo y mínimo. En el caso del zoom la solución es bastante sencilla. Solo hay que sobreescribir los métodos getMinimumResolution() y getMaximumResolution() de cada uno de los tipos de mapas GMapType presentes en [...]]]></description>
			<content:encoded><![CDATA[<p>En ocasiones nos interesa restringir el desplazamiento del usuario sobre el mapa a un área determinada, o limitar los niveles de zoom máximo y mínimo.</p>
<p>En el caso del zoom la solución es bastante sencilla. Solo hay que sobreescribir los métodos getMinimumResolution() y getMaximumResolution() de cada uno de los tipos de mapas GMapType presentes en nuestro mapa.<br />
Para el caso del desplazamiento, la solución es algo más compleja. Consiste en escuchar el evento <em>move</em>, que es lanzado por el objeto GMap cuando hay un desplazamiento, y comprobar las coordenadas del mapa tras el desplazamiento. Si estas coordenadas quedan fuera del área a la que queremos limitar el desplazamiento, usamos el metodo GMap.setCenter para que el mapa quede dentro de nuesta área.</p>
<p>Esta clase implementa la funcionalidad deseada:</p>
<div class="syntax_hilite">
<div id="javascript-34">
<div class="javascript"><span style="color: #009900; font-style: italic;">/******&nbsp; TRestricter&nbsp; **********************************************/</span></p>
<p><span style="color: #009900; font-style: italic;">// Constructor</span><br />
TRestricter = <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span>map<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">map</span> = map;<br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #009900; font-style: italic;">// Función que activa la limitación del desplazamiento entre la esquina inferior izquierda</span><br />
<span style="color: #009900; font-style: italic;">// y la esquina superior derecha</span><br />
TRestricter.<span style="color: #006600;">prototype</span>.<span style="color: #006600;">restrict</span> = <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span>sw, ne<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">map</span>._allowedBounds = <span style="color: #003366; font-weight: bold;">new</span> GLatLngBounds<span style="color: #66cc66;">&#40;</span>sw, ne<span style="color: #66cc66;">&#41;</span>;<br />
GEvent.<span style="color: #006600;">addListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">map</span>, <span style="color: #3366CC;">'move'</span>, <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">checkBounds</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #009900; font-style: italic;">// Función que desactiva la limitación del desplazamiento</span><br />
TRestricter.<span style="color: #006600;">prototype</span>.<span style="color: #006600;">unrestrict</span> = <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">map</span>._allowedBounds = <span style="color: #003366; font-weight: bold;">null</span>;<br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #009900; font-style: italic;">// Listener encargado de comprobar el desplazamiento</span><br />
TRestricter.<span style="color: #006600;">prototype</span>.<span style="color: #006600;">checkBounds</span> = <span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>!<span style="color: #000066; font-weight: bold;">this</span>._allowedBounds || <span style="color: #000066; font-weight: bold;">this</span>._allowedBounds.<span style="color: #006600;">contains</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">getCenter</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span>;<br />
<span style="color: #003366; font-weight: bold;">var</span> x = Math.<span style="color: #006600;">min</span><span style="color: #66cc66;">&#40;</span>Math.<span style="color: #006600;">max</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">getCenter</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">lng</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #000066; font-weight: bold;">this</span>._allowedBounds.<span style="color: #006600;">getSouthWest</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">lng</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #000066; font-weight: bold;">this</span>._allowedBounds.<span style="color: #006600;">getNorthEast</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">lng</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #003366; font-weight: bold;">var</span> y = Math.<span style="color: #006600;">min</span><span style="color: #66cc66;">&#40;</span>Math.<span style="color: #006600;">max</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">getCenter</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">lat</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #000066; font-weight: bold;">this</span>._allowedBounds.<span style="color: #006600;">getSouthWest</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">lat</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #000066; font-weight: bold;">this</span>._allowedBounds.<span style="color: #006600;">getNorthEast</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">lat</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">setCenter</span><span style="color: #66cc66;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> GLatLng<span style="color: #66cc66;">&#40;</span>y,x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #009900; font-style: italic;">// Establece los límites de zoom del mapa</span><br />
TRestricter.<span style="color: #006600;">prototype</span>.<span style="color: #006600;">zoomLevels</span> = <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span>min, max<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> array = <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">map</span>.<span style="color: #006600;">getMapTypes</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> || <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span>;<br />
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i=<span style="color: #CC0000;">0</span>; i<br />
array<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">getMinimumResolution</span> = <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> min <span style="color: #66cc66;">&#125;</span>;<br />
array<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">getMaximumResolution</span> = <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> max <span style="color: #66cc66;">&#125;</span>;<br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p><a href="http://seamcity.madeinxpain.com/examples/gmap/restrict.html" >Y aquí tenemos un ejemplo de la clase en acción</a></p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/como-limitar-el-zoom-y-el-desplazamiento-en-google-maps/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arrays asociativos en javacript</title>
		<link>http://seamcity.madeinxpain.com/archives/arrays-asociativos-en-javacript</link>
		<comments>http://seamcity.madeinxpain.com/archives/arrays-asociativos-en-javacript#comments</comments>
		<pubDate>Tue, 17 Jun 2008 09:50:14 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/?p=39</guid>
		<description><![CDATA[En javascript se llama array asociativo a aquellos que en vez de estar organizados con indices numericos en funcion de su posicion dentro del array, están organizados por claves no numericas. Este tipo de arrays puede ser muy útil si tenemos listas de objetos que poseen un identificador. &#60;br /&#62; var array_asociativo =&#160; new Array&#40;&#41;;&#60;br [...]]]></description>
			<content:encoded><![CDATA[<p>En javascript se llama array asociativo a aquellos que en vez de estar organizados con indices numericos en funcion de su posicion dentro del array, están organizados por claves no numericas.<br />
Este tipo de arrays puede ser muy útil si tenemos listas de objetos que poseen un identificador.</p>
<div class="syntax_hilite">
<div id="javascript-40">
<div class="javascript">&lt;br /&gt;<br />
<span style="color: #003366; font-weight: bold;">var</span> array_asociativo =&nbsp; <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;&lt;br /&gt;<br />
array_asociativo<span style="color: #66cc66;">&#91;</span><span style="color: #3366CC;">'uno'</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #3366CC;">'brinkindans'</span>;&lt;br /&gt;<br />
array_asociativo<span style="color: #66cc66;">&#91;</span><span style="color: #3366CC;">'dos'</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #3366CC;">'crusaito'</span>;&lt;br /&gt;<br />
array_asociativo<span style="color: #66cc66;">&#91;</span><span style="color: #3366CC;">'tres'</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #3366CC;">'maiquel yason'</span>;&lt;br /&gt;<br />
array_asociativo<span style="color: #66cc66;">&#91;</span><span style="color: #3366CC;">'cuatro'</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #3366CC;">'robocó'</span>;&lt;/p&gt;<br />
&lt;p&gt;alert<span style="color: #66cc66;">&#40;</span>array_asociativo<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'tres'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #009900; font-style: italic;">// --&gt;&nbsp; maiquel yason&lt;br /&gt; </span></div>
</div>
</div>
<p></p>
<p>Como se puede obervar este tipo de arrays se acerca mas al concepto de Map que al de Array.<br />
Esto ocurre porque los arrays en javascript heredan de la clase Object.<br />
El codigo anterior seria equivalente a este:</p>
<div class="syntax_hilite">
<div id="javascript-41">
<div class="javascript">&lt;br /&gt;<br />
<span style="color: #003366; font-weight: bold;">var</span> array_asociativo =&nbsp; <span style="color: #003366; font-weight: bold;">new</span> Object<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;&lt;br /&gt;<br />
array_asociativo.<span style="color: #006600;">uno</span> = <span style="color: #3366CC;">'brinkindans'</span>;&lt;br /&gt;<br />
array_asociativo.<span style="color: #006600;">dos</span> = <span style="color: #3366CC;">'crusaito'</span>;&lt;br /&gt;<br />
array_asociativo.<span style="color: #006600;">tres</span> = <span style="color: #3366CC;">'maiquel yason'</span>;&lt;br /&gt;<br />
array_asociativo.<span style="color: #006600;">cuatro</span> = <span style="color: #3366CC;">'robocó'</span>;&lt;/p&gt;<br />
&lt;p&gt;alert<span style="color: #66cc66;">&#40;</span>array_asociativo<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'tres'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <span style="color: #009900; font-style: italic;">//--&gt;&nbsp; maiquel yason&lt;br /&gt; </span></div>
</div>
</div>
<p></p>
<p>En ambos casos podemos acceder a sus propiedades utilizando la notación de paréntesis o la notacion de puntos.</p>
<div class="syntax_hilite">
<div id="javascript-42">
<div class="javascript">&lt;br /&gt;<br />
<span style="color: #000066;">alert</span><span style="color: #66cc66;">&#40;</span>array_asociativo<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'uno'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #009900; font-style: italic;">//--&gt;&nbsp; brinkindans&lt;br /&gt;</span><br />
<span style="color: #000066;">alert</span><span style="color: #66cc66;">&#40;</span>array_asociativo.<span style="color: #006600;">dos</span><span style="color: #66cc66;">&#41;</span>;&nbsp; <span style="color: #009900; font-style: italic;">//--&gt;&nbsp; crusaito&lt;br /&gt; </span></div>
</div>
</div>
<p></p>
<p>El principal problema con estos arrays viene cuando queremos iterar por ellos. Al no estar organizados por indices, no nos vale el típico "for( i=0; i<array .length; i++)"<br />
Deberemos usar un "for in"</p>
<div class="syntax_hilite">
<div id="javascript-43">
<div class="javascript">&lt;br /&gt;<br />
<span style="color: #000066; font-weight: bold;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #000066; font-weight: bold;">in</span> array_asociativo<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>&lt;br /&gt;<br />
&nbsp; <span style="color: #000066;">alert</span><span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>;&nbsp; <span style="color: #009900; font-style: italic;">// Nombre de la clave&lt;br /&gt;</span><br />
&nbsp; <span style="color: #000066;">alert</span><span style="color: #66cc66;">&#40;</span>array_asociativo<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #009900; font-style: italic;">// valor&lt;br /&gt;</span><br />
<span style="color: #66cc66;">&#125;</span>&lt;br /&gt;</div>
</div>
</div>
<p>Sin embargo al iterar de esta forma no solo se enumeran las propiedades del objeto en cuestión, si no también sus funciones por lo que deberíamos hacer una comprobación de tipos mediante el operando "typeof". Este operando devuelve un String con el tipo del operador sobre el que se ejecuta.<br />
Aqui están los resultado al ejecutar el operador "typeof" sobre cada uno de los tipos de javascript.</p>
<div class="syntax_hilite">
<div id="javascript-44">
<div class="javascript">&lt;br /&gt;<br />
<span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #003366; font-weight: bold;">new</span> Object<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #009900; font-style: italic;">//--&gt;&nbsp; &nbsp;'object'&lt;br /&gt;</span><br />
<span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #009900; font-style: italic;">//--&gt;&nbsp; &nbsp;&nbsp; 'object' , ya que los arrays heredan de los objetos&lt;br /&gt;</span><br />
<span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #000066;">alert</span> <span style="color: #009900; font-style: italic;">//--&gt;&nbsp; &nbsp;'function', ya que alert() es una función&lt;br /&gt;</span><br />
<span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #3366CC;">'cadena'</span> <span style="color: #009900; font-style: italic;">//--&gt;&nbsp; &nbsp;'string', ya que 'cadena' es un String&lt;br /&gt;</span><br />
<span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #CC0000;">21</span> <span style="color: #009900; font-style: italic;">//--&gt;&nbsp; &nbsp;'number', ya que es un numero&lt;br /&gt;</span><br />
<span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #003366; font-weight: bold;">true</span> <span style="color: #009900; font-style: italic;">//--&gt;&nbsp; &nbsp; 'boolean'&lt;br /&gt;</span><br />
<span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #003366; font-weight: bold;">null</span> <span style="color: #009900; font-style: italic;">//--&gt;&nbsp; &nbsp; 'object', null también es considerado como un objeto&lt;br /&gt;</span><br />
<span style="color: #000066; font-weight: bold;">typeof</span> undefined <span style="color: #009900; font-style: italic;">//--&gt;&nbsp; &nbsp; 'undefined'&lt;br /&gt; </span></div>
</div>
</div>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/arrays-asociativos-en-javacript/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

