<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns: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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">

<channel>
	<title>pcollaog's blog</title>
	
	<link>http://blog.pcollaog.cl</link>
	<description>Linux, Java, Música y otras hierbas...</description>
	<lastBuildDate>Wed, 11 Jan 2012 20:18:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/pcollaog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="pcollaog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-sa/2.5/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-sa/2.5/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><item>
		<title>Para ti, qué son las vacaciones?</title>
		<link>http://blog.pcollaog.cl/2012/01/11/para-ti-que-son-las-vacaciones/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=para-ti-que-son-las-vacaciones</link>
		<comments>http://blog.pcollaog.cl/2012/01/11/para-ti-que-son-las-vacaciones/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 20:01:16 +0000</pubDate>
		<dc:creator>pcollaog</dc:creator>
				<category><![CDATA[personal]]></category>
		<category><![CDATA[familia]]></category>
		<category><![CDATA[Javiera]]></category>
		<category><![CDATA[Vacaciones]]></category>

		<guid isPermaLink="false">http://blog.pcollaog.cl/?p=750</guid>
		<description><![CDATA[TweetEstas son nuestras primeras vacaciones con mi hija Javiera, hasta el momento de vacaciones tienen bien poco. Nos despertamos temprano, nos acostamos tarde y hay que estar constantemente jugando, mirando, vigilando y enseñando a la @javicollaov. Y esto es todos los días.
Antes&#8230; vacaciones para  [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton750" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2Fy7b8qX&amp;text=RT%20%40pcollaog%20Para%20ti%2C%20qu%C3%A9%20son%20las%20vacaciones%3F&amp;related=&amp;lang=es&amp;count=vertical&amp;counturl=http%3A%2F%2Fblog.pcollaog.cl%2F2012%2F01%2F11%2Fpara-ti-que-son-las-vacaciones%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.pcollaog.cl/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="plus-one-wrap"><g:plusone href="http://blog.pcollaog.cl/2012/01/11/para-ti-que-son-las-vacaciones/"></g:plusone></div><p>Estas son nuestras primeras vacaciones con mi hija <em>Javiera</em>, hasta el momento de vacaciones tienen bien poco. Nos despertamos temprano, nos acostamos tarde y hay que estar constantemente jugando, mirando, vigilando y enseñando a la @javicollaov. Y esto es todos los días.</p>
<p>Antes&#8230; vacaciones para mi era desconectarme del trabajo y comenzar a pensar en mis proyectos personales, como por ejemplo, avanzar en mis códigos, estudiar o simplemente sacar un buen tema en la guitarra (de esos que te dejan pegado por mas de 1 semana). Muchos me decían, esas no son vacaciones (por lo de seguir programando o estudiar) y es que existe un vínculo/paradigma de que vacaciones es necesariamente playa, sol o viajes alrededor del mundo, disculpen pero yo no estoy de acuerdo con eso!</p>
<p>Ahora bien, con familia todo cambia, hay que pensar en que salir de vacaciones fuera de Santiago se deben adaptar para @javicollaov (que tiene 1 año 5 meses), pues bien hay que pensar en sus comidas, en los pañales y se deben cubrir todas sus necesidades a la perfección, de lo contrario podrías pasar unas pésimas vacaciones. Por suerte su mamá la @guzyy, siempre se preocupa de hasta el mas mínimo detalle y hay que decirlo, se preocupa de cosas que yo ni pensaría.</p>
<p>A pesar de todo, no hay nada mas lindo que la sonrisa de mi hija, cuando se come el yogurt a cucharadas, cuando te dice &#8220;papapapaaaaa&#8221; o simplemente cuando le preguntas la hora (si la ven no duden en preguntarle la hora), todo lo cansado, somnoliento o enojado simplemente desaparece.</p>
<div id="attachment_752" class="wp-caption aligncenter" style="width: 510px"><img src="http://blog.pcollaog.cl/wp-content/uploads/2012/01/javi_comiendo_yogurt.jpg" alt="" title="Javiera Comiendo Yogurt" width="500" height="423" class="size-full wp-image-752" /><p class="wp-caption-text">Javiera Comiendo Yogurt</p></div>
<p>Y es que espero que estas vacaciones (aunque no muy descansadas) lo vamos a pasar <del datetime="2012-01-11T19:40:41+00:00">la raja</del>, increíble, de pelos, maravilloso y todo eso porque llevamos a la @javicollaov, esa <em>personita</em> que nos mueve todos los días y nos hace la vida mas feliz.</p>
<p><strong>Y para ti? qué son las vacaciones?</strong></p>
<img src="http://feeds.feedburner.com/~r/pcollaog/~4/Phaukg_76T8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pcollaog.cl/2012/01/11/para-ti-que-son-las-vacaciones/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Todo calza pollo… los 33</title>
		<link>http://blog.pcollaog.cl/2011/09/29/todo-calza-pollo-los-33/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=todo-calza-pollo-los-33</link>
		<comments>http://blog.pcollaog.cl/2011/09/29/todo-calza-pollo-los-33/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 14:20:49 +0000</pubDate>
		<dc:creator>pcollaog</dc:creator>
				<category><![CDATA[personal]]></category>
		<category><![CDATA[cumpleaños]]></category>

		<guid isPermaLink="false">http://blog.pcollaog.cl/?p=721</guid>
		<description><![CDATA[Tweet
Hoy llegue al número que tanto se ha hablado durante mucho rato, el 33. Donde han salido innumerables personajes tratando de hacer que todo sume 33, a eso hay que agregar la coincidencia de los 33 mineros, los 33 caracteres (incluyendo los espacios) del mensaje de los mineros, fueron  [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton721" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FpRvAPr&amp;text=RT%20%40pcollaog%20Todo%20calza%20pollo%26%238230%3B%20los%2033&amp;related=&amp;lang=es&amp;count=vertical&amp;counturl=http%3A%2F%2Fblog.pcollaog.cl%2F2011%2F09%2F29%2Ftodo-calza-pollo-los-33%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.pcollaog.cl/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="plus-one-wrap"><g:plusone href="http://blog.pcollaog.cl/2011/09/29/todo-calza-pollo-los-33/"></g:plusone></div><p><img class="aligncenter size-full wp-image-743" title="32-33" src="http://blog.pcollaog.cl/wp-content/uploads/2011/09/32-33.png" alt="" width="380" height="250" /><br />
Hoy llegue al número que tanto se ha hablado durante mucho rato, el <strong>33</strong>. Donde han salido innumerables personajes tratando de hacer que todo sume 33, a eso hay que agregar la coincidencia de los 33 mineros, los 33 caracteres (incluyendo los espacios) del mensaje de los mineros, fueron encontrados en la semana 33 del año 2010, 33 la edad de Cristo y así un sin fin de otras posibles combinaciones que den 33.</p>
<p><img class="aligncenter size-full wp-image-744" title="Mensaje Mineros" src="http://blog.pcollaog.cl/wp-content/uploads/2011/09/MensajeMineros.jpg" alt="" width="380" height="126" /></p>
<p>&nbsp;</p>
<p>Para mi no es mas que un número que llevare durante todo año y lo mas lindo que lo llevaré junto a mi hermosa familia, con el amor de mi hija @javicollaov y mi @guzyy.</p>
<p><img class="aligncenter size-full wp-image-745" title="Mi Hija asombrada" src="http://blog.pcollaog.cl/wp-content/uploads/2011/09/DSC00455.jpg" alt="" width="530" height="355" /></p>
<p>Muchas gracias a todos y todas por sus saludos y que siga la música</p>
<img src="http://feeds.feedburner.com/~r/pcollaog/~4/UJ5m5PMLRWY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pcollaog.cl/2011/09/29/todo-calza-pollo-los-33/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La simplicidad de Apache Jexl</title>
		<link>http://blog.pcollaog.cl/2011/08/29/la-simplicidad-de-apache-jexl/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=la-simplicidad-de-apache-jexl</link>
		<comments>http://blog.pcollaog.cl/2011/08/29/la-simplicidad-de-apache-jexl/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 17:39:36 +0000</pubDate>
		<dc:creator>pcollaog</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[EL]]></category>
		<category><![CDATA[expresion language]]></category>
		<category><![CDATA[jexl]]></category>

		<guid isPermaLink="false">http://blog.pcollaog.cl/?p=730</guid>
		<description><![CDATA[Tweet
Este artículo puede ser útil para todos aquellos que alguna vez tuvieron que hacer cientos o miles de líneas de código usando reflexión para poder acceder a atributos, navegar mapas y recorrer listas en Java. Ahora bien si le agregamos que esas listas o mapas pueden tener más de lo mismo o  [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton730" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FmUT7H1&amp;text=RT%20%40pcollaog%20La%20simplicidad%20de%20Apache%20Jexl&amp;related=&amp;lang=es&amp;count=vertical&amp;counturl=http%3A%2F%2Fblog.pcollaog.cl%2F2011%2F08%2F29%2Fla-simplicidad-de-apache-jexl%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.pcollaog.cl/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="plus-one-wrap"><g:plusone href="http://blog.pcollaog.cl/2011/08/29/la-simplicidad-de-apache-jexl/"></g:plusone></div><p><img alt="" src="http://commons.apache.org/jexl/images/jexl-logo-white.png" title="Apache Jexl" class="alignright" width="230" height="83" /><br />
Este artículo puede ser útil para todos aquellos que alguna vez tuvieron que hacer cientos o miles de líneas de código usando reflexión para poder acceder a atributos, navegar mapas y recorrer listas en Java. Ahora bien si le agregamos que esas listas o mapas pueden tener más de lo mismo o más complejo aún, objetos que contienen listas o mapas.</p>
<p>Aquí <a href="http://commons.apache.org/jexl/" title="Apache Jexl">Apache Jexl</a> hace bien su trabajo utilizando un lenguaje cómodo para poder acceder a esos recónditos lugares.</p>
<p><a href="http://commons.apache.org/jexl/" title="Apache Jexl">Apache Jexl</a> (Java EXpresion Language) fue inspirado por <a href="http://velocity.apache.org/">Apache Velocity</a> y por la definición de Expresion Language para JSTL y JSP 2.0. Ademas en la versión 2.0 se agregaron funcionalidades de <a href="http://java.sun.com/products/jsp/reference/techart/unifiedEL.html" title="Unified EL">Unified EL</a>.</p>
<p>Un pequeño ejemplo para que lo véan en acción:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestDTO <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">String</span> _name<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">Map</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">String</span>, <span style="color: #003399; font-weight: bold;">Object</span><span style="color: #339933;">&gt;</span> _dataBag<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** Se omiten los setter y getter **/</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Esta es la definición de un DTO que tiene dos atributos, uno de ellos es un <strong>String</strong> y otro un <strong>Map</strong> cuya clave siempre será <strong>String</strong> y su valor puede ser un <strong>Object</strong>.</p>
<p>La problemática es obtener un valor desde ese DTO mediante reflexión, es decir, el ente que ejecuta la extracción del parámetro no conoce la definición <em>a priori</em> de esa clase. Es aquí donde entra Jexl y mediante un simple lenguaje le podemos indicar hasta donde acceder. A ese <em>cómo</em> y <em>qué</em> le llamaremos <strong>Expresión</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> JexlEvaluator <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> JexlEngine jexl = <span style="color: #000000; font-weight: bold;">new</span> JexlEngine<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #009900;">&#123;</span>
		jexl.<span style="color: #006633;">setCache</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">512</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		jexl.<span style="color: #006633;">setLenient</span><span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		jexl.<span style="color: #006633;">setSilent</span><span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399; font-weight: bold;">Object</span> getValue<span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">String</span> expresion, <span style="color: #003399; font-weight: bold;">Object</span> object<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399; font-weight: bold;">Expression</span> e = jexl.<span style="color: #006633;">createExpression</span><span style="color: #009900;">&#40;</span>expresion<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		JexlContext context = <span style="color: #000000; font-weight: bold;">new</span> MapContext<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		context.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;fua&quot;</span>, object<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> e.<span style="color: #006633;">evaluate</span><span style="color: #009900;">&#40;</span>context<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Esta simple clase en su bloque estático configura <a href="http://commons.apache.org/jexl/" title="Apache Jexl">Apache Jexl</a> para luego ser utilizado en el método <strong>getValue</strong>. </p>
<p>El método <strong>getValue</strong> recibe como parámetros, la expresión y el objeto a evaluar. Dentro del método se crea el contexto de <a href="http://commons.apache.org/jexl/" title="Apache Jexl">Apache Jexl</a> (muy similar a un HashMap) al cual se le pasa el Objeto a inspecionar y luego evalúa la expresión.</p>
<p>Aquí les dejo el test unitario y la salida:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> JexlEvaluatorTest <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> Log logger = LogFactory.<span style="color: #006633;">getLog</span><span style="color: #009900;">&#40;</span>JexlEvaluatorTest.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	@Test
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> testJexl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		JexlEvaluator je = <span style="color: #000000; font-weight: bold;">new</span> JexlEvaluator<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">/* Expresión a evaluar */</span>
		<span style="color: #003399; font-weight: bold;">String</span> expresion = <span style="color: #0000ff;">&quot;fua.dataBag.hola2&quot;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399; font-weight: bold;">Map</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">String</span>, <span style="color: #003399; font-weight: bold;">Object</span><span style="color: #339933;">&gt;</span> map = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">HashMap</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">String</span>, <span style="color: #003399; font-weight: bold;">Object</span><span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		map.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;hola&quot;</span>, <span style="color: #0000ff;">&quot;Hola 1 del MAP&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399; font-weight: bold;">Map</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">String</span>, <span style="color: #003399; font-weight: bold;">Object</span><span style="color: #339933;">&gt;</span> map2 = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">HashMap</span><span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">String</span>, <span style="color: #003399; font-weight: bold;">Object</span><span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		map2.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;hola2&quot;</span>, <span style="color: #0000ff;">&quot;Hola 2 del MAP&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		map.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;hola2&quot;</span>, map2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		TestDTO testDTO = <span style="color: #000000; font-weight: bold;">new</span> TestDTO<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		testDTO.<span style="color: #006633;">setDataBag</span><span style="color: #009900;">&#40;</span>map2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		testDTO.<span style="color: #006633;">setName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DTO Interesante&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399; font-weight: bold;">Object</span> result = je.<span style="color: #006633;">getValue</span><span style="color: #009900;">&#40;</span>expresion, testDTO<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		logger.<span style="color: #006633;">info</span><span style="color: #009900;">&#40;</span>result.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>La ejecución de ese test debería retornar lo siguiente:</p>
<pre>
[29/08/11 09:08:16:016 CLT] [ INFO] [JexlEvaluatorTest:44] - Hola 2 del MAP
</pre>
<p>Más adelante espero poder escribir sobre <a href="http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/expressions.html" title="Spring EL">Spring EL</a>, otra solución para evaluación de expresiones para Java.</p>
<img src="http://feeds.feedburner.com/~r/pcollaog/~4/HF6VyU68D7k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pcollaog.cl/2011/08/29/la-simplicidad-de-apache-jexl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Junit, ServletContextAware y MockServletContext</title>
		<link>http://blog.pcollaog.cl/2011/08/26/junit-servletcontextaware-y-mockservletcontext/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=junit-servletcontextaware-y-mockservletcontext</link>
		<comments>http://blog.pcollaog.cl/2011/08/26/junit-servletcontextaware-y-mockservletcontext/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 15:50:04 +0000</pubDate>
		<dc:creator>pcollaog</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[servlet]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[springframework]]></category>

		<guid isPermaLink="false">http://blog.pcollaog.cl/?p=720</guid>
		<description><![CDATA[TweetSe me generó el siguiente problema al hacer un test unitario sobre una clase que implementa la interfaz de Spring Framework ServletContextAware.

public interface ServletContextAware &#123;
&#160;
	void setServletContext&#40;ServletContext servletContext&#41;;
&#160;
&#125;

Mediante esta interfaz puedes inyectar el  [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton720" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2Fpwxia3&amp;text=RT%20%40pcollaog%20Junit%2C%20ServletContextAware%20y%20MockServletContext&amp;related=&amp;lang=es&amp;count=vertical&amp;counturl=http%3A%2F%2Fblog.pcollaog.cl%2F2011%2F08%2F26%2Fjunit-servletcontextaware-y-mockservletcontext%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.pcollaog.cl/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="plus-one-wrap"><g:plusone href="http://blog.pcollaog.cl/2011/08/26/junit-servletcontextaware-y-mockservletcontext/"></g:plusone></div><p>Se me generó el siguiente problema al hacer un test unitario sobre una clase que implementa la interfaz de Spring Framework <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/context/ServletContextAware.html" title="ServletContextAware - Spring Framework API">ServletContextAware</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> ServletContextAware <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold;">void</span> setServletContext<span style="color: #009900;">&#40;</span>ServletContext servletContext<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Mediante esta interfaz puedes inyectar el <strong>servletContext</strong> a la configuración de tu Bean, siempre y cuando tengas un contexto web funcionando.</p>
<p>He aquí el segundo problema, <strong>¿ Cómo puedo tener el un contexto web dentro de un Junit ?</strong>. Puede que exista una mejor forma de hacerlo pero lo logré de la siguiente manera.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://www.springframework.org/schema/beans&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span> </span>
<span style="color: #009900;">	<span style="color: #000066;">xmlns:context</span>=<span style="color: #ff0000;">&quot;http://www.springframework.org/schema/context&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xmlns:p</span>=<span style="color: #ff0000;">&quot;http://www.springframework.org/schema/p&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;http://www.springframework.org/schema/beans </span>
<span style="color: #009900;">	http://www.springframework.org/schema/beans/spring-beans.xsd</span>
<span style="color: #009900;">	http://www.springframework.org/schema/context</span>
<span style="color: #009900;">	http://www.springframework.org/schema/context/spring-context-3.0.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;org.springframework.mock.web.MockServletContext&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/beans<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Con esto y usando la anotación <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html" title="Autowired - Spring Framework">Autowired</a> funciona de pelos la inyección del ServletContext.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ReadFileFromWebinf <span style="color: #009900;">&#123;</span>
&nbsp;
	@Autowired
	<span style="color: #000000; font-weight: bold;">private</span> ServletContext _servletContext<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">/*Se omite el resto de los métodos*/</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Pero!!! cuando quise utilizar la interfaz <strong>ServletContextAware</strong> no funcionó y me quede con una propiedad en <strong>null</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ReadFileFromWebinf implement ServletContextAware <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> ServletContext _servletContext<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setServletContext<span style="color: #009900;">&#40;</span>ServletContext servletContext<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		_servletContext=servletContext<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">/*Se omite el resto de los métodos*/</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Buscando por todos lados encontré que a mi test unitario le faltaba un par de configuraciones para la lectura del contexto Spring.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@RunWith<span style="color: #009900;">&#40;</span>SpringJUnit4ClassRunner.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span>
@ContextConfiguration<span style="color: #009900;">&#40;</span>locations = <span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">&quot;/test/test-context.xml&quot;</span> <span style="color: #009900;">&#125;</span>
@TestExecutionListeners<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> DependencyInjectionTestExecutionListener.<span style="color: #000000; font-weight: bold;">class</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ReadFileFromWebinfTest <span style="color: #009900;">&#123;</span>
&nbsp;
	@Autowired
	<span style="color: #000000; font-weight: bold;">private</span> ReadFileFromWebinf _readFileFromWebinf<span style="color: #339933;">;</span>
&nbsp;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> testReadFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #003399; font-weight: bold;">String</span> fileContent = _readFileFromWebinf.<span style="color: #006633;">load</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;archivo.xml&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>fileContent<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Las dos primeras anotaciones son para decirle a <strong>Spring</strong> que se va a utilizar <strong>Junit</strong> para ejecutar la clase y cual o cuales son los contextos a cargar.</p>
<p>Luego viene la anotación que me arregló el día, <strong>TestExecutionListeners</strong> y el <em>listener</em> asociado para la completar las inyecciones de dependencia de todos los <em>beans</em>. (Antes con <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html" title="Autowired - Spring Framework">Autowired</a> solo hacía algunos).</p>
<p>Espero les sirva, cualquier duda bienvenida sea.</p>
<img src="http://feeds.feedburner.com/~r/pcollaog/~4/XZ6ZNwMGzyw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pcollaog.cl/2011/08/26/junit-servletcontextaware-y-mockservletcontext/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring Framework – InitializingBean</title>
		<link>http://blog.pcollaog.cl/2011/08/21/spring-framework-initializingbean/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=spring-framework-initializingbean</link>
		<comments>http://blog.pcollaog.cl/2011/08/21/spring-framework-initializingbean/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 00:55:23 +0000</pubDate>
		<dc:creator>pcollaog</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[springframework]]></category>

		<guid isPermaLink="false">http://blog.pcollaog.cl/?p=697</guid>
		<description><![CDATA[Tweet
InitializingBean
Esta interfaz de Spring Framework te permite una vez configurado el contexto, ejecutar el método  afterPropertiesSet(), y como su nombre lo dice, lo ejecuta luego de ejecutar los métodos setter del bean (post configurar el bean).

public interface InitializingBean &#123;
&#160;
	void  [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton697" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FpcA6sr&amp;text=RT%20%40pcollaog%20Spring%20Framework%20%26%238211%3B%20InitializingBean&amp;related=&amp;lang=es&amp;count=vertical&amp;counturl=http%3A%2F%2Fblog.pcollaog.cl%2F2011%2F08%2F21%2Fspring-framework-initializingbean%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.pcollaog.cl/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="plus-one-wrap"><g:plusone href="http://blog.pcollaog.cl/2011/08/21/spring-framework-initializingbean/"></g:plusone></div><p><img src="http://blog.pcollaog.cl/wp-content/uploads/2011/08/logo-e1313974441614.jpg" alt="Spring Framework - Logo" title="Spring Framework - Logo" width="150" height="100" class="alignright size-full wp-image-715" /></p>
<h2>InitializingBean</h2>
<p>Esta interfaz de <a href="http://www.springsource.org" title="SpringFramework">Spring Framework</a> te permite una vez configurado el contexto, ejecutar el método  <strong>afterPropertiesSet()</strong>, y como su nombre lo dice, lo ejecuta luego de ejecutar los métodos <em>setter</em> del bean (post configurar el bean).</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> InitializingBean <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold;">void</span> afterPropertiesSet<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399; font-weight: bold;">Exception</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Algunas aplicaciones de esta interfaz:</strong></p>
<ul>
<li>Validar que los atributos de un Bean estén correctamente inicializados.</li>
<li>A partir de los atributos ya setteados, generar otra propiedad en tiempo de configuración. Por ejemplo, se configura el bean con dos atributos de tipo <strong>int</strong> y en tiempo de configuración quiero calcular la suma de ambos y dejarlo en otra propiedad. ¿ Qué gano con esto ? que esa propiedad no se calcula cada vez que hago el <em>getter</em> sino que ya esta previamente calculada.</li>
</ul>
<p>Para el primer caso, recomiendo utilizar la clase <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/Assert.html" title="SpringFramework - Assert API">Assert</a> ya que provee métodos con los que puedes invalidar que el contexto <strong>Spring</strong> levante si hay errores en la configuración.</p>
<p>Les dejo un código de ejemplo para que le echen un vistazo (le agregué la interfaz al ejemplo del <a href="http://blog.pcollaog.cl/2011/08/17/%c2%bfpor-que-factorybean-es-util/" title="FactoryBean">post anterior</a>)</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ExampleBean <span style="color: #000000; font-weight: bold;">implements</span> InitializingBean <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">Integer</span> _randomValue<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">Integer</span> _newValue<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399; font-weight: bold;">Integer</span> getRandomValue<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> _randomValue<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399; font-weight: bold;">Integer</span> getNewValue<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> _newValue<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #006600; font-weight: bold;">void</span> setRandomValue<span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Integer</span> randomValue<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		_randomValue = randomValue<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> afterPropertiesSet<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399; font-weight: bold;">Exception</span> <span style="color: #009900;">&#123;</span>
		Assert.<span style="color: #006633;">notNull</span><span style="color: #009900;">&#40;</span>_randomValue, <span style="color: #0000ff;">&quot;randomValue properties cannot be null&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		_newValue = _randomValue <span style="color: #339933;">*</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Voy a explicar un poco y a groso modo el como funciona esta clase desde el punto de vista de Spring:</p>
<ul>
<li>Se lee la configuración asociada a la clase <strong>ExampleBean</strong></li>
<li>Se crea la instancia de la clase <strong>ExampleBean</strong></li>
<li>Luego vía inyección se le <em>settean</em> los atributos, entre ellos <strong>randomValue</strong></li>
<li>Luego de la creación del bean <strong>ExampleBean</strong> se ejecuta el método <strong>afterPropertiesSet()</strong>, en donde se realiza una validación del randomValue (este NO puede ser nulo, de serlo, el contexto de <strong>Spring</strong> no quedara operativo), si eso pasa OK, se calculará el atributo <strong>newValue</strong> y que será <strong>randomValue</strong> multipliado por <strong>10</strong>.</li>
<li>Finalmente y si no hay errores en el contexto de <strong>Spring</strong>, se deja la instancia del bean  <strong>ExampleBean</strong> en el contexto, es decir, el valor <strong>randomValue</strong> y <strong>newValue</strong> quedan listos para ser usados.</li>
</ul>
<p>Este proceso se realiza sólo una vez (salvo que el <em>scope</em> no sea <em>singleton</em>) y es en el momento de la creación del contexto.</p>
<p>Demás esta decir que esta clase/bean (ExampleBean) debe estar configurada en el archivo del contexto de Spring o vía las anotaciones (metadata) provistas para eso.</p>
<img src="http://feeds.feedburner.com/~r/pcollaog/~4/T1yhc4w75Mc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pcollaog.cl/2011/08/21/spring-framework-initializingbean/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nieve en Santiago</title>
		<link>http://blog.pcollaog.cl/2011/08/18/nieve-en-santiago/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nieve-en-santiago</link>
		<comments>http://blog.pcollaog.cl/2011/08/18/nieve-en-santiago/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 16:38:07 +0000</pubDate>
		<dc:creator>pcollaog</dc:creator>
				<category><![CDATA[personal]]></category>
		<category><![CDATA[nieve]]></category>
		<category><![CDATA[Santiago]]></category>

		<guid isPermaLink="false">http://blog.pcollaog.cl/2011/08/18/nieve-en-santiago/</guid>
		<description><![CDATA[Tweet&#160;
&#160;

]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton589" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FoeEICP&amp;text=RT%20%40pcollaog%20Nieve%20en%20Santiago&amp;related=&amp;lang=es&amp;count=vertical&amp;counturl=http%3A%2F%2Fblog.pcollaog.cl%2F2011%2F08%2F18%2Fnieve-en-santiago%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.pcollaog.cl/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="plus-one-wrap"><g:plusone href="http://blog.pcollaog.cl/2011/08/18/nieve-en-santiago/"></g:plusone></div><div class="wp-caption aligncenter" style="width: 510px"><a href="http://blog.pcollaog.cl/wp-content/uploads/2011/08/wpid-IMG_20110818_122837.jpg"><img style="display: block;" title="Las Condes" src="http://blog.pcollaog.cl/wp-content/uploads/2011/08/wpid-IMG_20110818_122837.jpg" alt="Las Condes" width="500" height="375" /></a><p class="wp-caption-text">Las Condes</p></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://blog.pcollaog.cl/wp-content/uploads/2011/08/wpid-IMG_20110818_125029.jpg"><img title="Los creativos" src="http://blog.pcollaog.cl/wp-content/uploads/2011/08/wpid-IMG_20110818_125029.jpg" alt="Los creativos" width="500" height="667" /></a><p class="wp-caption-text">Los creativos</p></div>
<p style="text-align: center;">
<img src="http://feeds.feedburner.com/~r/pcollaog/~4/J9OphYJsWUk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pcollaog.cl/2011/08/18/nieve-en-santiago/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Por que FactoryBean es útil?</title>
		<link>http://blog.pcollaog.cl/2011/08/17/%c2%bfpor-que-factorybean-es-util/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25c2%25bfpor-que-factorybean-es-util</link>
		<comments>http://blog.pcollaog.cl/2011/08/17/%c2%bfpor-que-factorybean-es-util/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 21:55:31 +0000</pubDate>
		<dc:creator>pcollaog</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Bean]]></category>
		<category><![CDATA[Factory]]></category>
		<category><![CDATA[FactoryBean]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[springframework]]></category>

		<guid isPermaLink="false">http://blog.pcollaog.cl/?p=581</guid>
		<description><![CDATA[TweetEn este post voy a tratar de explicar porque FactoryBean&#60;T&#62; es increíblemente útil para alambrar (aplicar DI) aplicaciones hechas con Spring Framework.
La interfaz de FactoryBean dice lo siguiente:

public interface FactoryBean&#60;T&#62; &#123;
&#160;
	T getObject&#40;&#41; throws Exception;
&#160;
	Class&#60;?&#62;  [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton581" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FnR5BLu&amp;text=RT%20%40pcollaog%20%C2%BFPor%20que%20FactoryBean%3CT%3E%20es%20%C3%BAtil%3F&amp;related=&amp;lang=es&amp;count=vertical&amp;counturl=http%3A%2F%2Fblog.pcollaog.cl%2F2011%2F08%2F17%2F%25c2%25bfpor-que-factorybean-es-util%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.pcollaog.cl/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="plus-one-wrap"><g:plusone href="http://blog.pcollaog.cl/2011/08/17/%c2%bfpor-que-factorybean-es-util/"></g:plusone></div><p>En este post voy a tratar de explicar porque FactoryBean&lt;T&gt; es increíblemente útil para alambrar (aplicar <a title="Inyección de Dependencia" href="http://en.wikipedia.org/wiki/Dependency_injection">DI</a>) aplicaciones hechas con <a title="SpringFramework" href="http://www.springsource.org/">Spring Framework</a>.</p>
<p>La interfaz de FactoryBean dice lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> FactoryBean<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	T getObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399; font-weight: bold;">Exception</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003399; font-weight: bold;">Class</span><span style="color: #339933;">&lt;?&gt;</span> getObjectType<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold;">boolean</span> isSingleton<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>La utilidad de la implementación de esta interfaz y su posterior declaración como Bean dentro del contexto de la aplicación, es que puede ser usada (como su nombre lo indica) como Factory para inyectar algún valor en alguna propiedad de otro Bean.</p>
<p>¿Dónde y cómo funciona? Dentro del ciclo de vida de la carga del Contexto de spring, la ejecución de la implementación de esta interfaz, esta justo antes de hacer los <em>setters</em> de las propiedades de un Bean. El funcionamiento es simple, siempre se ejecutará el método <strong>getObject()</strong> que retornará la instancia del tipo T.</p>
<p>Veamos una implementación simple y una configuración de contexto de spring:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> RandomNumberFactoryBean <span style="color: #000000; font-weight: bold;">implements</span> FactoryBean<span style="color: #339933;">&lt;</span><span style="color: #003399; font-weight: bold;">Integer</span><span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399; font-weight: bold;">Integer</span> getObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399; font-weight: bold;">Exception</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #003399; font-weight: bold;">Integer</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">Random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399; font-weight: bold;">Class</span><span style="color: #339933;">&lt;?&gt;</span> getObjectType<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #003399; font-weight: bold;">Integer</span>.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">boolean</span> isSingleton<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #006600; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Esta simple implementación de FactoryBean<T> retorna un <em>Integer</em> en el método <strong>getObject()</strong>, simplemente eso (obviamente en este método debes poner todo tu talento para resolver el valor que andas buscando, esto es un ejemplo simple).</p>
<p>El método <strong>getObjectType()</strong> es usado internamente por el framework para validar que el retorno de <strong>getObject()</strong> sea correcto o que este dentro de la jerarquía de clases, esto es en caso de que quieras restringir por tipo.</p>
<p>El último método <strong>isSingleton()</strong> es si quieres que esta clase (no importa la cantidad de declaraciones que tengas, siempre será la misma), es un tanto dificil de entender pero les sugiero que lean sobre el concepto de <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-scopes-singleton" title="SpringFramework Singleton Scope">Singleton que tiene SpringFramework</a>. En el ejemplo de configuración espero que les quede claro, de lo contrario, bienvenidas las preguntas.</p>
<p>Esta es la definición del Bean de ejemplo, en donde se hará uso del FactoryBean:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ExampleBean <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">Integer</span> _randomValue<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399; font-weight: bold;">Integer</span> getRandomValue<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> _randomValue<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #006600; font-weight: bold;">void</span> setRandomValue<span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Integer</span> randomValue<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		_randomValue = randomValue<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Aquí las configuraciones de contexto de spring.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://www.springframework.org/schema/beans&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;http://www.springframework.org/schema/beans </span>
<span style="color: #009900;">	http://www.springframework.org/schema/beans/spring-beans.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
&nbsp;
	<span style="color: #808080; font-style: italic;">&lt;!-- Ejemplo 1 --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;exampleBean1&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;cl.pcollaog.factory.ExampleBean&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;randomValue&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;cl.pcollaog.factory.RandomNumberFactoryBean&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #808080; font-style: italic;">&lt;!-- Ejemplo 2 --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;randomNumberFactoryBean&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;cl.pcollaog.factory.RandomNumberFactoryBean&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;exampleBean21&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;cl.pcollaog.factory.ExampleBean&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;randomValue&quot;</span> <span style="color: #000066;">ref</span>=<span style="color: #ff0000;">&quot;randomNumberFactoryBean&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;exampleBean22&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;cl.pcollaog.factory.ExampleBean&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;randomValue&quot;</span> <span style="color: #000066;">ref</span>=<span style="color: #ff0000;">&quot;randomNumberFactoryBean&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/beans<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><strong>Ejemplo 1:</strong></p>
<p>Se declara el Bean <strong>exampleBean1</strong> y que tiene como propiedad el atributo <strong>randomValue</strong> y cuyo valor será producto de la ejecución del Bean <strong>RandomNumberFactoryBean</strong> en el momento que el contexto de Spring es cargado. En este caso se utiliza la técnica de <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-inner-beans" title="Inner Beans">InnerBean</a>, es decir, no se tiene una instancia del Bean para ser reutilizada sino que esta en la misma declaración del <em>setter</em> del atributo.</p>
<p><strong>Ejemplo 2:</strong><br />
Este ejemplo hace lo mismo indicado arriba, sólo que no se aplica InnerBean sino que se extrae y es reutilizado en el bean <strong>exampleBean21</strong> y <strong>exampleBean22</strong>. En este ejemplo entra en juego el método <strong>isSingleton()</strong>, si es true, quiere decir que el valor que entregará el FactoryBean siempre será el mismo para ambos Beans. Ahora bien, si se cambia a false, por cada <em>setter</em>, es decir, para <strong>exampleBean21</strong> y <strong>exampleBean22</strong> se realizara la ejecución de <strong>RandomNumberFactoryBean</strong> 2 veces. (En este caso, nos entregará dos valores aleatorios para cada bean)</p>
<p>En pocas palabras para cada Bean del ejemplo 2 habrá dos instancias de <strong>RandomNumberFactoryBean</strong> que entregará cada una un <strong>Integer</strong> para los atributos de los beans declarados.</p>
<p>Algo interesante de las implementaciones de <strong>FactoryBean<T></strong> es que luego de la carga del contexto, estas instancias son desechadas.</p>
<p>Espero les sea útil y cualquier pregunta sera bienvenida.</p>
<img src="http://feeds.feedburner.com/~r/pcollaog/~4/i0MRwil3xq8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pcollaog.cl/2011/08/17/%c2%bfpor-que-factorybean-es-util/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java7: null-safe y null-default</title>
		<link>http://blog.pcollaog.cl/2011/01/20/java7-null-safe-y-null-default/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=java7-null-safe-y-null-default</link>
		<comments>http://blog.pcollaog.cl/2011/01/20/java7-null-safe-y-null-default/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 21:46:38 +0000</pubDate>
		<dc:creator>pcollaog</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java7]]></category>

		<guid isPermaLink="false">http://blog.pcollaog.cl/?p=572</guid>
		<description><![CDATA[TweetSeguramente les ha pasado y mucho que tienen que llenarse de validaciones contra NullPointerException cuando los métodos retornan null, hay una propuesta para poder manejar este tipo de problemas. Veamos uno ejemplos:
Null-Default
Hoy en dia:

String maybeNull = metodoNull&#40;&#41;;
&#160;
if &#40;null ==  [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton572" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FgIHoPI&amp;text=RT%20%40pcollaog%20Java7%3A%20null-safe%20y%20null-default&amp;related=&amp;lang=es&amp;count=vertical&amp;counturl=http%3A%2F%2Fblog.pcollaog.cl%2F2011%2F01%2F20%2Fjava7-null-safe-y-null-default%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.pcollaog.cl/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="plus-one-wrap"><g:plusone href="http://blog.pcollaog.cl/2011/01/20/java7-null-safe-y-null-default/"></g:plusone></div><p>Seguramente les ha pasado y mucho que tienen que llenarse de validaciones contra <strong>NullPointerException</strong> cuando los métodos retornan <strong>null</strong>, hay una propuesta para poder manejar este tipo de problemas. Veamos uno ejemplos:</p>
<h3>Null-Default</h3>
<p>Hoy en dia:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #003399; font-weight: bold;">String</span> maybeNull = metodoNull<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">null</span> == maybeNull<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    maybeNull=<span style="color: #0000ff;">&quot;Ahora no es null&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Otra Opcion</span>
&nbsp;
<span style="color: #003399; font-weight: bold;">String</span> nullVar = metodoNull<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
nullVar = <span style="color: #009900;">&#40;</span>nullVar <span style="color: #339933;">!</span>= <span style="color: #006600; font-weight: bold;">null</span> <span style="color: #339933;">?</span> nullVar : <span style="color: #0000ff;">&quot;Ahora no es null&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ahora la propuesta es la siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #003399; font-weight: bold;">String</span> maybeNull = metodoMaybeNull<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
maybeNull =  maybeNull <span style="color: #339933;">?</span>: <span style="color: #0000ff;">&quot;Ahora no es null&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Como verán nos ahorramos unas cuantas líneas de código. Ahora veamos el otro esquema</p>
<h3>Null-safe</h3>
<p>Hoy en dia:</p>
<pre>  String result = null;
  Foo foo = getFooMayBeNull();
  if (foo != null) {
    Bar bar = foo.getBarMayBeNull();
    if (bar != null) {
      result = bar.getResult();
    }
  }</pre>
<p>Con la propuesta de <strong>null-safe</strong> quedaría así:</p>
<pre>String result = getFooMayBeNull()?.getBarMayBeNull()?.getResult();</pre>
<p>Esto hasta el dia de hoy seguía en propuesta y por lo que veo en las <a href="http://openjdk.java.net/projects/jdk7/features/">Características de Java7</a> no viene, así que a esperar. (Estoy bajando el jdk7 para probar, luego updates)</p>
<p>Estas modificaciones al lenguaje (sintaxis) vienen de los operadores que tiene <a href="http://groovy.codehaus.org/Operators">Goovy</a>.</p>
<p>Más información sobre esta propuesta de mejora al lenguaje en:</p>
<ul>
<li><a href="https://docs.google.com/View?docid=dfn5297z_3c73gwb">Propuesta en google docs</a></li>
<li><a href="http://www.jroller.com/scolebourne/entry/java_7_null_default_and">Blog de Stephen Colebourne</a></li>
<li><a href="http://codervirtue.blogspot.com/2009/03/null-safe-invocation-in-java-7.html">Blog de Jacek</a></li>
<li><a href="http://groovy.codehaus.org/Operators">Operadores de Groovy</a></li>
<li><a href="http://fantom.org/doc/docLang/Expressions.html#nullConvenience">Operadores de Fantom</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/pcollaog/~4/ahEYfV1oLZo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pcollaog.cl/2011/01/20/java7-null-safe-y-null-default/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Algunas API’s Java que te pueden servir: commons-io</title>
		<link>http://blog.pcollaog.cl/2011/01/06/algunas-apis-que-te-pueden-servir/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=algunas-apis-que-te-pueden-servir</link>
		<comments>http://blog.pcollaog.cl/2011/01/06/algunas-apis-que-te-pueden-servir/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 03:17:54 +0000</pubDate>
		<dc:creator>pcollaog</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[IO]]></category>
		<category><![CDATA[Reader]]></category>
		<category><![CDATA[Stream]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.pcollaog.cl/?p=483</guid>
		<description><![CDATA[Tweetcommons-io trae un montón de clases que te pueden servir al momento de utilizar lecturas y escrituras de archivos, entre otras cosillas.
Por si no lo sabías una de las malas practicas mas recurrentes programando con java es, no cerrar los Stream y ciertos Readers adecuadamente, o te complicas  [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton483" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2Ff8k7kQ&amp;text=RT%20%40pcollaog%20Algunas%20API%26%238217%3Bs%20Java%20que%20te%20pueden%20servir%3A%20commons-io&amp;related=&amp;lang=es&amp;count=vertical&amp;counturl=http%3A%2F%2Fblog.pcollaog.cl%2F2011%2F01%2F06%2Falgunas-apis-que-te-pueden-servir%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.pcollaog.cl/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="plus-one-wrap"><g:plusone href="http://blog.pcollaog.cl/2011/01/06/algunas-apis-que-te-pueden-servir/"></g:plusone></div><p><a href="http://commons.apache.org/io/">commons-io</a> trae un montón de clases que te pueden servir al momento de utilizar lecturas y escrituras de archivos, entre otras cosillas.</p>
<p>Por si no lo sabías una de las malas practicas mas recurrentes programando con java es, no cerrar los <strong>Stream</strong> y ciertos <strong>Readers</strong> adecuadamente, o te complicas mucho con los <strong>try/catch</strong>, vamos a ver un par de ejemplos clásicos:</p>
<p>Primero agregamos la dependencia de maven, ojo que las versiones 2.x están escritas para Java 1.5 y las 1.x para java 1.3 y 1.4:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dependency<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>commons-io<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>commons-io<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2.0.1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dependency<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><strong>Caso 1:</strong> <strong>finally</strong> que asegura cerrar el <strong>Reader</strong> con el método <em>close()</em></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> closeWithFinally<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> filename<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003399;">BufferedReader</span> reader <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileReader</span><span style="color: #009900;">&#40;</span>filename<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
		StringBuilder sb <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> StringBuilder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> line <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>line <span style="color: #339933;">=</span> reader.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			sb.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>line<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #003399;">String</span> contentFile <span style="color: #339933;">=</span> sb.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>contentFile<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Cerrar el reader</span>
		reader.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><strong>Caso 2:</strong> Creando la instancia de <strong>BufferedReader</strong> dentro del <strong>try</strong> y validando si es <strong>null</strong> al momento de cerrar:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> closeWithFinallyNullCheck<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> filename<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003399;">BufferedReader</span> reader <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
		reader <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileReader</span><span style="color: #009900;">&#40;</span>filename<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> line <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		StringBuilder sb <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> StringBuilder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>line <span style="color: #339933;">=</span> reader.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			sb.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>line<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #003399;">String</span> contentFile <span style="color: #339933;">=</span> sb.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>contentFile<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Cerrar el reader</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">!=</span> reader<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			reader.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><strong>Caso 3:</strong> Usando <em>commons-io</em> y la clase <strong>IOUtils</strong> se reduce bastante el código y quedaría algo así:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> closeWithFinallyCommonsIO<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> filename<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003399;">BufferedReader</span> reader <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileReader</span><span style="color: #009900;">&#40;</span>filename<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">String</span> contentFile <span style="color: #339933;">=</span> IOUtils.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span>reader<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>contentFile<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #009900;">&#123;</span>
		IOUtils.<span style="color: #006633;">closeQuietly</span><span style="color: #009900;">&#40;</span>reader<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Mas información en el maven site del proyecto:</p>
<ul>
<li><a href="http://commons.apache.org/io/">Apache Commons-io</a></li>
<li><a href="http://commons.apache.org/io/api-release/org/apache/commons/io/IOUtils.html">JavaDoc de IOUtils</a></li>
</ul>
<p>Mas adelante escribiré un par de ejemplos con otras clases de commons-io que son bastante útiles.</p>
<img src="http://feeds.feedburner.com/~r/pcollaog/~4/4A74A1GEt0E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pcollaog.cl/2011/01/06/algunas-apis-que-te-pueden-servir/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cómo iterar un Map con Java 1.5</title>
		<link>http://blog.pcollaog.cl/2011/01/04/como-iterar-un-map-con-java-1-5/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=como-iterar-un-map-con-java-1-5</link>
		<comments>http://blog.pcollaog.cl/2011/01/04/como-iterar-un-map-con-java-1-5/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 21:53:10 +0000</pubDate>
		<dc:creator>pcollaog</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Entry]]></category>
		<category><![CDATA[EntrySet]]></category>
		<category><![CDATA[Java 5.0]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://blog.pcollaog.cl/?p=473</guid>
		<description><![CDATA[TweetA pedido del Sr: @perrefe les dejo un tip de performance para iterar sobre Map&#60;K,V&#62;:
Supongamos que nuestro Map tiene como key un String y como value un Integer, declarado de esta forma:

1
Map&#60;String,Integer&#62; map = new HashMap&#60;String,Integer&#62;&#40;&#41;;

Ahora podemos iterar el Map de la siguiente  [...]]]></description>
			<content:encoded><![CDATA[<div id="tweetbutton473" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2Feit0fy&amp;text=RT%20%40pcollaog%20C%C3%B3mo%20iterar%20un%20Map%20con%20Java%201.5&amp;related=&amp;lang=es&amp;count=vertical&amp;counturl=http%3A%2F%2Fblog.pcollaog.cl%2F2011%2F01%2F04%2Fcomo-iterar-un-map-con-java-1-5%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.pcollaog.cl/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="plus-one-wrap"><g:plusone href="http://blog.pcollaog.cl/2011/01/04/como-iterar-un-map-con-java-1-5/"></g:plusone></div><p>A pedido del Sr: <a title="@perrefe" href="http://twitter.com/perrefe">@perrefe</a> les dejo un <strong>tip</strong> de <strong>performance</strong> para iterar sobre <strong>Map&lt;K,V&gt;</strong>:</p>
<p>Supongamos que nuestro Map<K,V> tiene como <em>key</em> un <strong>String</strong> y como <em>value</em> un <strong>Integer</strong>, declarado de esta forma:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">Map<span style="color: #339933;">&lt;</span>String,Integer<span style="color: #339933;">&gt;</span> map <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HashMap<span style="color: #339933;">&lt;</span>String,Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Ahora podemos iterar el Map de la siguiente forma:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>Entry<span style="color: #339933;">&lt;</span>String, Integer<span style="color: #339933;">&gt;</span> entry <span style="color: #339933;">:</span> map.<span style="color: #006633;">entrySet</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Key [&quot;</span> <span style="color: #339933;">+</span> entry.<span style="color: #006633;">getKey</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Value [&quot;</span> <span style="color: #339933;">+</span> entry.<span style="color: #006633;">getValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Si ve por ahí algún iterador sobre un Map<K,V> al cual le sacan primero la lista de <em>keys</em> y después iteran el Map para sacar el <em>value</em>, no pierda tiempo escribiendo código de más y haciendo que su aplicación ande mas lenta.</p>
<p><strong>Por favor no haga esto!!!</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">Set<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> keys <span style="color: #339933;">=</span> map.<span style="color: #006633;">keySet</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> key <span style="color: #339933;">:</span> keys<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003399;">Integer</span> value <span style="color: #339933;">=</span> map.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Key [&quot;</span> <span style="color: #339933;">+</span> key <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Value [&quot;</span> <span style="color: #339933;">+</span> value <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Espero les sirva.</p>
<img src="http://feeds.feedburner.com/~r/pcollaog/~4/i2XGTLdySOE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.pcollaog.cl/2011/01/04/como-iterar-un-map-con-java-1-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 9.482 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-01-30 00:47:46 --><!-- Compression = gzip -->

