<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://dosideas.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=201.251.185.130</id>
		<title>Dos Ideas. - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://dosideas.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=201.251.185.130"/>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/Especial:Contribuciones/201.251.185.130"/>
		<updated>2026-06-09T11:21:09Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Metricas_Agiles&amp;diff=6413</id>
		<title>Metricas Agiles</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Metricas_Agiles&amp;diff=6413"/>
				<updated>2011-10-06T12:26:21Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* ¿ Cómo obtener la información necesaria para el tablero ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hay distintas métricas en los proyectos de desarrollo:&lt;br /&gt;
&lt;br /&gt;
* de productividad y resultados del proyecto&lt;br /&gt;
* de situación financiera&lt;br /&gt;
* de riesgos &lt;br /&gt;
* de calidad&lt;br /&gt;
&lt;br /&gt;
== Productividad y resultados del proyecto ==&lt;br /&gt;
&lt;br /&gt;
Muchos de los problemas detectados y disfuncionalidades de la organización seguramente existen desde antes de utilizar una gestión ágil de proyectos como [[Scrum]]. Esos problemas no son el resultado de aplicar las métricas sino que por el contrario  nos aporta: &lt;br /&gt;
&lt;br /&gt;
* transparencia a los resultados del proyecto&lt;br /&gt;
* ayuda a priorizar el trabajo&lt;br /&gt;
* permite tomar decisiones entre las personas involucradas al proyecto &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ¿ Cuáles son las métricas que elegimos para medir productividad en nuestros proyectos ? ====&lt;br /&gt;
&lt;br /&gt;
* requisitos completados respecto al total de requisitos&lt;br /&gt;
* valor que le dan al cliente los requisitos completados&lt;br /&gt;
* la velocidad con qué se aporta valor al negocio&lt;br /&gt;
* cambios y requisitos añadidos&lt;br /&gt;
&lt;br /&gt;
==== ¿ Qué hacer con estas métricas ? ====&lt;br /&gt;
&lt;br /&gt;
Estamos en condiciones de generar un tablero o cuadro de control de nuestro proyecto para que todos los involucrados estén informados y puedan tomar decisiones de su rol. &lt;br /&gt;
&lt;br /&gt;
El equipo de desarrollo podrá evaluar su propia velocidad, planificar y tomar compromisos. &lt;br /&gt;
&lt;br /&gt;
El cliente podrá replantear las prioridades que está eligiendo para sus requerimientos, y así con cada persona involucrada. &lt;br /&gt;
&lt;br /&gt;
Esta info a lo largo del tiempo muestra tendencias.&lt;br /&gt;
&lt;br /&gt;
==== ¿ Cómo obtener la información necesaria para el tablero ? ====&lt;br /&gt;
&lt;br /&gt;
Esta info surge de las herramientas de [[Scrum]]: backlog priorizado, burn down, burn up. Y un buen momento para actualizar el tablero es al finalizar cada iteración. Es conveniente compartir puntos destacados del proyecto, riesgos y próximos pasos en el mismo tablero.&lt;br /&gt;
&lt;br /&gt;
==== ¿ Cuál es la métrica más importante en un proyecto ágil ? ====&lt;br /&gt;
&lt;br /&gt;
El valor de negocio que se le está dando al cliente. &lt;br /&gt;
&lt;br /&gt;
En ocasiones escuchamos hablar de ROI o Retorno de Inversión. ROI es una fórmula financiera tal que ROI = (ingreso - costo)/costo. Por ejemplo, podemos decir que si un producto genera un ingreso anual de 2500 $ y el costo anual de mantener ese producto es de 1000 $ entonces ese negocio nos deja un 50 % de ganancia anual sobre la inversión generada.&lt;br /&gt;
&lt;br /&gt;
Podemos no conocer la rentabilidad específica de un producto que desarrollamos y si podemos asumir que alguien analizó que ese producto genera una rentabilidad positiva para la compañia.&lt;br /&gt;
&lt;br /&gt;
Entonces, podemos trabajar junto al dueño de producto para orientarnos a que obtenga su máximo valor de negocio lo antes posible.&lt;br /&gt;
&lt;br /&gt;
==== ¿ Por qué es importante considerar el valor de negocio ? ====&lt;br /&gt;
&lt;br /&gt;
El cliente puede conocer la velocidad con que retorna su inversión y cuando ya no es necesario seguir con el proyecto por que lo que resta hacer tiene un retorno que no compensa el costo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Contrato-agil-change-for-free.gif]]&lt;br /&gt;
&lt;br /&gt;
Algunos consejos para el ROI:&lt;br /&gt;
&lt;br /&gt;
* usar un valor tangible para medir el retorno: dinero, personas, tiempo&lt;br /&gt;
* no tomar requisitos tan pequeños si el usuario no se siente representado&lt;br /&gt;
&lt;br /&gt;
== Ejemplo de tablero de productividad y resultados del proyecto ==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:TableroDelProyecto.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
&lt;br /&gt;
* [http://www.proyectosagiles.org/metricas-agiles-cuadro-mandos-balanceado-scrum Métricas ágiles y cuadro de mandos integral para Scrum]&lt;br /&gt;
* [http://www.proyectosagiles.org/contrato-agil-scrum Un contrato ágil para Scrum]&lt;br /&gt;
* [http://www.proyectosagiles.org/priorizacion-requisitos-valor-coste Priorización de los requisitos por valor y coste]&lt;br /&gt;
* [[Historia de usuario]]&lt;br /&gt;
* [[Backlog Del Producto]]&lt;br /&gt;
* [[Gráfico de Burn-Down]]&lt;br /&gt;
* [[Gráfico de Burn-Up]]&lt;br /&gt;
* [[Velocidad Trabajo Tiempo]]&lt;br /&gt;
* [[Hudson]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Scrum]]&lt;br /&gt;
[[Category: Métricas]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Metricas_Agiles&amp;diff=6412</id>
		<title>Metricas Agiles</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Metricas_Agiles&amp;diff=6412"/>
				<updated>2011-10-06T12:25:52Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* ¿ Cómo obtener la información necesaria para el tablero ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hay distintas métricas en los proyectos de desarrollo:&lt;br /&gt;
&lt;br /&gt;
* de productividad y resultados del proyecto&lt;br /&gt;
* de situación financiera&lt;br /&gt;
* de riesgos &lt;br /&gt;
* de calidad&lt;br /&gt;
&lt;br /&gt;
== Productividad y resultados del proyecto ==&lt;br /&gt;
&lt;br /&gt;
Muchos de los problemas detectados y disfuncionalidades de la organización seguramente existen desde antes de utilizar una gestión ágil de proyectos como [[Scrum]]. Esos problemas no son el resultado de aplicar las métricas sino que por el contrario  nos aporta: &lt;br /&gt;
&lt;br /&gt;
* transparencia a los resultados del proyecto&lt;br /&gt;
* ayuda a priorizar el trabajo&lt;br /&gt;
* permite tomar decisiones entre las personas involucradas al proyecto &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ¿ Cuáles son las métricas que elegimos para medir productividad en nuestros proyectos ? ====&lt;br /&gt;
&lt;br /&gt;
* requisitos completados respecto al total de requisitos&lt;br /&gt;
* valor que le dan al cliente los requisitos completados&lt;br /&gt;
* la velocidad con qué se aporta valor al negocio&lt;br /&gt;
* cambios y requisitos añadidos&lt;br /&gt;
&lt;br /&gt;
==== ¿ Qué hacer con estas métricas ? ====&lt;br /&gt;
&lt;br /&gt;
Estamos en condiciones de generar un tablero o cuadro de control de nuestro proyecto para que todos los involucrados estén informados y puedan tomar decisiones de su rol. &lt;br /&gt;
&lt;br /&gt;
El equipo de desarrollo podrá evaluar su propia velocidad, planificar y tomar compromisos. &lt;br /&gt;
&lt;br /&gt;
El cliente podrá replantear las prioridades que está eligiendo para sus requerimientos, y así con cada persona involucrada. &lt;br /&gt;
&lt;br /&gt;
Esta info a lo largo del tiempo muestra tendencias.&lt;br /&gt;
&lt;br /&gt;
==== ¿ Cómo obtener la información necesaria para el tablero ? ====&lt;br /&gt;
&lt;br /&gt;
Esta info surge de las herramientas de [[Scrum]]: backlog priorizado, burn down, burn up. Y el momento para actualizar el tablero es al finalizar cada iteración. Es conveniente compartir puntos destacados del proyecto, riesgos y próximos pasos en el mismo tablero.&lt;br /&gt;
&lt;br /&gt;
==== ¿ Cuál es la métrica más importante en un proyecto ágil ? ====&lt;br /&gt;
&lt;br /&gt;
El valor de negocio que se le está dando al cliente. &lt;br /&gt;
&lt;br /&gt;
En ocasiones escuchamos hablar de ROI o Retorno de Inversión. ROI es una fórmula financiera tal que ROI = (ingreso - costo)/costo. Por ejemplo, podemos decir que si un producto genera un ingreso anual de 2500 $ y el costo anual de mantener ese producto es de 1000 $ entonces ese negocio nos deja un 50 % de ganancia anual sobre la inversión generada.&lt;br /&gt;
&lt;br /&gt;
Podemos no conocer la rentabilidad específica de un producto que desarrollamos y si podemos asumir que alguien analizó que ese producto genera una rentabilidad positiva para la compañia.&lt;br /&gt;
&lt;br /&gt;
Entonces, podemos trabajar junto al dueño de producto para orientarnos a que obtenga su máximo valor de negocio lo antes posible.&lt;br /&gt;
&lt;br /&gt;
==== ¿ Por qué es importante considerar el valor de negocio ? ====&lt;br /&gt;
&lt;br /&gt;
El cliente puede conocer la velocidad con que retorna su inversión y cuando ya no es necesario seguir con el proyecto por que lo que resta hacer tiene un retorno que no compensa el costo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Contrato-agil-change-for-free.gif]]&lt;br /&gt;
&lt;br /&gt;
Algunos consejos para el ROI:&lt;br /&gt;
&lt;br /&gt;
* usar un valor tangible para medir el retorno: dinero, personas, tiempo&lt;br /&gt;
* no tomar requisitos tan pequeños si el usuario no se siente representado&lt;br /&gt;
&lt;br /&gt;
== Ejemplo de tablero de productividad y resultados del proyecto ==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:TableroDelProyecto.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
&lt;br /&gt;
* [http://www.proyectosagiles.org/metricas-agiles-cuadro-mandos-balanceado-scrum Métricas ágiles y cuadro de mandos integral para Scrum]&lt;br /&gt;
* [http://www.proyectosagiles.org/contrato-agil-scrum Un contrato ágil para Scrum]&lt;br /&gt;
* [http://www.proyectosagiles.org/priorizacion-requisitos-valor-coste Priorización de los requisitos por valor y coste]&lt;br /&gt;
* [[Historia de usuario]]&lt;br /&gt;
* [[Backlog Del Producto]]&lt;br /&gt;
* [[Gráfico de Burn-Down]]&lt;br /&gt;
* [[Gráfico de Burn-Up]]&lt;br /&gt;
* [[Velocidad Trabajo Tiempo]]&lt;br /&gt;
* [[Hudson]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Scrum]]&lt;br /&gt;
[[Category: Métricas]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Metricas_Agiles&amp;diff=6411</id>
		<title>Metricas Agiles</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Metricas_Agiles&amp;diff=6411"/>
				<updated>2011-10-06T12:24:08Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Productividad y resultados del proyecto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hay distintas métricas en los proyectos de desarrollo:&lt;br /&gt;
&lt;br /&gt;
* de productividad y resultados del proyecto&lt;br /&gt;
* de situación financiera&lt;br /&gt;
* de riesgos &lt;br /&gt;
* de calidad&lt;br /&gt;
&lt;br /&gt;
== Productividad y resultados del proyecto ==&lt;br /&gt;
&lt;br /&gt;
Muchos de los problemas detectados y disfuncionalidades de la organización seguramente existen desde antes de utilizar una gestión ágil de proyectos como [[Scrum]]. Esos problemas no son el resultado de aplicar las métricas sino que por el contrario  nos aporta: &lt;br /&gt;
&lt;br /&gt;
* transparencia a los resultados del proyecto&lt;br /&gt;
* ayuda a priorizar el trabajo&lt;br /&gt;
* permite tomar decisiones entre las personas involucradas al proyecto &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ¿ Cuáles son las métricas que elegimos para medir productividad en nuestros proyectos ? ====&lt;br /&gt;
&lt;br /&gt;
* requisitos completados respecto al total de requisitos&lt;br /&gt;
* valor que le dan al cliente los requisitos completados&lt;br /&gt;
* la velocidad con qué se aporta valor al negocio&lt;br /&gt;
* cambios y requisitos añadidos&lt;br /&gt;
&lt;br /&gt;
==== ¿ Qué hacer con estas métricas ? ====&lt;br /&gt;
&lt;br /&gt;
Estamos en condiciones de generar un tablero o cuadro de control de nuestro proyecto para que todos los involucrados estén informados y puedan tomar decisiones de su rol. &lt;br /&gt;
&lt;br /&gt;
El equipo de desarrollo podrá evaluar su propia velocidad, planificar y tomar compromisos. &lt;br /&gt;
&lt;br /&gt;
El cliente podrá replantear las prioridades que está eligiendo para sus requerimientos, y así con cada persona involucrada. &lt;br /&gt;
&lt;br /&gt;
Esta info a lo largo del tiempo muestra tendencias.&lt;br /&gt;
&lt;br /&gt;
==== ¿ Cómo obtener la información necesaria para el tablero ? ====&lt;br /&gt;
&lt;br /&gt;
Esta info surge de las herramientas de Scrum: backlog priorizado, burn down, burn up. Y el momento para actualizar el tablero es al finalizar cada iteración. Es conveniente compartir puntos destacados del proyecto, riesgos y próximos pasos en el mismo tablero.&lt;br /&gt;
&lt;br /&gt;
==== ¿ Cuál es la métrica más importante en un proyecto ágil ? ====&lt;br /&gt;
&lt;br /&gt;
El valor de negocio que se le está dando al cliente. &lt;br /&gt;
&lt;br /&gt;
En ocasiones escuchamos hablar de ROI o Retorno de Inversión. ROI es una fórmula financiera tal que ROI = (ingreso - costo)/costo. Por ejemplo, podemos decir que si un producto genera un ingreso anual de 2500 $ y el costo anual de mantener ese producto es de 1000 $ entonces ese negocio nos deja un 50 % de ganancia anual sobre la inversión generada.&lt;br /&gt;
&lt;br /&gt;
Podemos no conocer la rentabilidad específica de un producto que desarrollamos y si podemos asumir que alguien analizó que ese producto genera una rentabilidad positiva para la compañia.&lt;br /&gt;
&lt;br /&gt;
Entonces, podemos trabajar junto al dueño de producto para orientarnos a que obtenga su máximo valor de negocio lo antes posible.&lt;br /&gt;
&lt;br /&gt;
==== ¿ Por qué es importante considerar el valor de negocio ? ====&lt;br /&gt;
&lt;br /&gt;
El cliente puede conocer la velocidad con que retorna su inversión y cuando ya no es necesario seguir con el proyecto por que lo que resta hacer tiene un retorno que no compensa el costo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Contrato-agil-change-for-free.gif]]&lt;br /&gt;
&lt;br /&gt;
Algunos consejos para el ROI:&lt;br /&gt;
&lt;br /&gt;
* usar un valor tangible para medir el retorno: dinero, personas, tiempo&lt;br /&gt;
* no tomar requisitos tan pequeños si el usuario no se siente representado&lt;br /&gt;
&lt;br /&gt;
== Ejemplo de tablero de productividad y resultados del proyecto ==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:TableroDelProyecto.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
&lt;br /&gt;
* [http://www.proyectosagiles.org/metricas-agiles-cuadro-mandos-balanceado-scrum Métricas ágiles y cuadro de mandos integral para Scrum]&lt;br /&gt;
* [http://www.proyectosagiles.org/contrato-agil-scrum Un contrato ágil para Scrum]&lt;br /&gt;
* [http://www.proyectosagiles.org/priorizacion-requisitos-valor-coste Priorización de los requisitos por valor y coste]&lt;br /&gt;
* [[Historia de usuario]]&lt;br /&gt;
* [[Backlog Del Producto]]&lt;br /&gt;
* [[Gráfico de Burn-Down]]&lt;br /&gt;
* [[Gráfico de Burn-Up]]&lt;br /&gt;
* [[Velocidad Trabajo Tiempo]]&lt;br /&gt;
* [[Hudson]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Scrum]]&lt;br /&gt;
[[Category: Métricas]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Diagrama_de_despliegue&amp;diff=6367</id>
		<title>Diagrama de despliegue</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Diagrama_de_despliegue&amp;diff=6367"/>
				<updated>2011-09-29T13:08:41Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: Página creada con 'El diagrama de despliegue es un diagrama de UML que se utiliza para modelar el hardware utilizado en las implementaciones de sistemas y las relaciones entre sus componentes.  Es…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El diagrama de despliegue es un diagrama de UML que se utiliza para modelar el hardware utilizado en las implementaciones de sistemas y las relaciones entre sus componentes.&lt;br /&gt;
&lt;br /&gt;
Este diagrama muestra las relaciones físicas entre los componentes de hardware y software en el sistema final. Describe la topología del sistema: la estructura de los elementos de hardware y el software que ejecuta cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
== Elementos del diagrama ==&lt;br /&gt;
&lt;br /&gt;
=== Nodos ===&lt;br /&gt;
Los nodos son objetos físicos que existen en tiempo de ejecución y que representan algún tipo de recurso (capacidad de memoria, procesamiento, dispositivos).&lt;br /&gt;
&lt;br /&gt;
=== Asociaciones ===&lt;br /&gt;
Las asociaciones son las conexiones que unen los nodos y representan la comunicación entre los nodos.&lt;br /&gt;
&lt;br /&gt;
=== Componentes ===&lt;br /&gt;
Los componentes son las aplicaciones que se ejecutan en los nodos.&lt;br /&gt;
&lt;br /&gt;
=== Artefactos ===&lt;br /&gt;
Un artefacto es un producto del proceso de desarrollo de software.&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UML-diagrama_de_despliegue_-_ejemplo.JPG]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Diagrama_de_componentes&amp;diff=6349</id>
		<title>Diagrama de componentes</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Diagrama_de_componentes&amp;diff=6349"/>
				<updated>2011-09-20T20:09:43Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: Página creada con 'Los diagramas de componentes muestran las relaciones entre los componentes de software, sus dependencias, comunicación, ubicación y otras condiciones.  === Una guía para cons…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Los diagramas de componentes muestran las relaciones entre los componentes de software, sus dependencias, comunicación, ubicación y otras condiciones.&lt;br /&gt;
&lt;br /&gt;
=== Una guía para construir un diagrama de componentes===&lt;br /&gt;
&lt;br /&gt;
#Pensar en un único diagrama que unifique los componentes de software que utilizaremos en la solución&lt;br /&gt;
#Dentro de la estructura de proyecto en [[UML]] generar un paquete con todos los componentes a utilizar&lt;br /&gt;
#Añadir al diagrama todos los componentes anteriormente creados&lt;br /&gt;
#Definir las relaciones que hay entre los componentes&lt;br /&gt;
#Definir que interfaces requeridas o expuestas habrá&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:UML-diagrama de secuencia.jpg]]&lt;br /&gt;
&lt;br /&gt;
Como siempre, el objetivo de estos diagramas es servir como una herramienta para entender al sistema. Si el diagrama no resulta claro, no estaremos cumpliendo con uno de los motivos por el cual estamos modelando.  Es una buena práctica discutir los diagramas entre los que estén modelando el sistema.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Diseño Por Contrato]]&lt;br /&gt;
* [[Patrones De Diseño]]&lt;br /&gt;
* [[Interfaces De Usuario]]&lt;br /&gt;
* [[UML]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=UML&amp;diff=6348</id>
		<title>UML</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=UML&amp;diff=6348"/>
				<updated>2011-09-20T19:58:34Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Diagramas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Diseño De Software]]&lt;br /&gt;
Lenguaje Unificado de Modelado (UML, por sus siglas en inglés, Unified Modeling Language) es el lenguaje de modelado de sistemas de software más conocido y utilizado en la actualidad; está respaldado por el OMG (Object Management Group). Es un lenguaje gráfico para visualizar, especificar, construir y documentar un sistema de software. UML ofrece un estándar para describir un &amp;quot;plano&amp;quot; del sistema (modelo), incluyendo aspectos conceptuales tales como procesos de negocios y funciones del sistema, y aspectos concretos como expresiones de lenguajes de programación, esquemas de bases de datos y componentes de software reutilizables.&lt;br /&gt;
&lt;br /&gt;
==Diagramas==&lt;br /&gt;
En UML 2.0 hay 13 tipos diferentes de diagramas.&lt;br /&gt;
&lt;br /&gt;
Los '''Diagramas de Estructura''' enfatizan en los elementos que deben existir en el sistema modelado:&lt;br /&gt;
&lt;br /&gt;
*[[Diagrama de dominio]]&lt;br /&gt;
*[[Diagrama de clases]]&lt;br /&gt;
*[[Diagrama de componentes]]&lt;br /&gt;
*Diagrama de estructura compuesta (UML 2.0)&lt;br /&gt;
*Diagrama de despliegue&lt;br /&gt;
*Diagrama de paquetes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Los '''Diagramas de Comportamiento''' enfatizan en lo que debe suceder en el sistema modelado:&lt;br /&gt;
&lt;br /&gt;
*Diagrama de actividades&lt;br /&gt;
*[[Diagrama de casos de uso]]&lt;br /&gt;
*Diagrama de estados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Los '''Diagramas de Interacción''' son un subtipo de diagramas de comportamiento, que enfatiza sobre el flujo de control y de datos entre los elementos del sistema modelado:&lt;br /&gt;
&lt;br /&gt;
*[[Diagrama de secuencia]]&lt;br /&gt;
*Diagrama de colaboración&lt;br /&gt;
*Diagrama de tiempos (UML 2.0)&lt;br /&gt;
*Diagrama de vista de interacción (UML 2.0)&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Diseño De Software]]&lt;br /&gt;
* [http://es.wikipedia.org/wiki/Lenguaje_Unificado_de_Modelado UML en la Wikipedia ]&lt;br /&gt;
* [http://case-tools.org/uml.html Listado de herramientas UML]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=REST_con_Spring&amp;diff=6285</id>
		<title>REST con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=REST_con_Spring&amp;diff=6285"/>
				<updated>2011-09-07T13:49:14Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Manejo de errores */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Framework]] 3.x trae la posibilidad de crear servicios web REST de manera muy simple. &lt;br /&gt;
&lt;br /&gt;
== Un ejemplo ==&lt;br /&gt;
Vamos a realizar una aplicación que responda a las siguientes URL: &lt;br /&gt;
&lt;br /&gt;
 /persona/todos   : devuelve todas las personas&lt;br /&gt;
 /persona/123     : devuelve la persona cuyo id es 123&lt;br /&gt;
&lt;br /&gt;
Tendremos que seguir 3 pasos:&lt;br /&gt;
# Configurar el servlet de Spring&lt;br /&gt;
# Crear la clase que atenderá y resolverá estas peticiones&lt;br /&gt;
# Configurar Spring&lt;br /&gt;
&lt;br /&gt;
=== El servlet de Spring ===&lt;br /&gt;
Lo primero es configurar el servlet de Spring que se encargará de tomas las peticiones y redireccionarla a las clases correspondientes. La clase que se encarga de esto es ''org.springframework.web.servlet.DispatcherServlet''. Un archivo web.xml de ejemplo sería: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;web-app version=&amp;quot;2.5&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/javaee&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;display-name&amp;gt;json-con-spring-mvc&amp;lt;/display-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;filter&amp;gt;&lt;br /&gt;
        &amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;
        &amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;forceEncoding&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
    &amp;lt;/filter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Spring MVC Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;&lt;br /&gt;
			WEB-INF/applicationContext-clasico.xml&lt;br /&gt;
            &amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
        &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Spring MVC Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/app/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;session-config&amp;gt;&lt;br /&gt;
        &amp;lt;session-timeout&amp;gt;&lt;br /&gt;
            30&lt;br /&gt;
        &amp;lt;/session-timeout&amp;gt;&lt;br /&gt;
    &amp;lt;/session-config&amp;gt;&lt;br /&gt;
    &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
        &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
    &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
