<?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>Alfonso Marín López &#187; Programación</title>
	<atom:link href="http://www.alfonsomarin.es/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alfonsomarin.es</link>
	<description>Blog personal de un informático</description>
	<lastBuildDate>Thu, 22 Jul 2010 13:51:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Generar un build de un proyecto GWT</title>
		<link>http://www.alfonsomarin.es/generar-un-build-de-un-proyecto-gwt/</link>
		<comments>http://www.alfonsomarin.es/generar-un-build-de-un-proyecto-gwt/#comments</comments>
		<pubDate>Thu, 20 May 2010 15:33:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[gwt]]></category>

		<guid isPermaLink="false">http://www.alfonsomarin.es/?p=162</guid>
		<description><![CDATA[Como es justo el tema con el que estoy, antes de que se me olvide lo pongo aquí. Son solo unas pequeñas notas que puede que no se tengan claras.
En un post anterior explique las diferentes opciones del compilador de GWT, pero a la hora de hacer el build tenia algunas dudas, os pondré los [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm;">Como es justo el tema con el que estoy, antes de que se me olvide lo pongo aquí. Son solo unas pequeñas notas que puede que no se tengan claras.</p>
<p style="margin-bottom: 0cm;">En un <a title="Parametros de GWT" href="http://www.alfonsomarin.es/parametros-de-compilacion-de-gwt/" target="_self">post</a> anterior explique las diferentes opciones del compilador de GWT, pero a la hora de hacer el build tenia algunas dudas, os pondré los resultados de las pruebas.</p>
<ul>
<li>En ningun momento es necesario incluir el código fuente en el build para producción</li>
</ul>
<ul>
<li>Aunque si debe estar accesible el 	código fuente para su compilación (es obvio), yo en este caso 	suelo meter en diferentes jars los fuentes y copilados de los 	diferentes módulos, para luego incluirlo en el classpath del 	proyecto principal.
<p style="margin-bottom: 0cm;">
</li>
</ul>
<p style="margin-bottom: 0cm;">La verdad es que cuando pensé en escribir un post, pensé que tendría mas chicha, pero me ha resultado todo un reto montar un build con diferentes módulos y proyectos, aunque ahora ya terminado parece una tontería.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfonsomarin.es/generar-un-build-de-un-proyecto-gwt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parámetros de compilación de GWT</title>
		<link>http://www.alfonsomarin.es/parametros-de-compilacion-de-gwt/</link>
		<comments>http://www.alfonsomarin.es/parametros-de-compilacion-de-gwt/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 16:05:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tecnología]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[gwt]]></category>

		<guid isPermaLink="false">http://www.alfonsomarin.es/?p=143</guid>
		<description><![CDATA[Estos días ando un poco liado con el desarrollo de una aplicación en GWT. Que con esta ultima versión, la 2.0, se puede decir que han dado un paso de gigante.
En esta ocasión voy a hablar de su compilador para la puesta en producción y los parámetros que tiene.
Antes de nada explicar un poco como [...]]]></description>
			<content:encoded><![CDATA[<p>Estos días ando un poco liado con el desarrollo de una aplicación en GWT. Que con esta ultima versión, la 2.0, se puede decir que han dado un paso de gigante.<br />
En esta ocasión voy a hablar de su compilador para la<strong> puesta en producción </strong>y los parámetros que tiene.</p>
<p>Antes de nada explicar un poco como funciona, GWT coge y compila a javascript nuestro codigo creando diferentes versiones en archivos diferentes. Si nos fijamos en lo que genera veremos que hay una serie de archivos con extensiones html, rpc, png. Los png son los bundle, donde mete todas las imágenes de la aplicación en una sola, descargándola de golpe y luego muestra la parte que interese. Los archivos rpc son los encargados de las llamadas a los servicios y los html son donde esta toda la chicha.</p>
<p>Veremos que son del estilos <strong>LKH45KH6KLJH4356H3456HLKH45.cache.htm</strong>l, cada archivo represente a un idioma/navegador. Así que si tenemos 2 idiomas y 5 navegadores, tendremos 10 archivos o permutaciones como ellos los llaman.</p>
<p>Cada compilación lleva su tiempo, y en las tareas ant que utilicemos podremos introducir algunos parámetros que agilicen esta compilación.</p>
<p>Si tenemos varios módulos, es interesante que los compilemos en una misma tarea, indicando a cada llamada java que sea un fork, para que se compile en paralelo.</p>
<p>Y hacemos uso de unos de los parámetros mas interesantes, el <strong>localworkers</strong>, esto representa a un hilo que compila una permutación, así que si ponemos mas, compilaría paralelamente las permutaciones, aquí que cada uno hagas sus pruebas. Yo tengo 4 núcleos y poniéndolo en 4 se me reduce a la mitad el tiempo necesario para compilar.<br />
Os dejo una muestra en ant.</p>
<blockquote>
<pre style="overflow: auto; width: 489px;">&lt;target name="gwtc" depends="javac" description="GWT compile to JavaScript"&gt;
&lt;!-- Compilacion modulo vo --&gt;
&lt;java failonerror="false" fork="true" classname="com.google.gwt.dev.Compiler"&gt;
&lt;classpath&gt;
&lt;pathelement location="modules"/&gt;
&lt;path refid="project.class.path"/&gt;
&lt;/classpath&gt;
&lt;!-- add jvmarg -Xss16M or similar if you see a StackOverflowError --&gt;
&lt;jvmarg value="-Xmx256M"/&gt;
&lt;!-- Additional arguments like -style PRETTY or -logLevel DEBUG --&gt;
&lt;arg value="com.orion.apps.cuentas.ValueObject"/&gt;
&lt;arg line="-war ${build.dir}"/&gt;
&lt;arg line="-style DETAILED"/&gt;
&lt;arg line="-localWorkers 4"/&gt;
&lt;/java&gt;

&lt;!-- Compilacion modulo cuentas--&gt;
&lt;java failonerror="false" fork="true" classname="com.google.gwt.dev.Compiler"&gt;
&lt;classpath&gt;
&lt;pathelement location="view/main/java"/&gt;
&lt;pathelement location="view/main/resources"/&gt;
&lt;pathelement location="rpc/main/java"/&gt;
&lt;pathelement location="modules"/&gt;
&lt;path refid="project.class.path"/&gt;
&lt;/classpath&gt;
&lt;!-- add jvmarg -Xss16M or similar if you see a StackOverflowError --&gt;
&lt;jvmarg value="-Xmx256M"/&gt;
&lt;!-- Additional arguments like -style PRETTY or -logLevel DEBUG --&gt;
&lt;arg line="-war ${build.dir}"/&gt;
&lt;arg line="-style DETAILED"/&gt;
&lt;arg line="-localWorkers 4"/&gt;
&lt;arg value="com.orion.apps.cuentas.web.CuentasWeb"/&gt;
&lt;/java&gt;
&lt;/target&gt;</pre>
</blockquote>
<p>PD: Si se quiere ir mas rápido, se puede eliminar idiomas del archivo de configuración gwt.xml</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfonsomarin.es/parametros-de-compilacion-de-gwt/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>GWT 2.0 RC2</title>
		<link>http://www.alfonsomarin.es/gwt-2-0-rc2/</link>
		<comments>http://www.alfonsomarin.es/gwt-2-0-rc2/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 11:54:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tecnología]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[gwt]]></category>

		<guid isPermaLink="false">http://www.alfonsomarin.es/?p=127</guid>
		<description><![CDATA[Ya tenemos casi a punto la nueva versión de GWT 2.0, esta en RC2, así que en breve tendremos una versión final.
Esta nueva versión promete muchas cosas nuevas e interesante, se nota como le han metido mano a fondo con el tema de WAVE.
He podido probarlo poco pero puedo decir que es fabuloso, una de [...]]]></description>
			<content:encoded><![CDATA[<p>Ya tenemos casi a punto la nueva versión de<a title="http://code.google.com/p/google-web-toolkit/wiki/GWT_2_0_RC" href="http://code.google.com/p/google-web-toolkit/wiki/GWT_2_0_RC" target="_blank"> GWT 2.0</a>, esta en RC2, así que en breve tendremos una versión final.</p>
<p>Esta nueva versión promete muchas cosas nuevas e interesante, se nota como le han metido mano a fondo con el tema de <a title="http://wave.google.com/help/wave/closed.html" href="http://wave.google.com/help/wave/closed.html" target="_blank">WAVE</a>.</p>
<p>He podido probarlo poco pero puedo decir que es fabuloso, una de las cosas que mas me molestaban era el hecho de tener que desarrollar con el navegador que trae en modo host. Que debe ser el motor de iexplorer 6, porque no hay forma de que vayan ciertas mejoras gráficas. Afortunadamente eso se ha terminado para siempre y ya podemos desarrollar en modo host, o como se llama ahora development mode, utilizando el firefox, y mejor aun, UTILIZANDO EL FIREBUG PARA ARREGLAR LA VISTA!!!!!. Ya no tenemos que compilar el proyecto para poder usar el firebug.</p>
<p>Trae muchas mas mejoras como el UIBinder, que permite montar las vistas con archivos xml. Aunque no he podido probarlo ya os iré informando de lo que vaya descubriendo.</p>
<p>¿Alguno lo ha probado? ¿Cual es vuestra opinión al respecto?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfonsomarin.es/gwt-2-0-rc2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grails</title>
		<link>http://www.alfonsomarin.es/grails/</link>
		<comments>http://www.alfonsomarin.es/grails/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 19:00:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.alfonsomarin.es/?p=113</guid>
		<description><![CDATA[
Continuando con el tema del curso de Groovy y Grails, hoy  toca hablar de lo que es Grails.
Grails es un framework web basado en MVC, que mediante  comandos Ant, o como lo llaman Gant, se va construyendo la aplicación. Sigue  una metodología de desarrollo basado en el Dominio, y por debajo genera [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.alfonsomarin.es/wp-content/uploads/2009/09/grailslogo.png"><img class="aligncenter size-full wp-image-118" title="grailslogo" src="http://www.alfonsomarin.es/wp-content/uploads/2009/09/grailslogo.png" alt="grailslogo" width="163" height="43" /></a></p>
<p>Continuando con el tema del <a title="Groovy" href="groovy/" target="_self">curso de Groovy y Grails</a>, hoy  toca hablar de lo que es Grails.</p>
<p><a title="Grails.org" href="http://grails.org" target="_blank">Grails</a> es un framework web basado en MVC, que mediante  comandos Ant, o como lo llaman Gant, se va construyendo la aplicación. Sigue  una metodología de desarrollo basado en el Dominio, y por debajo genera todo  con <a title="http://www.springsource.org/" href="http://www.springsource.org/" target="_blank">Spring</a>, <a title="https://www.hibernate.org/" href="https://www.hibernate.org/" target="_blank">Hibernate</a> y GSP, que son como las JSP de toda la vida, pero con  tags de grails y lenguaje Groovy.</p>
<p>Una de las características mas interesantes que posee es el  scafloinding. Que mediante unas pocas líneas y comandos, genera todo el CRUD,  desde la vista hasta la base de datos, pasando por el controlador, DAO y  servicios necesarios.</p>
<p>Otro concepto interesante son los plugin que es una forma de  añadir seguridad, ajax, test y cualquier otra funcionalidad, herramienta o  servicio que necesitemos de una forma fácil, aunque eso es un poco relativo.</p>
<p>En principio parece una herramienta para el desarrollo de  aplicaciones de una cierta complejidad de forma realmente rápida, como ejemplo  tenemos a <a title="http://www.jobsket.com/" href="http://www.jobsket.com/" target="_blank">jobsket</a>, realizado en grails.</p>
<p>Aunque como todo, hasta que no te metes en el ajo no ves  realmente como es, he iniciado un proyecto con unos <a title="http://www.i2e.com.es/" href="http://www.i2e.com.es/" target="_blank">amigos</a> para desarrollar una  aplicación en dicha tecnología, que ya iré comentado.</p>
<p>Si alguno ha utilizado alguna de estas tecnologías, estaré  muy agradecido de que comparta sus experiencias conmigo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfonsomarin.es/grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integración de spring y GWT</title>
		<link>http://www.alfonsomarin.es/integracion-de-spring-y-gwt/</link>
		<comments>http://www.alfonsomarin.es/integracion-de-spring-y-gwt/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 10:58:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.alfonsomarin.es/?p=61</guid>
		<description><![CDATA[Vamos a tratar la gestión de beans de spring dentro de GWT. En principio no tiene nada de especial. Solo hay que arrancar el contexto de spring para poder solicitar los beans que queramos.
Despues de navegar mucho, pero que mucho, he encontrado 3 metodos:
El primero y más simple, cargar el archivo de configuración xml en [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a tratar la gestión de beans de <a href="http://www.springsource.org/">spring </a>dentro de <a href="http://code.google.com/intl/es-ES/webtoolkit/">GWT</a>. En principio no tiene nada de especial. Solo hay que arrancar el contexto de spring para poder solicitar los beans que queramos.</p>
<p>Despues de navegar mucho, pero que mucho, he encontrado 3 metodos:</p>
<h3>El primero y más simple, cargar el archivo de configuración xml en cualquier momento</h3>
<blockquote>
<pre style="overflow: auto; width: 489px;">org.springframework.beans.factory.access.BeanFactoryLocator beanFactoryLocator = org.springframework.context.access.ContextSingletonBeanFactoryLocator.getInstance(“Archivo-configuracion.xml”);

beanFactoryReference = beanFactoryLocator.useBeanFactory(“BeanId”);

(org.springframework.context.ApplicationContext)beanFactoryReference.getFactory();</pre>
</blockquote>
<p>Esto puesto en algún singleto y en un método synchronized, es posible que no de muchos problemas, lo único es que en cada servicio habría que llamarlo explícitamente para usar los beans de spring, no siendo muy automatico.</p>
<h3>Usando el ContextLoaderListener</h3>
<p>Con unos pequeños cambios podemos hacer que sea la propia aplicación web quien carge el contexto al iniciar la aplicación.</p>
<p>Para ello, solo hay que poner el nuestro web.xml el siguiente código:</p>
<blockquote>
<pre style="overflow: auto; width: 489px;">&lt;context-param&gt;

	&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;

		&lt;param-value&gt;

        /WEB-INF/applicationContext.xml

		classpath:applicationContext.xml

	&lt;/param-value&gt;

&lt;/context-param&gt;</pre>
</blockquote>
<p>Teneis las dos formas de cargar el archivo, si esta en el contexto de la aplicación, directamente por su path. O si lo tenemos en algún paquete de nuestro classpath. El ya lo busca y lo carga.</p>
<p>Y después:</p>
<blockquote>
<pre style="overflow: auto; width: 489px;">&lt;listener&gt;

	&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;

&lt;/listener&gt;</pre>
</blockquote>
<p>Que ya se encarga de cargar el archivo de configuración.Despues podemos solicitar el Bean de spring utilizando la siguiente instrucción.</p>
<blockquote>
<pre style="overflow: auto; width: 489px;">ApplicationContext context = WebApplicationContextUtils.<em>getWebApplicationContext</em>(getServletContext());

(MyService)context.getBean(“myservice”);</pre>
</blockquote>
<p>No hace falta decir que esto ha de hacerse desde un servlet en el servidor, para poder tener acceso al contexto de la aplicación.</p>
<p>Para no tener que llamarlo constantemente en cada servlet, podemos extender RemoteServiceServlet de GWT  y montarlo en llamadas que nos den los servicios.</p>
<blockquote>
<pre style="overflow: auto; width: 489px;"><strong>public</strong> <strong>class</strong> SpringRemoteServiceServlet <strong>extends</strong> RemoteServiceServlet{

	<strong>private</strong> ApplicationContext getContext(){

		ServletContext sc = getServletContext();

		<strong>return</strong> WebApplicationContextUtils.getWebApplicationContext(sc);

	}

	<strong>protected</strong> MyService getMyService(){

		<strong>return</strong> (MyService)getContext().getBean("myService");

	}

}</pre>
</blockquote>
<p>Así solo tenemos que llamar en nuestro servlet al metodo del servicio correspondiente. Aun asi, no deja de ser un poco intrusivo, y el hecho de tener una llamada en medio de nuestro servlet del tipo getServicio(), marea un poco.</p>
<h3>Inyección de dependencias</h3>
<p>Este es el que más me gusta, cumple con la filosofía de inyección de dependencias de spring, y lo hace todo muy transparente. Este lo he encontrada de <a href="http://seewah.blogspot.com/2009/02/gwt-spring-integration-using.html">aquí</a>. Esta en ingles, pero se entiende muy bien. Pero hare un resumen:</p>
<p>Al igual que hacíamos en el anterior punto, extendemos RemoteServiceServlet de GWT:</p>
<blockquote>
<pre style="overflow: auto; width: 489px; height: 500px;">import java.lang.reflect.Field;

import java.util.HashSet;

import java.util.Set;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.NoSuchBeanDefinitionException;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.context.support.WebApplicationContextUtils;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

/**

 * {@link RemoteServiceServlet} that automatically injects IoC dependency.

 * "org.springframework.beans.factory.annotation.Autowired" annotation is used

 * for marking which fields to inject into. Uses

 * {@link SpringApplicationContextLoader} to retrieve beans by name.

 *

 * Note that the current implementation will only inject "declared" fields, and

 * not inherited fields. Fields can be private, protected, package or public.

 * 

 * @author See Wah Cheng

 * @created 27 Jun 2008

 */

@SuppressWarnings("serial")

public class DependencyInjectionRemoteServiceServlet extends

		RemoteServiceServlet {

	protected static Logger logger = Logger

			.getLogger(DependencyInjectionRemoteServiceServlet.class);

	@Override

	public void init() throws ServletException {

		super.init();

		doDependencyInjection();

	}

	/**

	 * Carries out dependency injection. This implementation uses Spring IoC

	 * container.

	 * 

	 * @exception NoSuchBeanDefinitionException

	 *                if a suitable bean cannot be found in the Spring

	 *                application context. The current implementation looks up

	 *                beans by name

	 */

	protected void doDependencyInjection() {

		for (Field field : getFieldsToDependencyInject()) {

			try {

				boolean isFieldAccessible = field.isAccessible();

				if (!isFieldAccessible) {

					field.setAccessible(true);

				}

				field.set(this, WebApplicationContextUtils

						.getWebApplicationContext(getServletContext()).getBean(

								field.getName()));

				if (!isFieldAccessible) {

					field.setAccessible(false);

				}

				logger.debug("Dependency injection successful: "

						+ this.getClass().getName() + "." + field.getName());

			} catch (IllegalArgumentException e) {

				throw new RuntimeException(e);

			} catch (IllegalAccessException e) {

				throw new RuntimeException(e);

			}

		}

	}

	/**

	 * Find annotated fields to inject.

	 * 

	 * @return a list of all the annotated fields

	 */

	private Set getFieldsToDependencyInject() {

		Set fieldsToInject = new HashSet();

		Field[] fields = this.getClass().getDeclaredFields();

		for (Field field : fields) {

			if (field.getAnnotation(Autowired.class) != null) {

				fieldsToInject.add(field);

			}

		}

		return fieldsToInject;

	}

}</pre>
</blockquote>
<p>Esta es la clase que deberemos heredar en todos nuestros servicios. Y en el servicio en concreto debemos marcas la dependencia, en este ejemplo utilizan una anotación de spring, @Autowired. Si nos fijamos, cuando solicita los campos de la clase, utiliza reflection para buscar esa marca, y después busca el servicio en el contexto de spring que tiene en el contexto del servlet y lo asigna. Muy limpio y fácil de utilizar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfonsomarin.es/integracion-de-spring-y-gwt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
