<?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>LazyLoading</title>
	<atom:link href="http://mgaravaglia.com.ar/blog/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://mgaravaglia.com.ar/blog</link>
	<description>Software Development y Otras Yerbas por Mauricio Garavaglia</description>
	<lastBuildDate>Wed, 23 Jun 2010 02:34:49 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ruby 1.9.1 en Snow Leopard</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2010/06/22/ruby-1-9-1-en-snow-leopard/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2010/06/22/ruby-1-9-1-en-snow-leopard/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 02:25:47 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=109</guid>
		<description><![CDATA[
instalar ruby version manager (rvm)
$ sudo gem install rvm
$ rvm-install
despues de esto seguir las instrucciones en pantalla para finalizar la instalacion de rvm.
instalar ruby 1.9.1 usando rvm
$ rvm install 1.9.1

usar!
$ rvm use 1.9.1
$ ruby -v
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.3.2]



]]></description>
			<content:encoded><![CDATA[<ol>
<li>instalar ruby version manager (rvm)
<pre>$ sudo gem install rvm
$ rvm-install</pre>
<p>despues de esto seguir las instrucciones en pantalla para finalizar la instalacion de rvm.</li>
<li>instalar ruby 1.9.1 usando rvm
<pre>$ rvm install 1.9.1</pre>
</li>
<li>usar!
<pre>$ rvm use 1.9.1
$ ruby -v
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.3.2]
</pre>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2010/06/22/ruby-1-9-1-en-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ServiceConstructionException: Could not find definition for service</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2010/06/15/serviceconstructionexception-could-not-find-definition-for-service/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2010/06/15/serviceconstructionexception-could-not-find-definition-for-service/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 18:32:29 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[cxf]]></category>
		<category><![CDATA[ws]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=105</guid>
		<description><![CDATA[Ok&#8230; just for the record, Al implementar un client ws con cxf tener cuidado de no estar usando un frontend proxy factory en lugar de un jaxws proxy factory como, en general, queremos.

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.setServiceClass(MyService.class);
factory.setAddress("http://localhost/ws");
MyService client = (MyService) factory.create();

]]></description>
			<content:encoded><![CDATA[<p>Ok&#8230; just for the record, Al implementar un client ws con cxf tener cuidado de no estar usando un frontend proxy factory en lugar de un jaxws proxy factory como, en general, queremos.</p>
<pre code="java">
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.setServiceClass(MyService.class);
factory.setAddress("http://localhost/ws");
MyService client = (MyService) factory.create();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2010/06/15/serviceconstructionexception-could-not-find-definition-for-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>String.format en Javascript</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2010/05/31/string-format-en-javascript/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2010/05/31/string-format-en-javascript/#comments</comments>
		<pubDate>Mon, 31 May 2010 14:55:24 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[strings]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=98</guid>
		<description><![CDATA[Dejo a continuacion una funcion bastante util que se comporta como el String.format de Java. En Javascript es comun andar componiendo strings a partir de constantes, variables, literales y otras cosas para generar una salida HTML. Asi que en lugar de escribir:

var v = "&#60;span style='color:"+myColor+"'&#62;"+singleton.myText()+"&#60;/span&#62;&#60;span id='"+entityId+"'&#62;"+Text+"&#60;/span&#62;";

podemos poner:
var v = "&#60;span style='color:{0}'&#62; {1} &#60;/span&#62; &#60;span [...]]]></description>
			<content:encoded><![CDATA[<p>Dejo a continuacion una funcion bastante util que se comporta como el <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#format%28java.lang.String,%20java.lang.Object...%29">String.format</a> de Java. En Javascript es comun andar componiendo strings a partir de constantes, variables, literales y otras cosas para generar una salida HTML. Asi que en lugar de escribir:</p>
<pre name="code" class="javascript">
var v = "&lt;span style='color:"+myColor+"'&gt;"+singleton.myText()+"&lt;/span&gt;&lt;span id='"+entityId+"'&gt;"+Text+"&lt;/span&gt;";
</pre>
<p>podemos poner:</p>
<pre name="code" class="java">var v = "&lt;span style='color:{0}'&gt; {1} &lt;/span&gt; &lt;span id='{2}'&gt;{3}&lt;/span&gt;".format(myColor,singleton.myText(),entityId,Text);</pre>
<p>más lindo no?</p>
<pre name="code" class="java">
// Replaces {0},{1},{n} with the arguments.
String.prototype.format = function() {
	var i = 0;
	var string = (typeof (this) == "function" &amp;&amp; !(i++)) ? arguments[0] : this;
	while(i &lt; arguments.length) {
		string = string.replaceAll('\\{' + i + '\\}', arguments[i]);
                i++;
        }
	return string;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2010/05/31/string-format-en-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EasyMock: Mocks&#8230; eh&#8230; fácil.</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2009/10/23/easymock-mocks-eh-facil/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2009/10/23/easymock-mocks-eh-facil/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 00:02:26 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=88</guid>
		<description><![CDATA[El TDD es muy lindo hasta que nos toca hacer un test unitario a un componente que tiene muchas dependencias, que en estos tiempos de arquitecturas multitier suelen ser la mayoria.
Estas dependencias suelen remplazarse por objetos que simulan ser los reales compartiendo la misma interfaz. Claro que es solo una fachada, su implementación dista mucho [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">El <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a> es muy lindo hasta que nos toca hacer un test unitario a un componente que tiene muchas dependencias, que en estos tiempos de arquitecturas multitier suelen ser la mayoria.</p>
<p style="text-align: justify;">Estas dependencias suelen remplazarse por objetos que simulan ser los reales compartiendo la misma interfaz. Claro que es solo una fachada, su implementación dista mucho de ser la real, pero nos proporcionan un comportamiento determinista y controlado contra el que probar nuestros componentes. <a href="http://easymock.org/" target="_blank">EasyMocks </a>es un framework que permite crear estos objetos de forma muy sencilla indicando cual es la interfaz que deben cumplir y cual es el comportamiento que esperamos.</p>
<h2>Creando el Mock</h2>
<p style="text-align: justify;">Lo primero que necesitamos es decirle al framework cual va a ser la interfaz que queremos implementar en nuestro &#8220;mock&#8221;. Supongamos que necesitamos testear una clase <em>Cliente </em>que necesita los favores de una clase que implemente <em>Servicio</em>. Lo que vamos a hacer es un &#8220;mock&#8221; que simule ser una implementacion real de <em>Servicio </em>pero solo la vamos a usar para llevar a cabo el test.</p>
<p style="text-align: justify;">El metodo estatico createMock de la clase EasyMock toma una Interface como parametro (tambien puede ser una clase) y nos devuelve un objeto que la implementa.</p>
<pre name="code" class="java">Servicio servicioMock = EasyMock.createMock(Servicio.class)</pre>
<h2>Its Alive!!</h2>
<p style="text-align: justify;">Genial, ¿Ya podemos pasarle la referencia servicioMock al Cliente y testear a gusto?&#8230; bueno&#8230; no tan easy.</p>
<p style="text-align: justify;">A continuacion vamos a hacer que ese servicioMock implemente la operacion sumarDiez que, a partir de un parametro int numero devuelve ese numero incrementado en 10. No va a ser la implementacion real, solo a &#8217;simular&#8217; que esta haciendo algo realmente mediante el metodo EasyMock.expect.</p>
<pre name="code"  class="java">EasyMock.expect(servicioMock.sumarDiez(5)).andReturn(15);</pre>
<p style="text-align: justify;">Acabamos de decirle a nuestro servicioMock que cuando alguien invoque al metodo sumarDiez con el numero 5 como parametro el debe devolver 15. No hay implementacion real, solo se pretende estar realizando la operacion. Ademas nuestro mock no sabe que hacer si alguien le pasa el numero 6 como parametro, y nos lo hara saber con una hermosa excepción.</p>
<pre name="code"  class="java">Easymock.replay(servicioMock);</pre>
<p style="text-align: justify;">Esto pone al mock en &#8216;test mode&#8217; indicando que ya podemos usarlo para nuestro <a href="http://www.junit.org/">test</a>.</p>
<h2>Still alive&#8230; and well?</h2>
<p style="text-align:justift;">Ahora sí podemos meter el servicioMock en nuestro test y admirar a EasyMock en toda su gloria</p>
<p>Ojo que lo que estamos testeando es el comportamiento de <em>Cliente </em>y no de <em>Servicio</em>! es decir que <em>invocarAlMetodoSumarDiezDeServicio() </em>este delegando correctamente e invocando a <em>Servicio</em>.</p>
<pre name="code"  class="java">Cliente cliente = new Cliente();
cliente.setServicio(servicioMock);
int esultado = cliente.invocarAlMetodoSumarDiezDeServicio(10);
assertEquals(15,resultado);</pre>
<p style="text-align: justify;">Las posibilidades que tiene Easymock son ilimitadas y podemos simular comportamientos extremadamente complejos. Pueden encontrar mas informacion sobre todo el potencial de EasyMock en su <a href="http://easymock.org/EasyMock2_5_2_Documentation.html">página oficial</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2009/10/23/easymock-mocks-eh-facil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ant para lanzar Tomcat</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2009/07/23/ant-para-lanzar-tomcat/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2009/07/23/ant-para-lanzar-tomcat/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 23:37:46 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=77</guid>
		<description><![CDATA[Aca van dos targets para lanzar y detener el Tomcat sin necesidad de hacer chanchadas con el exec.


    
        
    



    
        
        
  [...]]]></description>
			<content:encoded><![CDATA[<p>Aca van dos targets para lanzar y detener el Tomcat sin necesidad de hacer chanchadas con el exec.</p>
<pre name="code" class="xml">
<target name="tomcat-start">
    <java jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
        <jvmarg value="-Dcatalina.home=${tomcat.home}"/>
    </java>
</target>

<target name="tomcat-stop">
    <java jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
        <jvmarg value="-Dcatalina.home=${tomcat.home}"/>
        <arg line="stop"/>
    </java>
</target>

<target name="tomcat-start-debug">
    <java jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
        <jvmarg value="-Dcatalina.home=${tomcat.home}"/>
        <jvmarg value="-Xdebug"/>
        <jvmarg
value="-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"/>
    </java>
</target>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2009/07/23/ant-para-lanzar-tomcat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse: WTP y Maven en el mismo proyecto</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2009/06/28/eclipse-wtp-y-maven-en-el-mismo-proyecto/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2009/06/28/eclipse-wtp-y-maven-en-el-mismo-proyecto/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 20:31:08 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Tool Box]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=68</guid>
		<description><![CDATA[Al manejar un proyecto con Maven es muy comun encontrarse con que nuestro proyecto no se integra demasiado bien con todas caracteristicas que ofrecen los IDEs. Si estamos desarrollando aplicaciones web vamos a tener problemas tratando de que Netbeans o Eclipse se aviven de que necesitamos usar los servers del IDE para debugear y al [...]]]></description>
			<content:encoded><![CDATA[<p>Al manejar un proyecto con Maven es muy comun encontrarse con que nuestro proyecto no se integra demasiado bien con todas caracteristicas que ofrecen los IDEs. Si estamos desarrollando aplicaciones web vamos a tener problemas tratando de que Netbeans o Eclipse se aviven de que necesitamos usar los servers del IDE para debugear y al final terminamos haciendo todo a traves de los goals de maven, lo cual no siempre es muy cómodo.</p>
<p>En Eclipse hay una forma de poder usar el &#8216;run on server&#8217; (alt+shift+X,R) directamente desde nuestro proyecto Maven y consiste en incorporar el Plugin que da soporte a Eclipse Web Tools Platform al pom.xml del proyecto.</p>
<p>Receta:</p>
<p>1- Crear el proyecto de maven como normalmente lo hariamos. Por ejemplo con un archetype de <a href="http://myfaces.apache.org/" target="_blank">myfaces</a></p>
<pre name="code" class="php">   $ mvn archetype:create -DgroupId=ar.com.mgaravaglia -DartifactId=testWebApp -DarchetypeGroupId=org.apache.myfaces.build -DarchetypeArtifactId=myfaces-archetype-helloworld
</pre>
<p>2- Modificar el archivo pom.xml creado agregando la referencia al plugin maven-eclipse-plugin en el elemento build</p>
<pre name="code" class="xml">
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<configuration>
<wtpversion>2.0</wtpversion>
<wtpapplicationxml>true</wtpapplicationxml>
<wtpmanifest>true</wtpmanifest>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
<projectNameTemplate>[artifactId]-[version]</projectNameTemplate>
<manifest>${basedir}/src/main/resources/META-INF/MANIFEST.MF</manifest>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</pre>
<p>3- Generar el proyecto de eclipse desde maven.</p>
<pre lang="bash">$ mvn eclipse:clean; mvn eclipse:eclipse</pre>
<p>4- Una vez dentro de eclipse importar el proyecto como un maven project.</p>
<p>5- Ejecutar y Debuggear a gusto en el tomcat instalado en eclipse usando el &#8216;Run on Server&#8217;</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2009/06/28/eclipse-wtp-y-maven-en-el-mismo-proyecto/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Alineando los planetas para JMX</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2009/05/02/alineando-los-planetas-para-jmx/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2009/05/02/alineando-los-planetas-para-jmx/#comments</comments>
		<pubDate>Sat, 02 May 2009 22:59:28 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Bofh]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/index.php/2009/05/02/alineando-los-planetas-para-jmx/</guid>
		<description><![CDATA[Cada vez que tengo que testear un Apache Tomcat nuevo usando jconsole o jvisualvm me pasa lo mismo. A continuación: Lista bullet-proof Para hacer andar el JMX del Tomcat.
1- Agregar los siguientes parametros a la JVM del Tomcat
-Dcom.sun.management.jmxremote.port=7000
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
2- No tiene que haber inconsistencias en los hostname de la maquina. Es bastante comun que tirar el [...]]]></description>
			<content:encoded><![CDATA[<p>Cada vez que tengo que testear un Apache Tomcat nuevo usando jconsole o jvisualvm me pasa lo mismo. A continuación: Lista bullet-proof Para hacer andar el JMX del Tomcat.</p>
<p>1- Agregar los siguientes parametros a la JVM del Tomcat</p>
<p>-Dcom.sun.management.jmxremote.port=7000<br />
-Dcom.sun.management.jmxremote.ssl=false<br />
-Dcom.sun.management.jmxremote.authenticate=false</p>
<p>2- No tiene que haber inconsistencias en los hostname de la maquina. Es bastante comun que tirar el comando &#8216;hostname&#8217; devuelvo algo totalmente distinto a lo que dice el /etc/hosts y el RMI es algo susceptible a esto. Ejemplo que funciona correctamente:</p>
<p>  #hostname<br />
     maquina.dominio.com</p>
<p>  #cat /etc/hosts<br />
    127.0.0.1	localhost.localdomain localhost<br />
    10.1.3.24	maquina.dominio.com	</p>
<p>Ahora al conectarnos via jconsole, jvisualvm o cualquier otro agente JMX a 10.1.3.24:7000 no deberiamos tener problemas </p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2009/05/02/alineando-los-planetas-para-jmx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Puzzle!</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2009/04/24/puzzle-2/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2009/04/24/puzzle-2/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 23:37:57 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Jokes]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=66</guid>
		<description><![CDATA[Volvió el puzzle! Esta vez es fácil, ya que es una practica común, pero me encontré con mucha gente que no sabia de esto. Por favor, que alguien me explique por qué funciona el siguiente código.

List frutas = new ArrayList(){{ add("Manzana");add("Naranja");add("Pera");}};

]]></description>
			<content:encoded><![CDATA[<p>Volvió el puzzle! Esta vez es fácil, ya que es una practica común, pero me encontré con mucha gente que no sabia de esto. Por favor, que alguien me explique por qué funciona el siguiente código.</p>
<pre lang="java">
List<String> frutas = new ArrayList<String>(){{ add("Manzana");add("Naranja");add("Pera");}};
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2009/04/24/puzzle-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SourceMonitor</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2009/02/18/sourcemonitor/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2009/02/18/sourcemonitor/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 01:50:18 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=65</guid>
		<description><![CDATA[SourceMonitor es una aplicación freeware que examina el codigo fuente de nuestros proyectos y calcula distintas metricas acerca la complejidad que encuentra. Una caracteristica muy interesante es la posibilidad de tomar &#8217;snapshots&#8217; de los valores arrojados por las metricas para poder compararlos a lo largo de tiempo . Soporta Java, C, C++ y unos cuantos [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.campwoodsw.com/">SourceMonitor </a>es una aplicación freeware que examina el codigo fuente de nuestros proyectos y calcula distintas metricas acerca la complejidad que encuentra. Una caracteristica muy interesante es la posibilidad de tomar &#8217;snapshots&#8217; de los valores arrojados por las metricas para poder compararlos a lo largo de tiempo . Soporta Java, C, C++ y unos cuantos lenguajes más</p>
<p>Muy util para saber en que momento hay que empezar a refactorear.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2009/02/18/sourcemonitor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scripting en Java</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2009/02/08/scripting-en-java/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2009/02/08/scripting-en-java/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 21:00:33 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=64</guid>
		<description><![CDATA[En Java es posible interpretar virtualmente cualquier lenguaje de scripting utilizando una API bastante simple introducida  a partir de la versión 1.6  por obra de la JSR223. Estos lenguajes se incorporan en nuestros proyectos como simples Jars que luego son descubiertos por un ScriptEngineManager que los regentea.
JSE6 incorpora out-of-the-box el engine Rhino asi que tenemos [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En Java es posible interpretar virtualmente cualquier lenguaje de scripting utilizando una API bastante simple introducida  a partir de la versión 1.6  por obra de la <a href="http://jcp.org/en/jsr/detail?id=223" target="_blank">JSR223</a>. Estos lenguajes se incorporan en nuestros proyectos como simples Jars que luego son descubiertos por un <a href="http://java.sun.com/javase/6/docs/api/javax/script/ScriptEngineManager.html" target="_blank">ScriptEngineManager</a> que los regentea.</p>
<p style="text-align: justify;">JSE6 incorpora out-of-the-box el engine <a href="http://www.mozilla.org/rhino/" target="_blank">Rhino</a> asi que tenemos la posibilidad de ejecutar código JavaScript en nuestras aplicaciónes haciendo poco y nada.</p>
<pre name="code" class="java">
 ScriptEngineManager scm = new ScriptEngineManager();
ScriptEngine jsEngine = scm.getEngineByName("JavaScript");</pre>
<p style="text-align: justify;">Uhm&#8230; listo! estamos listos para interpretar javascript. Por un proceso de discovering (siguiendo la linea de los *Manager de Java) el ScriptEngineManager sabe que hacer cuando le pedimos un Engine de &#8220;JavaScript&#8221; y nos devuelve una instancia de ScriptEngine.</p>
<pre name="code" class="java">String script = "var sum = 0; var obj = new Array(1,1,2,3,5,13);"
+ "for each (var item in obj) { sum += item; }"
+ "print(sum);";
jsEngine.eval(script); // 25</pre>
<p style="text-align: justify;">el metodo <a href="http://java.sun.com/javase/6/docs/api/javax/script/ScriptEngine.html#eval(java.lang.String)" target="_blank">eval</a> del ScriptEngine interpreta el String que le pasamos como parametro y en la consola terminariamos con un &#8220;25&#8243;. However, el scripting en Java es mucho más inteligente, el metodo eval devuelve un Object que contiene el valor del ultimo statement del script. El mapeo del valor que &#8216;retorna&#8217; el script contra los tipos de datos de Java es especifico del Engine por lo que nos vamos a encontrar con comportamientos diferentes segun el lenguaje (y el engine) que interpretemos.</p>
<pre name="code" class="java"> String script = "var sum = 0; var obj = new Array(1,1,2,3,5,13);"
+ "for each (var item in obj) { sum += item; }"
+ "sum;";
Double d = (Double) jsEngine.eval(script);
 System.out.println( d +1 ); //26!!!</pre>
<p style="text-align: justify;">Con esta feature de JSE6 es inevitable pensar en dar un paso más en la parametrización de nuestros sistemas  ya no solo parametrizando valores y constantes sino también la logica de determinados procesos a traves de scripts simples en JS, Phyton, Ruby, Groovy, Jaskell o lo que sea. Otra ventaja en el uso de de esta API esta en incorporar lenguajes que nos eliminan el ciclo de code-compile-deploy-test pero sin alejarnos de la plataforma Java.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2009/02/08/scripting-en-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