&amp;lt;/web-app&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este ejemplo, el servlet de Spring queda atendiendo todas las URL que empiecen con &amp;quot;/app&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
=== El controller ===&lt;br /&gt;
La clase que toma las peticiones HTTP es una clase Java anotada con @Controller. Esta clase asocia las URL con métodos. Los objetos que devuelven los métodos son luego procesador por conversores, que representan la respuesta de distinta manera (XML, JSON, etc.)&lt;br /&gt;
&lt;br /&gt;
Para esto, creamos una clase de la siguiente forma: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
package com.dosideas.jsonconspringmvc;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collection;&lt;br /&gt;
import org.springframework.stereotype.Controller;&lt;br /&gt;
import org.springframework.web.bind.annotation.PathVariable;&lt;br /&gt;
import org.springframework.web.bind.annotation.RequestBody;&lt;br /&gt;
import org.springframework.web.bind.annotation.RequestMapping;&lt;br /&gt;
import org.springframework.web.bind.annotation.ResponseBody;&lt;br /&gt;
&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona get(@PathVariable Long id) {&lt;br /&gt;
        Persona p = new Persona(&amp;quot;Invasor &amp;quot; + id, &amp;quot;Zim &amp;quot; + id);&lt;br /&gt;
        return p;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/todos&amp;quot;)&lt;br /&gt;
    public @ResponseBody Collection&amp;lt;Persona&amp;gt; getTodos() {&lt;br /&gt;
        Collection&amp;lt;Persona&amp;gt; personas = new ArrayList&amp;lt;Persona&amp;gt;();&lt;br /&gt;
        for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
            Persona p = new Persona(&amp;quot;Invasor &amp;quot; + i, &amp;quot;Zim&amp;quot; + i);&lt;br /&gt;
            personas.add(p);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return personas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El objeto Persona es un POJO que tiene dos atributos: nombre y apellido. Los tags @RequestMapping se encargan de asociar la clase y cada uno de sus métodos con una URL en particular. &lt;br /&gt;
&lt;br /&gt;
=== La configuración ===&lt;br /&gt;
Lo último que nos queda configurar es Spring con un archivo clásico (el cual es referenciado por el servlet):  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;br /&gt;
       xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;
       xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;
       xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;
       xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;context:component-scan base-package=&amp;quot;com.dosideas.jsonconspringmvc&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mvc:annotation-driven /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El tag ''mvc:annotation-driven'' se encarga de configurar automáticamente para emepezar a recibir y responder peticiones usando los controladores encontrados. &lt;br /&gt;
&lt;br /&gt;
Más aún, la configuración predeterminada se encarga de realizar [http://en.wikipedia.org/wiki/Content_negotiation negociación de contenido]: la respuesta se formatea de acuerdo a las capacidades del cliente. Por ejemplo, si en el classpath tenemos agregado las librerías de Jackson (un parser JSON), se habilitará el soporte JSON correspondiente. Si están agregadas las librerías de JAXB2, se habilitará el soporte XML. &lt;br /&gt;
&lt;br /&gt;
=== Probando ===&lt;br /&gt;
Podemos crear una prueba [[JUnit]] para acceder a nuestro servicio: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
package com.dosideas.jsonconspringmvc;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import org.apache.commons.httpclient.methods.GetMethod;&lt;br /&gt;
import org.apache.commons.httpclient.HttpMethod;&lt;br /&gt;
import org.apache.commons.httpclient.HttpClient;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
&lt;br /&gt;
public class HttpTest {&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaTodosJSON() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/todos&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;[{\&amp;quot;&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaPorIdJSON() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/34421&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;{\&amp;quot;&amp;quot;));&lt;br /&gt;
        assertTrue(resultado.contains(&amp;quot;34421&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaPorIdXML() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/34421&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/xml&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;&amp;quot;));&lt;br /&gt;
        assertTrue(resultado.contains(&amp;quot;34421&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manejo de errores ==&lt;br /&gt;
Es posible personalizar las excepciones para que devuelvan códigos de estado HTTP personalizados, usando la anotación @ResponseStatus en la excepción lanzada. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason=&amp;quot;No se encontró el recurso pedido&amp;quot;)&lt;br /&gt;
public class NotFoundException extends RuntimeException { ... }&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/id/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona findById(@PathVariable long id) {&lt;br /&gt;
       Contact contact = personaService.findById(id);&lt;br /&gt;
       if (contact == null) {&lt;br /&gt;
           throw new NotFoundException();&lt;br /&gt;
       } else {&lt;br /&gt;
           return contact;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Otra forma de personalizar las excepciones, es interceptar las excepciones del controller(@Controller) y personalizarla en el mismo controller. &lt;br /&gt;
Para esto debemos crear un método handleException por cada excepción que deseemos personalizar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/id/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona findById(@PathVariable long id) {&lt;br /&gt;
       Contact contact = personaService.findById(id);&lt;br /&gt;
       if (contact == null) {&lt;br /&gt;
           throw new NotFoundException();&lt;br /&gt;
       } else {&lt;br /&gt;
           return contact;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @ResponseStatus(HttpStatus.NOT_FOUND)&lt;br /&gt;
    @ExceptionHandler(NotFoundException.class)&lt;br /&gt;
    @ResponseBody&lt;br /&gt;
    public Map&amp;lt;String, String&amp;gt; handleException(NotFoundException exception) {&lt;br /&gt;
        return Collections.singletonMap(&amp;quot;message&amp;quot;, &amp;quot;No se encontró el recurso pedido&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y agregar lo siguiente en el applicationContext.xml&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;br /&gt;
       xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;
       xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;
       xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;
       xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;context:component-scan base-package=&amp;quot;com.dosideas.jsonconspringmvc&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mvc:annotation-driven /&amp;gt;&lt;br /&gt;
    &amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
	    &amp;lt;list&amp;gt;&lt;br /&gt;
	        &amp;lt;bean class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot; /&amp;gt;&lt;br /&gt;
	    &amp;lt;/list&amp;gt;&lt;br /&gt;
	&amp;lt;/property&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Al utilizar este interceptor se debe personalizar las excepciones en todos los controladores, caso contrario la excepción no es customizada y retorna un status code 500.&lt;br /&gt;
La propiedad &amp;quot;messageConverters&amp;quot;, define que conversor utilizar en el ResponseBody, en nuestro caso lo estamos pasando a Json.&lt;br /&gt;
&lt;br /&gt;
En caso de que se quiera utilizar los 2 métodos, el de @ResponseStatus y el de @ExceptionHandler, se deben registrar los 2 Handler en el applicationContext.xml con el orden de ejecución.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;order&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;list&amp;gt;&lt;br /&gt;
            &amp;lt;bean class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;order&amp;quot; value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manejo de la respuesta ==&lt;br /&gt;
La anotación @ResponseStatus puede usarse para personalizar el código HTTP de cualquier respuesta, al ubicarla en el método. &lt;br /&gt;
Por ejemplo, los métodos que devuelven void pueden usar esta anotación para indicar que no hay contenido (es útil si, por ejemplo, se parsea el contenido con algunas librerías como [[JQuery]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/delete/{id}&amp;quot;)&lt;br /&gt;
    @ResponseStatus(HttpStatus.NO_CONTENT)&lt;br /&gt;
    public void delete(@PathVariable long id) {&lt;br /&gt;
        contactService.delete(id);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Descargar un proyecto de ejemplo ===&lt;br /&gt;
Les dejamos para [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=41%3Ap descargar un proyecto de ejemplo de REST con Spring MVC] donde tienen todos los fuentes necesarios para abrir y ejecutar el ejemplo de esta página.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=41%3Ap Descargar un proyecto de ejemplo]&lt;br /&gt;
* [http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch18.html Creating Restful services - Documentación oficial]&lt;br /&gt;
* [http://www.informit.com/guides/content.aspx?g=java&amp;amp;seqNum=544 Creating Restful web services]&lt;br /&gt;
* [http://www.ibm.com/developerworks/web/library/wa-spring3webserv/index.html?ca=drs- Building RESTful web services using Spring 3]&lt;br /&gt;
* [http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=springRestJson Spring + REST + JSON = SOAUI]&lt;br /&gt;
* [http://www.jpalace.org/docs/spring/rest.html Sprint REST Tutorial]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=REST_con_Spring&amp;diff=6284</id>
		<title>REST con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=REST_con_Spring&amp;diff=6284"/>
				<updated>2011-09-07T13:47:25Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Manejo de errores */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Framework]] 3.x trae la posibilidad de crear servicios web REST de manera muy simple. &lt;br /&gt;
&lt;br /&gt;
== Un ejemplo ==&lt;br /&gt;
Vamos a realizar una aplicación que responda a las siguientes URL: &lt;br /&gt;
&lt;br /&gt;
 /persona/todos   : devuelve todas las personas&lt;br /&gt;
 /persona/123     : devuelve la persona cuyo id es 123&lt;br /&gt;
&lt;br /&gt;
Tendremos que seguir 3 pasos:&lt;br /&gt;
# Configurar el servlet de Spring&lt;br /&gt;
# Crear la clase que atenderá y resolverá estas peticiones&lt;br /&gt;
# Configurar Spring&lt;br /&gt;
&lt;br /&gt;
=== El servlet de Spring ===&lt;br /&gt;
Lo primero es configurar el servlet de Spring que se encargará de tomas las peticiones y redireccionarla a las clases correspondientes. La clase que se encarga de esto es ''org.springframework.web.servlet.DispatcherServlet''. Un archivo web.xml de ejemplo sería: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;web-app version=&amp;quot;2.5&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/javaee&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;display-name&amp;gt;json-con-spring-mvc&amp;lt;/display-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;filter&amp;gt;&lt;br /&gt;
        &amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;
        &amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;forceEncoding&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
    &amp;lt;/filter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Spring MVC Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;&lt;br /&gt;
			WEB-INF/applicationContext-clasico.xml&lt;br /&gt;
            &amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
        &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Spring MVC Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/app/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;session-config&amp;gt;&lt;br /&gt;
        &amp;lt;session-timeout&amp;gt;&lt;br /&gt;
            30&lt;br /&gt;
        &amp;lt;/session-timeout&amp;gt;&lt;br /&gt;
    &amp;lt;/session-config&amp;gt;&lt;br /&gt;
    &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
        &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
    &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
&amp;lt;/web-app&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este ejemplo, el servlet de Spring queda atendiendo todas las URL que empiecen con &amp;quot;/app&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
=== El controller ===&lt;br /&gt;
La clase que toma las peticiones HTTP es una clase Java anotada con @Controller. Esta clase asocia las URL con métodos. Los objetos que devuelven los métodos son luego procesador por conversores, que representan la respuesta de distinta manera (XML, JSON, etc.)&lt;br /&gt;
&lt;br /&gt;
Para esto, creamos una clase de la siguiente forma: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
package com.dosideas.jsonconspringmvc;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collection;&lt;br /&gt;
import org.springframework.stereotype.Controller;&lt;br /&gt;
import org.springframework.web.bind.annotation.PathVariable;&lt;br /&gt;
import org.springframework.web.bind.annotation.RequestBody;&lt;br /&gt;
import org.springframework.web.bind.annotation.RequestMapping;&lt;br /&gt;
import org.springframework.web.bind.annotation.ResponseBody;&lt;br /&gt;
&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona get(@PathVariable Long id) {&lt;br /&gt;
        Persona p = new Persona(&amp;quot;Invasor &amp;quot; + id, &amp;quot;Zim &amp;quot; + id);&lt;br /&gt;
        return p;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/todos&amp;quot;)&lt;br /&gt;
    public @ResponseBody Collection&amp;lt;Persona&amp;gt; getTodos() {&lt;br /&gt;
        Collection&amp;lt;Persona&amp;gt; personas = new ArrayList&amp;lt;Persona&amp;gt;();&lt;br /&gt;
        for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
            Persona p = new Persona(&amp;quot;Invasor &amp;quot; + i, &amp;quot;Zim&amp;quot; + i);&lt;br /&gt;
            personas.add(p);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return personas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El objeto Persona es un POJO que tiene dos atributos: nombre y apellido. Los tags @RequestMapping se encargan de asociar la clase y cada uno de sus métodos con una URL en particular. &lt;br /&gt;
&lt;br /&gt;
=== La configuración ===&lt;br /&gt;
Lo último que nos queda configurar es Spring con un archivo clásico (el cual es referenciado por el servlet):  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;br /&gt;
       xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;
       xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;
       xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;
       xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;context:component-scan base-package=&amp;quot;com.dosideas.jsonconspringmvc&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mvc:annotation-driven /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El tag ''mvc:annotation-driven'' se encarga de configurar automáticamente para emepezar a recibir y responder peticiones usando los controladores encontrados. &lt;br /&gt;
&lt;br /&gt;
Más aún, la configuración predeterminada se encarga de realizar [http://en.wikipedia.org/wiki/Content_negotiation negociación de contenido]: la respuesta se formatea de acuerdo a las capacidades del cliente. Por ejemplo, si en el classpath tenemos agregado las librerías de Jackson (un parser JSON), se habilitará el soporte JSON correspondiente. Si están agregadas las librerías de JAXB2, se habilitará el soporte XML. &lt;br /&gt;
&lt;br /&gt;
=== Probando ===&lt;br /&gt;
Podemos crear una prueba [[JUnit]] para acceder a nuestro servicio: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
package com.dosideas.jsonconspringmvc;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import org.apache.commons.httpclient.methods.GetMethod;&lt;br /&gt;
import org.apache.commons.httpclient.HttpMethod;&lt;br /&gt;
import org.apache.commons.httpclient.HttpClient;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
&lt;br /&gt;
public class HttpTest {&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaTodosJSON() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/todos&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;[{\&amp;quot;&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaPorIdJSON() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/34421&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;{\&amp;quot;&amp;quot;));&lt;br /&gt;
        assertTrue(resultado.contains(&amp;quot;34421&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaPorIdXML() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/34421&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/xml&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;&amp;quot;));&lt;br /&gt;
        assertTrue(resultado.contains(&amp;quot;34421&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manejo de errores ==&lt;br /&gt;
Es posible personalizar las excepciones para que devuelvan códigos de estado HTTP personalizados, usando la anotación @ResponseStatus en la excepción lanzada. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason=&amp;quot;No se encontró el recurso pedido&amp;quot;)&lt;br /&gt;
public class NotFoundException extends RuntimeException { ... }&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/id/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona findById(@PathVariable long id) {&lt;br /&gt;
       Contact contact = personaService.findById(id);&lt;br /&gt;
       if (contact == null) {&lt;br /&gt;
           throw new NotFoundException();&lt;br /&gt;
       } else {&lt;br /&gt;
           return contact;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Otra forma de personalizar las excepciones, es interceptar las excepciones del controller(@Controller) y personalizarla en el mismo controller. &lt;br /&gt;
Para esto debemos crear un método handleException por cada excepción que deseemos personalizar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/id/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona findById(@PathVariable long id) {&lt;br /&gt;
       Contact contact = personaService.findById(id);&lt;br /&gt;
       if (contact == null) {&lt;br /&gt;
           throw new NotFoundException();&lt;br /&gt;
       } else {&lt;br /&gt;
           return contact;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @ResponseStatus(HttpStatus.NOT_FOUND)&lt;br /&gt;
    @ExceptionHandler(NotFoundException.class)&lt;br /&gt;
    @ResponseBody&lt;br /&gt;
    public Map&amp;lt;String, String&amp;gt; handleException(NotFoundException exception) {&lt;br /&gt;
        return Collections.singletonMap(&amp;quot;message&amp;quot;, &amp;quot;No se encontró el recurso pedido&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y agregar lo siguiente en el applicationContext.xml&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;br /&gt;
       xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;
       xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;
       xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;
       xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;context:component-scan base-package=&amp;quot;com.dosideas.jsonconspringmvc&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mvc:annotation-driven /&amp;gt;&lt;br /&gt;
    &amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
	    &amp;lt;list&amp;gt;&lt;br /&gt;
	        &amp;lt;bean class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot; /&amp;gt;&lt;br /&gt;
	    &amp;lt;/list&amp;gt;&lt;br /&gt;
	&amp;lt;/property&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Al utilizar este interceptor se debe personalizar las excepciones en todos los controladores, caso contrario la excepción no es customizada y retorna un status code 500.&lt;br /&gt;
La propiedad &amp;quot;messageConverters&amp;quot;, define que conversor utilizar en el ResponseBody, en nuestro caso lo estamos pasando a Json.&lt;br /&gt;
&lt;br /&gt;
En caso de que se quiera utilizar los 2 métodos, el de @ResponseStatus y el de @ExceptionHandler, se deben registrar los 2 Handler en el applicationContext.xml con el orden de ejecucion.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;order&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;list&amp;gt;&lt;br /&gt;
            &amp;lt;bean class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;order&amp;quot; value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manejo de la respuesta ==&lt;br /&gt;
La anotación @ResponseStatus puede usarse para personalizar el código HTTP de cualquier respuesta, al ubicarla en el método. &lt;br /&gt;
Por ejemplo, los métodos que devuelven void pueden usar esta anotación para indicar que no hay contenido (es útil si, por ejemplo, se parsea el contenido con algunas librerías como [[JQuery]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/delete/{id}&amp;quot;)&lt;br /&gt;
    @ResponseStatus(HttpStatus.NO_CONTENT)&lt;br /&gt;
    public void delete(@PathVariable long id) {&lt;br /&gt;
        contactService.delete(id);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Descargar un proyecto de ejemplo ===&lt;br /&gt;
Les dejamos para [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=41%3Ap descargar un proyecto de ejemplo de REST con Spring MVC] donde tienen todos los fuentes necesarios para abrir y ejecutar el ejemplo de esta página.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=41%3Ap Descargar un proyecto de ejemplo]&lt;br /&gt;
* [http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch18.html Creating Restful services - Documentación oficial]&lt;br /&gt;
* [http://www.informit.com/guides/content.aspx?g=java&amp;amp;seqNum=544 Creating Restful web services]&lt;br /&gt;
* [http://www.ibm.com/developerworks/web/library/wa-spring3webserv/index.html?ca=drs- Building RESTful web services using Spring 3]&lt;br /&gt;
* [http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=springRestJson Spring + REST + JSON = SOAUI]&lt;br /&gt;
* [http://www.jpalace.org/docs/spring/rest.html Sprint REST Tutorial]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=REST_con_Spring&amp;diff=6283</id>
		<title>REST con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=REST_con_Spring&amp;diff=6283"/>
				<updated>2011-09-07T13:43:46Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Manejo de errores */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Framework]] 3.x trae la posibilidad de crear servicios web REST de manera muy simple. &lt;br /&gt;
&lt;br /&gt;
== Un ejemplo ==&lt;br /&gt;
Vamos a realizar una aplicación que responda a las siguientes URL: &lt;br /&gt;
&lt;br /&gt;
 /persona/todos   : devuelve todas las personas&lt;br /&gt;
 /persona/123     : devuelve la persona cuyo id es 123&lt;br /&gt;
&lt;br /&gt;
Tendremos que seguir 3 pasos:&lt;br /&gt;
# Configurar el servlet de Spring&lt;br /&gt;
# Crear la clase que atenderá y resolverá estas peticiones&lt;br /&gt;
# Configurar Spring&lt;br /&gt;
&lt;br /&gt;
=== El servlet de Spring ===&lt;br /&gt;
Lo primero es configurar el servlet de Spring que se encargará de tomas las peticiones y redireccionarla a las clases correspondientes. La clase que se encarga de esto es ''org.springframework.web.servlet.DispatcherServlet''. Un archivo web.xml de ejemplo sería: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;web-app version=&amp;quot;2.5&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/javaee&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;display-name&amp;gt;json-con-spring-mvc&amp;lt;/display-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;filter&amp;gt;&lt;br /&gt;
        &amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;
        &amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;forceEncoding&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
    &amp;lt;/filter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Spring MVC Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;&lt;br /&gt;
			WEB-INF/applicationContext-clasico.xml&lt;br /&gt;
            &amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
        &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Spring MVC Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/app/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;session-config&amp;gt;&lt;br /&gt;
        &amp;lt;session-timeout&amp;gt;&lt;br /&gt;
            30&lt;br /&gt;
        &amp;lt;/session-timeout&amp;gt;&lt;br /&gt;
    &amp;lt;/session-config&amp;gt;&lt;br /&gt;
    &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
        &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
    &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
&amp;lt;/web-app&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este ejemplo, el servlet de Spring queda atendiendo todas las URL que empiecen con &amp;quot;/app&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
=== El controller ===&lt;br /&gt;
La clase que toma las peticiones HTTP es una clase Java anotada con @Controller. Esta clase asocia las URL con métodos. Los objetos que devuelven los métodos son luego procesador por conversores, que representan la respuesta de distinta manera (XML, JSON, etc.)&lt;br /&gt;
&lt;br /&gt;
Para esto, creamos una clase de la siguiente forma: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
package com.dosideas.jsonconspringmvc;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collection;&lt;br /&gt;
import org.springframework.stereotype.Controller;&lt;br /&gt;
import org.springframework.web.bind.annotation.PathVariable;&lt;br /&gt;
import org.springframework.web.bind.annotation.RequestBody;&lt;br /&gt;
import org.springframework.web.bind.annotation.RequestMapping;&lt;br /&gt;
import org.springframework.web.bind.annotation.ResponseBody;&lt;br /&gt;
&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona get(@PathVariable Long id) {&lt;br /&gt;
        Persona p = new Persona(&amp;quot;Invasor &amp;quot; + id, &amp;quot;Zim &amp;quot; + id);&lt;br /&gt;
        return p;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/todos&amp;quot;)&lt;br /&gt;
    public @ResponseBody Collection&amp;lt;Persona&amp;gt; getTodos() {&lt;br /&gt;
        Collection&amp;lt;Persona&amp;gt; personas = new ArrayList&amp;lt;Persona&amp;gt;();&lt;br /&gt;
        for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
            Persona p = new Persona(&amp;quot;Invasor &amp;quot; + i, &amp;quot;Zim&amp;quot; + i);&lt;br /&gt;
            personas.add(p);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return personas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El objeto Persona es un POJO que tiene dos atributos: nombre y apellido. Los tags @RequestMapping se encargan de asociar la clase y cada uno de sus métodos con una URL en particular. &lt;br /&gt;
&lt;br /&gt;
=== La configuración ===&lt;br /&gt;
Lo último que nos queda configurar es Spring con un archivo clásico (el cual es referenciado por el servlet):  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;br /&gt;
       xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;
       xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;
       xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;
       xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;context:component-scan base-package=&amp;quot;com.dosideas.jsonconspringmvc&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mvc:annotation-driven /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El tag ''mvc:annotation-driven'' se encarga de configurar automáticamente para emepezar a recibir y responder peticiones usando los controladores encontrados. &lt;br /&gt;
&lt;br /&gt;
Más aún, la configuración predeterminada se encarga de realizar [http://en.wikipedia.org/wiki/Content_negotiation negociación de contenido]: la respuesta se formatea de acuerdo a las capacidades del cliente. Por ejemplo, si en el classpath tenemos agregado las librerías de Jackson (un parser JSON), se habilitará el soporte JSON correspondiente. Si están agregadas las librerías de JAXB2, se habilitará el soporte XML. &lt;br /&gt;
&lt;br /&gt;
=== Probando ===&lt;br /&gt;
Podemos crear una prueba [[JUnit]] para acceder a nuestro servicio: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
package com.dosideas.jsonconspringmvc;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import org.apache.commons.httpclient.methods.GetMethod;&lt;br /&gt;
import org.apache.commons.httpclient.HttpMethod;&lt;br /&gt;
import org.apache.commons.httpclient.HttpClient;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
&lt;br /&gt;
public class HttpTest {&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaTodosJSON() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/todos&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;[{\&amp;quot;&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaPorIdJSON() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/34421&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;{\&amp;quot;&amp;quot;));&lt;br /&gt;
        assertTrue(resultado.contains(&amp;quot;34421&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaPorIdXML() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/34421&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/xml&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;&amp;quot;));&lt;br /&gt;
        assertTrue(resultado.contains(&amp;quot;34421&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manejo de errores ==&lt;br /&gt;
Es posible personalizar las excepciones para que devuelvan códigos de estado HTTP personalizados, usando la anotación @ResponseStatus en la excepción lanzada. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason=&amp;quot;No se encontró el recurso pedido&amp;quot;)&lt;br /&gt;
public class NotFoundException extends RuntimeException { ... }&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/id/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona findById(@PathVariable long id) {&lt;br /&gt;
       Contact contact = personaService.findById(id);&lt;br /&gt;
       if (contact == null) {&lt;br /&gt;
           throw new NotFoundException();&lt;br /&gt;
       } else {&lt;br /&gt;
           return contact;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Otra forma de personalizar las excepciones, es interceptar las excepciones del controller(@Controller) y personalizarla en el mismo controller. &lt;br /&gt;
Para esto debemos crear un método handleException por cada excepción que deseemos personalizar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/id/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona findById(@PathVariable long id) {&lt;br /&gt;
       Contact contact = personaService.findById(id);&lt;br /&gt;
       if (contact == null) {&lt;br /&gt;
           throw new NotFoundException();&lt;br /&gt;
       } else {&lt;br /&gt;
           return contact;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @ResponseStatus(HttpStatus.NOT_FOUND)&lt;br /&gt;
    @ExceptionHandler(NotFoundException.class)&lt;br /&gt;
    @ResponseBody&lt;br /&gt;
    public Map&amp;lt;String, String&amp;gt; handleException(NotFoundException exception) {&lt;br /&gt;
        return Collections.singletonMap(&amp;quot;message&amp;quot;, &amp;quot;No se encontró el recurso pedido&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y agregar lo siguiente en el applicationContext.xml&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;br /&gt;
       xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;
       xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;
       xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;
       xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;context:component-scan base-package=&amp;quot;com.dosideas.jsonconspringmvc&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mvc:annotation-driven /&amp;gt;&lt;br /&gt;
    &amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
	    &amp;lt;list&amp;gt;&lt;br /&gt;
	        &amp;lt;bean class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot; /&amp;gt;&lt;br /&gt;
	    &amp;lt;/list&amp;gt;&lt;br /&gt;
	&amp;lt;/property&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Al utilizar este interceptor se debe personalizar las excepciones en todos los controladores, caso contrario la excepción no es customizada y retorna un status code 500.&lt;br /&gt;
La propiedad &amp;quot;messageConverters&amp;quot;, define que conversor utilizar en el ResponseBody, en nuestro caso lo estamos pasando a Json.&lt;br /&gt;
&lt;br /&gt;
En caso de que se quiera utilizar los 2 métodos, el de @ResponseStatus y el de @ExceptionHandler, se debe registrar los 2 Handler en el applicationContext con el orden de ejecucion.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;order&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;list&amp;gt;&lt;br /&gt;
            &amp;lt;bean class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;order&amp;quot; value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manejo de la respuesta ==&lt;br /&gt;
La anotación @ResponseStatus puede usarse para personalizar el código HTTP de cualquier respuesta, al ubicarla en el método. &lt;br /&gt;
Por ejemplo, los métodos que devuelven void pueden usar esta anotación para indicar que no hay contenido (es útil si, por ejemplo, se parsea el contenido con algunas librerías como [[JQuery]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/delete/{id}&amp;quot;)&lt;br /&gt;
    @ResponseStatus(HttpStatus.NO_CONTENT)&lt;br /&gt;
    public void delete(@PathVariable long id) {&lt;br /&gt;
        contactService.delete(id);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Descargar un proyecto de ejemplo ===&lt;br /&gt;
Les dejamos para [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=41%3Ap descargar un proyecto de ejemplo de REST con Spring MVC] donde tienen todos los fuentes necesarios para abrir y ejecutar el ejemplo de esta página.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=41%3Ap Descargar un proyecto de ejemplo]&lt;br /&gt;
* [http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch18.html Creating Restful services - Documentación oficial]&lt;br /&gt;
* [http://www.informit.com/guides/content.aspx?g=java&amp;amp;seqNum=544 Creating Restful web services]&lt;br /&gt;
* [http://www.ibm.com/developerworks/web/library/wa-spring3webserv/index.html?ca=drs- Building RESTful web services using Spring 3]&lt;br /&gt;
* [http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=springRestJson Spring + REST + JSON = SOAUI]&lt;br /&gt;
* [http://www.jpalace.org/docs/spring/rest.html Sprint REST Tutorial]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=REST_con_Spring&amp;diff=6282</id>
		<title>REST con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=REST_con_Spring&amp;diff=6282"/>
				<updated>2011-09-07T13:40:35Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Manejo de errores */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Framework]] 3.x trae la posibilidad de crear servicios web REST de manera muy simple. &lt;br /&gt;
&lt;br /&gt;
== Un ejemplo ==&lt;br /&gt;
Vamos a realizar una aplicación que responda a las siguientes URL: &lt;br /&gt;
&lt;br /&gt;
 /persona/todos   : devuelve todas las personas&lt;br /&gt;
 /persona/123     : devuelve la persona cuyo id es 123&lt;br /&gt;
&lt;br /&gt;
Tendremos que seguir 3 pasos:&lt;br /&gt;
# Configurar el servlet de Spring&lt;br /&gt;
# Crear la clase que atenderá y resolverá estas peticiones&lt;br /&gt;
# Configurar Spring&lt;br /&gt;
&lt;br /&gt;
=== El servlet de Spring ===&lt;br /&gt;
Lo primero es configurar el servlet de Spring que se encargará de tomas las peticiones y redireccionarla a las clases correspondientes. La clase que se encarga de esto es ''org.springframework.web.servlet.DispatcherServlet''. Un archivo web.xml de ejemplo sería: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;web-app version=&amp;quot;2.5&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/javaee&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;display-name&amp;gt;json-con-spring-mvc&amp;lt;/display-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;filter&amp;gt;&lt;br /&gt;
        &amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;
        &amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;forceEncoding&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
    &amp;lt;/filter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Spring MVC Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;&lt;br /&gt;
			WEB-INF/applicationContext-clasico.xml&lt;br /&gt;
            &amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
        &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;Spring MVC Dispatcher Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;/app/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;session-config&amp;gt;&lt;br /&gt;
        &amp;lt;session-timeout&amp;gt;&lt;br /&gt;
            30&lt;br /&gt;
        &amp;lt;/session-timeout&amp;gt;&lt;br /&gt;
    &amp;lt;/session-config&amp;gt;&lt;br /&gt;
    &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
        &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
    &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
&amp;lt;/web-app&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este ejemplo, el servlet de Spring queda atendiendo todas las URL que empiecen con &amp;quot;/app&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
=== El controller ===&lt;br /&gt;
La clase que toma las peticiones HTTP es una clase Java anotada con @Controller. Esta clase asocia las URL con métodos. Los objetos que devuelven los métodos son luego procesador por conversores, que representan la respuesta de distinta manera (XML, JSON, etc.)&lt;br /&gt;
&lt;br /&gt;
Para esto, creamos una clase de la siguiente forma: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
package com.dosideas.jsonconspringmvc;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collection;&lt;br /&gt;
import org.springframework.stereotype.Controller;&lt;br /&gt;
import org.springframework.web.bind.annotation.PathVariable;&lt;br /&gt;
import org.springframework.web.bind.annotation.RequestBody;&lt;br /&gt;
import org.springframework.web.bind.annotation.RequestMapping;&lt;br /&gt;
import org.springframework.web.bind.annotation.ResponseBody;&lt;br /&gt;
&lt;br /&gt;
@Controller&lt;br /&gt;
@RequestMapping(value=&amp;quot;/persona&amp;quot;)&lt;br /&gt;
public class PersonaController {&lt;br /&gt;
&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona get(@PathVariable Long id) {&lt;br /&gt;
        Persona p = new Persona(&amp;quot;Invasor &amp;quot; + id, &amp;quot;Zim &amp;quot; + id);&lt;br /&gt;
        return p;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/todos&amp;quot;)&lt;br /&gt;
    public @ResponseBody Collection&amp;lt;Persona&amp;gt; getTodos() {&lt;br /&gt;
        Collection&amp;lt;Persona&amp;gt; personas = new ArrayList&amp;lt;Persona&amp;gt;();&lt;br /&gt;
        for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
            Persona p = new Persona(&amp;quot;Invasor &amp;quot; + i, &amp;quot;Zim&amp;quot; + i);&lt;br /&gt;
            personas.add(p);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return personas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El objeto Persona es un POJO que tiene dos atributos: nombre y apellido. Los tags @RequestMapping se encargan de asociar la clase y cada uno de sus métodos con una URL en particular. &lt;br /&gt;
&lt;br /&gt;
=== La configuración ===&lt;br /&gt;
Lo último que nos queda configurar es Spring con un archivo clásico (el cual es referenciado por el servlet):  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;br /&gt;
       xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;
       xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;
       xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;
       xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;context:component-scan base-package=&amp;quot;com.dosideas.jsonconspringmvc&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mvc:annotation-driven /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El tag ''mvc:annotation-driven'' se encarga de configurar automáticamente para emepezar a recibir y responder peticiones usando los controladores encontrados. &lt;br /&gt;
&lt;br /&gt;
Más aún, la configuración predeterminada se encarga de realizar [http://en.wikipedia.org/wiki/Content_negotiation negociación de contenido]: la respuesta se formatea de acuerdo a las capacidades del cliente. Por ejemplo, si en el classpath tenemos agregado las librerías de Jackson (un parser JSON), se habilitará el soporte JSON correspondiente. Si están agregadas las librerías de JAXB2, se habilitará el soporte XML. &lt;br /&gt;
&lt;br /&gt;
=== Probando ===&lt;br /&gt;
Podemos crear una prueba [[JUnit]] para acceder a nuestro servicio: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
package com.dosideas.jsonconspringmvc;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import org.apache.commons.httpclient.methods.GetMethod;&lt;br /&gt;
import org.apache.commons.httpclient.HttpMethod;&lt;br /&gt;
import org.apache.commons.httpclient.HttpClient;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
&lt;br /&gt;
public class HttpTest {&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaTodosJSON() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/todos&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;[{\&amp;quot;&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaPorIdJSON() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/34421&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;{\&amp;quot;&amp;quot;));&lt;br /&gt;
        assertTrue(resultado.contains(&amp;quot;34421&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void personaPorIdXML() throws IOException {&lt;br /&gt;
        HttpClient httpclient = new HttpClient();&lt;br /&gt;
        HttpMethod method = new GetMethod(&amp;quot;http://localhost:8084/json-con-spring-mvc/app/persona/34421&amp;quot;);&lt;br /&gt;
        method.addRequestHeader(&amp;quot;accept&amp;quot;, &amp;quot;application/xml&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        httpclient.executeMethod(method);&lt;br /&gt;
        String resultado = method.getResponseBodyAsString();&lt;br /&gt;
        System.out.println(resultado);&lt;br /&gt;
&lt;br /&gt;
        assertNotNull(resultado);&lt;br /&gt;
        assertTrue(resultado.startsWith(&amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;&amp;quot;));&lt;br /&gt;
        assertTrue(resultado.contains(&amp;quot;34421&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manejo de errores ==&lt;br /&gt;
Es posible personalizar las excepciones para que devuelvan códigos de estado HTTP personalizados, usando la anotación @ResponseStatus en la excepción lanzada. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason=&amp;quot;No se encontró el recurso pedido&amp;quot;)&lt;br /&gt;
public class NotFoundException extends RuntimeException { ... }&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/id/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona findById(@PathVariable long id) {&lt;br /&gt;
       Contact contact = personaService.findById(id);&lt;br /&gt;
       if (contact == null) {&lt;br /&gt;
           throw new NotFoundException();&lt;br /&gt;
       } else {&lt;br /&gt;
           return contact;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Otra forma de personalizar las excepciones, es interceptar las excepciones del controller(@Controller) y personalizarla en el mismo controller. &lt;br /&gt;
Para esto debemos crear un método handleException por cada excepción que deseemos personalizar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/id/{id}&amp;quot;)&lt;br /&gt;
    public @ResponseBody Persona findById(@PathVariable long id) {&lt;br /&gt;
       Contact contact = personaService.findById(id);&lt;br /&gt;
       if (contact == null) {&lt;br /&gt;
           throw new NotFoundException();&lt;br /&gt;
       } else {&lt;br /&gt;
           return contact;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @ResponseStatus(HttpStatus.NOT_FOUND)&lt;br /&gt;
    @ExceptionHandler(NotFoundException.class)&lt;br /&gt;
    @ResponseBody&lt;br /&gt;
    public Map&amp;lt;String, String&amp;gt; handleException(NotFoundException exception) {&lt;br /&gt;
        return Collections.singletonMap(&amp;quot;message&amp;quot;, &amp;quot;No se encontró el recurso pedido&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y agregar lo siguiente en el applicationContext.xml&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
       xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
       xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;br /&gt;
       xmlns:aop=&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;br /&gt;
       xmlns:tx=&amp;quot;http://www.springframework.org/schema/tx&amp;quot;&lt;br /&gt;
       xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;br /&gt;
       xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&amp;quot;&lt;br /&gt;
       xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&lt;br /&gt;
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;context:component-scan base-package=&amp;quot;com.dosideas.jsonconspringmvc&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;mvc:annotation-driven /&amp;gt;&lt;br /&gt;
    &amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
	    &amp;lt;list&amp;gt;&lt;br /&gt;
	        &amp;lt;bean class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot; /&amp;gt;&lt;br /&gt;
	    &amp;lt;/list&amp;gt;&lt;br /&gt;
	&amp;lt;/property&amp;gt;&lt;br /&gt;
    &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Al utilizar este interceptor se debe personalizar las excepciones en todos los controladores, caso contrario la excepción no es customizada y retorna un status code 500.&lt;br /&gt;
En caso de que se quiera utilizar los 2 métodos, el de @ResponseStatus y el de @ExceptionHandler, se debe registrar los 2 Handler en el applicationContext con el orden de ejecucion.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;order&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;messageConverters&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;list&amp;gt;&lt;br /&gt;
            &amp;lt;bean class=&amp;quot;org.springframework.http.converter.json.MappingJacksonHttpMessageConverter&amp;quot; /&amp;gt;&lt;br /&gt;
       &amp;lt;/list&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;order&amp;quot; value=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manejo de la respuesta ==&lt;br /&gt;
La anotación @ResponseStatus puede usarse para personalizar el código HTTP de cualquier respuesta, al ubicarla en el método. &lt;br /&gt;
Por ejemplo, los métodos que devuelven void pueden usar esta anotación para indicar que no hay contenido (es útil si, por ejemplo, se parsea el contenido con algunas librerías como [[JQuery]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
    @RequestMapping(value=&amp;quot;/delete/{id}&amp;quot;)&lt;br /&gt;
    @ResponseStatus(HttpStatus.NO_CONTENT)&lt;br /&gt;
    public void delete(@PathVariable long id) {&lt;br /&gt;
        contactService.delete(id);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Descargar un proyecto de ejemplo ===&lt;br /&gt;
Les dejamos para [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=41%3Ap descargar un proyecto de ejemplo de REST con Spring MVC] donde tienen todos los fuentes necesarios para abrir y ejecutar el ejemplo de esta página.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=41%3Ap Descargar un proyecto de ejemplo]&lt;br /&gt;
* [http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch18.html Creating Restful services - Documentación oficial]&lt;br /&gt;
* [http://www.informit.com/guides/content.aspx?g=java&amp;amp;seqNum=544 Creating Restful web services]&lt;br /&gt;
* [http://www.ibm.com/developerworks/web/library/wa-spring3webserv/index.html?ca=drs- Building RESTful web services using Spring 3]&lt;br /&gt;
* [http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=springRestJson Spring + REST + JSON = SOAUI]&lt;br /&gt;
* [http://www.jpalace.org/docs/spring/rest.html Sprint REST Tutorial]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=UML&amp;diff=6104</id>
		<title>UML</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=UML&amp;diff=6104"/>
				<updated>2011-09-02T14:51:17Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Diagramas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Diseño De Software]]&lt;br /&gt;
Lenguaje Unificado de Modelado (UML, por sus siglas en inglés, Unified Modeling Language) es el lenguaje de modelado de sistemas de software más conocido y utilizado en la actualidad; está respaldado por el OMG (Object Management Group). Es un lenguaje gráfico para visualizar, especificar, construir y documentar un sistema de software. UML ofrece un estándar para describir un &amp;quot;plano&amp;quot; del sistema (modelo), incluyendo aspectos conceptuales tales como procesos de negocios y funciones del sistema, y aspectos concretos como expresiones de lenguajes de programación, esquemas de bases de datos y componentes de software reutilizables.&lt;br /&gt;
&lt;br /&gt;
==Diagramas==&lt;br /&gt;
En UML 2.0 hay 13 tipos diferentes de diagramas.&lt;br /&gt;
&lt;br /&gt;
Los '''Diagramas de Estructura''' enfatizan en los elementos que deben existir en el sistema modelado:&lt;br /&gt;
&lt;br /&gt;
*[[Diagrama de dominio]]&lt;br /&gt;
*Diagrama de clases&lt;br /&gt;
*Diagrama de componentes&lt;br /&gt;
*Diagrama de estructura compuesta (UML 2.0)&lt;br /&gt;
*Diagrama de despliegue&lt;br /&gt;
*Diagrama de paquetes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Los '''Diagramas de Comportamiento''' enfatizan en lo que debe suceder en el sistema modelado:&lt;br /&gt;
&lt;br /&gt;
*Diagrama de actividades&lt;br /&gt;
*[[Diagrama de casos de uso]]&lt;br /&gt;
*Diagrama de estados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Los '''Diagramas de Interacción''' son un subtipo de diagramas de comportamiento, que enfatiza sobre el flujo de control y de datos entre los elementos del sistema modelado:&lt;br /&gt;
&lt;br /&gt;
*[[Diagrama de secuencia]]&lt;br /&gt;
*Diagrama de colaboración&lt;br /&gt;
*Diagrama de tiempos (UML 2.0)&lt;br /&gt;
*Diagrama de vista de interacción (UML 2.0)&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Diseño De Software]]&lt;br /&gt;
* [http://es.wikipedia.org/wiki/Lenguaje_Unificado_de_Modelado UML en la Wikipedia ]&lt;br /&gt;
* [http://case-tools.org/uml.html Listado de herramientas UML]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6103</id>
		<title>Test de javascript con QUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6103"/>
				<updated>2011-08-31T15:13:36Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ¿Qué es QUnit? ==&lt;br /&gt;
&lt;br /&gt;
QUnit es una potente herramienta para testear javascript. &lt;br /&gt;
&lt;br /&gt;
== Escribir test unitarios con QUnit  ==&lt;br /&gt;
&lt;br /&gt;
Lo primero que se debe hacer es configurar el ambiente de test. &lt;br /&gt;
&lt;br /&gt;
Para utilizar QUnit se deben usar los siguientes archivos: qunit.js y qunit.css. El qunit.js es un script con la libreria, y el qunit.css es una hoja de estilo y es opcional. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;http://github.com/jquery/QUnit/raw/master/QUnit/QUnit.css&amp;quot; media=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://github.com/jquery/QUnit/raw/master/QUnit/QUnit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Además de estos archivos, nuestras aplicaciones tienen que contar con una serie de etiquetas HTML donde se mostrarán los resultados de nuestros tests: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1 id=&amp;quot;QUnit-header&amp;quot;&amp;gt;QUnit Test Suite&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;QUnit-banner&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;QUnit-testrunner-toolbar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;QUnit-userAgent&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ol id=&amp;quot;QUnit-tests&amp;quot;&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
A continuación se deja un ejemplo completo de un html donde se incluyen los archivos y las etiquetas html que necesita QUnit. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Dos Ideas - QUnit&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://code.jquery.com/qunit/git/qunit.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://code.jquery.com/qunit/git/qunit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;!-- Your source files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeas.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Your tests files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeasTest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1 id=&amp;quot;qunit-header&amp;quot;&amp;gt;QUnit example&amp;lt;/h1&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-banner&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-testrunner-toolbar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-userAgent&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;ol id=&amp;quot;qunit-tests&amp;quot;&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Any HTML you may require for your tests to work properly --&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-fixture&amp;quot;&amp;gt;test markup, will be hidden&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
El codigo que se va a testear debe estar en dosIdeas.js y los test en dosIdeasTest.js. Para correr los test simplemente se debe abrir el html en el browser. &lt;br /&gt;
&lt;br /&gt;
El archivo dosIdeasTest.js: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
&lt;br /&gt;
	module(&amp;quot;dosIdeasTest&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	test('probando validarImporte()', function() { &lt;br /&gt;
		ok(validarImporte(&amp;quot;1112&amp;quot;),'El importe es 1112'); &lt;br /&gt;
		ok(!validarImporte(&amp;quot;11A12&amp;quot;),'El importe es 11A12'); &lt;br /&gt;
		ok(!validarImporte(&amp;quot;A1112&amp;quot;),'El importe es A1112');&lt;br /&gt;
		ok(!validarImporte(&amp;quot;1112A&amp;quot;),'El importe es 1112A');&lt;br /&gt;
	}) &lt;br /&gt;
	&lt;br /&gt;
	test('probando extraerSubCadena()', function() { &lt;br /&gt;
		equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'Ideas'); &lt;br /&gt;
		equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'deas'); &lt;br /&gt;
	}) &lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; El archivo dosIdeas.js: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function validarImporte(importe) {&lt;br /&gt;
&lt;br /&gt;
        if (importe.length == 0) {&lt;br /&gt;
            return false;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (!/^[1-9][0-9]*(?:\.)?[0-9]?[0-9]?$/.test(importe.replace(',','.'))) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
function extraerSubCadena(cadena, posicionInicial, longitud)&lt;br /&gt;
{&lt;br /&gt;
	return cadena.substr(posicionInicial, longitud);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
El resultado de los test quedan de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
[[Image:DosIdeasQUnitResultado.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Asserts  ==&lt;br /&gt;
&lt;br /&gt;
Qunit nos provee de una serie de asserts para nuestros test. En el ejemplo anterior se hace mención de ok y equal. A continuación vamos a dar más detalle de los mismos y de nuevos.&lt;br /&gt;
&lt;br /&gt;
'''ok''':&lt;br /&gt;
Es para validar resultado booleanos (es el equivalente a assertTrue de JUnit). &lt;br /&gt;
&lt;br /&gt;
La sintaxis es la siguiente: ok(estado, mensaje).&lt;br /&gt;
&lt;br /&gt;
estado: es una expresión booleana a evaluar.&lt;br /&gt;
&lt;br /&gt;
mensaje: es el mensaje a mostrar cuando finaliza el assert.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
ok(validarImporte(&amp;quot;1112&amp;quot;),'El importe es 1112'); &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''equal''':&lt;br /&gt;
Valida que el resultado obtenido es igual al esperado (es similiar al assertEqual de JUnit). &lt;br /&gt;
&lt;br /&gt;
La sintaxis es la siguiente: equal(actual, esperado, mensaje)&lt;br /&gt;
&lt;br /&gt;
actual: es el objeto a evaluar.&lt;br /&gt;
&lt;br /&gt;
esperado: es el resultado esperado.&lt;br /&gt;
&lt;br /&gt;
mensaje: es el mensaje a mostrar cuando finaliza el assert.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'Ideas'); &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Integracion continua con Jenkins==&lt;br /&gt;
&lt;br /&gt;
Qunit-test-runner (QTR) es un proyecto que te permite integrar tus test de QUnit mediante una simple tarea ant.&lt;br /&gt;
&lt;br /&gt;
QTR provee un entorno de JavaScript dentro de una JVM para la ejecucion de los test de QUnit y el reporte de los resultados en un formato JUnit XML standard.&lt;br /&gt;
Por lo tanto, QTR permite una fácil integracion con los sistemas de CI (Integracion Continua) como Jenkins/Hudson, dando visibilidad inmediata de los test de QUnit junto a los test de JUnit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Bajar la libreria [http://code.google.com/p/qunit-test-runner/downloads/list qunit-test-runner-0.0.1-SNAPSHOT-jar-with-dependencies.jar] y agregarla en el classpath de Run Test (en Netbeans) del proyecto.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Generar un '''&amp;lt;nombre del Test&amp;gt;Recipe.js''' con la funcion loadFiles utilizada por QTR.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: pagoConTarjetaTestRecipe.js&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
 loadFiles([&lt;br /&gt;
   &amp;quot;../../siteApache/home/js/jquery-1.3.2.js&amp;quot;,&lt;br /&gt;
   &amp;quot;../../siteApache/home/js/validate.js&amp;quot;,  &lt;br /&gt;
   &amp;quot;../../siteApache/home/js/pagoConTarjeta.js&amp;quot;,&lt;br /&gt;
   &amp;quot;pagoConTarjetaTest.js&amp;quot;&lt;br /&gt;
 ])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Agregar las siguientes tareas ant al build.xml del proyecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;qunit&amp;quot; depends=&amp;quot;init&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;path id=&amp;quot;qunit-test-runner.path&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${basedir}&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;include name=&amp;quot;${file.reference.qunit-test-runner-0.0.1-SNAPSHOT-jar-with-dependencies.jar}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
    &amp;lt;taskdef classpathref=&amp;quot;qunit-test-runner.path&amp;quot; resource=&amp;quot;tasks.properties&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;target name=&amp;quot;report-jstest-pnt&amp;quot; depends=&amp;quot;qunit&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;mkdir dir=&amp;quot;${report.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;qunit basedirectory=&amp;quot;${basedir}/${test.javascript.dir}&amp;quot;&lt;br /&gt;
         reportdirectory=&amp;quot;${report.dir}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/qunit&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;!-- Create a JUnit report containing the QTR test results. --&amp;gt;&lt;br /&gt;
    &amp;lt;mkdir dir=&amp;quot;${report.dir}/html&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;junitreport todir=&amp;quot;${report.dir}/html&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;fileset dir=&amp;quot;${report.dir}&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;include name=&amp;quot;TEST-qunit-*.xml&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;report format=&amp;quot;frames&amp;quot; todir=&amp;quot;${report.dir}/html&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/junitreport&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Activar en el proyecto de Jenkins, la opcion publish HTML reports y apuntar al directorio donde se generan los reportes HTML a la pagina index.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ver también  ==&lt;br /&gt;
[http://docs.jquery.com/Qunit Página de QUnit]&lt;br /&gt;
[http://code.google.com/p/qunit-test-runner/ Página de QTR (proyecto Qunit-test-runner)]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6102</id>
		<title>Test de javascript con QUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6102"/>
				<updated>2011-08-31T15:11:52Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ¿Qué es QUnit? ==&lt;br /&gt;
&lt;br /&gt;
QUnit es una potente herramienta para testear javascript. &lt;br /&gt;
&lt;br /&gt;
== Escribir test unitarios con QUnit  ==&lt;br /&gt;
&lt;br /&gt;
Lo primero que se debe hacer es configurar el ambiente de test. &lt;br /&gt;
&lt;br /&gt;
Para utilizar QUnit se deben usar los siguientes archivos: qunit.js y qunit.css. El qunit.js es un script con la libreria, y el qunit.css es una hoja de estilo y es opcional. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;http://github.com/jquery/QUnit/raw/master/QUnit/QUnit.css&amp;quot; media=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://github.com/jquery/QUnit/raw/master/QUnit/QUnit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Además de estos archivos, nuestras aplicaciones tienen que contar con una serie de etiquetas HTML donde se mostrarán los resultados de nuestros tests: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1 id=&amp;quot;QUnit-header&amp;quot;&amp;gt;QUnit Test Suite&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;QUnit-banner&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;QUnit-testrunner-toolbar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;QUnit-userAgent&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ol id=&amp;quot;QUnit-tests&amp;quot;&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
A continuación se deja un ejemplo completo de un html donde se incluyen los archivos y las etiquetas html que necesita QUnit. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Dos Ideas - QUnit&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://code.jquery.com/qunit/git/qunit.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://code.jquery.com/qunit/git/qunit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;!-- Your source files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeas.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Your tests files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeasTest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1 id=&amp;quot;qunit-header&amp;quot;&amp;gt;QUnit example&amp;lt;/h1&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-banner&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-testrunner-toolbar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-userAgent&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;ol id=&amp;quot;qunit-tests&amp;quot;&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Any HTML you may require for your tests to work properly --&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-fixture&amp;quot;&amp;gt;test markup, will be hidden&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
El codigo que se va a testear debe estar en dosIdeas.js y los test en dosIdeasTest.js. Para correr los test simplemente se debe abrir el html en el browser. &lt;br /&gt;
&lt;br /&gt;
El archivo dosIdeasTest.js: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
&lt;br /&gt;
	module(&amp;quot;dosIdeasTest&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	test('probando validarImporte()', function() { &lt;br /&gt;
		ok(validarImporte(&amp;quot;1112&amp;quot;),'El importe es 1112'); &lt;br /&gt;
		ok(!validarImporte(&amp;quot;11A12&amp;quot;),'El importe es 11A12'); &lt;br /&gt;
		ok(!validarImporte(&amp;quot;A1112&amp;quot;),'El importe es A1112');&lt;br /&gt;
		ok(!validarImporte(&amp;quot;1112A&amp;quot;),'El importe es 1112A');&lt;br /&gt;
	}) &lt;br /&gt;
	&lt;br /&gt;
	test('probando extraerSubCadena()', function() { &lt;br /&gt;
		equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'Ideas'); &lt;br /&gt;
		equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'deas'); &lt;br /&gt;
	}) &lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; El archivo dosIdeas.js: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function validarImporte(importe) {&lt;br /&gt;
&lt;br /&gt;
        if (importe.length == 0) {&lt;br /&gt;
            return false;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (!/^[1-9][0-9]*(?:\.)?[0-9]?[0-9]?$/.test(importe.replace(',','.'))) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
function extraerSubCadena(cadena, posicionInicial, longitud)&lt;br /&gt;
{&lt;br /&gt;
	return cadena.substr(posicionInicial, longitud);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
El resultado de los test quedan de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
[[Image:DosIdeasQUnitResultado.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Asserts  ==&lt;br /&gt;
&lt;br /&gt;
Qunit nos provee de una serie de asserts para nuestros test. En el ejemplo anterior se hace mención de ok y equal. A continuación vamos a dar más detalle de los mismos y de nuevos.&lt;br /&gt;
&lt;br /&gt;
'''ok''':&lt;br /&gt;
Es para validar resultado booleanos (es el equivalente a assertTrue de JUnit). &lt;br /&gt;
&lt;br /&gt;
La sintaxis es la siguiente: ok(estado, mensaje).&lt;br /&gt;
&lt;br /&gt;
estado: es una expresión booleana a evaluar.&lt;br /&gt;
&lt;br /&gt;
mensaje: es el mensaje a mostrar cuando finaliza el assert.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
ok(validarImporte(&amp;quot;1112&amp;quot;),'El importe es 1112'); &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''equal''':&lt;br /&gt;
Valida que el resultado obtenido es igual al esperado (es similiar al assertEqual de JUnit). &lt;br /&gt;
&lt;br /&gt;
La sintaxis es la siguiente: equal(actual, esperado, mensaje)&lt;br /&gt;
&lt;br /&gt;
actual: es el objeto a evaluar.&lt;br /&gt;
&lt;br /&gt;
esperado: es el resultado esperado.&lt;br /&gt;
&lt;br /&gt;
mensaje: es el mensaje a mostrar cuando finaliza el assert.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'Ideas'); &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Integracion continua con Jenkins==&lt;br /&gt;
&lt;br /&gt;
Qunit-test-runner (QTR) es un proyecto que te permite integrar tus test de QUnit mediante una simple tarea ant.&lt;br /&gt;
&lt;br /&gt;
QTR provee un entorno de JavaScript dentro de una JVM para la ejecucion de los test de QUnit y el reporte de los resultados en un formato JUnit XML standard.&lt;br /&gt;
Por lo tanto, QTR permite una fácil integracion con los sistemas de CI (Integracion Continua) como Jenkins/Hudson, dando visibilidad inmediata de los test de QUnit junto a los test de JUnit.&lt;br /&gt;
&lt;br /&gt;
* Bajar la libreria [http://code.google.com/p/qunit-test-runner/downloads/list qunit-test-runner-0.0.1-SNAPSHOT-jar-with-dependencies.jar] y agregarla en el classpath de Run Test (en Netbeans) del proyecto.&lt;br /&gt;
&lt;br /&gt;
* Generar un &amp;lt;nombre del Test&amp;gt;Recipe.js con la funcion loadFiles utilizada por QTR.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: pagoConTarjetaTestRecipe.js&lt;br /&gt;
&amp;lt;code javascript&amp;gt;&lt;br /&gt;
 loadFiles([&lt;br /&gt;
   &amp;quot;../../siteApache/home/js/jquery-1.3.2.js&amp;quot;,&lt;br /&gt;
   &amp;quot;../../siteApache/home/js/validate.js&amp;quot;,  &lt;br /&gt;
   &amp;quot;../../siteApache/home/js/pagoConTarjeta.js&amp;quot;,&lt;br /&gt;
   &amp;quot;pagoConTarjetaTest.js&amp;quot;&lt;br /&gt;
 ])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Agregar las siguientes tareas ant al build.xml del proyecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;qunit&amp;quot; depends=&amp;quot;init&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;path id=&amp;quot;qunit-test-runner.path&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;fileset dir=&amp;quot;${basedir}&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;include name=&amp;quot;${file.reference.qunit-test-runner-0.0.1-SNAPSHOT-jar-with-dependencies.jar}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
    &amp;lt;/path&amp;gt;&lt;br /&gt;
    &amp;lt;taskdef classpathref=&amp;quot;qunit-test-runner.path&amp;quot; resource=&amp;quot;tasks.properties&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;target name=&amp;quot;report-jstest-pnt&amp;quot; depends=&amp;quot;qunit&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;mkdir dir=&amp;quot;${report.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;qunit basedirectory=&amp;quot;${basedir}/${test.javascript.dir}&amp;quot;&lt;br /&gt;
         reportdirectory=&amp;quot;${report.dir}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/qunit&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
    &amp;lt;!-- Create a JUnit report containing the QTR test results. --&amp;gt;&lt;br /&gt;
    &amp;lt;mkdir dir=&amp;quot;${report.dir}/html&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;junitreport todir=&amp;quot;${report.dir}/html&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;fileset dir=&amp;quot;${report.dir}&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;include name=&amp;quot;TEST-qunit-*.xml&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
        &amp;lt;report format=&amp;quot;frames&amp;quot; todir=&amp;quot;${report.dir}/html&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/junitreport&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Activar en el proyecto de Jenkins, la opcion publish HTML reports y apuntar al directorio donde se generan los reportes HTML a la pagina index.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ver también  ==&lt;br /&gt;
[http://docs.jquery.com/Qunit Página de QUnit]&lt;br /&gt;
[http://code.google.com/p/qunit-test-runner/ Página de QTR (proyecto Qunit-test-runner)]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Tablas_Externas&amp;diff=6089</id>
		<title>Tablas Externas</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Tablas_Externas&amp;diff=6089"/>
				<updated>2011-08-19T12:18:28Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: Deshecha la edición 6080 de 200.4.200.130 (disc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Oracle]]&lt;br /&gt;
Las tablas externas de [[Oracle]] permiten consultar datos de un archivo plano como si fuera una tabla dentro de la [[Base De Datos]] [[Oracle]]. Vamos a ver a continuación una breve introducción al tema.&lt;br /&gt;
&lt;br /&gt;
En [[Oracle9i]], solo se pueden realizar operaciones de lectura, pero en [[Oracle10g]], ya se pueden escribir datos a una tabla externa, aunque no se puede escribir a un archivo existente.&lt;br /&gt;
&lt;br /&gt;
Las external tables son un reemplazo natural del sql*loader en su función de lectura de archivos plano.&lt;br /&gt;
&lt;br /&gt;
=Ejemplo=&lt;br /&gt;
Supongamos el archivo ''D:\ejemplo\external_table\empleados.txt''&lt;br /&gt;
&lt;br /&gt;
   001,Perez,Carlos,21446992, cperez@dosideas.com&lt;br /&gt;
   002,Garcia,Alicia,19436951, agarcia@dosideas.com&lt;br /&gt;
   003,Lopez,Pablo,11446663, plopez@dosideas.com&lt;br /&gt;
   004,Gomez,Valeria,22222222, vgomez@dosideas.com&lt;br /&gt;
   005,Gonzalez,Diego,16446987, dgonzalez@dosideas.com&lt;br /&gt;
   006,Torres,Guillermo,23444999, gtorres@dosideas.com&lt;br /&gt;
&lt;br /&gt;
==Creación de la tabla externa==&lt;br /&gt;
&lt;br /&gt;
 connect system/password&lt;br /&gt;
&lt;br /&gt;
 create or replace directory extdata_dir as ‘D:\ejemplo\external_table’;&lt;br /&gt;
 grant read, write on directory extdata_dir to cbarbiero;&lt;br /&gt;
&lt;br /&gt;
 connect usuario/password&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE empleados_ext&lt;br /&gt;
 (  emp_id     number(3),&lt;br /&gt;
    apellido   varchar2(30),&lt;br /&gt;
    nombre     varchar2(30),&lt;br /&gt;
    documento  number,&lt;br /&gt;
    mail       varchar2(50)&lt;br /&gt;
 )&lt;br /&gt;
 Organization external&lt;br /&gt;
 (&lt;br /&gt;
    default directory extdata_dir&lt;br /&gt;
    access parameters (records delimited by newline&lt;br /&gt;
                       fields terminated by ‘,’)&lt;br /&gt;
    location (‘empleados.txt’)&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Query de ejemplo==&lt;br /&gt;
 SQL&amp;gt; select * from empleados_ext;&lt;br /&gt;
&lt;br /&gt;
     EMP_ID APELLIDO   NOMBRE      DOCUMENTO MAIL&lt;br /&gt;
 --------- ---------- ---------- ---------- ------------------------------&lt;br /&gt;
         1 Perez      Carlos       21446992 cperez@dosideas.com&lt;br /&gt;
         2 Garcia     Alicia       19436951 agarcia@dosideas.com&lt;br /&gt;
         3 Lopez      Pablo        11446663 plopez@dosideas.com&lt;br /&gt;
         4 Gomez      Valeria      22222222 vgomez@dosideas.com&lt;br /&gt;
         5 Gonzalez   Diego        16446987 dgonzalez@dosideas.com&lt;br /&gt;
         6 Torres     Guillermo    23444999 gtorres@dosideas.com&lt;br /&gt;
&lt;br /&gt;
 6 rows selected.&lt;br /&gt;
&lt;br /&gt;
=Sintaxis=&lt;br /&gt;
 CREATE TABLE tabla&lt;br /&gt;
 (  columna1 ....,&lt;br /&gt;
    columna2 ....,&lt;br /&gt;
    ..........&lt;br /&gt;
 )&lt;br /&gt;
 ORGANIZATION EXTERNAL&lt;br /&gt;
 (&lt;br /&gt;
    TYPE ORACLE_LOADER&lt;br /&gt;
    DEFAULT DIRECTORY directorio&lt;br /&gt;
    ACCESS PARAMETERS (records delimited by newline&lt;br /&gt;
                       fields terminated by ','&lt;br /&gt;
                       [NOBADFILE | BADFILE directorio:'archivo.bad']&lt;br /&gt;
                       [NODISCARDFILE | DISCARDFILE directorio:'archivo.dis']&lt;br /&gt;
                       [NOLOGFILE | LOGFILE directorio:'archivo.log'])&lt;br /&gt;
    LOCATION ([directorio]:'archivos,...')&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
Las posibilidades de definición en ACCESS PARAMETERS son mucho más amplias que las cubiertas en esta nota. Para una referencia completa ir al manual Oracle9i Database Utilities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Reglas y Restricciones=&lt;br /&gt;
==Si se puede==&lt;br /&gt;
&lt;br /&gt;
Ya que los datos de una tabla externa, residen en el sistema operativo, necesitamos que el/los archivos asociados a la misma estén unicados en un lugar donde Oracle tenga acceso.&lt;br /&gt;
&lt;br /&gt;
Por lo tanto el primer paso es crear un directorio dentro de la base asociado a un directorio en el sistema operativo y dar permisos de acceso al mismo.&lt;br /&gt;
&lt;br /&gt;
  create or replace directory extdata_dir as ‘D:\ejemplo\external_table’;&lt;br /&gt;
  grant read, write on directory extdata_dir to cbarbiero;&lt;br /&gt;
&lt;br /&gt;
El usuario de S.O. dueño de los binarios de Oracle, debe tener acceso al directorio del S.O. y este directorio no puede ser un link simbólico.&lt;br /&gt;
&lt;br /&gt;
Hay que poner el archivo plano que contiene los datos en este directorio.&lt;br /&gt;
&lt;br /&gt;
 D:\ejemplo\external_table\empleados.txt&lt;br /&gt;
   001,Perez,Carlos,21446992, cperez@dosideas.com&lt;br /&gt;
   002,Garcia,Alicia,19436951, agarcia@dosideas.com&lt;br /&gt;
   003,Lopez,Pablo,11446663, plopez@dosideas.com&lt;br /&gt;
   004,Gomez,Valeria,22222222, vgomez@dosideas.com&lt;br /&gt;
   005,Gonzalez,Diego,16446987, dgonzalez@dosideas.com&lt;br /&gt;
   006,Torres,Guillermo,23444999, gtorres@dosideas.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El siguiente paso es crear la tabla. La sentencia CREATE TABLE de una tabla externa tiene 2 partes.&lt;br /&gt;
&lt;br /&gt;
La primer parte, como para una tabla normal, tiene el nombre de la tabla y la especificación de las columnas.&lt;br /&gt;
&lt;br /&gt;
Esta es seguida por un bloque de sintánxis específica para las tablas externas, la cual le indica a Oracle como interpretar los datos del archivo externo.&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE empleados_ext&lt;br /&gt;
 ( emp_id          number(3),&lt;br /&gt;
   apellido  varchar2(30),&lt;br /&gt;
   nombre          varchar2(30),&lt;br /&gt;
   documento number,&lt;br /&gt;
   mail     varchar2(50)&lt;br /&gt;
 )&lt;br /&gt;
 Organization external&lt;br /&gt;
 (&lt;br /&gt;
  default directory extdata_dir&lt;br /&gt;
  access parameters (records delimited by newline&lt;br /&gt;
                     fields terminated by ‘,’)&lt;br /&gt;
  location (‘empleados.txt’)&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
Con la creación de la tabla, Oracle no intenta cargar los datos, ni siquiera intenta chequear la validez de los valores de los parámetros especificados. La sentencia CREATE TABLE será exitosa aunque el archivo todavía no exista en el directorio.&lt;br /&gt;
&lt;br /&gt;
Con la sentencia de CREATE sólo hemos creado un metadata en el diccionario de datos que instruye a Oracle  cómo debe el driver ORACLE_LOADER parsear los datos del archivo.&lt;br /&gt;
&lt;br /&gt;
Recién se valida la información y se accede al archivo en el momento de consultar la tabla.&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from empleados_ext;&lt;br /&gt;
&lt;br /&gt;
    EMP_ID APELLIDO   NOMBRE      DOCUMENTO MAIL&lt;br /&gt;
 --------- ---------- ---------- ---------- ------------------------------&lt;br /&gt;
         1 Perez      Carlos       21446992 cperez@dosideas.com&lt;br /&gt;
         2 Garcia     Alicia       19436951 agarcia@dosideas.com&lt;br /&gt;
         3 Lopez      Pablo        11446663 plopez@dosideas.com&lt;br /&gt;
         4 Gomez      Valeria      22222222 vgomez@dosideas.com&lt;br /&gt;
         5 Gonzalez   Diego        16446987 dgonzalez@dosideas.com&lt;br /&gt;
         6 Torres     Guillermo    23444999 gtorres@dosideas.com&lt;br /&gt;
&lt;br /&gt;
 6 rows selected.&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; select * from empleados_ext where apellido like ‘G%’;&lt;br /&gt;
&lt;br /&gt;
    EMP_ID APELLIDO   NOMBRE      DOCUMENTO MAIL&lt;br /&gt;
 --------- ---------- ---------- ---------- ------------------------------&lt;br /&gt;
         2 Garcia     Alicia       19436951 agarcia@dosideas.com&lt;br /&gt;
         4 Gomez      Valeria      22222222 vgomez@dosideas.com&lt;br /&gt;
         5 Gonzalez   Diego        16446987 dgonzalez@dosideas.com&lt;br /&gt;
&lt;br /&gt;
 3 rows selected.&lt;br /&gt;
&lt;br /&gt;
Oracle usa el dirver ORACLE_LOADER para procesar el archivo, y  como la herramienta SQL*Loader, crea un archivo de log en el directorio definido como default al crear la tabla. El nombre usado por default es &amp;lt;nombre de tabla&amp;gt;_ospid.log&lt;br /&gt;
&lt;br /&gt;
 D:\ejemplo\external_table\empleados_ext_452_2828.txt&lt;br /&gt;
&lt;br /&gt;
 LOG file opened at 12/27/06 16:17:19&lt;br /&gt;
&lt;br /&gt;
 Field Definitions for table EMPLEADOS_EXT&lt;br /&gt;
  Record format DELIMITED BY NEWLINE&lt;br /&gt;
  Data in file has same endianness as the platform&lt;br /&gt;
  Rows with all null fields are accepted&lt;br /&gt;
&lt;br /&gt;
  Fields in Data Source:&lt;br /&gt;
    EMP_ID                          CHAR (255)&lt;br /&gt;
      Terminated by &amp;quot;,&amp;quot;&lt;br /&gt;
      Trim whitespace same as SQL Loader&lt;br /&gt;
    APELLIDO                        CHAR (255)&lt;br /&gt;
      Terminated by &amp;quot;,&amp;quot;&lt;br /&gt;
      Trim whitespace same as SQL Loader&lt;br /&gt;
    NOMBRE                          CHAR (255)&lt;br /&gt;
      Terminated by &amp;quot;,&amp;quot;&lt;br /&gt;
      Trim whitespace same as SQL Loader&lt;br /&gt;
    DOCUMENTO                       CHAR (255)&lt;br /&gt;
      Terminated by &amp;quot;,&amp;quot;&lt;br /&gt;
      Trim whitespace same as SQL Loader&lt;br /&gt;
    MAIL                            CHAR (255)&lt;br /&gt;
      Terminated by &amp;quot;,&amp;quot;&lt;br /&gt;
      Trim whitespace same as SQL Loader&lt;br /&gt;
&lt;br /&gt;
Lo mismo sucede con los archivos “bad” y “discard” en el caso de que necesiten generarse.&lt;br /&gt;
&lt;br /&gt;
Si se desea se puede configurar directorios separados y nombres específicos para cada uno de estos archivos. Lo que debe recordarse es que debemos tener permiso de READ para el directorio donde están los datos y permisos de WRITE donde se generan los archivos de losg, bad y discard.&lt;br /&gt;
&lt;br /&gt;
Se puede usar un ALTER TABLE para modificar los parámetros sin necesidad de borrar y redefinir toda la tabla.&lt;br /&gt;
&lt;br /&gt;
 connect system/password&lt;br /&gt;
&lt;br /&gt;
 create or replace directory extlog_dir as ‘D:\ejemplo\external_table\log’;&lt;br /&gt;
 grant write on directory extlog_dir to cbarbiero;&lt;br /&gt;
&lt;br /&gt;
 connect cbarbiero/password&lt;br /&gt;
&lt;br /&gt;
 ALTER TABLE empleados_ext&lt;br /&gt;
 ( access parameters (records delimited by newline&lt;br /&gt;
                      logfile extlog_dir:’empleados_ext.log’&lt;br /&gt;
                      badfile extlog_dir:’empleados_ext.bad’&lt;br /&gt;
                      discardfile extlog_dir:’empleados_ext.dis’&lt;br /&gt;
                      fields terminated by ‘,’ );&lt;br /&gt;
&lt;br /&gt;
Tambien podríamos setear que la tabla no genere ninguno de estos archivos y muchas otras opciones de configuración mas, que pueden consultarlas en el manual Oracle 9i Utilities.&lt;br /&gt;
&lt;br /&gt;
==No se puede==&lt;br /&gt;
&lt;br /&gt;
Aunque las external tables pueden ser consultadas, no pueden ser usadas como una tabla regular de Oracle.&lt;br /&gt;
&lt;br /&gt;
Las tablas externas son read-only. No se puede realizar ninguna operación de DML ni crear índices sobre una tabla externa.&lt;br /&gt;
&lt;br /&gt;
Otra cosa que debemos considerar es no terminar el ultimo registro del archivo de datos con un newline, ya que seguramente esto generará un error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Casos prácticos de uso=&lt;br /&gt;
&lt;br /&gt;
El principal uso de las external tables es como medio/herramienta para cargar datos dentro de una tabla real en la base de datos. Luego de crear una tabla externa, se puede hacer:&lt;br /&gt;
&lt;br /&gt;
 CREATE TABLE &amp;lt;tabla real&amp;gt; AS SELECT … &amp;lt;tabla externa&amp;gt; …&lt;br /&gt;
                INSERT INTO &amp;lt;tabla real&amp;gt; AS SELECT … &amp;lt;tabla externa&amp;gt; …&lt;br /&gt;
&lt;br /&gt;
Cuando la tabla externa es accedida por una sentencia SQL, los campos de la tabla externa pueden usarse como cualquier campo de una tabla normal. En particular, los campos pueden ser usados como argumentos de cualquier función SQL, función PL/SQL o función java.&lt;br /&gt;
&lt;br /&gt;
Esto permite una manipulación más amplia de los datos de la fuente externa en el momento de carga, si lo comparamos con la herramienta SQL*Loader.&lt;br /&gt;
&lt;br /&gt;
También podemos hacer joins contra los datos de una tabla externa.&lt;br /&gt;
&lt;br /&gt;
Y muy importante en los casos de carga masiva y volúmenes importantes, podemos paralelizar el proceso de carga creando la tabla externa con el degree de paralelismo deseado.&lt;br /&gt;
&lt;br /&gt;
==Reemplazo SQL*Loader==&lt;br /&gt;
&lt;br /&gt;
En la mayoría de las implementaciones podemos reemplazar el uso del SQL*Loader con tablas externas, evitando de esta manera la necesidad de crear una tabla de interface para cargar los datos, ahorrando espacio dentro de la base de datos.&lt;br /&gt;
&lt;br /&gt;
==Data Warehouse==&lt;br /&gt;
&lt;br /&gt;
Las tablas externas son interesantes en un ambiente data warehouse durante el proceso ETL (Extraction Transformation Loading). Evita la necesidad de crear tablas temporales a ser creadas durante las etapas de Extracción y Transformación, reduciendo el espacio alocado y el riesgo de aborto durante todo el proceso.&lt;br /&gt;
&lt;br /&gt;
=Ver también=&lt;br /&gt;
* [[Oracle]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Oracle_BPM_11g&amp;diff=6087</id>
		<title>Oracle BPM 11g</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Oracle_BPM_11g&amp;diff=6087"/>
				<updated>2011-08-17T14:06:48Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Oracle BPM 11g]] es la una versión de [[Oracle BPM]], que permite instalar aplicaciones basadas en [[BPM]]. &lt;br /&gt;
&lt;br /&gt;
== Instalación ==&lt;br /&gt;
Para instalar Oracle BPM 11g hay que seguir varios pasos e instaladores. Pueden seguir un [http://blog.lebrijo.com/?p=330&amp;amp;language=es paso-a-paso para instalarlo]. &lt;br /&gt;
&lt;br /&gt;
Los pasos simplificados son: &lt;br /&gt;
# Instalar base de datos Oracle Express 10g&lt;br /&gt;
# Ejecutar los siguientes ALTER en el equema: &lt;br /&gt;
  alter system reset sessions scope=spfile sid='*';&lt;br /&gt;
  alter system set processes=200 scope=spfile;&lt;br /&gt;
# Instalar el RCU. Si se usa Oracle Express, es necesario setear una variable de entorno ANTES de ejecutar el RCU (ver la documentación en el [http://www.oracle.com/technetwork/middleware/bpm/downloads/downloads-097443.html Centro de Descargas])&lt;br /&gt;
# Descomprimir soa_generic_11.1.1.2.0, y sobre el Disk1 ejecutar bin/setup&lt;br /&gt;
# Descomprimir soa_generic_11.1.1.3.0, y sobre el Disk1 ejectuar bin/setup&lt;br /&gt;
# Sobre el dominio instalado de SOA (Oracle_SOA1) ejecutar Oracle_SOA1\common\bin&amp;gt;config.cmd&lt;br /&gt;
# Instalar JDeveloper 11g.&lt;br /&gt;
# En JDeveloper 11g, ir a las actualizaciones e instalar los componentes SOA y BPM.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://st-curriculum.oracle.com/obe/fmw/obpm/11g/r1/firstProcess/firstprocess_obpm11g.htm Guía para construir una primera aplicación con Oracle BPM 11g]&lt;br /&gt;
* [http://blog.lebrijo.com/?p=330&amp;amp;language=es Instalando Oracle SOA Suite 11g]&lt;br /&gt;
* [http://st-curriculum.oracle.com/obe/jdev/obe11jdev/bulldog/deploysoaapp/deployment.htm Instalación de Oracle SOA y ALTERs necesarios]&lt;br /&gt;
* [http://www.oracle.com/technetwork/middleware/bpm/downloads/downloads-097443.html Centro de descargas de Oracle BPM Suite]&lt;br /&gt;
&lt;br /&gt;
[[Category: Oracle]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Oracle_BPM_11g&amp;diff=6086</id>
		<title>Oracle BPM 11g</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Oracle_BPM_11g&amp;diff=6086"/>
				<updated>2011-08-17T14:02:42Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Oracle BPM 11g]] es la una versión de [[Oracle BPM]], que permite instalar aplicaciones basadas en [[BPM]]. &lt;br /&gt;
&lt;br /&gt;
== Instalación ==&lt;br /&gt;
Para instalar Oracle BPM 11g hay que seguir varios pasos e instaladores. Pueden seguir un [http://blog.lebrijo.com/?p=330&amp;amp;language=es paso-a-paso para instalarlo]. &lt;br /&gt;
&lt;br /&gt;
Los pasos simplificados son: &lt;br /&gt;
# Instalar base de datos Oracle Express 10g&lt;br /&gt;
# Ejecutar los siguientes ALTER en el equema: &lt;br /&gt;
  alter system reset sessions scope=spfile sid='*';&lt;br /&gt;
  alter system set processes=200 scope=spfile;&lt;br /&gt;
# Instalar el RCU&lt;br /&gt;
# Descomprimir soa_generic_11.1.1.2.0, y sobre el Disk1 ejecutar bin/setup&lt;br /&gt;
# Descomprimir soa_generic_11.1.1.3.0, y sobre el Disk1 ejectuar bin/setup&lt;br /&gt;
# Sobre el dominio instalado de SOA (Oracle_SOA1) ejecutar Oracle_SOA1\common\bin&amp;gt;config.cmd&lt;br /&gt;
# Instalar JDeveloper 11g.&lt;br /&gt;
# En JDeveloper 11g, ir a las actualizaciones e instalar los componentes SOA y BPM.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://st-curriculum.oracle.com/obe/fmw/obpm/11g/r1/firstProcess/firstprocess_obpm11g.htm Guía para construir una primera aplicación con Oracle BPM 11g]&lt;br /&gt;
* [http://blog.lebrijo.com/?p=330&amp;amp;language=es Instalando Oracle SOA Suite 11g]&lt;br /&gt;
* [http://st-curriculum.oracle.com/obe/jdev/obe11jdev/bulldog/deploysoaapp/deployment.htm Instalación de Oracle SOA y ALTERs necesarios]&lt;br /&gt;
* [http://www.oracle.com/technetwork/middleware/bpm/downloads/downloads-097443.html Centro de descargas de Oracle BPM Suite]&lt;br /&gt;
&lt;br /&gt;
[[Category: Oracle]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6066</id>
		<title>Test de javascript con QUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6066"/>
				<updated>2011-08-15T19:55:18Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;QUnit es una potente herramienta para testear javascript. &lt;br /&gt;
&lt;br /&gt;
Para utilizar QUnit, se tiene que incluir los archivos qunit.js, qunit.css y un HTML para mostrar los resultados de las pruebas. &lt;br /&gt;
&lt;br /&gt;
Como escribir test unitarios con QUnit: &lt;br /&gt;
&lt;br /&gt;
Lo primero que se debe hacer es hacer el ambiente de test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Dos Ideas - QUnit&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://code.jquery.com/qunit/git/qunit.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://code.jquery.com/qunit/git/qunit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;!-- Your source files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeas.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Your tests files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeasTest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1 id=&amp;quot;qunit-header&amp;quot;&amp;gt;QUnit example&amp;lt;/h1&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-banner&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-testrunner-toolbar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-userAgent&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;ol id=&amp;quot;qunit-tests&amp;quot;&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Any HTML you may require for your tests to work properly --&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-fixture&amp;quot;&amp;gt;test markup, will be hidden&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codigo que se va a testear debe estar en dosIdeas.js y los test en dosIdeasTest.js. Para correr los test simplemente se debe abrir el html en el browser.&lt;br /&gt;
&lt;br /&gt;
El archivo dosIdeasTest.js:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
&lt;br /&gt;
	module(&amp;quot;dosIdeasTest&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	test('probando validarImporte()', function() { &lt;br /&gt;
		ok(validarImporte(&amp;quot;1112&amp;quot;),'El importe es 1112'); &lt;br /&gt;
		ok(!validarImporte(&amp;quot;11A12&amp;quot;),'El importe es 11A12'); &lt;br /&gt;
		ok(!validarImporte(&amp;quot;A1112&amp;quot;),'El importe es A1112');&lt;br /&gt;
		ok(!validarImporte(&amp;quot;1112A&amp;quot;),'El importe es 1112A');&lt;br /&gt;
	}) &lt;br /&gt;
	&lt;br /&gt;
	test('probando extraerSubCadena()', function() { &lt;br /&gt;
		equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'Ideas'); &lt;br /&gt;
		equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'deas'); &lt;br /&gt;
	}) &lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El archivo dosIdeas.js:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function validarImporte(importe) {&lt;br /&gt;
        esImporteValido = true;&lt;br /&gt;
&lt;br /&gt;
        if (importe.length == 0) {&lt;br /&gt;
            mensajeError = 'Ingresá el importe a pagar.';&lt;br /&gt;
            esImporteValido = false;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (!/^[1-9][0-9]*(?:\.)?[0-9]?[0-9]?$/.test(importe.replace(',','.'))) {&lt;br /&gt;
                mensajeError = &amp;quot;El importe a pagar debe ser numérico, mayor a cero con hasta 2 decimales.&amp;quot;;&lt;br /&gt;
                esImporteValido = false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return esImporteValido;&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
function extraerSubCadena(cadena, posicionInicial, longitud)&lt;br /&gt;
{&lt;br /&gt;
	return cadena.substr(posicionInicial, longitud);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:DosIdeasQUnitResultado.jpg]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6065</id>
		<title>Test de javascript con QUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6065"/>
				<updated>2011-08-15T19:51:49Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;QUnit es una potente herramienta para testear javascript. &lt;br /&gt;
&lt;br /&gt;
Para utilizar QUnit, se tiene que incluir a los archivos qunit.js, qunit.css y un HTML para mostrar los resultados de las pruebas. &lt;br /&gt;
&lt;br /&gt;
[[Image:EjemploQUnit.jpg]] &lt;br /&gt;
&lt;br /&gt;
Como escribir test unitarios con QUnit: &lt;br /&gt;
&lt;br /&gt;
Lo primero que se debe hacer es hacer el ambiente de test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Dos Ideas - QUnit&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://code.jquery.com/qunit/git/qunit.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://code.jquery.com/qunit/git/qunit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;!-- Your source files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeas.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Your tests files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeasTest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1 id=&amp;quot;qunit-header&amp;quot;&amp;gt;QUnit example&amp;lt;/h1&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-banner&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-testrunner-toolbar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-userAgent&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;ol id=&amp;quot;qunit-tests&amp;quot;&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Any HTML you may require for your tests to work properly --&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-fixture&amp;quot;&amp;gt;test markup, will be hidden&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codigo que se va a testear debe estar en dosIdeas.js y los test en dosIdeasTest.js. Para correr los test simplemente se debe abrir el html en el browser.&lt;br /&gt;
&lt;br /&gt;
El archivo dosIdeasTest.js:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
&lt;br /&gt;
	module(&amp;quot;dosIdeasTest&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	test('probando validarImporte()', function() { &lt;br /&gt;
		ok(validarImporte(&amp;quot;1112&amp;quot;),'El importe es 1112'); &lt;br /&gt;
		ok(!validarImporte(&amp;quot;11A12&amp;quot;),'El importe es 11A12'); &lt;br /&gt;
		ok(!validarImporte(&amp;quot;A1112&amp;quot;),'El importe es A1112');&lt;br /&gt;
		ok(!validarImporte(&amp;quot;1112A&amp;quot;),'El importe es 1112A');&lt;br /&gt;
	}) &lt;br /&gt;
	&lt;br /&gt;
	test('probando extraerSubCadena()', function() { &lt;br /&gt;
		equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'Ideas'); &lt;br /&gt;
		equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'deas'); &lt;br /&gt;
	}) &lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El archivo dosIdeas.js:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function validarImporte(importe) {&lt;br /&gt;
        esImporteValido = true;&lt;br /&gt;
&lt;br /&gt;
        if (importe.length == 0) {&lt;br /&gt;
            mensajeError = 'Ingresá el importe a pagar.';&lt;br /&gt;
            esImporteValido = false;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (!/^[1-9][0-9]*(?:\.)?[0-9]?[0-9]?$/.test(importe.replace(',','.'))) {&lt;br /&gt;
                mensajeError = &amp;quot;El importe a pagar debe ser numérico, mayor a cero con hasta 2 decimales.&amp;quot;;&lt;br /&gt;
                esImporteValido = false;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return esImporteValido;&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
function extraerSubCadena(cadena, posicionInicial, longitud)&lt;br /&gt;
{&lt;br /&gt;
	return cadena.substr(posicionInicial, longitud);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6064</id>
		<title>Test de javascript con QUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6064"/>
				<updated>2011-08-15T19:50:25Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;QUnit es una potente herramienta para testear javascript. &lt;br /&gt;
&lt;br /&gt;
Para utilizar QUnit, se tiene que incluir a los archivos qunit.js, qunit.css y un HTML para mostrar los resultados de las pruebas. &lt;br /&gt;
&lt;br /&gt;
[[Image:EjemploQUnit.jpg]] &lt;br /&gt;
&lt;br /&gt;
Como escribir test unitarios con QUnit: &lt;br /&gt;
&lt;br /&gt;
Lo primero que se debe hacer es hacer el ambiente de test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Dos Ideas - QUnit&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://code.jquery.com/qunit/git/qunit.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://code.jquery.com/qunit/git/qunit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;!-- Your source files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeas.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Your tests files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeasTest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1 id=&amp;quot;qunit-header&amp;quot;&amp;gt;QUnit example&amp;lt;/h1&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-banner&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-testrunner-toolbar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-userAgent&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;ol id=&amp;quot;qunit-tests&amp;quot;&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Any HTML you may require for your tests to work properly --&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-fixture&amp;quot;&amp;gt;test markup, will be hidden&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codigo que se va a testear debe estar en dosIdeas.js y los test en dosIdeasTest.js. Para correr los test simplemente se debe abrir el html en el browser.&lt;br /&gt;
&lt;br /&gt;
El archivo dosIdeasTest.js es de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
&lt;br /&gt;
	module(&amp;quot;dosIdeasTest&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	test('probando validarImporte()', function() { &lt;br /&gt;
		ok(validarImporte(&amp;quot;1112&amp;quot;),'El importe es 1112'); &lt;br /&gt;
		ok(!validarImporte(&amp;quot;11A12&amp;quot;),'El importe es 11A12'); &lt;br /&gt;
		ok(!validarImporte(&amp;quot;A1112&amp;quot;),'El importe es A1112');&lt;br /&gt;
		ok(!validarImporte(&amp;quot;1112A&amp;quot;),'El importe es 1112A');&lt;br /&gt;
	}) &lt;br /&gt;
	&lt;br /&gt;
	test('probando extraerSubCadena()', function() { &lt;br /&gt;
		equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'Ideas'); &lt;br /&gt;
		equal(extraerSubCadena(&amp;quot;dosIdeas&amp;quot;,3,5),'deas'); &lt;br /&gt;
	}) &lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6063</id>
		<title>Test de javascript con QUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6063"/>
				<updated>2011-08-15T19:44:17Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;QUnit es una potente herramienta para testear javascript. &lt;br /&gt;
&lt;br /&gt;
Para utilizar QUnit, se tiene que incluir a los archivos qunit.js, qunit.css y un HTML para mostrar los resultados de las pruebas. &lt;br /&gt;
&lt;br /&gt;
[[Image:EjemploQUnit.jpg]] &lt;br /&gt;
&lt;br /&gt;
Como escribir test unitarios con QUnit: &lt;br /&gt;
&lt;br /&gt;
Lo primero que se debe hacer es hacer el ambiente de test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Dos Ideas - QUnit&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://code.jquery.com/qunit/git/qunit.css&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://code.jquery.com/qunit/git/qunit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;!-- Your source files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeas.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Your tests files go here --&amp;gt;&lt;br /&gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;dosIdeasTest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1 id=&amp;quot;qunit-header&amp;quot;&amp;gt;QUnit example&amp;lt;/h1&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-banner&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-testrunner-toolbar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;h2 id=&amp;quot;qunit-userAgent&amp;quot;&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;ol id=&amp;quot;qunit-tests&amp;quot;&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Any HTML you may require for your tests to work properly --&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;qunit-fixture&amp;quot;&amp;gt;test markup, will be hidden&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El codigo que se va a testear debe estar en dosIdeas.js y los test en dosIdeasTest.js. Para correr los test simplemente se debe abrir el html en el browser.&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6062</id>
		<title>Test de javascript con QUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Test_de_javascript_con_QUnit&amp;diff=6062"/>
				<updated>2011-08-15T19:39:55Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;QUnit es una potente herramienta para testear javascript. &lt;br /&gt;
&lt;br /&gt;
Para utilizar QUnit, se tiene que incluir a los archivos qunit.js, qunit.css y un HTML para mostrar los resultados de las pruebas. &lt;br /&gt;
&lt;br /&gt;
[[Image:EjemploQUnit.jpg]] &lt;br /&gt;
&lt;br /&gt;
Como escribir test unitarios con QUnit: &lt;br /&gt;
&lt;br /&gt;
Lo primero que se debe hacer es hacer el ambiente de test. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El codigo que se va a testear debe estar en dosIdeas.js y los test en dosIdeasTest.js. Para correr los test simplemente se debe abrir el html en el browser.&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6050</id>
		<title>JavaScript</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JavaScript&amp;diff=6050"/>
				<updated>2011-08-11T17:37:16Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:JavaScript]]&lt;br /&gt;
[[JavaScript]] es un lenguaje de programación interpretado, es decir, que no requiere compilación, utilizado principalmente en páginas web, con una sintaxis semejante a la del lenguaje Java y el lenguaje C.&lt;br /&gt;
&lt;br /&gt;
Al igual que [[Java]], [[JavaScript]] es un lenguaje orientado a objetos propiamente dicho, ya que dispone de Herencia, si bien esta se realiza siguiendo el paradigma de programación basada en prototipos, ya que las nuevas clases se generan clonando las clases base (prototipos) y extendiendo su funcionalidad.&lt;br /&gt;
&lt;br /&gt;
Todos los navegadores modernos interpretan el código [[JavaScript]] integrado dentro de las páginas web. Para interactuar con una página web se provee al lenguaje [[JavaScript]] de una implementación del DOM.&lt;br /&gt;
&lt;br /&gt;
==Frameworks==&lt;br /&gt;
[[JavaScript]] cuenta con infinidad de frameworks y librerias que otorgan diversa funcionalidad. Entre los más conocidos:&lt;br /&gt;
* [[JQuery]], un framework de aplicación base, sumamente extensible.&lt;br /&gt;
* [[Prototype]], un framework de aplicación base que permite definir clases, muy usado.&lt;br /&gt;
* [[Rico]], un framework de componentes de presentación [AJAX].&lt;br /&gt;
* [[Concurrent Thread Javascript]], librería para manejo de hilos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://es.wikipedia.org/wiki/JavaScript JavaScript en la Wikipedia]&lt;br /&gt;
* [http://www.theserverside.com/tt/articles/article.tss?l=OOJavaScriptDemonstrated Conceptos y operaciones básicas]&lt;br /&gt;
* [[Test de javascript con QUnit]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SoapUI&amp;diff=6049</id>
		<title>SoapUI</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SoapUI&amp;diff=6049"/>
				<updated>2011-08-10T20:40:32Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Categoría: Web Service]]&lt;br /&gt;
[[SoapUI]] es una herramienta de [[Software Libre]] gráfica, está basada en [[Java]] y sirve para el testeo de [[Web Service]] y generación de [[Clientes De Web Service]]. &lt;br /&gt;
&lt;br /&gt;
SoapUI permite testear web services de forma facil, ver los resultados. Además, permite facilitar el uso de herramientas comunes para la generación de clientes, como [[Axis]]. &lt;br /&gt;
&lt;br /&gt;
Trabajando con web services, y sin interfase gráfica en la aplicación, esta herramienta nos permite automatizar fácilmente las pruebas funcionales y así asegurar la calidad en nuestros proyectos.&lt;br /&gt;
&lt;br /&gt;
Las pruebas funcionales de los web services podrían usarse para más de un propósito:&lt;br /&gt;
&lt;br /&gt;
*Pruebas unitarias: para validar que cada operación de los servicios funciona como se definió.&lt;br /&gt;
*Prueba de aceptación: para validar que el servicio retorna resultados aceptables según los requerimientos.&lt;br /&gt;
*Pruebas de proceso: para validar que una sucesión de invocaciones del servicio cumple con el proceso de negocio definido.&lt;br /&gt;
*Pruebas de manejo de datos: para validar el comportamiento con las entradas de datos externos al sistema (bases de datos, otros sistemas, uso de otros web services).&lt;br /&gt;
*[http://es.wikipedia.org/wiki/Pruebas_de_regresi%C3%B3n/ Pruebas de regresión]: para validar el comportamiento post cambios.&lt;br /&gt;
&lt;br /&gt;
==Un paso a paso==&lt;br /&gt;
&lt;br /&gt;
1. Tener instalada la última versión bajada de la [http://www.soapui.org/ Web oficial de SoapUI].&lt;br /&gt;
&lt;br /&gt;
2. Crear un nuevo proyecto [[SoapUI]] para el proyecto a probar. Donde configurar la url que contiene el WSDL del proyecto.&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:SoapUI-Creacion-De-Proyecto.jpg|center|Creacion de un proyecto&lt;br /&gt;
default [[SoapUI]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
3. Por cada operacion del servicio a probar, crear una peticion. Cada peticion requiere el ingreso de valores para los parámetros definidos. Agregar valores en el XML que nos propone el wizard de la herramienta.&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:SoapUI-Agregar-Peticion.jpg|center|Agregar Peticion&lt;br /&gt;
default [[SoapUI]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:SoapUI-Parametros-Peticion.jpg|center|Editar Parametros Peticion&lt;br /&gt;
default [[SoapUI]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
4. El proyecto se persiste en un script XML, que podemos resguardar en el repositorio en el que tengamos el código fuente del proyecto. Y así todo el equipo podrá hacer crecer la prueba funcional automática del proyecto, y de un modo ágil.&lt;br /&gt;
&lt;br /&gt;
5. Con los pasos dados hasta acá, logramos obtener una prueba funcional del proyecto y su documentación.&lt;br /&gt;
&lt;br /&gt;
6. Esta herramienta maneja el concepto de TestSuite, TestCase, TestStep, como lo manejan [[JUnit]], [[JMeter]], etc. Un TestSuite sirve para contener un número arbitrario de casos de prueba (TestCases) que pueden ejecutarse secuencialmente o en paralelo.  Los TestSteps sirven para ejecutar TestCases secuencialmente.&lt;br /&gt;
Una vez creadas las peticiones, es posible generar una TestSuite y así automatizar las pruebas funcionales, con el valor agregado de tener [[pruebas de regresión]].&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:SoapUI-Agregar-Caso-Prueba.jpg|center|Agregar Peticion a un Caso de Prueba&lt;br /&gt;
default [[SoapUI]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
7. Por cada TestCase es posible hacer validaciones automáticas de los resultados. Entonces, por cada petición, verificar si la respuesta es un fault, o no lo es, o contiene determinado valor, o no lo contiene. Es una buena práctica, en el manejo de web services, que los errores inesperado del sistema (Runtime Exception) viajen en un tag “fault”. Distinto a una respuesta normal del servicio.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:SoapUI-Agregar-Aserciones.jpg|center|Agregar una asercion a la respuesta de una peticion&lt;br /&gt;
default [[SoapUI]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:SoapUI-Tipos-Aserciones.jpg|center|Tipos de Aserciones&lt;br /&gt;
default [[SoapUI]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:SoapUI-Asercion-Contenido.jpg|center|Agregar una asercion de contenido&lt;br /&gt;
default [[SoapUI]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
8. Con las peticiones agregadas a los casos de prueba, se puede realizar una ejecución masiva utilizando la opción Launch TestRunner.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:SoapUI-Ejecutar-Casos.jpg|center|Configurar y Ejecutar Casos de Prueba&lt;br /&gt;
default [[SoapUI]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Mientras se ejecutan los casos de prueba, se pueden visualizar los pasos de ejecución y un resumen global.&lt;br /&gt;
En el directorio físico configurado, se genera un archivo por cada caso de prueba 	con la nomenclatura conteniendo el TestSuite que lo ejecutó, el nombre del caso de 	prueba, y el resultado de la prueba.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Derechos reservados==&lt;br /&gt;
&lt;br /&gt;
==Transferencia de datos entre peticiones==&lt;br /&gt;
&lt;br /&gt;
En un TestSuite podemos tener un TestCase con Steps, donde cada Step puede ser un request de una operación diferente del web service. Y el valor devuelto en un Step puede ser el valor de entrada en el próximo Step. Más en el [http://www.soapui.org/userguide/functional/propertytransfers.html#The_PropertyTransfer_Editor tutorial de soapUI]&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; align=&amp;quot;center&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
 |-&lt;br /&gt;
 | &amp;lt;imagemap&amp;gt;&lt;br /&gt;
Image:SoapUI-TestSuite2ConTransfer.jpg|center|Transferencia de datos entre peticiones&lt;br /&gt;
default [[SoapUI]]&lt;br /&gt;
desc none&lt;br /&gt;
&amp;lt;/imagemap&amp;gt; &lt;br /&gt;
&amp;lt;p align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:large&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
==Conclusión==&lt;br /&gt;
&lt;br /&gt;
*Es fácil y rápido crear, ejecutar y guardar los casos de prueba funcional que quieras. Se pueden adaptar y expandir en cualquier momento.&lt;br /&gt;
*Es fácil hacer aserciones. También con expresiones regulares.&lt;br /&gt;
&lt;br /&gt;
==Algo más==&lt;br /&gt;
&lt;br /&gt;
*Se puede agregar MockService cuando el web service todavía no está listo.&lt;br /&gt;
*Load Tests permite medir performance sobre los tests funcionales creados.&lt;br /&gt;
*Esta nota está basada en una [http://www.soapui.org/userguide/functional/index.html guia] y en un [http://www.soapui.org/movies/sample_project/sample_project.html video] de la [http://www.soapui.org/ página oficial de SoapUI].&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[SoapUI Con JUnit]]&lt;br /&gt;
* [[Mock de un web service con SoapUI]]&lt;br /&gt;
* [http://www.soapui.org/ Web oficial de SoapUI]&lt;br /&gt;
* [http://www.dosideas.com/foros/5-ascensor-a-ningun-lugar/658-web-service-minimo-para-pruebas-de-desarrollo.html Foro de Ayuda para Simular un Web Service en Desarrollo]&lt;br /&gt;
&lt;br /&gt;
[[Category:Web Service]]&lt;br /&gt;
[[Category:ATDD]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=HTML&amp;diff=5876</id>
		<title>HTML</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=HTML&amp;diff=5876"/>
				<updated>2011-07-08T20:48:55Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[HTML]] es un lenguaje de marcas para dar formato a datos en la web.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Tablas en HTML]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Tablas_en_HTML&amp;diff=5875</id>
		<title>Tablas en HTML</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Tablas_en_HTML&amp;diff=5875"/>
				<updated>2011-07-08T20:46:28Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En [[HTML]], ¿cuándo usar Tablas y cuando no usarlas? A mi parecer, se generó un odio extraño hacia las tablas en html, y este odio creo yo, viene desde los [[IDE]]s visuales de paginas html en sus principios de la web como el FrontPage o el DreamWeaver, donde uno arrastraba controles sobre una 'hoja' y creaba una página web, pero el html que generaba por detrás era realmente desastroso. Porque era desastroso?, la realidad es que el IDE desconocía lo que intentábamos formar, solo agrupaba los elementos de forma tal que se vieran como lo quisiéramos y esto lo hacía creando tablas, entre muchas otras cosas, para poder estructurar la pagina.&lt;br /&gt;
&lt;br /&gt;
Habría que pensarlo de otra manera, ni las tablas, ni los divs, ni los ul, ni cualquier otro contenedor sirve para cualquier cosa. Cada elemento fue creado con un propósito, el punto principal es entender cual es el propósito de cada uno y utilizarlo de esa manera.&lt;br /&gt;
&lt;br /&gt;
Las tablas fueron creadas para visualizar grillas. Si vamos a diseñar la estructura de una página web el elemento table no es la respuesta, si vamos a mostrar una lista de elementos enumerados usamos un UL, si vamos a agurpar elementos usaremos un div, etc. pero si necesitamos mostrar una '''grilla''', usamos un '''table'''.&lt;br /&gt;
&lt;br /&gt;
El mejor ejemplo que se me ocurre en este momento es una factura. Supongamos que tenemos que mostrar una factura, la misma está compuesta por un Encabezado, Productos y Pie. El encabezado tiene la información del consumidor, no es una grilla por lo que utilizaremos otro contenedor, pero para el detalle de productos si tenemos una grilla de 4 columnas: Cantidad, Detalle de Producto, Precio unitario y Precio total. Eso si es una grilla y utilizar una tabla es la solución.&lt;br /&gt;
&lt;br /&gt;
Algo a tener en cuenta en las tablas, es que pueden o no tener un encabezado y un pie también, lo que nos puede ayudar a aplicar estilos [[CSS]].&lt;br /&gt;
&lt;br /&gt;
Estructura simple de una tabla con header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Cantidad&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Detalle de Producto&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Precio Unitario&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Precio Total&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;Microprocesador Sempron 2.2 Ghz&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;200&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;200&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;Memorias RAM 4Gb&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;140&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;280&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde  vamos a tener Filas (TR) y Celdas (TD). También se puede encontrar el elemento TH y se utiliza para decirle al browser que esa celda es un header. Por lo que en la primer Fila TR si utilizamos el elemento TH para las celdas vamos a notar que algunos browsers van a identificarlo como un header automáticamente haciendo el texto con negrita.&lt;br /&gt;
&lt;br /&gt;
De esta manera, utilizamos el control para crear una grilla, para lo que fue creado y al momento de darle estilos, vamos a notar fácilmente que es mucho más ordenado, por ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
&lt;br /&gt;
table&lt;br /&gt;
{&lt;br /&gt;
    width:600px;&lt;br /&gt;
    border-collapse:collapse;&lt;br /&gt;
    border:solid 1px silver;    &lt;br /&gt;
    font-family: Verdana;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table th&lt;br /&gt;
{&lt;br /&gt;
    font-weight:bold;&lt;br /&gt;
    color: black;&lt;br /&gt;
    font-size:11pt;    &lt;br /&gt;
    border:solid 1px silver;&lt;br /&gt;
    background-color:#A9F5F2;&lt;br /&gt;
    text-align:center;&lt;br /&gt;
    padding:5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table tr td&lt;br /&gt;
{&lt;br /&gt;
    color: Black;&lt;br /&gt;
    font-size:10pt;    &lt;br /&gt;
    border:solid 1px silver;&lt;br /&gt;
    background-color:#CEECF5;&lt;br /&gt;
    padding:3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table tr:hover td&lt;br /&gt;
{&lt;br /&gt;
    background-color:#A9D0F5;&lt;br /&gt;
    cursor:pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hay mucho mas sobre tablas, pero mi objetivo es poder mostrar la facilidad que nos deja al momento de trabar con grillas y a no confundir, hablo de '''grillas''', hay muchos tags mas en html, no todo es un table y depende que se intenta hacer el elemento a usar.&lt;br /&gt;
&lt;br /&gt;
== Pruebas en linea ==&lt;br /&gt;
&lt;br /&gt;
Les dejo un [http://jsfiddle.net/pjnovas/Xsuzp jsFiddle] para que vean el ejemplo en vivo y puedan hacer pruebas.&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Tablas_en_HTML&amp;diff=5874</id>
		<title>Tablas en HTML</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Tablas_en_HTML&amp;diff=5874"/>
				<updated>2011-07-08T20:45:18Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: Página creada con '¿Cuándo usar Tablas y cuando no usarlas? A mi parecer, se generó un odio extraño hacia las tablas en html, y este odio creo yo, viene desde los IDEs visuales de paginas html…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;¿Cuándo usar Tablas y cuando no usarlas? A mi parecer, se generó un odio extraño hacia las tablas en html, y este odio creo yo, viene desde los IDEs visuales de paginas html en sus principios de la web como el FrontPage o el DreamWeaver, donde uno arrastraba controles sobre una 'hoja' y creaba una página web, pero el html que generaba por detrás era realmente desastroso. Porque era desastroso?, la realidad es que el IDE desconocía lo que intentábamos formar, solo agrupaba los elementos de forma tal que se vieran como lo quisiéramos y esto lo hacía creando tablas, entre muchas otras cosas, para poder estructurar la pagina.&lt;br /&gt;
&lt;br /&gt;
Habría que pensarlo de otra manera, ni las tablas, ni los divs, ni los ul, ni cualquier otro contenedor sirve para cualquier cosa. Cada elemento fue creado con un propósito, el punto principal es entender cual es el propósito de cada uno y utilizarlo de esa manera.&lt;br /&gt;
&lt;br /&gt;
Las tablas fueron creadas para visualizar grillas. Si vamos a diseñar la estructura de una página web el elemento table no es la respuesta, si vamos a mostrar una lista de elementos enumerados usamos un UL, si vamos a agurpar elementos usaremos un div, etc. pero si necesitamos mostrar una '''grilla''', usamos un '''table'''.&lt;br /&gt;
&lt;br /&gt;
El mejor ejemplo que se me ocurre en este momento es una factura. Supongamos que tenemos que mostrar una factura, la misma está compuesta por un Encabezado, Productos y Pie. El encabezado tiene la información del consumidor, no es una grilla por lo que utilizaremos otro contenedor, pero para el detalle de productos si tenemos una grilla de 4 columnas: Cantidad, Detalle de Producto, Precio unitario y Precio total. Eso si es una grilla y utilizar una tabla es la solución.&lt;br /&gt;
&lt;br /&gt;
Algo a tener en cuenta en las tablas, es que pueden o no tener un encabezado y un pie también, lo que nos puede ayudar a aplicar estilos CSS.&lt;br /&gt;
&lt;br /&gt;
Estructura simple de una tabla con header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Cantidad&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Detalle de Producto&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Precio Unitario&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Precio Total&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;Microprocesador Sempron 2.2 Ghz&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;200&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;200&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;Memorias RAM 4Gb&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;140&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;280&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde  vamos a tener Filas (TR) y Celdas (TD). También se puede encontrar el elemento TH y se utiliza para decirle al browser que esa celda es un header. Por lo que en la primer Fila TR si utilizamos el elemento TH para las celdas vamos a notar que algunos browsers van a identificarlo como un header automáticamente haciendo el texto con negrita.&lt;br /&gt;
&lt;br /&gt;
De esta manera, utilizamos el control para crear una grilla, para lo que fue creado y al momento de darle estilos, vamos a notar fácilmente que es mucho más ordenado, por ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
&lt;br /&gt;
table&lt;br /&gt;
{&lt;br /&gt;
    width:600px;&lt;br /&gt;
    border-collapse:collapse;&lt;br /&gt;
    border:solid 1px silver;    &lt;br /&gt;
    font-family: Verdana;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table th&lt;br /&gt;
{&lt;br /&gt;
    font-weight:bold;&lt;br /&gt;
    color: black;&lt;br /&gt;
    font-size:11pt;    &lt;br /&gt;
    border:solid 1px silver;&lt;br /&gt;
    background-color:#A9F5F2;&lt;br /&gt;
    text-align:center;&lt;br /&gt;
    padding:5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table tr td&lt;br /&gt;
{&lt;br /&gt;
    color: Black;&lt;br /&gt;
    font-size:10pt;    &lt;br /&gt;
    border:solid 1px silver;&lt;br /&gt;
    background-color:#CEECF5;&lt;br /&gt;
    padding:3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table tr:hover td&lt;br /&gt;
{&lt;br /&gt;
    background-color:#A9D0F5;&lt;br /&gt;
    cursor:pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hay mucho mas sobre tablas, pero mi objetivo es poder mostrar la facilidad que nos deja al momento de trabar con grillas y a no confundir, hablo de '''grillas''', hay muchos tags mas en html, no todo es un table y depende que se intenta hacer el elemento a usar.&lt;br /&gt;
&lt;br /&gt;
Les dejo un [http://jsfiddle.net/pjnovas/Xsuzp jsFiddle] para que vean el ejemplo en vivo y puedan hacer pruebas.&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Spring_Integration&amp;diff=5844</id>
		<title>Spring Integration</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Spring_Integration&amp;diff=5844"/>
				<updated>2011-07-07T14:13:59Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Adaptadores */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.springsource.org/spring-integration Spring Integration] es un producto relativamente desconocido del Spring.&lt;br /&gt;
Brinda una extensión a Spring para soportar los [http://www.eaipatterns.com/ Patrones de Integración Corporativos] en pocas palabras es un [http://en.wikipedia.org/wiki/Enterprise_service_bus  ESB] liviano montado sobre el contenedor de Spring e independiente del Servidor de aplicaciones. Permite utilizar mensajería dentro de una aplicación Spring, y se integra con sistemas externos a través de adaptadores. Se basa en el concepto de &amp;quot;mensajes&amp;quot; para intercambiar datos entre distintos componentes.&lt;br /&gt;
&lt;br /&gt;
==Conceptos y componentes básicos==&lt;br /&gt;
&lt;br /&gt;
===Conceptos===&lt;br /&gt;
&lt;br /&gt;
* '''Channel (MessageChannel)''', representa un canal lógico por donde se reciben o se envían mensajes.&lt;br /&gt;
&lt;br /&gt;
* '''Channel-adapter''', representa el adaptador entre el canal lógico y una implementación física de ese canal. &lt;br /&gt;
&lt;br /&gt;
* '''Bridge''', se encarga de redireccionar todos los mensajes del canal de entrada hacia un canal de salida.&lt;br /&gt;
&lt;br /&gt;
* '''Router''', se encarga de redireccionar los mensajes que llegan a un canal de entrada hacia uno o varios canales de salida, dependiendo de ciertas condiciones.&lt;br /&gt;
&lt;br /&gt;
* '''Splitter''', se encarga de separar el contenido de un mensaje en muchos mensajes.&lt;br /&gt;
&lt;br /&gt;
* '''Transformer''', se encarga de transformar el formato del contenido del mensaje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Componentes===&lt;br /&gt;
&lt;br /&gt;
* '''Message''', esta compuesto por una cabecera (headers) y por un cuerpo (Payload). &lt;br /&gt;
&lt;br /&gt;
* '''MessageChannel''', provee métodos para enviar y recibir. &lt;br /&gt;
&lt;br /&gt;
* '''MessageEndpoint''', Conecta un Handler a un MessageChannel de entrada o/y a uno de salida.&lt;br /&gt;
&lt;br /&gt;
* '''MessageHandler''', interfaz que permite transformer, rutear y en general “tartar” cualquier mensaje de Entrada.&lt;br /&gt;
&lt;br /&gt;
* '''Channel Adapters''', se usan para enviar y recibir mensajes a sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Adaptadores==&lt;br /&gt;
&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#ip TCP y UDP]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#http HTTP]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#feed RSS/ATOM]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#ws Web Services]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#mail Mail (POP3, IMAP, SMTP)]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jms JMS]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jdbc JDBC]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jmx JMX]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#rmi RMI]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Taller ==&lt;br /&gt;
&lt;br /&gt;
{{curso|url=http://www.dosideas.com/cursos/course/view.php?id=12|nombre=Introducción a Spring Integration}}&lt;br /&gt;
&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
=== Configuración de canales ===&lt;br /&gt;
[[Spring Integration]] se basa en ''canales'', lugares en donde se consumen o envian mensajes. Estos canales pueden ser colas [[JMS]] u otros medios, como clases propias. La siguiente definición de canales se usa en los ejemplos que siguen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneIn&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;jms:message-driven-channel-adapter connection-factory=&amp;quot;PruebaQueueConnectionFactory&amp;quot; &lt;br /&gt;
destination-name=&amp;quot;jms/Queue-in&amp;quot; destination-resolver=&amp;quot;jmsDestinationResolver&amp;quot; &lt;br /&gt;
channel=&amp;quot;QueueChanneIn&amp;quot; acknowledge=&amp;quot;auto&amp;quot; concurrent-consumers=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;jms:outbound-channel-adapter jms-template=&amp;quot;jmsQueueTemplateOut1&amp;quot; channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;jms:outbound-channel-adapter jms-template=&amp;quot;jmsQueueTemplateOut2&amp;quot; channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===stdout-channel-adapter===&lt;br /&gt;
Podemos consumir un mensaje de una cola y mostrarlo por consola. Para esto es necesario configurar un '''stdout-channel-adapter''', el cual se encargará de procesar los mensajes. Luego, se crea un '''bridge''' que asocia un canal de entrada con este adaptador. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;stream:stdout-channel-adapter id=&amp;quot;stdout&amp;quot; append-newline=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;integration:bridge id=&amp;quot;echo&amp;quot; input-channel=&amp;quot;QueueChanneIn&amp;quot; output-channel=&amp;quot;stdout&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===recipient-list-router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una lista fija de canales de destino. En este ejemplo creamos un '''recipient-list-router''', el cual consume mensajes de un canal de entrada y los envia a dos canales de destino distintos. Entonces, cada mensaje que llegue al canal de entrada será derivado a dos canales de destino. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:recipient-list-router input-channel=&amp;quot;QueueChanneIn&amp;quot; apply-sequence=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;integration:recipient channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;integration:recipient channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/integration:recipient-list-router&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===header-value-router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una cola especifica dependiendo del valor de un atributo del header del mensaje. De esta manera, configuramos un '''header-value-router''', el cual contiene el canal de entrada y el nombre del atributo del encabezado que se comprobará. Luego, se realiza el mapeo entre los posibles valores de este encabezado y algún canal de destino. Si llega un mensaje que coincida este mapeo, será enviado a ese canal de destino.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:header-value-router input-channel=&amp;quot;QueueChanneIn&amp;quot; &lt;br /&gt;
header-name=&amp;quot;springintegration_jms_type&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;integration:mapping value=&amp;quot;Out1&amp;quot; channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;integration:mapping value=&amp;quot;Out2&amp;quot; channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/integration:header-value-router&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una lista de colas de salida utilizando un pojo para determinar a que colas enviarlo. En este ejemplo, creamos un '''router''' que será implementado por la clase &amp;quot;MultiDestino&amp;quot;. Esta clase devuelve una lista de nombres de canales hacia donde se derivará el mensaje.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:router input-channel=&amp;quot;QueueChanneIn&amp;quot; ref=&amp;quot;multiDestino&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;multiDestino&amp;quot; class=&amp;quot;com.dosideas.springintegration.MultiDestino&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
public class MultiDestino {&lt;br /&gt;
&lt;br /&gt;
    @Router&lt;br /&gt;
    public List&amp;lt;String&amp;gt; resolverChannel(GenericMessage message) throws JMSException {&lt;br /&gt;
&lt;br /&gt;
        List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
        if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Out1&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut1&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
        else if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Out2&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut2&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Multi&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut1&amp;quot;);&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut2&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return list;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=29%3Ap Descargar un proyecto con varios ejemplos de Spring Integration]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/reference/htmlsingle/spring-integration-reference.html Manual de referencia de Spring Integration]&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring Framework]]&lt;br /&gt;
[[Category:JMS]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Spring_Integration&amp;diff=5843</id>
		<title>Spring Integration</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Spring_Integration&amp;diff=5843"/>
				<updated>2011-07-07T14:11:12Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Aplicaciones demo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.springsource.org/spring-integration Spring Integration] es un producto relativamente desconocido del Spring.&lt;br /&gt;
Brinda una extensión a Spring para soportar los [http://www.eaipatterns.com/ Patrones de Integración Corporativos] en pocas palabras es un [http://en.wikipedia.org/wiki/Enterprise_service_bus  ESB] liviano montado sobre el contenedor de Spring e independiente del Servidor de aplicaciones. Permite utilizar mensajería dentro de una aplicación Spring, y se integra con sistemas externos a través de adaptadores. Se basa en el concepto de &amp;quot;mensajes&amp;quot; para intercambiar datos entre distintos componentes.&lt;br /&gt;
&lt;br /&gt;
==Conceptos y componentes básicos==&lt;br /&gt;
&lt;br /&gt;
===Conceptos===&lt;br /&gt;
&lt;br /&gt;
* '''Channel (MessageChannel)''', representa un canal lógico por donde se reciben o se envían mensajes.&lt;br /&gt;
&lt;br /&gt;
* '''Channel-adapter''', representa el adaptador entre el canal lógico y una implementación física de ese canal. &lt;br /&gt;
&lt;br /&gt;
* '''Bridge''', se encarga de redireccionar todos los mensajes del canal de entrada hacia un canal de salida.&lt;br /&gt;
&lt;br /&gt;
* '''Router''', se encarga de redireccionar los mensajes que llegan a un canal de entrada hacia uno o varios canales de salida, dependiendo de ciertas condiciones.&lt;br /&gt;
&lt;br /&gt;
* '''Splitter''', se encarga de separar el contenido de un mensaje en muchos mensajes.&lt;br /&gt;
&lt;br /&gt;
* '''Transformer''', se encarga de transformar el formato del contenido del mensaje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Componentes===&lt;br /&gt;
&lt;br /&gt;
* '''Message''', esta compuesto por una cabecera (headers) y por un cuerpo (Payload). &lt;br /&gt;
&lt;br /&gt;
* '''MessageChannel''', provee métodos para enviar y recibir. &lt;br /&gt;
&lt;br /&gt;
* '''MessageEndpoint''', Conecta un Handler a un MessageChannel de entrada o/y a uno de salida.&lt;br /&gt;
&lt;br /&gt;
* '''MessageHandler''', interfaz que permite transformer, rutear y en general “tartar” cualquier mensaje de Entrada.&lt;br /&gt;
&lt;br /&gt;
* '''Channel Adapters''', se usan para enviar y recibir mensajes a sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Adaptadores==&lt;br /&gt;
&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#ip TCP y UDP]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#http HTTP]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#feed RSS/ATOM]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#ws Web Services]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#mail Mail (POP3, IMAP, SMTP)]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jms JMS]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jdbc JDBC]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jmx JMX]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#rmi RMI]&lt;br /&gt;
&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
=== Configuración de canales ===&lt;br /&gt;
[[Spring Integration]] se basa en ''canales'', lugares en donde se consumen o envian mensajes. Estos canales pueden ser colas [[JMS]] u otros medios, como clases propias. La siguiente definición de canales se usa en los ejemplos que siguen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneIn&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;jms:message-driven-channel-adapter connection-factory=&amp;quot;PruebaQueueConnectionFactory&amp;quot; &lt;br /&gt;
destination-name=&amp;quot;jms/Queue-in&amp;quot; destination-resolver=&amp;quot;jmsDestinationResolver&amp;quot; &lt;br /&gt;
channel=&amp;quot;QueueChanneIn&amp;quot; acknowledge=&amp;quot;auto&amp;quot; concurrent-consumers=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;jms:outbound-channel-adapter jms-template=&amp;quot;jmsQueueTemplateOut1&amp;quot; channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;jms:outbound-channel-adapter jms-template=&amp;quot;jmsQueueTemplateOut2&amp;quot; channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===stdout-channel-adapter===&lt;br /&gt;
Podemos consumir un mensaje de una cola y mostrarlo por consola. Para esto es necesario configurar un '''stdout-channel-adapter''', el cual se encargará de procesar los mensajes. Luego, se crea un '''bridge''' que asocia un canal de entrada con este adaptador. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;stream:stdout-channel-adapter id=&amp;quot;stdout&amp;quot; append-newline=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;integration:bridge id=&amp;quot;echo&amp;quot; input-channel=&amp;quot;QueueChanneIn&amp;quot; output-channel=&amp;quot;stdout&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===recipient-list-router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una lista fija de canales de destino. En este ejemplo creamos un '''recipient-list-router''', el cual consume mensajes de un canal de entrada y los envia a dos canales de destino distintos. Entonces, cada mensaje que llegue al canal de entrada será derivado a dos canales de destino. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:recipient-list-router input-channel=&amp;quot;QueueChanneIn&amp;quot; apply-sequence=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;integration:recipient channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;integration:recipient channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/integration:recipient-list-router&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===header-value-router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una cola especifica dependiendo del valor de un atributo del header del mensaje. De esta manera, configuramos un '''header-value-router''', el cual contiene el canal de entrada y el nombre del atributo del encabezado que se comprobará. Luego, se realiza el mapeo entre los posibles valores de este encabezado y algún canal de destino. Si llega un mensaje que coincida este mapeo, será enviado a ese canal de destino.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:header-value-router input-channel=&amp;quot;QueueChanneIn&amp;quot; &lt;br /&gt;
header-name=&amp;quot;springintegration_jms_type&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;integration:mapping value=&amp;quot;Out1&amp;quot; channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;integration:mapping value=&amp;quot;Out2&amp;quot; channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/integration:header-value-router&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una lista de colas de salida utilizando un pojo para determinar a que colas enviarlo. En este ejemplo, creamos un '''router''' que será implementado por la clase &amp;quot;MultiDestino&amp;quot;. Esta clase devuelve una lista de nombres de canales hacia donde se derivará el mensaje.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:router input-channel=&amp;quot;QueueChanneIn&amp;quot; ref=&amp;quot;multiDestino&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;multiDestino&amp;quot; class=&amp;quot;com.dosideas.springintegration.MultiDestino&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
public class MultiDestino {&lt;br /&gt;
&lt;br /&gt;
    @Router&lt;br /&gt;
    public List&amp;lt;String&amp;gt; resolverChannel(GenericMessage message) throws JMSException {&lt;br /&gt;
&lt;br /&gt;
        List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
        if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Out1&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut1&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
        else if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Out2&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut2&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Multi&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut1&amp;quot;);&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut2&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return list;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=29%3Ap Descargar un proyecto con varios ejemplos de Spring Integration]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/reference/htmlsingle/spring-integration-reference.html Manual de referencia de Spring Integration]&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring Framework]]&lt;br /&gt;
[[Category:JMS]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Spring_Integration&amp;diff=5842</id>
		<title>Spring Integration</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Spring_Integration&amp;diff=5842"/>
				<updated>2011-07-07T14:09:55Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Adaptadores */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.springsource.org/spring-integration Spring Integration] es un producto relativamente desconocido del Spring.&lt;br /&gt;
Brinda una extensión a Spring para soportar los [http://www.eaipatterns.com/ Patrones de Integración Corporativos] en pocas palabras es un [http://en.wikipedia.org/wiki/Enterprise_service_bus  ESB] liviano montado sobre el contenedor de Spring e independiente del Servidor de aplicaciones. Permite utilizar mensajería dentro de una aplicación Spring, y se integra con sistemas externos a través de adaptadores. Se basa en el concepto de &amp;quot;mensajes&amp;quot; para intercambiar datos entre distintos componentes.&lt;br /&gt;
&lt;br /&gt;
==Conceptos y componentes básicos==&lt;br /&gt;
&lt;br /&gt;
===Conceptos===&lt;br /&gt;
&lt;br /&gt;
* '''Channel (MessageChannel)''', representa un canal lógico por donde se reciben o se envían mensajes.&lt;br /&gt;
&lt;br /&gt;
* '''Channel-adapter''', representa el adaptador entre el canal lógico y una implementación física de ese canal. &lt;br /&gt;
&lt;br /&gt;
* '''Bridge''', se encarga de redireccionar todos los mensajes del canal de entrada hacia un canal de salida.&lt;br /&gt;
&lt;br /&gt;
* '''Router''', se encarga de redireccionar los mensajes que llegan a un canal de entrada hacia uno o varios canales de salida, dependiendo de ciertas condiciones.&lt;br /&gt;
&lt;br /&gt;
* '''Splitter''', se encarga de separar el contenido de un mensaje en muchos mensajes.&lt;br /&gt;
&lt;br /&gt;
* '''Transformer''', se encarga de transformar el formato del contenido del mensaje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Componentes===&lt;br /&gt;
&lt;br /&gt;
* '''Message''', esta compuesto por una cabecera (headers) y por un cuerpo (Payload). &lt;br /&gt;
&lt;br /&gt;
* '''MessageChannel''', provee métodos para enviar y recibir. &lt;br /&gt;
&lt;br /&gt;
* '''MessageEndpoint''', Conecta un Handler a un MessageChannel de entrada o/y a uno de salida.&lt;br /&gt;
&lt;br /&gt;
* '''MessageHandler''', interfaz que permite transformer, rutear y en general “tartar” cualquier mensaje de Entrada.&lt;br /&gt;
&lt;br /&gt;
* '''Channel Adapters''', se usan para enviar y recibir mensajes a sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Adaptadores==&lt;br /&gt;
&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#ip TCP y UDP]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#http HTTP]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#feed RSS/ATOM]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#ws Web Services]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#mail Mail (POP3, IMAP, SMTP)]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jms JMS]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jdbc JDBC]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jmx JMX]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#rmi RMI]&lt;br /&gt;
&lt;br /&gt;
== Aplicaciones demo ==&lt;br /&gt;
&lt;br /&gt;
[http://dosideas-aplicaciones-modelo.googlecode.com/svn/spring-integration-demo/trunk Descarga] con svn nuestra demo, es un proyecto Maven con ejemplos de algunos de los adaptadores más utilizados.&lt;br /&gt;
&lt;br /&gt;
{{curso|url=http://www.dosideas.com/cursos/course/view.php?id=12|nombre=Introducción a Spring Integration}}&lt;br /&gt;
&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
=== Configuración de canales ===&lt;br /&gt;
[[Spring Integration]] se basa en ''canales'', lugares en donde se consumen o envian mensajes. Estos canales pueden ser colas [[JMS]] u otros medios, como clases propias. La siguiente definición de canales se usa en los ejemplos que siguen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneIn&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;jms:message-driven-channel-adapter connection-factory=&amp;quot;PruebaQueueConnectionFactory&amp;quot; &lt;br /&gt;
destination-name=&amp;quot;jms/Queue-in&amp;quot; destination-resolver=&amp;quot;jmsDestinationResolver&amp;quot; &lt;br /&gt;
channel=&amp;quot;QueueChanneIn&amp;quot; acknowledge=&amp;quot;auto&amp;quot; concurrent-consumers=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;jms:outbound-channel-adapter jms-template=&amp;quot;jmsQueueTemplateOut1&amp;quot; channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;jms:outbound-channel-adapter jms-template=&amp;quot;jmsQueueTemplateOut2&amp;quot; channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===stdout-channel-adapter===&lt;br /&gt;
Podemos consumir un mensaje de una cola y mostrarlo por consola. Para esto es necesario configurar un '''stdout-channel-adapter''', el cual se encargará de procesar los mensajes. Luego, se crea un '''bridge''' que asocia un canal de entrada con este adaptador. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;stream:stdout-channel-adapter id=&amp;quot;stdout&amp;quot; append-newline=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;integration:bridge id=&amp;quot;echo&amp;quot; input-channel=&amp;quot;QueueChanneIn&amp;quot; output-channel=&amp;quot;stdout&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===recipient-list-router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una lista fija de canales de destino. En este ejemplo creamos un '''recipient-list-router''', el cual consume mensajes de un canal de entrada y los envia a dos canales de destino distintos. Entonces, cada mensaje que llegue al canal de entrada será derivado a dos canales de destino. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:recipient-list-router input-channel=&amp;quot;QueueChanneIn&amp;quot; apply-sequence=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;integration:recipient channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;integration:recipient channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/integration:recipient-list-router&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===header-value-router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una cola especifica dependiendo del valor de un atributo del header del mensaje. De esta manera, configuramos un '''header-value-router''', el cual contiene el canal de entrada y el nombre del atributo del encabezado que se comprobará. Luego, se realiza el mapeo entre los posibles valores de este encabezado y algún canal de destino. Si llega un mensaje que coincida este mapeo, será enviado a ese canal de destino.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:header-value-router input-channel=&amp;quot;QueueChanneIn&amp;quot; &lt;br /&gt;
header-name=&amp;quot;springintegration_jms_type&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;integration:mapping value=&amp;quot;Out1&amp;quot; channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;integration:mapping value=&amp;quot;Out2&amp;quot; channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/integration:header-value-router&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una lista de colas de salida utilizando un pojo para determinar a que colas enviarlo. En este ejemplo, creamos un '''router''' que será implementado por la clase &amp;quot;MultiDestino&amp;quot;. Esta clase devuelve una lista de nombres de canales hacia donde se derivará el mensaje.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:router input-channel=&amp;quot;QueueChanneIn&amp;quot; ref=&amp;quot;multiDestino&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;multiDestino&amp;quot; class=&amp;quot;com.dosideas.springintegration.MultiDestino&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
public class MultiDestino {&lt;br /&gt;
&lt;br /&gt;
    @Router&lt;br /&gt;
    public List&amp;lt;String&amp;gt; resolverChannel(GenericMessage message) throws JMSException {&lt;br /&gt;
&lt;br /&gt;
        List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
        if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Out1&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut1&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
        else if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Out2&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut2&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Multi&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut1&amp;quot;);&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut2&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return list;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=29%3Ap Descargar un proyecto con varios ejemplos de Spring Integration]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/reference/htmlsingle/spring-integration-reference.html Manual de referencia de Spring Integration]&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring Framework]]&lt;br /&gt;
[[Category:JMS]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Spring_Integration&amp;diff=5841</id>
		<title>Spring Integration</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Spring_Integration&amp;diff=5841"/>
				<updated>2011-07-07T13:55:43Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.springsource.org/spring-integration Spring Integration] es un producto relativamente desconocido del Spring.&lt;br /&gt;
Brinda una extensión a Spring para soportar los [http://www.eaipatterns.com/ Patrones de Integración Corporativos] en pocas palabras es un [http://en.wikipedia.org/wiki/Enterprise_service_bus  ESB] liviano montado sobre el contenedor de Spring e independiente del Servidor de aplicaciones. Permite utilizar mensajería dentro de una aplicación Spring, y se integra con sistemas externos a través de adaptadores. Se basa en el concepto de &amp;quot;mensajes&amp;quot; para intercambiar datos entre distintos componentes.&lt;br /&gt;
&lt;br /&gt;
==Conceptos y componentes básicos==&lt;br /&gt;
&lt;br /&gt;
===Conceptos===&lt;br /&gt;
&lt;br /&gt;
* '''Channel (MessageChannel)''', representa un canal lógico por donde se reciben o se envían mensajes.&lt;br /&gt;
&lt;br /&gt;
* '''Channel-adapter''', representa el adaptador entre el canal lógico y una implementación física de ese canal. &lt;br /&gt;
&lt;br /&gt;
* '''Bridge''', se encarga de redireccionar todos los mensajes del canal de entrada hacia un canal de salida.&lt;br /&gt;
&lt;br /&gt;
* '''Router''', se encarga de redireccionar los mensajes que llegan a un canal de entrada hacia uno o varios canales de salida, dependiendo de ciertas condiciones.&lt;br /&gt;
&lt;br /&gt;
* '''Splitter''', se encarga de separar el contenido de un mensaje en muchos mensajes.&lt;br /&gt;
&lt;br /&gt;
* '''Transformer''', se encarga de transformar el formato del contenido del mensaje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Componentes===&lt;br /&gt;
&lt;br /&gt;
* '''Message''', esta compuesto por una cabecera (headers) y por un cuerpo (Payload). &lt;br /&gt;
&lt;br /&gt;
* '''MessageChannel''', provee métodos para enviar y recibir. &lt;br /&gt;
&lt;br /&gt;
* '''MessageEndpoint''', Conecta un Handler a un MessageChannel de entrada o/y a uno de salida.&lt;br /&gt;
&lt;br /&gt;
* '''MessageHandler''', interfaz que permite transformer, rutear y en general “tartar” cualquier mensaje de Entrada.&lt;br /&gt;
&lt;br /&gt;
* '''Channel Adapters''', se usan para enviar y recibir mensajes a sistemas externos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Adaptadores==&lt;br /&gt;
&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#ip TCP y UDP]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#http HTTP]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#feed RSS/ATOM]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#ws Web Services]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#mail Mail (POP3, IMAP, SMTP)]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jms JMS]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jdbc JDBC]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jmx JMX]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#rmi RMI]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{curso|url=http://www.dosideas.com/cursos/course/view.php?id=12|nombre=Introducción a Spring Integration}}&lt;br /&gt;
&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
=== Configuración de canales ===&lt;br /&gt;
[[Spring Integration]] se basa en ''canales'', lugares en donde se consumen o envian mensajes. Estos canales pueden ser colas [[JMS]] u otros medios, como clases propias. La siguiente definición de canales se usa en los ejemplos que siguen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneIn&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;jms:message-driven-channel-adapter connection-factory=&amp;quot;PruebaQueueConnectionFactory&amp;quot; &lt;br /&gt;
destination-name=&amp;quot;jms/Queue-in&amp;quot; destination-resolver=&amp;quot;jmsDestinationResolver&amp;quot; &lt;br /&gt;
channel=&amp;quot;QueueChanneIn&amp;quot; acknowledge=&amp;quot;auto&amp;quot; concurrent-consumers=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;jms:outbound-channel-adapter jms-template=&amp;quot;jmsQueueTemplateOut1&amp;quot; channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;integration:channel id=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;jms:outbound-channel-adapter jms-template=&amp;quot;jmsQueueTemplateOut2&amp;quot; channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===stdout-channel-adapter===&lt;br /&gt;
Podemos consumir un mensaje de una cola y mostrarlo por consola. Para esto es necesario configurar un '''stdout-channel-adapter''', el cual se encargará de procesar los mensajes. Luego, se crea un '''bridge''' que asocia un canal de entrada con este adaptador. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;stream:stdout-channel-adapter id=&amp;quot;stdout&amp;quot; append-newline=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;integration:bridge id=&amp;quot;echo&amp;quot; input-channel=&amp;quot;QueueChanneIn&amp;quot; output-channel=&amp;quot;stdout&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===recipient-list-router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una lista fija de canales de destino. En este ejemplo creamos un '''recipient-list-router''', el cual consume mensajes de un canal de entrada y los envia a dos canales de destino distintos. Entonces, cada mensaje que llegue al canal de entrada será derivado a dos canales de destino. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:recipient-list-router input-channel=&amp;quot;QueueChanneIn&amp;quot; apply-sequence=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;integration:recipient channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;integration:recipient channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/integration:recipient-list-router&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===header-value-router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una cola especifica dependiendo del valor de un atributo del header del mensaje. De esta manera, configuramos un '''header-value-router''', el cual contiene el canal de entrada y el nombre del atributo del encabezado que se comprobará. Luego, se realiza el mapeo entre los posibles valores de este encabezado y algún canal de destino. Si llega un mensaje que coincida este mapeo, será enviado a ese canal de destino.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:header-value-router input-channel=&amp;quot;QueueChanneIn&amp;quot; &lt;br /&gt;
header-name=&amp;quot;springintegration_jms_type&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;integration:mapping value=&amp;quot;Out1&amp;quot; channel=&amp;quot;QueueChanneOut1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;integration:mapping value=&amp;quot;Out2&amp;quot; channel=&amp;quot;QueueChanneOut2&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/integration:header-value-router&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===router===&lt;br /&gt;
Podemos consumir un mensaje de una cola y enviarlo a una lista de colas de salida utilizando un pojo para determinar a que colas enviarlo. En este ejemplo, creamos un '''router''' que será implementado por la clase &amp;quot;MultiDestino&amp;quot;. Esta clase devuelve una lista de nombres de canales hacia donde se derivará el mensaje.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;integration:router input-channel=&amp;quot;QueueChanneIn&amp;quot; ref=&amp;quot;multiDestino&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;multiDestino&amp;quot; class=&amp;quot;com.dosideas.springintegration.MultiDestino&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
public class MultiDestino {&lt;br /&gt;
&lt;br /&gt;
    @Router&lt;br /&gt;
    public List&amp;lt;String&amp;gt; resolverChannel(GenericMessage message) throws JMSException {&lt;br /&gt;
&lt;br /&gt;
        List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
        if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Out1&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut1&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
        else if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Out2&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut2&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else if(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;).equals(&amp;quot;Multi&amp;quot;)) {&lt;br /&gt;
            System.out.println(message.getHeaders().get(&amp;quot;springintegration_jms_type&amp;quot;));&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut1&amp;quot;);&lt;br /&gt;
            list.add(&amp;quot;QueueChanneOut2&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return list;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=29%3Ap Descargar un proyecto con varios ejemplos de Spring Integration]&lt;br /&gt;
* [http://static.springsource.org/spring-integration/reference/htmlsingle/spring-integration-reference.html Manual de referencia de Spring Integration]&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring Framework]]&lt;br /&gt;
[[Category:JMS]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_servidor_de_correo_smtp_con_Wiser&amp;diff=5803</id>
		<title>Mock de un servidor de correo smtp con Wiser</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_servidor_de_correo_smtp_con_Wiser&amp;diff=5803"/>
				<updated>2011-07-06T12:16:47Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* El test con JUnit y Wiser */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En el siguiente ejemplo de código se muestra una clase que envía un mail usando la API de JavaMail. Luego, un Test de [[JUnit]] prueba esta clase levantando el servidor de mail [[Wiser]] en memoria y verificando que el mail haya llegado correctamente.&lt;br /&gt;
&lt;br /&gt;
== La clase que manda mails ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.dosideas.smtp;&lt;br /&gt;
&lt;br /&gt;
import java.util.Properties;&lt;br /&gt;
import javax.mail.Message;&lt;br /&gt;
import javax.mail.MessagingException;&lt;br /&gt;
import javax.mail.Session;&lt;br /&gt;
import javax.mail.Transport;&lt;br /&gt;
import javax.mail.internet.AddressException;&lt;br /&gt;
import javax.mail.internet.InternetAddress;&lt;br /&gt;
import javax.mail.internet.MimeMessage;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Clase que envía un email.&lt;br /&gt;
 */&lt;br /&gt;
public class MandaMail {&lt;br /&gt;
&lt;br /&gt;
    public void enviarMail(String mailOrigen, String mailDestinatario, String asunto, String textoMensaje)&lt;br /&gt;
                throws AddressException, MessagingException {&lt;br /&gt;
&lt;br /&gt;
        //se puede poner en true para ver la interaccion del protocolo smtp por stdout.&lt;br /&gt;
        boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
        //setea el host y puerto donde esta el servidor de mail.&lt;br /&gt;
        Properties props = new Properties();&lt;br /&gt;
        props.put(&amp;quot;mail.smtp.host&amp;quot;, &amp;quot;localhost&amp;quot;);&lt;br /&gt;
        props.put(&amp;quot;mail.smtp.port&amp;quot;, 25);&lt;br /&gt;
&lt;br /&gt;
        Session session = Session.getDefaultInstance(props, null);&lt;br /&gt;
        session.setDebug(debug);&lt;br /&gt;
&lt;br /&gt;
        // create a message&lt;br /&gt;
        Message msg = new MimeMessage(session);&lt;br /&gt;
&lt;br /&gt;
        // set the from and to address&lt;br /&gt;
        InternetAddress addressFrom = new InternetAddress(mailOrigen);&lt;br /&gt;
        msg.setFrom(addressFrom);&lt;br /&gt;
&lt;br /&gt;
        InternetAddress addressTo = new InternetAddress(mailDestinatario);&lt;br /&gt;
        msg.setRecipient(Message.RecipientType.TO, addressTo);&lt;br /&gt;
&lt;br /&gt;
        // Setting the Subject and Content Type&lt;br /&gt;
        msg.setSubject(asunto);&lt;br /&gt;
        msg.setContent(textoMensaje, &amp;quot;text/plain&amp;quot;);&lt;br /&gt;
        Transport.send(msg);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== El test con JUnit y Wiser ==&lt;br /&gt;
&lt;br /&gt;
El siguiente test utiliza la clase anterior para maquetar el [[Servidor SMTP]]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.dosideas.smtp;&lt;br /&gt;
&lt;br /&gt;
import javax.mail.internet.MimeMessage;&lt;br /&gt;
import org.subethamail.wiser.WiserMessage;&lt;br /&gt;
import org.subethamail.wiser.Wiser;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Test de envio de mail con Junit y Dumbster&lt;br /&gt;
 */&lt;br /&gt;
public class MandaMailTest {&lt;br /&gt;
&lt;br /&gt;
    private Wiser smtpServer;&lt;br /&gt;
&lt;br /&gt;
    @Before&lt;br /&gt;
    public void startSmtpServer() {&lt;br /&gt;
        smtpServer = new Wiser();&lt;br /&gt;
        smtpServer.setPort(25);&lt;br /&gt;
        smtpServer.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @After&lt;br /&gt;
    public void stopSmtpServer() {&lt;br /&gt;
        smtpServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void testEnviarMail() throws Exception {&lt;br /&gt;
&lt;br /&gt;
        MandaMail instance = new MandaMail();&lt;br /&gt;
&lt;br /&gt;
        String mailDestinatario = &amp;quot;destinatario@dosideas.com&amp;quot;;&lt;br /&gt;
        String mailOrigen = &amp;quot;origen@dosideas.com&amp;quot;;&lt;br /&gt;
        String asunto = &amp;quot;Asunto del mail de prueba&amp;quot;;&lt;br /&gt;
        String textoMensaje = &amp;quot;Este es un mail para probar el servidor de Wiser&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //envia el mail.&lt;br /&gt;
            instance.enviarMail(mailOrigen, mailDestinatario, asunto, textoMensaje);&lt;br /&gt;
        } catch (Exception e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
            fail(&amp;quot;Unexpected exception: &amp;quot; + e);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //verifica que se obtenga el mail y que tenga los datos enviados.&lt;br /&gt;
        assertTrue(smtpServer.getMessages().size() == 1);&lt;br /&gt;
        Iterator emailIter = smtpServer.getMessages().iterator();&lt;br /&gt;
        WiserMessage email = (WiserMessage) emailIter.next();&lt;br /&gt;
        MimeMessage mmessage = email.getMimeMessage();&lt;br /&gt;
        assertTrue(mmessage.getSubject().equals(asunto));&lt;br /&gt;
        assertTrue(email.getEnvelopeSender().equals(mailOrigen));&lt;br /&gt;
        assertTrue(email.getEnvelopeReceiver().equals(mailDestinatario));&lt;br /&gt;
        assertTrue(mmessage.getContent().toString().equals(textoMensaje));&lt;br /&gt;
&lt;br /&gt;
        //muestra el contenido&lt;br /&gt;
        System.out.println(&amp;quot;Mensaje recibido en servidor Wiser:&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;--------------------------------------&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;De: &amp;quot; + email.getEnvelopeSender());&lt;br /&gt;
        System.out.println(&amp;quot;Para: &amp;quot; + email.getEnvelopeReceiver());&lt;br /&gt;
        System.out.println(&amp;quot;Asunto: &amp;quot; + mmessage.getSubject());&lt;br /&gt;
        System.out.println(&amp;quot;Contenido: &amp;quot; + mmessage.getContent());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
&lt;br /&gt;
*[[Wiser]]&lt;br /&gt;
*[[Dumbster]]&lt;br /&gt;
*[[Mock Object]] &lt;br /&gt;
*[[Jetty]] &lt;br /&gt;
&lt;br /&gt;
[[Category:Java]] [[Category:TDD]] [[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_servidor_de_correo_smtp_con_Wiser&amp;diff=5802</id>
		<title>Mock de un servidor de correo smtp con Wiser</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_servidor_de_correo_smtp_con_Wiser&amp;diff=5802"/>
				<updated>2011-07-06T12:16:27Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En el siguiente ejemplo de código se muestra una clase que envía un mail usando la API de JavaMail. Luego, un Test de [[JUnit]] prueba esta clase levantando el servidor de mail [[Wiser]] en memoria y verificando que el mail haya llegado correctamente.&lt;br /&gt;
&lt;br /&gt;
== La clase que manda mails ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.dosideas.smtp;&lt;br /&gt;
&lt;br /&gt;
import java.util.Properties;&lt;br /&gt;
import javax.mail.Message;&lt;br /&gt;
import javax.mail.MessagingException;&lt;br /&gt;
import javax.mail.Session;&lt;br /&gt;
import javax.mail.Transport;&lt;br /&gt;
import javax.mail.internet.AddressException;&lt;br /&gt;
import javax.mail.internet.InternetAddress;&lt;br /&gt;
import javax.mail.internet.MimeMessage;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Clase que envía un email.&lt;br /&gt;
 */&lt;br /&gt;
public class MandaMail {&lt;br /&gt;
&lt;br /&gt;
    public void enviarMail(String mailOrigen, String mailDestinatario, String asunto, String textoMensaje)&lt;br /&gt;
                throws AddressException, MessagingException {&lt;br /&gt;
&lt;br /&gt;
        //se puede poner en true para ver la interaccion del protocolo smtp por stdout.&lt;br /&gt;
        boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
        //setea el host y puerto donde esta el servidor de mail.&lt;br /&gt;
        Properties props = new Properties();&lt;br /&gt;
        props.put(&amp;quot;mail.smtp.host&amp;quot;, &amp;quot;localhost&amp;quot;);&lt;br /&gt;
        props.put(&amp;quot;mail.smtp.port&amp;quot;, 25);&lt;br /&gt;
&lt;br /&gt;
        Session session = Session.getDefaultInstance(props, null);&lt;br /&gt;
        session.setDebug(debug);&lt;br /&gt;
&lt;br /&gt;
        // create a message&lt;br /&gt;
        Message msg = new MimeMessage(session);&lt;br /&gt;
&lt;br /&gt;
        // set the from and to address&lt;br /&gt;
        InternetAddress addressFrom = new InternetAddress(mailOrigen);&lt;br /&gt;
        msg.setFrom(addressFrom);&lt;br /&gt;
&lt;br /&gt;
        InternetAddress addressTo = new InternetAddress(mailDestinatario);&lt;br /&gt;
        msg.setRecipient(Message.RecipientType.TO, addressTo);&lt;br /&gt;
&lt;br /&gt;
        // Setting the Subject and Content Type&lt;br /&gt;
        msg.setSubject(asunto);&lt;br /&gt;
        msg.setContent(textoMensaje, &amp;quot;text/plain&amp;quot;);&lt;br /&gt;
        Transport.send(msg);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== El test con JUnit y Wiser ==&lt;br /&gt;
&lt;br /&gt;
El siguiente test utiliza la clase anterior para maquetar el [[Servidor SMTP]]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.dosideas.smtp;&lt;br /&gt;
&lt;br /&gt;
import javax.mail.internet.MimeMessage;&lt;br /&gt;
import org.subethamail.wiser.WiserMessage;&lt;br /&gt;
import org.subethamail.wiser.Wiser;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Test de envio de mail con Junit y Dumbster&lt;br /&gt;
 */&lt;br /&gt;
public class MandaMailTest {&lt;br /&gt;
&lt;br /&gt;
    private Wiser smtpServer;&lt;br /&gt;
&lt;br /&gt;
    @Before&lt;br /&gt;
    public void startSmtpServer() {&lt;br /&gt;
        smtpServer = new Wiser();&lt;br /&gt;
        smtpServer.setPort(9580);&lt;br /&gt;
        smtpServer.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @After&lt;br /&gt;
    public void stopSmtpServer() {&lt;br /&gt;
        smtpServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void testEnviarMail() throws Exception {&lt;br /&gt;
&lt;br /&gt;
        MandaMail instance = new MandaMail();&lt;br /&gt;
&lt;br /&gt;
        String mailDestinatario = &amp;quot;destinatario@dosideas.com&amp;quot;;&lt;br /&gt;
        String mailOrigen = &amp;quot;origen@dosideas.com&amp;quot;;&lt;br /&gt;
        String asunto = &amp;quot;Asunto del mail de prueba&amp;quot;;&lt;br /&gt;
        String textoMensaje = &amp;quot;Este es un mail para probar el servidor de Wiser&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //envia el mail.&lt;br /&gt;
            instance.enviarMail(mailOrigen, mailDestinatario, asunto, textoMensaje);&lt;br /&gt;
        } catch (Exception e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
            fail(&amp;quot;Unexpected exception: &amp;quot; + e);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //verifica que se obtenga el mail y que tenga los datos enviados.&lt;br /&gt;
        assertTrue(smtpServer.getMessages().size() == 1);&lt;br /&gt;
        Iterator emailIter = smtpServer.getMessages().iterator();&lt;br /&gt;
        WiserMessage email = (WiserMessage) emailIter.next();&lt;br /&gt;
        MimeMessage mmessage = email.getMimeMessage();&lt;br /&gt;
        assertTrue(mmessage.getSubject().equals(asunto));&lt;br /&gt;
        assertTrue(email.getEnvelopeSender().equals(mailOrigen));&lt;br /&gt;
        assertTrue(email.getEnvelopeReceiver().equals(mailDestinatario));&lt;br /&gt;
        assertTrue(mmessage.getContent().toString().equals(textoMensaje));&lt;br /&gt;
&lt;br /&gt;
        //muestra el contenido&lt;br /&gt;
        System.out.println(&amp;quot;Mensaje recibido en servidor Wiser:&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;--------------------------------------&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;De: &amp;quot; + email.getEnvelopeSender());&lt;br /&gt;
        System.out.println(&amp;quot;Para: &amp;quot; + email.getEnvelopeReceiver());&lt;br /&gt;
        System.out.println(&amp;quot;Asunto: &amp;quot; + mmessage.getSubject());&lt;br /&gt;
        System.out.println(&amp;quot;Contenido: &amp;quot; + mmessage.getContent());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
&lt;br /&gt;
*[[Wiser]]&lt;br /&gt;
*[[Dumbster]]&lt;br /&gt;
*[[Mock Object]] &lt;br /&gt;
*[[Jetty]] &lt;br /&gt;
&lt;br /&gt;
[[Category:Java]] [[Category:TDD]] [[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_servidor_de_correo_smtp_con_Wiser&amp;diff=5801</id>
		<title>Mock de un servidor de correo smtp con Wiser</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_servidor_de_correo_smtp_con_Wiser&amp;diff=5801"/>
				<updated>2011-07-06T12:15:14Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* El test con JUnit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En el siguiente ejemplo de código se muestra una clase que envía un mail usando la API de JavaMail. &lt;br /&gt;
Luego, un Test de Junit prueba esta clase levantando el servidor de mail [[Wiser]] en memoria y verificando que el mail haya llegado correctamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.dosideas.smtp;&lt;br /&gt;
&lt;br /&gt;
import java.util.Properties;&lt;br /&gt;
import javax.mail.Message;&lt;br /&gt;
import javax.mail.MessagingException;&lt;br /&gt;
import javax.mail.Session;&lt;br /&gt;
import javax.mail.Transport;&lt;br /&gt;
import javax.mail.internet.AddressException;&lt;br /&gt;
import javax.mail.internet.InternetAddress;&lt;br /&gt;
import javax.mail.internet.MimeMessage;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Clase que envía un email.&lt;br /&gt;
 */&lt;br /&gt;
public class MandaMail {&lt;br /&gt;
&lt;br /&gt;
    public void enviarMail(String mailOrigen, String mailDestinatario, String asunto, String textoMensaje)&lt;br /&gt;
                throws AddressException, MessagingException {&lt;br /&gt;
&lt;br /&gt;
        //se puede poner en true para ver la interaccion del protocolo smtp por stdout.&lt;br /&gt;
        boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
        //setea el host y puerto donde esta el servidor de mail.&lt;br /&gt;
        Properties props = new Properties();&lt;br /&gt;
        props.put(&amp;quot;mail.smtp.host&amp;quot;, &amp;quot;localhost&amp;quot;);&lt;br /&gt;
        props.put(&amp;quot;mail.smtp.port&amp;quot;, 25);&lt;br /&gt;
&lt;br /&gt;
        Session session = Session.getDefaultInstance(props, null);&lt;br /&gt;
        session.setDebug(debug);&lt;br /&gt;
&lt;br /&gt;
        // create a message&lt;br /&gt;
        Message msg = new MimeMessage(session);&lt;br /&gt;
&lt;br /&gt;
        // set the from and to address&lt;br /&gt;
        InternetAddress addressFrom = new InternetAddress(mailOrigen);&lt;br /&gt;
        msg.setFrom(addressFrom);&lt;br /&gt;
&lt;br /&gt;
        InternetAddress addressTo = new InternetAddress(mailDestinatario);&lt;br /&gt;
        msg.setRecipient(Message.RecipientType.TO, addressTo);&lt;br /&gt;
&lt;br /&gt;
        // Setting the Subject and Content Type&lt;br /&gt;
        msg.setSubject(asunto);&lt;br /&gt;
        msg.setContent(textoMensaje, &amp;quot;text/plain&amp;quot;);&lt;br /&gt;
        Transport.send(msg);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== El test con JUnit  ==&lt;br /&gt;
&lt;br /&gt;
El siguiente test utiliza la clase anterior para maquetar el [[Servidor SMTP]]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.dosideas.smtp;&lt;br /&gt;
&lt;br /&gt;
import javax.mail.internet.MimeMessage;&lt;br /&gt;
import org.subethamail.wiser.WiserMessage;&lt;br /&gt;
import org.subethamail.wiser.Wiser;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Test de envio de mail con Junit y Dumbster&lt;br /&gt;
 */&lt;br /&gt;
public class MandaMailTest {&lt;br /&gt;
&lt;br /&gt;
    private Wiser smtpServer;&lt;br /&gt;
&lt;br /&gt;
    @Before&lt;br /&gt;
    public void startSmtpServer() {&lt;br /&gt;
        smtpServer = new Wiser();&lt;br /&gt;
        smtpServer.setPort(9580);&lt;br /&gt;
        smtpServer.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @After&lt;br /&gt;
    public void stopSmtpServer() {&lt;br /&gt;
        smtpServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void testEnviarMail() throws Exception {&lt;br /&gt;
&lt;br /&gt;
        MandaMail instance = new MandaMail();&lt;br /&gt;
&lt;br /&gt;
        String mailDestinatario = &amp;quot;destinatario@dosideas.com&amp;quot;;&lt;br /&gt;
        String mailOrigen = &amp;quot;origen@dosideas.com&amp;quot;;&lt;br /&gt;
        String asunto = &amp;quot;Asunto del mail de prueba&amp;quot;;&lt;br /&gt;
        String textoMensaje = &amp;quot;Este es un mail para probar el servidor de Wiser&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //envia el mail.&lt;br /&gt;
            instance.enviarMail(mailOrigen, mailDestinatario, asunto, textoMensaje);&lt;br /&gt;
        } catch (Exception e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
            fail(&amp;quot;Unexpected exception: &amp;quot; + e);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //verifica que se obtenga el mail y que tenga los datos enviados.&lt;br /&gt;
        assertTrue(smtpServer.getMessages().size() == 1);&lt;br /&gt;
        Iterator emailIter = smtpServer.getMessages().iterator();&lt;br /&gt;
        WiserMessage email = (WiserMessage) emailIter.next();&lt;br /&gt;
        MimeMessage mmessage = email.getMimeMessage();&lt;br /&gt;
        assertTrue(mmessage.getSubject().equals(asunto));&lt;br /&gt;
        assertTrue(email.getEnvelopeSender().equals(mailOrigen));&lt;br /&gt;
        assertTrue(email.getEnvelopeReceiver().equals(mailDestinatario));&lt;br /&gt;
        assertTrue(mmessage.getContent().toString().equals(textoMensaje));&lt;br /&gt;
&lt;br /&gt;
        //muestra el contenido&lt;br /&gt;
        System.out.println(&amp;quot;Mensaje recibido en servidor Wiser:&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;--------------------------------------&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;De: &amp;quot; + email.getEnvelopeSender());&lt;br /&gt;
        System.out.println(&amp;quot;Para: &amp;quot; + email.getEnvelopeReceiver());&lt;br /&gt;
        System.out.println(&amp;quot;Asunto: &amp;quot; + mmessage.getSubject());&lt;br /&gt;
        System.out.println(&amp;quot;Contenido: &amp;quot; + mmessage.getContent());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
&lt;br /&gt;
*[[Wiser]]&lt;br /&gt;
*[[Dumbster]]&lt;br /&gt;
*[[Mock Object]] &lt;br /&gt;
*[[Jetty]] &lt;br /&gt;
&lt;br /&gt;
[[Category:Java]] [[Category:TDD]] [[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Wiser&amp;diff=5800</id>
		<title>Wiser</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Wiser&amp;diff=5800"/>
				<updated>2011-07-06T12:12:40Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Wiser]] es un proyecto de [[Software Libre]] que permite generar [[Mock Object]] de un servidor de mail SMTP.&lt;br /&gt;
&lt;br /&gt;
Permite realizar Tests con Junit en los que se pueden enviar y obtener mails de este servidor de correo mock.&lt;br /&gt;
 &lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Mock de un servidor de correo smtp con Wiser]]&lt;br /&gt;
* [http://code.google.com/p/subethasmtp/ Sitio oficial de Wiser]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]] [[Category:TDD]] [[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=GlassFish&amp;diff=5796</id>
		<title>GlassFish</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=GlassFish&amp;diff=5796"/>
				<updated>2011-07-01T18:59:18Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;GlassFish es un [[Servidor de Aplicaciones]] para [[Java EE]] libre de código abierto, apoyado por Sun. Usualmente GlassFish es uno de los primeros Servidores de aplicaciones en soportar las últimas novedades de [[Java EE]].&lt;br /&gt;
&lt;br /&gt;
== Librerías cliente ==&lt;br /&gt;
Para acceder a EJBs  y otros recursos del Application Server, un cliente standalone necesita las siguientes librerias (que se encuentran en el directorio ''lib/'' de GlassFish):&lt;br /&gt;
* j2ee.jar&lt;br /&gt;
* appserv-rt.jar&lt;br /&gt;
* appserv-deployment-client.jar&lt;br /&gt;
* appserv-ext.jar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el caso de que los EJBs estén en GlassFish 3, deben agregarse las siguientes librerías (que se encuentran en el directorio ''glassfish\modules'' de GlassFish):&lt;br /&gt;
*javax.ejb.jar&lt;br /&gt;
*ejb-container.jar&lt;br /&gt;
*deployment-common.jar&lt;br /&gt;
*dol.jar&lt;br /&gt;
*glassfish-corba-csiv2-idl.jar&lt;br /&gt;
*glassfish-corba-codegen.jar&lt;br /&gt;
*ssl-impl.jar&lt;br /&gt;
*security.jar&lt;br /&gt;
*ejb.security.jar&lt;br /&gt;
*management-api.jar&lt;br /&gt;
*gmbal.jar&lt;br /&gt;
*glassfish-corba-asm.jar&lt;br /&gt;
*glassfish-corba-newtimer.jar&lt;br /&gt;
*glassfish-corba-orbgeneric.jar&lt;br /&gt;
*bean-validator.jar&lt;br /&gt;
*config-types.jar&lt;br /&gt;
*kernel.jar&lt;br /&gt;
*config.jar&lt;br /&gt;
*config-api.jar&lt;br /&gt;
*glassfish-corba-omgapi.jar&lt;br /&gt;
*glassfish-corba-orb.jar&lt;br /&gt;
*orb-connector.jar&lt;br /&gt;
*orb-enabler.jar&lt;br /&gt;
*orb-iiop.jar&lt;br /&gt;
*glassfish-api.jar&lt;br /&gt;
*auto-depends.jar&lt;br /&gt;
*hk2-core.jar&lt;br /&gt;
*internal-api.jar&lt;br /&gt;
*common-util.jar&lt;br /&gt;
*glassfish-corba-internal-api.jar&lt;br /&gt;
*glassfish-naming.jar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego el contexto para hacer el lookup se obtiene haciendo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
Properties jndiProps = new Properties();&lt;br /&gt;
jndiProps.put(&amp;quot;java.naming.factory.initial&amp;quot;, &amp;quot;com.sun.enterprise.naming.impl.SerialInitContextFactory&amp;quot;); &lt;br /&gt;
jndiProps.put(&amp;quot;java.naming.factory.url.pkgs&amp;quot;, &amp;quot;com.sun.enterprise.naming&amp;quot;);&lt;br /&gt;
jndiProps.put(&amp;quot;java.naming.factory.state&amp;quot;, &amp;quot;com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// puerto e ip por defecto   &lt;br /&gt;
jndiProps.setProperty(&amp;quot;org.omg.CORBA.ORBInitialHost&amp;quot;, &amp;quot;localhost&amp;quot;);&lt;br /&gt;
jndiProps.setProperty(&amp;quot;org.omg.CORBA.ORBInitialPort&amp;quot;, &amp;quot;3700&amp;quot;);&lt;br /&gt;
InitialContext initialContext = new InitialContext(jndiProps);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Breve resumen de uso ==&lt;br /&gt;
&lt;br /&gt;
Hi:&lt;br /&gt;
&lt;br /&gt;
I have been observing demetole.wordpress.com as a lurker for some time now.&lt;br /&gt;
I made a decision that I need to  get involved and socialize with the people here.&lt;br /&gt;
I'm expecting to hook up with a lot of wonderful persons and learn some awesome stuff.&lt;br /&gt;
&lt;br /&gt;
Hopefully this message didn't find itself in an inappropriate area. I'm hoping you'll forgive me if this is unsuitable. &lt;br /&gt;
&lt;br /&gt;
--------------------&lt;br /&gt;
&lt;br /&gt;
DONN SCHWARTZ &lt;br /&gt;
Home Economics Teacher&lt;br /&gt;
&lt;br /&gt;
=== Iniciar GlassFish ===&lt;br /&gt;
&lt;br /&gt;
 asadmin start-domain&lt;br /&gt;
&lt;br /&gt;
GlassFish inicia, y puede cerrarse la consola donde se ejecutó este comando.&lt;br /&gt;
&lt;br /&gt;
=== Configurar GlassFish (consola de administración) ===&lt;br /&gt;
&lt;br /&gt;
Una vez iniciado, la consola de administración de GlassFish se puede acceder desde:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:4848&lt;br /&gt;
 '''usuario''': admin&lt;br /&gt;
 '''password''': adminadmin&lt;br /&gt;
&lt;br /&gt;
Desde esta consola pueden administrarse las aplicaciones (deploys/redeploys/undeploys) y configurar los ConnectionPool y DataSource.&lt;br /&gt;
&lt;br /&gt;
=== Acceder a aplicaciones instaladas ===&lt;br /&gt;
&lt;br /&gt;
Por default, GlassFish expone las aplicaciones web en el puerto 8080. Por ejemplo, para acceder a la aplicación web &amp;quot;miAplicacion&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/miAplicacion&lt;br /&gt;
&lt;br /&gt;
=== Detener GlassFish ===&lt;br /&gt;
&lt;br /&gt;
 asadmin stop-domain&lt;br /&gt;
&lt;br /&gt;
=== Crear un dominio nuevo ===&lt;br /&gt;
&lt;br /&gt;
 asadmin create-domain --adminport 4848 domain2&lt;br /&gt;
&lt;br /&gt;
== Integración con CentOS / Fedora y otros Linux ==&lt;br /&gt;
[[GlassFish]] se inicia desde la línea de comandos, por lo cual es muy facil integrarlo con los sistemas de servicios que ofrecen las distintas distribuciones de Linux. &lt;br /&gt;
&lt;br /&gt;
Para integrarlo con CentOS / Fedora / RedHat Linux, ubicar el siguiente script en '''/etc/init.d/glassfish'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# glassfish     Este script se encarga de iniciar y detener el&lt;br /&gt;
#               servidor de aplicaciones Java GlassFish v3.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# Source function library.&lt;br /&gt;
. /etc/init.d/functions&lt;br /&gt;
&lt;br /&gt;
prog=&amp;quot;GlassFish v3&amp;quot;&lt;br /&gt;
asadmin=&amp;quot;/usr/local/glassfishv3/bin/asadmin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Esta variable la usa GlassFish para determinar el JDK a usar.&lt;br /&gt;
# Habra otra manera?&lt;br /&gt;
export AS_JAVA=/usr/local/jdk1.6.0_18/&lt;br /&gt;
&lt;br /&gt;
start() {&lt;br /&gt;
        action $&amp;quot;Starting $prog: &amp;quot; $asadmin start-domain&lt;br /&gt;
}&lt;br /&gt;
stop() {&lt;br /&gt;
        action $&amp;quot;Stopping $prog: &amp;quot; $asadmin stop-domain&lt;br /&gt;
}&lt;br /&gt;
restart() {&lt;br /&gt;
        action $&amp;quot;Restarting $prog: &amp;quot; $asadmin restart-domain&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
  start)&lt;br /&gt;
        start&lt;br /&gt;
        ;;&lt;br /&gt;
  stop)&lt;br /&gt;
        stop&lt;br /&gt;
        ;;&lt;br /&gt;
  restart)&lt;br /&gt;
        restart&lt;br /&gt;
        ;;&lt;br /&gt;
  *)&lt;br /&gt;
        echo $&amp;quot;Usage: $0 {start|stop|restart}&amp;quot;&lt;br /&gt;
        exit 2&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
exit $?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego, podemos ejecutar los siguentes comandos desde la consola de Linux para iniciar/detener [[GlassFish]]&lt;br /&gt;
 service glassfish start&lt;br /&gt;
 service glassfish stop&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Servidor de Aplicaciones]]&lt;br /&gt;
* [https://glassfish.dev.java.net/ Web oficial de GlassFish]&lt;br /&gt;
* [https://glassfish.dev.java.net/downloads/quickstart/index.html GlassFish Quick Start]&lt;br /&gt;
* [https://glassfish.dev.java.net/public/downloadsindex.html Descarga de GlassFish ]&lt;br /&gt;
* [https://glassfishplugins.dev.java.net/eclipse33/index.html Plugin de Glassfish para Eclipse]&lt;br /&gt;
&lt;br /&gt;
[[Category:GlassFish]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Hibernate_Con_Spring&amp;diff=5786</id>
		<title>Hibernate Con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Hibernate_Con_Spring&amp;diff=5786"/>
				<updated>2011-06-17T17:29:43Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* La clase HibernateDaoSupport */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Spring Framework]]&lt;br /&gt;
[[Category:Hibernate]]&lt;br /&gt;
[[Spring Framework]] provee amplio soporte para [[Hibernate]]. En particular, brinda implementaciones de [[DAO]] que ofrecen diversas utilidades para acceder a la session de Hibernate.&lt;br /&gt;
&lt;br /&gt;
==La clase HibernateDaoSupport==&lt;br /&gt;
&lt;br /&gt;
Spring nos provee la clase ''HibernateDaoSupport'' para brindarle a nuestros DAO soporte para Hibernate.&lt;br /&gt;
&lt;br /&gt;
'''Importante:''' ¡Esta clase está obsoleta y no debería utilizarse!. En cambio, crear un DAO común e inyectar el '''SessionFactory''' de Hibernate directamente, para utilizar. &lt;br /&gt;
&lt;br /&gt;
=== HibernateTemplate ===&lt;br /&gt;
&lt;br /&gt;
En particular, '''uno de los métodos''' más útiles que provee es ''getHibernateTemplate()''. Este método devuelve un template con varios métodos útiles, que simplifican el uso de Hibernate. Estos métodos suelen encapsular varias excepciones propias de acceso a datos de Hibernate (y SQL) dentro de una ''DataAccessException'' (que hereda de RuntimeException).&lt;br /&gt;
&lt;br /&gt;
===Creando un DAO con soporte de Spring===&lt;br /&gt;
La forma más simple de usar Hibernate con Spring es crear clases que hereden de !HibernateDaoSupport. Esta clase ofrece varias utilidades para manipular la session de Hibernate, y se encarga de manejar automáticamente las transacciones.&lt;br /&gt;
&lt;br /&gt;
==== La interfaz del DAO ====&lt;br /&gt;
La interfaz de nuestro DAO es simple, y no necesita tener ninguna herencia ni restricción en particular:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 public interface InvasorDao {&lt;br /&gt;
     guardarInvasor(Invasor invasor);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La implementación del DAO ====&lt;br /&gt;
La implementación del DAO deberá extender !HibernateDaoSupport. Esta clase nos proveerá de varios métodos útiles para manipular la session de Hibernate.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 public class InvasorDaoImpl extends HibernateDaoSupport implements InvasorDao   {&lt;br /&gt;
     public void guardarInvasor(Invasor invasor) {&lt;br /&gt;
         getHibernateTemplate().save(invasor);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La declaracion del Dao ====&lt;br /&gt;
En el XML de Spring deberemos declarar el Dao y la Factory de Hibernate. Al Dao se le asocia el factory de Hibernate del cual Spring sacará la session de Hibernate.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;dao.InvasorDao&amp;quot; class=&amp;quot;com.dosideas.dao.impl.InvasorDaoImpl&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;sessionFactory&amp;quot; ref=&amp;quot;defaultSessionFactory&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;defaultSessionFactory&amp;quot; class=&amp;quot;org.springframework.orm.hibernate3.LocalSessionFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;dataSource&amp;quot; ref=&amp;quot;defaultDataSource&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;mappingResources&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;list&amp;gt;&lt;br /&gt;
             &amp;lt;!-- Agregar los mappings necesarios --&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;com/dosideas/domain/map/Invasor.hbm.xml&amp;lt;/value&amp;gt;&lt;br /&gt;
         &amp;lt;/list&amp;gt;&lt;br /&gt;
     &amp;lt;/property&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;hibernateProperties&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;props&amp;gt;&lt;br /&gt;
            &amp;lt;prop key=&amp;quot;hibernate.dialect&amp;quot;&amp;gt;org.hibernate.dialect.Oracle9Dialect&amp;lt;/prop&amp;gt;&lt;br /&gt;
         &amp;lt;/props&amp;gt;&lt;br /&gt;
     &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uso de la Session directamente===&lt;br /&gt;
Es posible utilizar la Session de Hibernate directamente, a través del método ''getSession()'' que provee HibernateDaoSupport. Cuando se pide la Session de esta manera, es fundamental&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Session session = null; &lt;br /&gt;
try {&lt;br /&gt;
    session = getSession();&lt;br /&gt;
    //hacer cosas...&lt;br /&gt;
}&lt;br /&gt;
finally {&lt;br /&gt;
    releaseSession(session);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración con anotaciones ==&lt;br /&gt;
Hibernate puede configurarse con anotaciones en vez de archivos XML para definir los mapeos. Para esto usamos la clase de Spring '''AnnotationSessionFactoryBean'''.&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;beans&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;bean id=&amp;quot;defaultSessionFactory&amp;quot;&lt;br /&gt;
    class=&amp;quot;org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;dataSource&amp;quot; ref=&amp;quot;defaultDataSource&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;annotatedClasses&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;list&amp;gt;&lt;br /&gt;
        &amp;lt;!-- Agregar los mappings necesarios --&amp;gt;&lt;br /&gt;
        &amp;lt;value&amp;gt;com.dosideas.domain.MiClaseDeDominio&amp;lt;/value&amp;gt;&lt;br /&gt;
      &amp;lt;/list&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;hibernateProperties&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;props&amp;gt;&lt;br /&gt;
            &amp;lt;prop key=&amp;quot;hibernate.show_sql&amp;quot;&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;
      &amp;lt;/props&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
  &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y la clase de dominio anotada como corresponde: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
package com.dosideas.domain;&lt;br /&gt;
&lt;br /&gt;
import javax.persistence.Column;&lt;br /&gt;
import javax.persistence.Entity;&lt;br /&gt;
import javax.persistence.Id;&lt;br /&gt;
import javax.persistence.Table;&lt;br /&gt;
&lt;br /&gt;
@Entity&lt;br /&gt;
@Table(name = &amp;quot;TABLA_DE_ORIGEN&amp;quot;)&lt;br /&gt;
public class MiClaseDeDominio {&lt;br /&gt;
    @Id&lt;br /&gt;
    @Column(name = &amp;quot;COLUMNA_PK&amp;quot;)&lt;br /&gt;
    private String clase;&lt;br /&gt;
&lt;br /&gt;
    @Column(name = &amp;quot;NOMBRE&amp;quot;)&lt;br /&gt;
    private String nombre;&lt;br /&gt;
&lt;br /&gt;
    //getters y setters...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Consultas Con HibernateTemplate]]&lt;br /&gt;
* [http://static.springframework.org/spring/docs/2.0.x/reference/orm.html Manual de Spring, Capítulo 12]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=EJB&amp;diff=5785</id>
		<title>EJB</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=EJB&amp;diff=5785"/>
				<updated>2011-06-16T18:34:22Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Testeo de los EJB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:EJB]]&lt;br /&gt;
Los Enterprise Java Beans (también conocidos por sus siglas EJB) son una de las API que forman parte del estándar de construcción de aplicaciones empresariales [[Java EE]]. Su especificación detalla cómo un [[Servidor de Aplicaciones]] provee objetos desde el lado del servidor que son, precisamente, los EJBs:&lt;br /&gt;
&lt;br /&gt;
* comunicación remota utilizando CORBA&lt;br /&gt;
* transacciones&lt;br /&gt;
* control de la concurrencia&lt;br /&gt;
* eventos utilizando JMS (Java messaging service)&lt;br /&gt;
* servicios de nombres y de directorio&lt;br /&gt;
* seguridad&lt;br /&gt;
* ubicación de componentes en un servidor de aplicaciones.&lt;br /&gt;
&lt;br /&gt;
La especificación de Enterprise Java Bean define los papeles jugados por el contenedor de EJB y los EJBs, además de disponer los EJBs en un contenedor.&lt;br /&gt;
&lt;br /&gt;
==Tipos de EJB==&lt;br /&gt;
Actualmente, en la especificación 3.0 de EJB, existen 2 tipos principales de EJB:&lt;br /&gt;
*'''Session Beans'''&lt;br /&gt;
** Stateful Session Beans, son objetos distribuidos que mantienen estado. Pueden ser utilizados, por ejemplo, para mantener los items de un carrito de compras.&lt;br /&gt;
** Stateless Session Beans, son objetos distribuidos que no mantienen estado, lo que permite que sean invocados de manera concurrente. Suelen exponer lógica de negocio.&lt;br /&gt;
&lt;br /&gt;
[[Message Driven Bean]], son objetos distribuidos que se asocian a destinos JMS y se invocan asincrónicamente al momento de la llegada de un mensaje al destino.&lt;br /&gt;
&lt;br /&gt;
En la versión 2.x de EJB existía un tercer tipo: '''Entity Beans''', que eran objetos distribuidos para la persistencia de datos en una [[Base De Datos]]. Estos objetos fueron reemplazados en la versión 3.0 por la JavaPersistenceApi.&lt;br /&gt;
&lt;br /&gt;
==Testeo de los EJB==&lt;br /&gt;
Como los EJB se ejecutan dentro de un [[Servidor de Aplicaciones]], puede resultar dificil su testeo, en particular la PruebaUnitaria. Existen algunos frameworks para poder testear unitariamente a los EJB: &lt;br /&gt;
* [[MockEjb]]&lt;br /&gt;
* [[Cactus]]&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[JMS]]&lt;br /&gt;
* [[Message Driven Bean]]&lt;br /&gt;
* [[Ejb Con Spring]]&lt;br /&gt;
* [[Timer Service En EJB]]&lt;br /&gt;
* [http://es.wikipedia.org/wiki/Enterprise_JavaBeans EJB en la Wikipedia]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5769</id>
		<title>Configuración de ejecución selectiva de tests</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5769"/>
				<updated>2011-05-02T18:23:49Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Para poder correr selectivamente los test de integración de nuestras aplicaciones utilizamos la funcionalidad provista por la clase Assume de [[JUnit]]. La clase Assume contiene métodos útiles para afirmar las hipótesis sobre las condiciones en las que los resultados de los test son significativos. Un supuesto negativo no significa que el código está roto, pero si que los resultados de los test no proporciona ninguna información útil. Por defecto [[JUnit]] trata los test con las hipótesis negativas como ignorados.&lt;br /&gt;
&lt;br /&gt;
Para el caso de proyectos creados con [[NetBeans]] compilados con [[Ant]], podemos indicar si queremos o no correr determinados test usando ciertas propiedades.&lt;br /&gt;
&lt;br /&gt;
Propiedad:&lt;br /&gt;
&lt;br /&gt;
-Dtest-sys-prop.correrIntegracion=NO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@BeforeClass&lt;br /&gt;
public static void setUpOnce() throws Throwable {&lt;br /&gt;
        System.out.println(&amp;quot;Se usarán los test de integración [SI/NO]: &amp;quot; + System.getProperty(&amp;quot;correrIntegracion&amp;quot;));&lt;br /&gt;
        Assume.assumeTrue(System.getProperty(&amp;quot;correrIntegracion&amp;quot;) == null&lt;br /&gt;
                ? true : System.getProperty(&amp;quot;correrIntegracion&amp;quot;).matches(&amp;quot;SI&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos ver en el ejemplo, por linea de comando se indica la propiedad &amp;quot;test-sys-prop.correrIntegracion&amp;quot;, pero en el test se consulta por la propiedad “correrIntegracion”, esto se debe a que por defecto la tarea [[Ant]] creada por Netbeans para correr los test de [[JUnit]] tiene la propiedad “fork” en true. En esta tarea podemos ver el tag &amp;quot;syspropertyset&amp;quot;, el cual indica que todas las propiedades que tengan el prefijo &amp;quot;test-sys-prop.&amp;quot; se pasen sin este prefijo al proceso iniciado por el fork para ejecutar la clase de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;-init-macrodef-junit&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;macrodef name=&amp;quot;junit&amp;quot; uri=&amp;quot;http://www.netbeans.org/ns/j2se-project/2&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;attribute name=&amp;quot;includes&amp;quot; default=&amp;quot;**/*Test.java&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;sequential&amp;gt;&lt;br /&gt;
            &amp;lt;junit showoutput=&amp;quot;true&amp;quot; fork=&amp;quot;true&amp;quot; dir=&amp;quot;${basedir}&amp;quot; failureproperty=&amp;quot;tests.failed&amp;quot; errorproperty=&amp;quot;tests.failed&amp;quot;&amp;gt;&lt;br /&gt;
                .&lt;br /&gt;
		.&lt;br /&gt;
		.&lt;br /&gt;
                &amp;lt;syspropertyset&amp;gt;&lt;br /&gt;
                    &amp;lt;propertyref prefix=&amp;quot;test-sys-prop.&amp;quot;/&amp;gt;&lt;br /&gt;
                    &amp;lt;mapper type=&amp;quot;glob&amp;quot; from=&amp;quot;test-sys-prop.*&amp;quot; to=&amp;quot;*&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/syspropertyset&amp;gt;&lt;br /&gt;
                .&lt;br /&gt;
		.&lt;br /&gt;
		.&lt;br /&gt;
            &amp;lt;/junit&amp;gt;&lt;br /&gt;
	    .&lt;br /&gt;
	    .&lt;br /&gt;
	    .&lt;br /&gt;
        &amp;lt;/sequential&amp;gt;&lt;br /&gt;
    &amp;lt;/macrodef&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5768</id>
		<title>Configuración de ejecución selectiva de tests</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5768"/>
				<updated>2011-05-02T18:23:08Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Para poder correr selectivamente los test de integración de nuestras aplicaciones utilizamos la funcionalidad provista por la clase Assume de [[JUnit]]. La clase Assume contiene métodos útiles para afirmar las hipótesis sobre las condiciones en las que los resultados de los test son significativos. Un supuesto negativo no significa que el código está roto, pero si que los resultados de los test no proporciona ninguna información útil. Por defecto [[JUnit]] trata los test con las hipótesis negativas como ignorados.&lt;br /&gt;
&lt;br /&gt;
Para el caso de proyectos creados con [[NetBeans]] compilados con [[Ant]], podemos indicar si queremos o no correr determinados test usando ciertas propiedades.&lt;br /&gt;
&lt;br /&gt;
Propiedad:&lt;br /&gt;
-Dtest-sys-prop.correrIntegracion=NO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@BeforeClass&lt;br /&gt;
public static void setUpOnce() throws Throwable {&lt;br /&gt;
        System.out.println(&amp;quot;Se usarán los test de integración [SI/NO]: &amp;quot; + System.getProperty(&amp;quot;correrIntegracion&amp;quot;));&lt;br /&gt;
        Assume.assumeTrue(System.getProperty(&amp;quot;correrIntegracion&amp;quot;) == null&lt;br /&gt;
                ? true : System.getProperty(&amp;quot;correrIntegracion&amp;quot;).matches(&amp;quot;SI&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos ver en el ejemplo, por linea de comando se indica la propiedad &amp;quot;test-sys-prop.correrIntegracion&amp;quot;, pero en el test se consulta por la propiedad “correrIntegracion”, esto se debe a que por defecto la tarea [[Ant]] creada por Netbeans para correr los test de [[JUnit]] tiene la propiedad “fork” en true. En esta tarea podemos ver el tag &amp;quot;syspropertyset&amp;quot;, el cual indica que todas las propiedades que tengan el prefijo &amp;quot;test-sys-prop.&amp;quot; se pasen sin este prefijo al proceso iniciado por el fork para ejecutar la clase de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;-init-macrodef-junit&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;macrodef name=&amp;quot;junit&amp;quot; uri=&amp;quot;http://www.netbeans.org/ns/j2se-project/2&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;attribute name=&amp;quot;includes&amp;quot; default=&amp;quot;**/*Test.java&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;sequential&amp;gt;&lt;br /&gt;
            &amp;lt;junit showoutput=&amp;quot;true&amp;quot; fork=&amp;quot;true&amp;quot; dir=&amp;quot;${basedir}&amp;quot; failureproperty=&amp;quot;tests.failed&amp;quot; errorproperty=&amp;quot;tests.failed&amp;quot;&amp;gt;&lt;br /&gt;
                .&lt;br /&gt;
		.&lt;br /&gt;
		.&lt;br /&gt;
                &amp;lt;syspropertyset&amp;gt;&lt;br /&gt;
                    &amp;lt;propertyref prefix=&amp;quot;test-sys-prop.&amp;quot;/&amp;gt;&lt;br /&gt;
                    &amp;lt;mapper type=&amp;quot;glob&amp;quot; from=&amp;quot;test-sys-prop.*&amp;quot; to=&amp;quot;*&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/syspropertyset&amp;gt;&lt;br /&gt;
                .&lt;br /&gt;
		.&lt;br /&gt;
		.&lt;br /&gt;
            &amp;lt;/junit&amp;gt;&lt;br /&gt;
	    .&lt;br /&gt;
	    .&lt;br /&gt;
	    .&lt;br /&gt;
        &amp;lt;/sequential&amp;gt;&lt;br /&gt;
    &amp;lt;/macrodef&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5765</id>
		<title>Configuración de ejecución selectiva de tests</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5765"/>
				<updated>2011-05-02T18:07:42Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Para poder correr selectivamente los test de integración de nuestras aplicaciones utilizamos la funcionalidad provista por la clase Assume de [[JUnit]]. La clase Assume contiene métodos útiles para afirmar las hipótesis sobre las condiciones en las que los resultados de los test son significativos. Un supuesto negativo no significa que el código está roto, pero si que los resultados de los test no proporciona ninguna información útil. Por defecto [[JUnit]] trata los test con las hipótesis negativas como ignorados.&lt;br /&gt;
&lt;br /&gt;
Utilizando propiedades de línea de comando, en nuestro caso en la configuración del proyecto en [[Hudson]], podemos indicar si queremos o no correr determinados test.&lt;br /&gt;
&lt;br /&gt;
Propiedad:&lt;br /&gt;
-Dtest-sys-prop.correrIntegracion=NO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@BeforeClass&lt;br /&gt;
public static void setUpOnce() throws Throwable {&lt;br /&gt;
        System.out.println(&amp;quot;Se usarán los test de integración [SI/NO]: &amp;quot; + System.getProperty(&amp;quot;correrIntegracion&amp;quot;));&lt;br /&gt;
        Assume.assumeTrue(System.getProperty(&amp;quot;correrIntegracion&amp;quot;) == null&lt;br /&gt;
                ? true : System.getProperty(&amp;quot;correrIntegracion&amp;quot;).matches(&amp;quot;SI&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos ver en el ejemplo, por linea de comando se indica la propiedad &amp;quot;test-sys-prop.correrIntegracion&amp;quot;, pero en el test se consulta por la propiedad “correrIntegracion”, esto se debe a que por defecto la tarea [[Ant]] creada por Netbeans para correr los test de [[JUnit]] tiene la propiedad “fork” en true. En esta tarea podemos ver el tag &amp;quot;syspropertyset&amp;quot;, el cual indica que todas las propiedades que tengan el prefijo &amp;quot;test-sys-prop.&amp;quot; se pasen sin este prefijo al proceso iniciado por el fork para ejecutar la clase de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;-init-macrodef-junit&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;macrodef name=&amp;quot;junit&amp;quot; uri=&amp;quot;http://www.netbeans.org/ns/j2se-project/2&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;attribute name=&amp;quot;includes&amp;quot; default=&amp;quot;**/*Test.java&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;sequential&amp;gt;&lt;br /&gt;
            &amp;lt;junit showoutput=&amp;quot;true&amp;quot; fork=&amp;quot;true&amp;quot; dir=&amp;quot;${basedir}&amp;quot; failureproperty=&amp;quot;tests.failed&amp;quot; errorproperty=&amp;quot;tests.failed&amp;quot;&amp;gt;&lt;br /&gt;
                .&lt;br /&gt;
		 .&lt;br /&gt;
		 .&lt;br /&gt;
                &amp;lt;syspropertyset&amp;gt;&lt;br /&gt;
                    &amp;lt;propertyref prefix=&amp;quot;test-sys-prop.&amp;quot;/&amp;gt;&lt;br /&gt;
                    &amp;lt;mapper type=&amp;quot;glob&amp;quot; from=&amp;quot;test-sys-prop.*&amp;quot; to=&amp;quot;*&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/syspropertyset&amp;gt;&lt;br /&gt;
                .&lt;br /&gt;
		 .&lt;br /&gt;
		 .&lt;br /&gt;
            &amp;lt;/junit&amp;gt;&lt;br /&gt;
	    .&lt;br /&gt;
	    .&lt;br /&gt;
	    .&lt;br /&gt;
        &amp;lt;/sequential&amp;gt;&lt;br /&gt;
    &amp;lt;/macrodef&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5764</id>
		<title>Configuración de ejecución selectiva de tests</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5764"/>
				<updated>2011-05-02T18:05:14Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Para poder correr selectivamente los test de integración de nuestras aplicaciones utilizamos la funcionalidad provista por la clase Assume de [[JUnit]]. La clase Assume contiene métodos útiles para afirmar las hipótesis sobre las condiciones en las que los resultados de los test son significativos. Un supuesto negativo no significa que el código está roto, pero si que los resultados de los test no proporciona ninguna información útil. Por defecto [[JUnit]] trata los test con las hipótesis negativas como ignorados.&lt;br /&gt;
&lt;br /&gt;
Utilizando propiedades de línea de comando, en nuestro caso en la configuración del proyecto en [[Hudson]], podemos indicar si queremos o no correr determinados test.&lt;br /&gt;
&lt;br /&gt;
Propiedad:&lt;br /&gt;
-Dtest-sys-prop.correrIntegracion=NO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@BeforeClass&lt;br /&gt;
public static void setUpOnce() throws Throwable {&lt;br /&gt;
        System.out.println(&amp;quot;Se usarán los test de integración [SI/NO]: &amp;quot; + System.getProperty(&amp;quot;correrIntegracion&amp;quot;));&lt;br /&gt;
        Assume.assumeTrue(System.getProperty(&amp;quot;correrIntegracion&amp;quot;) == null&lt;br /&gt;
                ? true : System.getProperty(&amp;quot;correrIntegracion&amp;quot;).matches(&amp;quot;SI&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podemos ver en el ejemplo, por linea de comando se indica la propiedad &amp;quot;test-sys-prop.correrIntegracion&amp;quot;, pero en el test se consulta por la propiedad “correrIntegracion”, esto se debe a que por defecto la tarea creada por Netbeans para correr los test de [[JUnit]] tiene la propiedad “fork” en true. En esta tarea podemos ver el tag &amp;quot;syspropertyset&amp;quot;, el cual indica que todas las propiedades que tengan el prefijo &amp;quot;test-sys-prop.&amp;quot; se pasen sin este prefijo al proceso iniciado por el fork para ejecutar la clase de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;-init-macrodef-junit&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;macrodef name=&amp;quot;junit&amp;quot; uri=&amp;quot;http://www.netbeans.org/ns/j2se-project/2&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;attribute name=&amp;quot;includes&amp;quot; default=&amp;quot;**/*Test.java&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;sequential&amp;gt;&lt;br /&gt;
            &amp;lt;junit showoutput=&amp;quot;true&amp;quot; fork=&amp;quot;true&amp;quot; dir=&amp;quot;${basedir}&amp;quot; failureproperty=&amp;quot;tests.failed&amp;quot; errorproperty=&amp;quot;tests.failed&amp;quot;&amp;gt;&lt;br /&gt;
                .&lt;br /&gt;
		 .&lt;br /&gt;
		 .&lt;br /&gt;
                &amp;lt;syspropertyset&amp;gt;&lt;br /&gt;
                    &amp;lt;propertyref prefix=&amp;quot;test-sys-prop.&amp;quot;/&amp;gt;&lt;br /&gt;
                    &amp;lt;mapper type=&amp;quot;glob&amp;quot; from=&amp;quot;test-sys-prop.*&amp;quot; to=&amp;quot;*&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/syspropertyset&amp;gt;&lt;br /&gt;
                .&lt;br /&gt;
		 .&lt;br /&gt;
		 .&lt;br /&gt;
            &amp;lt;/junit&amp;gt;&lt;br /&gt;
	    .&lt;br /&gt;
	    .&lt;br /&gt;
	    .&lt;br /&gt;
        &amp;lt;/sequential&amp;gt;&lt;br /&gt;
    &amp;lt;/macrodef&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5763</id>
		<title>Configuración de ejecución selectiva de tests</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5763"/>
				<updated>2011-05-02T17:57:38Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Para poder correr selectivamente los test de integración de nuestras aplicaciones utilizamos la funcionalidad provista por la clase Assume de [[JUnit]]. La clase Assume contiene métodos útiles para afirmar las hipótesis sobre las condiciones en las que los resultados de los test son significativos. Un supuesto negativo no significa que el código está roto, pero si que los resultados de los test no proporciona ninguna información útil. Por defecto [[JUnit]] trata los test con las hipótesis negativas como ignorados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Utilizando propiedades de línea de comando, en nuestro caso en la configuración del proyecto en [[Hudson]], podemos indicar si queremos o no correr determinados test.&lt;br /&gt;
&lt;br /&gt;
-Dtest-sys-prop.correrIntegracion=NO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
@BeforeClass&lt;br /&gt;
    public static void setUpOnce() throws Throwable {&lt;br /&gt;
        System.out.println(&amp;quot;Se usarán los test de integración [SI/NO]: &amp;quot; + System.getProperty(&amp;quot;correrIntegracion&amp;quot;));&lt;br /&gt;
        Assume.assumeTrue(System.getProperty(&amp;quot;correrIntegracion&amp;quot;) == null&lt;br /&gt;
                ? true : System.getProperty(&amp;quot;correrIntegracion&amp;quot;).matches(&amp;quot;SI&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5762</id>
		<title>Configuración de ejecución selectiva de tests</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Configuraci%C3%B3n_de_ejecuci%C3%B3n_selectiva_de_tests&amp;diff=5762"/>
				<updated>2011-05-02T17:55:53Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: Página creada con 'Para poder correr selectivamente los test de integración de nuestras aplicaciones utilizamos la funcionalidad provista por la clase Assume de JUnit. La clase Assume contien…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Para poder correr selectivamente los test de integración de nuestras aplicaciones utilizamos la funcionalidad provista por la clase Assume de [[JUnit]]. La clase Assume contiene métodos útiles para afirmar las hipótesis sobre las condiciones en las que los resultados de los test son significativos. Un supuesto negativo no significa que el código está roto, pero si que los resultados de los test no proporciona ninguna información útil. Por defecto [[JUnit]] trata los test con las hipótesis negativas como ignorados.&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=JUnit&amp;diff=5761</id>
		<title>JUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=JUnit&amp;diff=5761"/>
				<updated>2011-05-02T17:22:47Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[JUnit]] es un framework de código abierto desarrollado especialmente para crear, ejecutar y hacer reportes de estado de conjuntos de [[Prueba Unitaria]] automatizadas hechos en lenguaje Java.&lt;br /&gt;
&lt;br /&gt;
[[JUnit]] es uno de los frameworks más populares en Java para realizar pruebas unitarias y llevar un desarrollo utilizando la práctica de [[Test Driven Development]].&lt;br /&gt;
&lt;br /&gt;
===Ciclo de vida===&lt;br /&gt;
Al momento de ejecutar los tests, [[JUnit]] ejecuta los siguientes métodos propios de cada clase de test:&lt;br /&gt;
&lt;br /&gt;
* Método '''@BeforeClass''' (método estático, antes de la construcción de la clase)&lt;br /&gt;
* Por cada método anotado con @Test&lt;br /&gt;
** Constructor de la clase de test&lt;br /&gt;
** Método anotado con '''@Before'''&lt;br /&gt;
** Método anotado con '''@Test'''&lt;br /&gt;
** Método anotado con '''@After'''&lt;br /&gt;
* Al finalizar todos los @Test, se ejecuta '''@AfterClass'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
La siguiente clase contiene 2 tests, y sirve para ver el ciclo de vida de [[JUnit]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 public class HolaMundoTest {&lt;br /&gt;
&lt;br /&gt;
    public HolaMundoTest() {&lt;br /&gt;
        System.out.println(&amp;quot;  Constructor de HolaMundoTest&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        System.out.println(&amp;quot;@BeforeClass&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        System.out.println(&amp;quot;@AfterClass&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Before&lt;br /&gt;
    public void setUp() {&lt;br /&gt;
        System.out.println(&amp;quot;    @Before&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @After&lt;br /&gt;
    public void tearDown() {&lt;br /&gt;
        System.out.println(&amp;quot;    @After&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void decirHola() {&lt;br /&gt;
        System.out.println(&amp;quot;    TEST decirHola&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void decirChau() {&lt;br /&gt;
        System.out.println(&amp;quot;    TEST decirChau&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La salida por consola de esta ejecución es:&lt;br /&gt;
 @BeforeClass&lt;br /&gt;
   Constructor de HolaMundoTest&lt;br /&gt;
     @Before&lt;br /&gt;
     TEST decirHola&lt;br /&gt;
     @After&lt;br /&gt;
   Constructor de HolaMundoTest&lt;br /&gt;
     @Before&lt;br /&gt;
     TEST decirChau&lt;br /&gt;
     @After&lt;br /&gt;
 @AfterClass&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Prueba Unitaria]]&lt;br /&gt;
* [[Spring Test]]&lt;br /&gt;
* [[Tests De JUnit Parametrizados]]&lt;br /&gt;
* [[Tests De JUnit Multihilo]]&lt;br /&gt;
* [[Test de Metodos y Atributos Privados]]&lt;br /&gt;
* [http://www.junit.org Web oficial de JUnit]&lt;br /&gt;
* [http://javaboutique.internet.com/tutorials/UnitTesting/ Unit testing Java programs]&lt;br /&gt;
* [[Configuración de ejecución selectiva de tests]]&lt;br /&gt;
&lt;br /&gt;
[[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=5737</id>
		<title>BEA Aqualogic BPM 5.7 (Fuego)</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=5737"/>
				<updated>2011-04-28T14:19:45Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Comunicando con Base de Datos con PBL (Process Business Language)===&lt;br /&gt;
&lt;br /&gt;
Para ejecutar comandos SQL en Aqualogic BPM 5.7 hay que seguir los siguientes pasos: &lt;br /&gt;
&lt;br /&gt;
====Primer paso====&lt;br /&gt;
&lt;br /&gt;
Se debe crear nuevo &amp;quot;External Resource&amp;quot;, haciendo click derecho en el directorio del proyecto &amp;quot;External Resources&amp;quot;, del tipo &amp;quot;SQL Database&amp;quot;. Los campos se deben completar con la información de la base de datos que queremos consultar y con un nombre significativo.&lt;br /&gt;
&lt;br /&gt;
====Segundo paso====&lt;br /&gt;
 &lt;br /&gt;
Se debe crear un nuevo &amp;quot;BPM Object&amp;quot;, haciendo click derecho sobre el modulo deseado en el directorio de &amp;quot;Catalog&amp;quot;, y luego crear un método en nuestro objeto, haciendo click derecho sobre el objeto y seleccionando la opción &amp;quot;New Method&amp;quot;. Ahora se debe editar el nuevo método, expandiendo el objeto bpm y haciendo doble click sobre el nombre del método creado. Ahora podemos editarlo e incluir el código necesario para comunicarnos con la BD a través de una clase propia de Fuego, un ejemplo de implementación puede ser el siguiente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String queryAEjecutar =&amp;quot;SELECT campo1, campo2, campo3 FROM nombreTabla WHERE nombreColumna in (?,?)&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
String nombreDeLaBDCreada = &amp;quot;NombreBD&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
String[] arrayDeParametros = {&amp;quot;valor1&amp;quot;, &amp;quot;valor2&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
Iterator &amp;lt;Any[Any]&amp;gt; iterator = DynamicSQL.executeQuery(sentence : queryAEjecutar, implname : nombreDeLaBDCreada, inParameters : arrayDeParametros);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como se puede observar, el resultado de realizar la consulta va a ser un iterador, que luego puede ser recorrido con un &amp;quot;foreach&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
foreach (e in iterator) {&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo1: &amp;quot;+e[&amp;quot;campo1&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo2: &amp;quot;+e[&amp;quot;campo2&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo3: &amp;quot;+e[&amp;quot;campo3&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;nombreColumna: &amp;quot;+e[&amp;quot;nombreColumna&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Versionando con CVS ===&lt;br /&gt;
El producto Aqualogic BPM 5.7 incluye un cliente de CVS que permite agregar, remover, actualizar en un repositorio CVS.&lt;br /&gt;
&lt;br /&gt;
==== Configurar el cliente CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* File -&amp;gt; Preference -&amp;gt;Default Version Control&lt;br /&gt;
** Version Control Manger: CVS&lt;br /&gt;
** Host: host del servidor CVS&lt;br /&gt;
** User Name: usuario del CVS&lt;br /&gt;
** User Password: password del usuario CVS&lt;br /&gt;
** path: ruta dentro del repositorio donde se guardará el proyecto.&lt;br /&gt;
&lt;br /&gt;
==== Subir el proyecto al CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* Abrir el proyecto a versionar.&lt;br /&gt;
* File -&amp;gt; Project Preference -&amp;gt; Project Version Control.&lt;br /&gt;
** Version Control Manager: CVS (nos carga la información ingresada en el punto anterior).&lt;br /&gt;
* File -&amp;gt; VCS -&amp;gt; Store project in repository&lt;br /&gt;
** Path: directorio en el que se creará el proyecto en el repositorio.&lt;br /&gt;
** Si es la primera vez que se sube un proyecto de Aqualogic BPM, pedirá que se ingrese la ruta del directorio donde se creará el &amp;quot;common catalog&amp;quot;&lt;br /&gt;
*** Common catalog: Es un catalogo de componente, el cual puede ser compartido por otros proyectos de Aqualogic BPM.&lt;br /&gt;
En el repositorio quedarán creados 2 directorios, el del proyecto y el del common catalog, ademas se crearán 2 alias en el CVS que apuntan al proyecto y al common catalog.&lt;br /&gt;
&lt;br /&gt;
==== Obtener el proyecto del CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* File -&amp;gt; Project Preference -&amp;gt; Project Version Control.&lt;br /&gt;
* File -&amp;gt; Import -&amp;gt; Project -&amp;gt; from Repository.&lt;br /&gt;
** Version Control Manager: CVS&lt;br /&gt;
** En la siguiente pantalla, seleccionar el proyecto del repositorio.&lt;br /&gt;
&lt;br /&gt;
==== Trabajar con proyectos versionados ====&lt;br /&gt;
Aqualogic BPM 5.7, posee una política restrictiva de edición para los proyecto versionados.&lt;br /&gt;
La política, consiste en que todo el proyecto se encuentra en modo lectura y solo un usuario puede editar un determinado archivo versionado (Ej.: un proceso).&lt;br /&gt;
===== Editar un procesos =====&lt;br /&gt;
* Seleccionar el proceso a editar.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; edit.&lt;br /&gt;
Esto habilita al usuario a modificar el proceso. En caso de que exitiera otro usuario modificando el proceso nos aparecerá un mensaje de error.&lt;br /&gt;
&lt;br /&gt;
===== Grabar los cambios realizados en un proceso =====&lt;br /&gt;
* Seleccionar el proceso que se esta editando.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; commit.&lt;br /&gt;
Este paso es importante, debido a que si se libera la edición del proceso sin realizar el commit se perderán los cambios.&lt;br /&gt;
&lt;br /&gt;
===== Liberar la edición del proceso =====&lt;br /&gt;
* Seleccionar el proceso que se esta editando.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; unedit.&lt;br /&gt;
&lt;br /&gt;
===Incluir un jar y utilizarlo===&lt;br /&gt;
Una vez que tenemos creado nuestro proyecto BPM podemos llegar a necesitar utilizar ciertas clases de java, tanto para modelar entidades como para invocar servicios externos a nuestro proyecto.&lt;br /&gt;
&lt;br /&gt;
En el caso que necesitemos incluír alguna librería al proyecto BPM los pasos a realizar son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* En &amp;quot;Recursos externos&amp;quot; hacer botón derecho y seleccionar la opción &amp;quot;Nuevo recurso externo&amp;quot;.&lt;br /&gt;
* Seleccionar un nombre y en tipo seleccionar &amp;quot;Biblioteca de clase Java&amp;quot;. &lt;br /&gt;
* Le damos clic al botón &amp;quot;Agregar&amp;quot; y buscamos el jar correspondiente que vamos a querer incluír.&lt;br /&gt;
* Aceptar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalizado estos pasos vamos a ver que se agregó a &amp;quot;Recursos externos&amp;quot; la librería que acabamos de incluir. Lo siguiente va a ser crear un módulo desde el cual invocar a las clases de nuestro jar. Para esto tenemos que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
* En &amp;quot;Catálogo&amp;quot; hacemos botón derecho y seleccionamos la opción &amp;quot;Crear módulo&amp;quot;.&lt;br /&gt;
* Le ponemos un nombre y le damos Aceptar.&lt;br /&gt;
* Realizado esto, veremos que se agregó un módulo al Catálogo. Lo que tenemos que hacer ahora es indicarle a ese módulo que contenga la configuración de nuestro jar. Para esto hacemos clic derecho sobre el módulo &amp;gt; Componente de catálogo &amp;gt; Java.&lt;br /&gt;
* Seleccionamos la opción &amp;quot;Usar una configuración existente&amp;quot; (está marcada por defecto) y en el combo seleccionamos nuestro recurso externo que agregamos antes. &lt;br /&gt;
* Luego, seleccionaremos las clases Java que quiero incluír en mi módulo.&lt;br /&gt;
* Se hará la carga de clases automáticamente.&lt;br /&gt;
* Finalizado esto deberíamos ver dentro de &amp;quot;Catálogo&amp;quot; nuestro módulo nuevo y al amplicar su contenido ver el árbol de las clases que incluímos en él.&lt;br /&gt;
&lt;br /&gt;
Para poder usar estas clases que incluímos, dentro de una actividad se podrán crear instancias de esta forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;ClaseDeMiBiblioteca instancia = new ClaseDeMiBiblioteca();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e invocar a sus métodos de esta forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;ObjetoRespuesta respuesta = (ObjetoRespuesta) instancia.metodo(arg1 : parametroAEnviar);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tratamiento de excepciones de servicios externos===&lt;br /&gt;
Puede suceder que, al momento de invocar algún servicio externo a nuestro proyecto de BPM, este retorne como respuesta una excepción. Para poder darle un comportamiento a nuestro proceso en BPM se puede utilizar una transición del tipo &amp;quot;Excepción&amp;quot; entre dos actividades.&lt;br /&gt;
&lt;br /&gt;
Para dar un ejemplo concreto vamos a imaginarnos 2 actividades a las que llamaremos &amp;quot;Inicio&amp;quot; y &amp;quot;Comportamiento correcto&amp;quot;. La actividad &amp;quot;Inicio&amp;quot; invocará a un servicio, y si sale todo bien, se pasará luego a la actividad &amp;quot;Comportamiento correcto&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[Archivo:1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ahora, puede suceder que cuando &amp;quot;Inicio&amp;quot; invoca al servicio, éste devuelva una Excepción. ¿Qué hacemos en ese caso? Creamos una actividad (en nuestro ejemplo es &amp;quot;Comportamiento excepción&amp;quot;), la cual nuestro sistema ejecutará en caso de que el servicio falle, y le asociamos una transición entre &amp;quot;Inicio&amp;quot; y esta nueva actividad de esta forma:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Para crear dicha transición, debemos crear la actividad a la cual asociarla, dale doble clic y luego seleccionar como tipo de transición aquella que dice &amp;quot;Excepción&amp;quot;. Para indicarle para qué tipo de Excepción queremos que se siga dicho flujo, en &amp;quot;Nombre de excepción&amp;quot; deberemos cargar la clase con la excepción que puede llegar.&lt;br /&gt;
&lt;br /&gt;
=== Ver también  ===&lt;br /&gt;
* [[Oracle BPM]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Oracle]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=5736</id>
		<title>BEA Aqualogic BPM 5.7 (Fuego)</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=5736"/>
				<updated>2011-04-28T14:18:16Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Incluir un jar y utilizarlo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Comunicando con Base de Datos con PBL (Process Business Language)===&lt;br /&gt;
&lt;br /&gt;
Para ejecutar comandos SQL en Aqualogic BPM 5.7 hay que seguir los siguientes pasos: &lt;br /&gt;
&lt;br /&gt;
====Primer paso====&lt;br /&gt;
&lt;br /&gt;
Se debe crear nuevo &amp;quot;External Resource&amp;quot;, haciendo click derecho en el directorio del proyecto &amp;quot;External Resources&amp;quot;, del tipo &amp;quot;SQL Database&amp;quot;. Los campos se deben completar con la información de la base de datos que queremos consultar y con un nombre significativo.&lt;br /&gt;
&lt;br /&gt;
====Segundo paso====&lt;br /&gt;
 &lt;br /&gt;
Se debe crear un nuevo &amp;quot;BPM Object&amp;quot;, haciendo click derecho sobre el modulo deseado en el directorio de &amp;quot;Catalog&amp;quot;, y luego crear un método en nuestro objeto, haciendo click derecho sobre el objeto y seleccionando la opción &amp;quot;New Method&amp;quot;. Ahora se debe editar el nuevo método, expandiendo el objeto bpm y haciendo doble click sobre el nombre del método creado. Ahora podemos editarlo e incluir el código necesario para comunicarnos con la BD a través de una clase propia de Fuego, un ejemplo de implementación puede ser el siguiente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String queryAEjecutar =&amp;quot;SELECT campo1, campo2, campo3 FROM nombreTabla WHERE nombreColumna in (?,?)&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
String nombreDeLaBDCreada = &amp;quot;NombreBD&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
String[] arrayDeParametros = {&amp;quot;valor1&amp;quot;, &amp;quot;valor2&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
Iterator &amp;lt;Any[Any]&amp;gt; iterator = DynamicSQL.executeQuery(sentence : queryAEjecutar, implname : nombreDeLaBDCreada, inParameters : arrayDeParametros);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como se puede observar, el resultado de realizar la consulta va a ser un iterador, que luego puede ser recorrido con un &amp;quot;foreach&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
foreach (e in iterator) {&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo1: &amp;quot;+e[&amp;quot;campo1&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo2: &amp;quot;+e[&amp;quot;campo2&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo3: &amp;quot;+e[&amp;quot;campo3&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;nombreColumna: &amp;quot;+e[&amp;quot;nombreColumna&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Versionando con CVS ===&lt;br /&gt;
El producto Aqualogic BPM 5.7 incluye un cliente de CVS que permite agregar, remover, actualizar en un repositorio CVS.&lt;br /&gt;
&lt;br /&gt;
==== Configurar el cliente CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* File -&amp;gt; Preference -&amp;gt;Default Version Control&lt;br /&gt;
** Version Control Manger: CVS&lt;br /&gt;
** Host: host del servidor CVS&lt;br /&gt;
** User Name: usuario del CVS&lt;br /&gt;
** User Password: password del usuario CVS&lt;br /&gt;
** path: ruta dentro del repositorio donde se guardará el proyecto.&lt;br /&gt;
&lt;br /&gt;
==== Subir el proyecto al CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* Abrir el proyecto a versionar.&lt;br /&gt;
* File -&amp;gt; Project Preference -&amp;gt; Project Version Control.&lt;br /&gt;
** Version Control Manager: CVS (nos carga la información ingresada en el punto anterior).&lt;br /&gt;
* File -&amp;gt; VCS -&amp;gt; Store project in repository&lt;br /&gt;
** Path: directorio en el que se creará el proyecto en el repositorio.&lt;br /&gt;
** Si es la primera vez que se sube un proyecto de Aqualogic BPM, pedirá que se ingrese la ruta del directorio donde se creará el &amp;quot;common catalog&amp;quot;&lt;br /&gt;
*** Common catalog: Es un catalogo de componente, el cual puede ser compartido por otros proyectos de Aqualogic BPM.&lt;br /&gt;
En el repositorio quedarán creados 2 directorios, el del proyecto y el del common catalog, ademas se crearán 2 alias en el CVS que apuntan al proyecto y al common catalog.&lt;br /&gt;
&lt;br /&gt;
==== Obtener el proyecto del CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* File -&amp;gt; Project Preference -&amp;gt; Project Version Control.&lt;br /&gt;
* File -&amp;gt; Import -&amp;gt; Project -&amp;gt; from Repository.&lt;br /&gt;
** Version Control Manager: CVS&lt;br /&gt;
** En la siguiente pantalla, seleccionar el proyecto del repositorio.&lt;br /&gt;
&lt;br /&gt;
==== Trabajar con proyectos versionados ====&lt;br /&gt;
Aqualogic BPM 5.7, posee una política restrictiva de edición para los proyecto versionados.&lt;br /&gt;
La política, consiste en que todo el proyecto se encuentra en modo lectura y solo un usuario puede editar un determinado archivo versionado (Ej.: un proceso).&lt;br /&gt;
===== Editar un procesos =====&lt;br /&gt;
* Seleccionar el proceso a editar.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; edit.&lt;br /&gt;
Esto habilita al usuario a modificar el proceso. En caso de que exitiera otro usuario modificando el proceso nos aparecerá un mensaje de error.&lt;br /&gt;
&lt;br /&gt;
===== Grabar los cambios realizados en un proceso =====&lt;br /&gt;
* Seleccionar el proceso que se esta editando.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; commit.&lt;br /&gt;
Este paso es importante, debido a que si se libera la edición del proceso sin realizar el commit se perderán los cambios.&lt;br /&gt;
&lt;br /&gt;
===== Liberar la edición del proceso =====&lt;br /&gt;
* Seleccionar el proceso que se esta editando.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; unedit.&lt;br /&gt;
&lt;br /&gt;
===Incluir un jar y utilizarlo===&lt;br /&gt;
Una vez que tenemos creado nuestro proyecto BPM podemos llegar a necesitar utilizar ciertas clases de java, tanto para modelar entidades como para invocar servicios externos a nuestro proyecto.&lt;br /&gt;
&lt;br /&gt;
En el caso que necesitemos incluír alguna librería al proyecto BPM los pasos a realizar son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* En &amp;quot;Recursos externos&amp;quot; hacer botón derecho y seleccionar la opción &amp;quot;Nuevo recurso externo&amp;quot;.&lt;br /&gt;
* Seleccionar un nombre y en tipo seleccionar &amp;quot;Biblioteca de clase Java&amp;quot;. &lt;br /&gt;
* Le damos clic al botón &amp;quot;Agregar&amp;quot; y buscamos el jar correspondiente que vamos a querer incluír.&lt;br /&gt;
* Aceptar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalizado estos pasos vamos a ver que se agregó a &amp;quot;Recursos externos&amp;quot; la librería que acabamos de incluir. Lo siguiente va a ser crear un módulo desde el cual invocar a las clases de nuestro jar. Para esto tenemos que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
* En &amp;quot;Catálogo&amp;quot; hacemos botón derecho y seleccionamos la opción &amp;quot;Crear módulo&amp;quot;.&lt;br /&gt;
* Le ponemos un nombre y le damos Aceptar.&lt;br /&gt;
* Realizado esto, veremos que se agregó un módulo al Catálogo. Lo que tenemos que hacer ahora es indicarle a ese módulo que contenga la configuración de nuestro jar. Para esto hacemos clic derecho sobre el módulo &amp;gt; Componente de catálogo &amp;gt; Java.&lt;br /&gt;
* Seleccionamos la opción &amp;quot;Usar una configuración existente&amp;quot; (está marcada por defecto) y en el combo seleccionamos nuestro recurso externo que agregamos antes. &lt;br /&gt;
* Luego, seleccionaremos las clases Java que quiero incluír en mi módulo.&lt;br /&gt;
* Se hará la carga de clases automáticamente.&lt;br /&gt;
* Finalizado esto deberíamos ver dentro de &amp;quot;Catálogo&amp;quot; nuestro módulo nuevo y al amplicar su contenido ver el árbol de las clases que incluímos en él.&lt;br /&gt;
&lt;br /&gt;
Para poder usar estas clases que incluímos, dentro de una actividad se podrán crear instancias de esta forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;ClaseDeMiBiblioteca instancia = new ClaseDeMiBiblioteca();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e invocar a sus métodos de esta forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;ObjetoRespuesta respuesta = (ObjetoRespuesta) instancia.metodo(arg1 : parametroAEnviar);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ver también  ===&lt;br /&gt;
* [[Oracle BPM]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Oracle]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=5735</id>
		<title>BEA Aqualogic BPM 5.7 (Fuego)</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=5735"/>
				<updated>2011-04-28T14:16:31Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Incluir un jar y utilizarlo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Comunicando con Base de Datos con PBL (Process Business Language)===&lt;br /&gt;
&lt;br /&gt;
Para ejecutar comandos SQL en Aqualogic BPM 5.7 hay que seguir los siguientes pasos: &lt;br /&gt;
&lt;br /&gt;
====Primer paso====&lt;br /&gt;
&lt;br /&gt;
Se debe crear nuevo &amp;quot;External Resource&amp;quot;, haciendo click derecho en el directorio del proyecto &amp;quot;External Resources&amp;quot;, del tipo &amp;quot;SQL Database&amp;quot;. Los campos se deben completar con la información de la base de datos que queremos consultar y con un nombre significativo.&lt;br /&gt;
&lt;br /&gt;
====Segundo paso====&lt;br /&gt;
 &lt;br /&gt;
Se debe crear un nuevo &amp;quot;BPM Object&amp;quot;, haciendo click derecho sobre el modulo deseado en el directorio de &amp;quot;Catalog&amp;quot;, y luego crear un método en nuestro objeto, haciendo click derecho sobre el objeto y seleccionando la opción &amp;quot;New Method&amp;quot;. Ahora se debe editar el nuevo método, expandiendo el objeto bpm y haciendo doble click sobre el nombre del método creado. Ahora podemos editarlo e incluir el código necesario para comunicarnos con la BD a través de una clase propia de Fuego, un ejemplo de implementación puede ser el siguiente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String queryAEjecutar =&amp;quot;SELECT campo1, campo2, campo3 FROM nombreTabla WHERE nombreColumna in (?,?)&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
String nombreDeLaBDCreada = &amp;quot;NombreBD&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
String[] arrayDeParametros = {&amp;quot;valor1&amp;quot;, &amp;quot;valor2&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
Iterator &amp;lt;Any[Any]&amp;gt; iterator = DynamicSQL.executeQuery(sentence : queryAEjecutar, implname : nombreDeLaBDCreada, inParameters : arrayDeParametros);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como se puede observar, el resultado de realizar la consulta va a ser un iterador, que luego puede ser recorrido con un &amp;quot;foreach&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
foreach (e in iterator) {&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo1: &amp;quot;+e[&amp;quot;campo1&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo2: &amp;quot;+e[&amp;quot;campo2&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo3: &amp;quot;+e[&amp;quot;campo3&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;nombreColumna: &amp;quot;+e[&amp;quot;nombreColumna&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Versionando con CVS ===&lt;br /&gt;
El producto Aqualogic BPM 5.7 incluye un cliente de CVS que permite agregar, remover, actualizar en un repositorio CVS.&lt;br /&gt;
&lt;br /&gt;
==== Configurar el cliente CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* File -&amp;gt; Preference -&amp;gt;Default Version Control&lt;br /&gt;
** Version Control Manger: CVS&lt;br /&gt;
** Host: host del servidor CVS&lt;br /&gt;
** User Name: usuario del CVS&lt;br /&gt;
** User Password: password del usuario CVS&lt;br /&gt;
** path: ruta dentro del repositorio donde se guardará el proyecto.&lt;br /&gt;
&lt;br /&gt;
==== Subir el proyecto al CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* Abrir el proyecto a versionar.&lt;br /&gt;
* File -&amp;gt; Project Preference -&amp;gt; Project Version Control.&lt;br /&gt;
** Version Control Manager: CVS (nos carga la información ingresada en el punto anterior).&lt;br /&gt;
* File -&amp;gt; VCS -&amp;gt; Store project in repository&lt;br /&gt;
** Path: directorio en el que se creará el proyecto en el repositorio.&lt;br /&gt;
** Si es la primera vez que se sube un proyecto de Aqualogic BPM, pedirá que se ingrese la ruta del directorio donde se creará el &amp;quot;common catalog&amp;quot;&lt;br /&gt;
*** Common catalog: Es un catalogo de componente, el cual puede ser compartido por otros proyectos de Aqualogic BPM.&lt;br /&gt;
En el repositorio quedarán creados 2 directorios, el del proyecto y el del common catalog, ademas se crearán 2 alias en el CVS que apuntan al proyecto y al common catalog.&lt;br /&gt;
&lt;br /&gt;
==== Obtener el proyecto del CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* File -&amp;gt; Project Preference -&amp;gt; Project Version Control.&lt;br /&gt;
* File -&amp;gt; Import -&amp;gt; Project -&amp;gt; from Repository.&lt;br /&gt;
** Version Control Manager: CVS&lt;br /&gt;
** En la siguiente pantalla, seleccionar el proyecto del repositorio.&lt;br /&gt;
&lt;br /&gt;
==== Trabajar con proyectos versionados ====&lt;br /&gt;
Aqualogic BPM 5.7, posee una política restrictiva de edición para los proyecto versionados.&lt;br /&gt;
La política, consiste en que todo el proyecto se encuentra en modo lectura y solo un usuario puede editar un determinado archivo versionado (Ej.: un proceso).&lt;br /&gt;
===== Editar un procesos =====&lt;br /&gt;
* Seleccionar el proceso a editar.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; edit.&lt;br /&gt;
Esto habilita al usuario a modificar el proceso. En caso de que exitiera otro usuario modificando el proceso nos aparecerá un mensaje de error.&lt;br /&gt;
&lt;br /&gt;
===== Grabar los cambios realizados en un proceso =====&lt;br /&gt;
* Seleccionar el proceso que se esta editando.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; commit.&lt;br /&gt;
Este paso es importante, debido a que si se libera la edición del proceso sin realizar el commit se perderán los cambios.&lt;br /&gt;
&lt;br /&gt;
===== Liberar la edición del proceso =====&lt;br /&gt;
* Seleccionar el proceso que se esta editando.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; unedit.&lt;br /&gt;
&lt;br /&gt;
===Incluir un jar y utilizarlo===&lt;br /&gt;
Una vez que tenemos creado nuestro proyecto BPM podemos llegar a necesitar utilizar ciertas clases de java, tanto para modelar entidades como para invocar servicios externos a nuestro proyecto.&lt;br /&gt;
&lt;br /&gt;
En el caso que necesitemos incluír alguna librería al proyecto BPM los pasos a realizar son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* En &amp;quot;Recursos externos&amp;quot; hacer botón derecho y seleccionar la opción &amp;quot;Nuevo recurso externo&amp;quot;.&lt;br /&gt;
* Seleccionar un nombre y en tipo seleccionar &amp;quot;Biblioteca de clase Java&amp;quot;. &lt;br /&gt;
* Le damos clic al botón &amp;quot;Agregar&amp;quot; y buscamos el jar correspondiente que vamos a querer incluír.&lt;br /&gt;
* Aceptar.&lt;br /&gt;
&lt;br /&gt;
Finalizado estos pasos vamos a ver que se agregó a &amp;quot;Recursos externos&amp;quot; la librería que acabamos de incluir. Lo siguiente va a ser crear un módulo desde el cual invocar a las clases de nuestro jar. Para esto tenemos que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
* En &amp;quot;Catálogo&amp;quot; hacemos botón derecho y seleccionamos la opción &amp;quot;Crear módulo&amp;quot;.&lt;br /&gt;
* Le ponemos un nombre y le damos Aceptar.&lt;br /&gt;
* Realizado esto, veremos que se agregó un módulo al Catálogo. Lo que tenemos que hacer ahora es indicarle a ese módulo que contenga la configuración de nuestro jar. Para esto hacemos clic derecho sobre el módulo &amp;gt; Componente de catálogo &amp;gt; Java.&lt;br /&gt;
* Seleccionamos la opción &amp;quot;Usar una configuración existente&amp;quot; (está marcada por defecto) y en el combo seleccionamos nuestro recurso externo que agregamos antes. &lt;br /&gt;
* Luego, seleccionaremos las clases Java que quiero incluír en mi módulo.&lt;br /&gt;
* Se hará la carga de clases automáticamente.&lt;br /&gt;
* Finalizado esto deberíamos ver dentro de &amp;quot;Catálogo&amp;quot; nuestro módulo nuevo y al amplicar su contenido ver el árbol de las clases que incluímos en él.&lt;br /&gt;
&lt;br /&gt;
Para poder usar estas clases que incluímos, dentro de una actividad se podrán crear instancias de esta forma:&lt;br /&gt;
&lt;br /&gt;
ClaseDeMiBiblioteca instancia = new ClaseDeMiBiblioteca();&lt;br /&gt;
&lt;br /&gt;
e invocar a sus métodos de esta forma:&lt;br /&gt;
&lt;br /&gt;
ObjetoRespuesta respuesta = (ObjetoRespuesta) instancia.metodo(arg1 : parametroAEnviar);&lt;br /&gt;
&lt;br /&gt;
=== Ver también  ===&lt;br /&gt;
* [[Oracle BPM]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Oracle]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=5734</id>
		<title>BEA Aqualogic BPM 5.7 (Fuego)</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=5734"/>
				<updated>2011-04-28T14:15:34Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Comunicando con Base de Datos con PBL (Process Business Language)===&lt;br /&gt;
&lt;br /&gt;
Para ejecutar comandos SQL en Aqualogic BPM 5.7 hay que seguir los siguientes pasos: &lt;br /&gt;
&lt;br /&gt;
====Primer paso====&lt;br /&gt;
&lt;br /&gt;
Se debe crear nuevo &amp;quot;External Resource&amp;quot;, haciendo click derecho en el directorio del proyecto &amp;quot;External Resources&amp;quot;, del tipo &amp;quot;SQL Database&amp;quot;. Los campos se deben completar con la información de la base de datos que queremos consultar y con un nombre significativo.&lt;br /&gt;
&lt;br /&gt;
====Segundo paso====&lt;br /&gt;
 &lt;br /&gt;
Se debe crear un nuevo &amp;quot;BPM Object&amp;quot;, haciendo click derecho sobre el modulo deseado en el directorio de &amp;quot;Catalog&amp;quot;, y luego crear un método en nuestro objeto, haciendo click derecho sobre el objeto y seleccionando la opción &amp;quot;New Method&amp;quot;. Ahora se debe editar el nuevo método, expandiendo el objeto bpm y haciendo doble click sobre el nombre del método creado. Ahora podemos editarlo e incluir el código necesario para comunicarnos con la BD a través de una clase propia de Fuego, un ejemplo de implementación puede ser el siguiente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String queryAEjecutar =&amp;quot;SELECT campo1, campo2, campo3 FROM nombreTabla WHERE nombreColumna in (?,?)&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
String nombreDeLaBDCreada = &amp;quot;NombreBD&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
String[] arrayDeParametros = {&amp;quot;valor1&amp;quot;, &amp;quot;valor2&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
Iterator &amp;lt;Any[Any]&amp;gt; iterator = DynamicSQL.executeQuery(sentence : queryAEjecutar, implname : nombreDeLaBDCreada, inParameters : arrayDeParametros);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como se puede observar, el resultado de realizar la consulta va a ser un iterador, que luego puede ser recorrido con un &amp;quot;foreach&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
foreach (e in iterator) {&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo1: &amp;quot;+e[&amp;quot;campo1&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo2: &amp;quot;+e[&amp;quot;campo2&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo3: &amp;quot;+e[&amp;quot;campo3&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;nombreColumna: &amp;quot;+e[&amp;quot;nombreColumna&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Versionando con CVS ===&lt;br /&gt;
El producto Aqualogic BPM 5.7 incluye un cliente de CVS que permite agregar, remover, actualizar en un repositorio CVS.&lt;br /&gt;
&lt;br /&gt;
==== Configurar el cliente CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* File -&amp;gt; Preference -&amp;gt;Default Version Control&lt;br /&gt;
** Version Control Manger: CVS&lt;br /&gt;
** Host: host del servidor CVS&lt;br /&gt;
** User Name: usuario del CVS&lt;br /&gt;
** User Password: password del usuario CVS&lt;br /&gt;
** path: ruta dentro del repositorio donde se guardará el proyecto.&lt;br /&gt;
&lt;br /&gt;
==== Subir el proyecto al CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* Abrir el proyecto a versionar.&lt;br /&gt;
* File -&amp;gt; Project Preference -&amp;gt; Project Version Control.&lt;br /&gt;
** Version Control Manager: CVS (nos carga la información ingresada en el punto anterior).&lt;br /&gt;
* File -&amp;gt; VCS -&amp;gt; Store project in repository&lt;br /&gt;
** Path: directorio en el que se creará el proyecto en el repositorio.&lt;br /&gt;
** Si es la primera vez que se sube un proyecto de Aqualogic BPM, pedirá que se ingrese la ruta del directorio donde se creará el &amp;quot;common catalog&amp;quot;&lt;br /&gt;
*** Common catalog: Es un catalogo de componente, el cual puede ser compartido por otros proyectos de Aqualogic BPM.&lt;br /&gt;
En el repositorio quedarán creados 2 directorios, el del proyecto y el del common catalog, ademas se crearán 2 alias en el CVS que apuntan al proyecto y al common catalog.&lt;br /&gt;
&lt;br /&gt;
==== Obtener el proyecto del CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* File -&amp;gt; Project Preference -&amp;gt; Project Version Control.&lt;br /&gt;
* File -&amp;gt; Import -&amp;gt; Project -&amp;gt; from Repository.&lt;br /&gt;
** Version Control Manager: CVS&lt;br /&gt;
** En la siguiente pantalla, seleccionar el proyecto del repositorio.&lt;br /&gt;
&lt;br /&gt;
==== Trabajar con proyectos versionados ====&lt;br /&gt;
Aqualogic BPM 5.7, posee una política restrictiva de edición para los proyecto versionados.&lt;br /&gt;
La política, consiste en que todo el proyecto se encuentra en modo lectura y solo un usuario puede editar un determinado archivo versionado (Ej.: un proceso).&lt;br /&gt;
===== Editar un procesos =====&lt;br /&gt;
* Seleccionar el proceso a editar.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; edit.&lt;br /&gt;
Esto habilita al usuario a modificar el proceso. En caso de que exitiera otro usuario modificando el proceso nos aparecerá un mensaje de error.&lt;br /&gt;
&lt;br /&gt;
===== Grabar los cambios realizados en un proceso =====&lt;br /&gt;
* Seleccionar el proceso que se esta editando.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; commit.&lt;br /&gt;
Este paso es importante, debido a que si se libera la edición del proceso sin realizar el commit se perderán los cambios.&lt;br /&gt;
&lt;br /&gt;
===== Liberar la edición del proceso =====&lt;br /&gt;
* Seleccionar el proceso que se esta editando.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; unedit.&lt;br /&gt;
&lt;br /&gt;
===Incluir un jar y utilizarlo===&lt;br /&gt;
Una vez que tenemos creado nuestro proyecto BPM podemos llegar a necesitar utilizar ciertas clases de java, tanto para modelar entidades como para invocar servicios externos a nuestro proyecto.&lt;br /&gt;
&lt;br /&gt;
En el caso que necesitemos incluír alguna librería al proyecto BPM los pasos a realizar son los siguientes:&lt;br /&gt;
&lt;br /&gt;
1) En &amp;quot;Recursos externos&amp;quot; hacer botón derecho y seleccionar la opción &amp;quot;Nuevo recurso externo&amp;quot;.&lt;br /&gt;
2) Seleccionar un nombre y en tipo seleccionar &amp;quot;Biblioteca de clase Java&amp;quot;. &lt;br /&gt;
3) Le damos clic al botón &amp;quot;Agregar&amp;quot; y buscamos el jar correspondiente que vamos a querer incluír.&lt;br /&gt;
4) Aceptar.&lt;br /&gt;
&lt;br /&gt;
Finalizado estos pasos vamos a ver que se agregó a &amp;quot;Recursos externos&amp;quot; la librería que acabamos de incluir. Lo siguiente va a ser crear un módulo desde el cual invocar a las clases de nuestro jar. Para esto tenemos que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
1) En &amp;quot;Catálogo&amp;quot; hacemos botón derecho y seleccionamos la opción &amp;quot;Crear módulo&amp;quot;.&lt;br /&gt;
2) Le ponemos un nombre y le damos Aceptar.&lt;br /&gt;
3) Realizado esto, veremos que se agregó un módulo al Catálogo. Lo que tenemos que hacer ahora es indicarle a ese módulo que contenga la configuración de nuestro jar. Para esto hacemos clic derecho sobre el módulo &amp;gt; Componente de catálogo &amp;gt; Java.&lt;br /&gt;
4) Seleccionamos la opción &amp;quot;Usar una configuración existente&amp;quot; (está marcada por defecto) y en el combo seleccionamos nuestro recurso externo que agregamos antes. &lt;br /&gt;
5) Luego, seleccionaremos las clases Java que quiero incluír en mi módulo.&lt;br /&gt;
6) Se hará la carga de clases automáticamente.&lt;br /&gt;
7) Finalizado esto deberíamos ver dentro de &amp;quot;Catálogo&amp;quot; nuestro módulo nuevo y al amplicar su contenido ver el árbol de las clases que incluímos en él.&lt;br /&gt;
&lt;br /&gt;
Para poder usar estas clases que incluímos, dentro de una actividad se podrán crear instancias de esta forma:&lt;br /&gt;
&lt;br /&gt;
ClaseDeMiBiblioteca instancia = new ClaseDeMiBiblioteca();&lt;br /&gt;
&lt;br /&gt;
e invocar a sus métodos de esta forma:&lt;br /&gt;
&lt;br /&gt;
ObjetoRespuesta respuesta = (ObjetoRespuesta) instancia.metodo(arg1 : parametroAEnviar);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ver también  ===&lt;br /&gt;
* [[Oracle BPM]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Oracle]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_servidor_de_correo_smtp_con_Wiser&amp;diff=5708</id>
		<title>Mock de un servidor de correo smtp con Wiser</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_servidor_de_correo_smtp_con_Wiser&amp;diff=5708"/>
				<updated>2011-04-19T15:01:17Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En el siguiente ejemplo de código se muestra una clase que envía un mail usando la API de JavaMail. &lt;br /&gt;
Luego, un Test de Junit prueba esta clase levantando el servidor de mail [[Wiser]] en memoria y verificando que el mail haya llegado correctamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.dosideas.smtp;&lt;br /&gt;
&lt;br /&gt;
import java.util.Properties;&lt;br /&gt;
import javax.mail.Message;&lt;br /&gt;
import javax.mail.MessagingException;&lt;br /&gt;
import javax.mail.Session;&lt;br /&gt;
import javax.mail.Transport;&lt;br /&gt;
import javax.mail.internet.AddressException;&lt;br /&gt;
import javax.mail.internet.InternetAddress;&lt;br /&gt;
import javax.mail.internet.MimeMessage;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Clase que envía un email.&lt;br /&gt;
 */&lt;br /&gt;
public class MandaMail {&lt;br /&gt;
&lt;br /&gt;
    public void enviarMail(String mailOrigen, String mailDestinatario, String asunto, String textoMensaje)&lt;br /&gt;
                throws AddressException, MessagingException {&lt;br /&gt;
&lt;br /&gt;
        //se puede poner en true para ver la interaccion del protocolo smtp por stdout.&lt;br /&gt;
        boolean debug = false;&lt;br /&gt;
&lt;br /&gt;
        //setea el host y puerto donde esta el servidor de mail.&lt;br /&gt;
        Properties props = new Properties();&lt;br /&gt;
        props.put(&amp;quot;mail.smtp.host&amp;quot;, &amp;quot;localhost&amp;quot;);&lt;br /&gt;
        props.put(&amp;quot;mail.smtp.port&amp;quot;, 25);&lt;br /&gt;
&lt;br /&gt;
        Session session = Session.getDefaultInstance(props, null);&lt;br /&gt;
        session.setDebug(debug);&lt;br /&gt;
&lt;br /&gt;
        // create a message&lt;br /&gt;
        Message msg = new MimeMessage(session);&lt;br /&gt;
&lt;br /&gt;
        // set the from and to address&lt;br /&gt;
        InternetAddress addressFrom = new InternetAddress(mailOrigen);&lt;br /&gt;
        msg.setFrom(addressFrom);&lt;br /&gt;
&lt;br /&gt;
        InternetAddress addressTo = new InternetAddress(mailDestinatario);&lt;br /&gt;
        msg.setRecipient(Message.RecipientType.TO, addressTo);&lt;br /&gt;
&lt;br /&gt;
        // Setting the Subject and Content Type&lt;br /&gt;
        msg.setSubject(asunto);&lt;br /&gt;
        msg.setContent(textoMensaje, &amp;quot;text/plain&amp;quot;);&lt;br /&gt;
        Transport.send(msg);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== El test con JUnit  ==&lt;br /&gt;
&lt;br /&gt;
El siguiente test utiliza la clase anterior para maquetar el [[Servidor SMTP]]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package com.dosideas.smtp;&lt;br /&gt;
&lt;br /&gt;
import javax.mail.internet.MimeMessage;&lt;br /&gt;
import org.subethamail.wiser.WiserMessage;&lt;br /&gt;
import org.subethamail.wiser.Wiser;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Test de envio de mail con Junit y Dumbster&lt;br /&gt;
 */&lt;br /&gt;
public class MandaMailTest {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void testEnviarMail() throws Exception {&lt;br /&gt;
&lt;br /&gt;
        MandaMail instance = new MandaMail();&lt;br /&gt;
&lt;br /&gt;
        String mailDestinatario = &amp;quot;destinatario@dumbster.com&amp;quot;;&lt;br /&gt;
        String mailOrigen = &amp;quot;origen@dumbster.com&amp;quot;;&lt;br /&gt;
        String asunto = &amp;quot;Asunto del mail de prueba&amp;quot;;&lt;br /&gt;
        String textoMensaje = &amp;quot;Este es un mail para probar el servidor de dumbster&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        //arranca el servidor de mail de  Dumbster.&lt;br /&gt;
        Wiser server = new Wiser();&lt;br /&gt;
        server.setPort(25);&lt;br /&gt;
        server.start();&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            //envia el mail.&lt;br /&gt;
            instance.enviarMail(mailOrigen, mailDestinatario, asunto, textoMensaje);&lt;br /&gt;
        } catch (Exception e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
            fail(&amp;quot;Unexpected exception: &amp;quot; + e);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        //detiene el servidor de Dumbster&lt;br /&gt;
        server.stop();&lt;br /&gt;
&lt;br /&gt;
        //verifica que se obtenga el mail y que tenga los datos enviados.&lt;br /&gt;
        assertTrue(server.getMessages().size() == 1);&lt;br /&gt;
        Iterator emailIter = server.getMessages().iterator();&lt;br /&gt;
        WiserMessage email = (WiserMessage) emailIter.next();&lt;br /&gt;
        MimeMessage mmessage = email.getMimeMessage();&lt;br /&gt;
        assertTrue(mmessage.getSubject().equals(asunto));&lt;br /&gt;
        assertTrue(email.getEnvelopeSender().equals(mailOrigen));&lt;br /&gt;
        assertTrue(email.getEnvelopeReceiver().equals(mailDestinatario));&lt;br /&gt;
        assertTrue(mmessage.getContent().toString().equals(textoMensaje));&lt;br /&gt;
&lt;br /&gt;
        //muestra el contenido&lt;br /&gt;
        System.out.println(&amp;quot;Mensaje recibido en servidor Dumbster:&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;--------------------------------------&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;De: &amp;quot; + email.getEnvelopeSender());&lt;br /&gt;
        System.out.println(&amp;quot;Para: &amp;quot; + email.getEnvelopeReceiver());&lt;br /&gt;
        System.out.println(&amp;quot;Asunto: &amp;quot; + mmessage.getSubject());&lt;br /&gt;
        System.out.println(&amp;quot;Contenido: &amp;quot; + mmessage.getContent());&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
&lt;br /&gt;
*[[Wiser]]&lt;br /&gt;
*[[Dumbster]]&lt;br /&gt;
*[[Mock Object]] &lt;br /&gt;
*[[Jetty]] &lt;br /&gt;
&lt;br /&gt;
[[Category:Java]] [[Category:TDD]] [[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Dumbster&amp;diff=5707</id>
		<title>Dumbster</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Dumbster&amp;diff=5707"/>
				<updated>2011-04-19T15:00:56Z</updated>
		
		<summary type="html">&lt;p&gt;201.251.185.130: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dumbster es un proyecto de [[Software Libre]] que permite generar [[Mock Object]] de un servidor de mail SMTP.&lt;br /&gt;
&lt;br /&gt;
Permite realizar Tests con Junit en los que se pueden enviar y obtener mails de este servidor de correo mock.&lt;br /&gt;
&lt;br /&gt;
== Issues conocidos ==&lt;br /&gt;
&lt;br /&gt;
Dumbster 1.6 tiene problemas en plataformas MacOSX. &lt;br /&gt;
&lt;br /&gt;
Debido a un race condition Dumbster puede llegar a producir un Deadlock, el problema suele aparecer cuando se intenta iniciar una nueva instancia de Dumbster luego de haber cerrado otra.&lt;br /&gt;
&lt;br /&gt;
Los detalles del problema se pueden ver en [http://sourceforge.net/tracker/?func=detail&amp;amp;aid=1354551&amp;amp;group_id=78413&amp;amp;atid=553186 el bug reportado en sourceforge].&lt;br /&gt;
&lt;br /&gt;
Hay un parche que se puede aplicar para solucionar este problema, aunque otra solución es utilizar otra herramienta como [[Wiser]]&lt;br /&gt;
 &lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Mock de un servidor de correo smtp con Dumbster]]&lt;br /&gt;
* [[Wiser]]&lt;br /&gt;
* [[Mock de un servidor de correo smtp con Wiser]]&lt;br /&gt;
* [http://quintanasoft.com/dumbster/ Sitio oficial de Dumbster]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]] [[Category:TDD]] [[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>201.251.185.130</name></author>	</entry>

	</feed>