<?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=Shichibukai</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=Shichibukai"/>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/Especial:Contribuciones/Shichibukai"/>
		<updated>2026-04-21T11:18:43Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Integraci%C3%B3n_de_Maven_con_IDEs&amp;diff=6816</id>
		<title>Integración de Maven con IDEs</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Integraci%C3%B3n_de_Maven_con_IDEs&amp;diff=6816"/>
				<updated>2013-03-19T18:28:36Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Mas Detalles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Eclipse ==&lt;br /&gt;
&lt;br /&gt;
Existen 2 plugins disponibles para Eclipse, pero solo uno se encuentra estable.&lt;br /&gt;
&lt;br /&gt;
=== M2Eclipse ===&lt;br /&gt;
&lt;br /&gt;
Provee las siguientes características:&lt;br /&gt;
&lt;br /&gt;
* Crear builds desde Eclipse.&lt;br /&gt;
* Configuración de las dependencias del proyecto desde el pom.xml&lt;br /&gt;
* Descarga automática de dependencias desde repositorios remotos de Maven.&lt;br /&gt;
* Editor gráfico del POM, incluyendo agregado de dependencias con Autocomplete.&lt;br /&gt;
* Wizards para la creación de proyectos Maven y para la conversión de proyectos sin Maven.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Update site: http://m2eclipse.sonatype.org/sites/m2e&lt;br /&gt;
&lt;br /&gt;
Para poder montar un proyecto en Eclipse, primero deberemos generar los archivos de configuración para el IDE. Esto realiza invocando la tarea:&lt;br /&gt;
&lt;br /&gt;
  mvn eclipse:eclipse&lt;br /&gt;
&lt;br /&gt;
Una vez ejecutada correctamente, el proyecto se puede montar en Eclipse accediendo a: File -&amp;gt; Import y en esa ventana General -&amp;gt; Existing Projects into Workspace.&lt;br /&gt;
&lt;br /&gt;
En caso que se vaya a trabajar con varios projectos en simultáneo (a través de un POM multiproyecto), es necesario realizar un paso previo para que el plugin de eclipse pueda interpretar correctamente las dependencias.&lt;br /&gt;
&lt;br /&gt;
  mvn install&lt;br /&gt;
  mvn eclipse:eclipse&lt;br /&gt;
&lt;br /&gt;
== NetBeans ==&lt;br /&gt;
&lt;br /&gt;
== Mas Detalles ==&lt;br /&gt;
* [http://m2eclipse.sonatype.org/ M2Eclipse Home Page]&lt;br /&gt;
* [[Maven]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Integraci%C3%B3n_de_Maven_con_IDEs&amp;diff=6815</id>
		<title>Integración de Maven con IDEs</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Integraci%C3%B3n_de_Maven_con_IDEs&amp;diff=6815"/>
				<updated>2013-03-19T18:27:47Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Mas Detalles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Eclipse ==&lt;br /&gt;
&lt;br /&gt;
Existen 2 plugins disponibles para Eclipse, pero solo uno se encuentra estable.&lt;br /&gt;
&lt;br /&gt;
=== M2Eclipse ===&lt;br /&gt;
&lt;br /&gt;
Provee las siguientes características:&lt;br /&gt;
&lt;br /&gt;
* Crear builds desde Eclipse.&lt;br /&gt;
* Configuración de las dependencias del proyecto desde el pom.xml&lt;br /&gt;
* Descarga automática de dependencias desde repositorios remotos de Maven.&lt;br /&gt;
* Editor gráfico del POM, incluyendo agregado de dependencias con Autocomplete.&lt;br /&gt;
* Wizards para la creación de proyectos Maven y para la conversión de proyectos sin Maven.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Update site: http://m2eclipse.sonatype.org/sites/m2e&lt;br /&gt;
&lt;br /&gt;
Para poder montar un proyecto en Eclipse, primero deberemos generar los archivos de configuración para el IDE. Esto realiza invocando la tarea:&lt;br /&gt;
&lt;br /&gt;
  mvn eclipse:eclipse&lt;br /&gt;
&lt;br /&gt;
Una vez ejecutada correctamente, el proyecto se puede montar en Eclipse accediendo a: File -&amp;gt; Import y en esa ventana General -&amp;gt; Existing Projects into Workspace.&lt;br /&gt;
&lt;br /&gt;
En caso que se vaya a trabajar con varios projectos en simultáneo (a través de un POM multiproyecto), es necesario realizar un paso previo para que el plugin de eclipse pueda interpretar correctamente las dependencias.&lt;br /&gt;
&lt;br /&gt;
  mvn install&lt;br /&gt;
  mvn eclipse:eclipse&lt;br /&gt;
&lt;br /&gt;
== NetBeans ==&lt;br /&gt;
&lt;br /&gt;
== Mas Detalles ==&lt;br /&gt;
* [http://m2eclipse.sonatype.org/ M2Eclipse Home Page]&lt;br /&gt;
*[[NetBeans]]&lt;br /&gt;
* [[Maven]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Javadump&amp;diff=6814</id>
		<title>Javadump</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Javadump&amp;diff=6814"/>
				<updated>2013-03-19T18:25:22Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: Leer un javadump desde el notepad&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Javadump''' es la información estructurada de la jvm en un instante determinado, en la cual registra el vuelco de memoria, los thread de la JVM y el estado de cada thread.&lt;br /&gt;
Esta información es la que utilizaremos cuando queremos analizar algún problema de perfomance, pergem o simplemente ver como se comporta nuestra aplicación en la JVM. &lt;br /&gt;
Existen varias herramientas para leer el javadump que varía según el entorno en la que se genera el javadump (Windows, AIX, etc), en este post vamos a analizar el javadump desde el notepad.&lt;br /&gt;
&lt;br /&gt;
==Información del thread==&lt;br /&gt;
Dentro del javadump, tenemos una sección (thread Details/All Thread Details) en donde se detalla cada thread que se encuentra corriendo dentro de la JVM.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;quot;Java2D Disposer&amp;quot; J9VMthread:0x00000001193E8A00, j9thread_t:0x00000001179DD300, java/lang/thread:0x0700000003B84360,&lt;br /&gt;
state:CW, prio=10&lt;br /&gt;
    (native thread ID:0x904F3, native priority:0xA, native policy:UNKNOWN)&lt;br /&gt;
    Java callstack:&lt;br /&gt;
        at java/lang/Object.wait(Native Method)&lt;br /&gt;
        at java/lang/Object.wait(Object.java:196(Compiled Code))&lt;br /&gt;
        at java/lang/ref/ReferenceQueue.remove(ReferenceQueue.java:102(Compiled Code))&lt;br /&gt;
        at java/lang/ref/ReferenceQueue.remove(ReferenceQueue.java:79(Compiled Code))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por cada thread tenemos la siguiente información:&lt;br /&gt;
*'''Nombre:''' En caso de estar en un servidor de aplicaciones, es el identificador que asigna el servidor de aplicaciones al thread. Ej.:Java2D Disposer&lt;br /&gt;
*'''Estado:''' estado actual del thread. Ej.: CW. Los estados pueden ser:&lt;br /&gt;
**R - Runnable - El thread puede tiene todos los recursos para ejecutarse.&lt;br /&gt;
**CW - Condition Wait - El thread se encuentra en espera de algún evento, ej:&lt;br /&gt;
***Esperando por una operación E/S.&lt;br /&gt;
***El thread ejecuta el metodo wait() de  un monitor y espera el evento notify().&lt;br /&gt;
***El thread espera para sincronizarse con otro hilo, invocando al metodo join()&lt;br /&gt;
***El thread espera por ejecutar el metodo sleep()&lt;br /&gt;
**S – Suspended – el thread fue suspendido por otro thread.&lt;br /&gt;
**Z – Zombie – el thread fue eliminado.&lt;br /&gt;
**P – Parked – el thread fue puesto en ese estado por la nueva api de concurrencia (java.util.concurrent).&lt;br /&gt;
**B – Blocked – el thread esta esperando para obtener acceso a la región critica (luego de pasar por el wait()) que posee otro hilo.&lt;br /&gt;
*'''Prioridad:''' prioridad del thread (mientra más alto más prioritario), cada prioridad de Java es mapeado a la prioridad del Sistema Operativo. Ej.: prio=10&lt;br /&gt;
*'''Stacktrace:''' El stack trace de la invocación realizada por el thread. Ej.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Java callstack:&lt;br /&gt;
    at java/lang/Object.wait(Native Method)&lt;br /&gt;
    at java/lang/Object.wait(Object.java:196(Compiled Code))&lt;br /&gt;
    at java/lang/ref/ReferenceQueue.remove(ReferenceQueue.java:102(Compiled Code))&lt;br /&gt;
    at java/lang/ref/ReferenceQueue.remove(ReferenceQueue.java:79(Compiled Code))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Monitores/Locks==&lt;br /&gt;
Los monitores es el mecanismo que utiliza Java para sincronizar los thread cuando quieren acceder a un recurso compartido. Para entender mejor como funciona el mecanismo de sincronización podemos leer el [http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html tutorial de java sobre los monitores].&lt;br /&gt;
Dentro del javadump, tenemos la información de los thread que estan a la espera de un monitor (lock), esta información nos puede ser útil para detectar deadlock o mucho thread compitiendo por el mismo recuros.&lt;br /&gt;
Ej.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
NULL           ------------------------------------------------------------------------&lt;br /&gt;
0SECTION       LOCKS subcomponent dump routine&lt;br /&gt;
NULL           ===============================&lt;br /&gt;
NULL           &lt;br /&gt;
1LKPOOLINFO    Monitor pool info:&lt;br /&gt;
2LKPOOLTOTAL     Current total number of monitors: 1358&lt;br /&gt;
NULL           &lt;br /&gt;
1LKMONPOOLDUMP Monitor Pool Dump (flat &amp;amp; inflated object-monitors):&lt;br /&gt;
2LKMONINUSE      sys_mon_t:0x000000011D560258 infl_mon_t: 0x000000011D560298:&lt;br /&gt;
3LKMONOBJECT       weblogic/utils/classloaders/ChangeAwareClassLoader@0x0700000001858578/0x0700000001858590: &lt;br /&gt;
owner &amp;quot;[ACTIVE] ExecuteThread: '348' for queue: 'weblogic.kernel.Default (self-tuning)'&amp;quot; (0x0000000140298F00), &lt;br /&gt;
entry count 2&lt;br /&gt;
3LKWAITERQ            Waiting to enter:&lt;br /&gt;
3LKWAITER                &amp;quot;[ACTIVE] ExecuteThread: '9' for queue: 'weblogic.kernel.Default (self-tuning)'&amp;quot; (0x000000011E5DED00)&lt;br /&gt;
3LKWAITER                &amp;quot;[ACTIVE] ExecuteThread: '12' for queue: 'weblogic.kernel.Default (self-tuning)'&amp;quot; (0x000000011E942B00)&lt;br /&gt;
3LKWAITER                &amp;quot;[ACTIVE] ExecuteThread: '17' for queue: 'weblogic.kernel.Default (self-tuning)'&amp;quot; (0x00000001213EE700)&lt;br /&gt;
3LKWAITER                &amp;quot;[ACTIVE] ExecuteThread: '41' for queue: 'weblogic.kernel.Default (self-tuning)'&amp;quot; (0x000000012175A400)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el ejemplo vemos que los threads se encuentran esperando que se libere la instancia '''weblogic/utils/classloaders/ChangeAwareClassLoader@0x0700000001858578/0x0700000001858590''' cuyo dueño es '''[ACTIVE] ExecuteThread: '348' '''&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html Tutorial Java sobre concurrencia]&lt;br /&gt;
* [http://javaeesupportpatterns.blogspot.com.ar/2011/11/how-to-analyze-thread-dump-part-1.html Como analizar el &amp;quot;thread dump&amp;quot;]&lt;br /&gt;
* [http://publib.boulder.ibm.com/infocenter/realtime/v1r0/index.jsp?topic=%2Fcom.ibm.rt.doc.10%2Fdiag%2Ftools%2Fjavadump_tags_threads.html Interpretando el javadump en el IBM WebSphere]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Java&amp;diff=6813</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Java&amp;diff=6813"/>
				<updated>2013-03-19T18:02:35Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Cuestiones generales de Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Java es un lenguaje de programación, aunque también se suele hacer referencia con este nombre a toda una plataforma para el desarrollo de aplicaciones. Hay un buen [http://es.wikipedia.org/wiki/Java_%28Sun%29 resumen de Java en la wikipedia].&lt;br /&gt;
&lt;br /&gt;
Al desarrollar un sistema se suele basar en una [[Arquitectura De Software]] para crear los componentes.&lt;br /&gt;
&lt;br /&gt;
Java se caracteriza por una enorme cantidad de proyectos libres.&lt;br /&gt;
&lt;br /&gt;
== Algunas tecnologías Java ==&lt;br /&gt;
=== Frameworks de base===&lt;br /&gt;
* [[Spring Framework]]&lt;br /&gt;
* [[Terracotta]]&lt;br /&gt;
* [[EJB]]&lt;br /&gt;
* [[Restlet]]&lt;br /&gt;
&lt;br /&gt;
===Acceso a datos===&lt;br /&gt;
* [[Hibernate]]&lt;br /&gt;
* [[Apache Lucene]]&lt;br /&gt;
&lt;br /&gt;
===Frameworks de presentación===&lt;br /&gt;
* [[Apache Tiles]]&lt;br /&gt;
* [[Struts]]&lt;br /&gt;
* [[JSF]]&lt;br /&gt;
* [[JSTL]]&lt;br /&gt;
* [[GWT]]&lt;br /&gt;
* [[SiteMesh 2]]&lt;br /&gt;
&lt;br /&gt;
===Librerías===&lt;br /&gt;
* [[Google Guava]]&lt;br /&gt;
* [[Jawr]]&lt;br /&gt;
&lt;br /&gt;
===Mensajeria===&lt;br /&gt;
* [[JMS]]&lt;br /&gt;
&lt;br /&gt;
===Web Services===&lt;br /&gt;
* [[Web Service]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
&lt;br /&gt;
===Ejecuciones batch y programadas===&lt;br /&gt;
* [[Quartz]]&lt;br /&gt;
* [[Spring Batch]]&lt;br /&gt;
&lt;br /&gt;
===Seguridad===&lt;br /&gt;
* [[Spring Security]]&lt;br /&gt;
&lt;br /&gt;
===Cuestiones generales de Java===&lt;br /&gt;
* [[Validaciones de XML contra XSD En Java]]&lt;br /&gt;
* [[Fechas En Java]]&lt;br /&gt;
* [[Numeros En Java]]&lt;br /&gt;
* [[Encoding En Java]]&lt;br /&gt;
* [[Serializacion De Objetos En Java]]&lt;br /&gt;
* [[Log4J]]&lt;br /&gt;
* [[SLF4J]]&lt;br /&gt;
* [[Cache De Objetos Java]]&lt;br /&gt;
* [[Exportacion Hacia Archivos]]&lt;br /&gt;
* [[Javadump]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:ConsumirWS_NET_conJava_Solucion.jpg&amp;diff=6641</id>
		<title>Archivo:ConsumirWS NET conJava Solucion.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:ConsumirWS_NET_conJava_Solucion.jpg&amp;diff=6641"/>
				<updated>2012-06-22T14:25:33Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: subida una nueva versión de «Archivo:ConsumirWS NET conJava Solucion.jpg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Solucion para consumir un WS en .Net con clientes Java utilizando un Aqualogic&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:ConsumirWS_NET_conJava_Solucion.jpg&amp;diff=6640</id>
		<title>Archivo:ConsumirWS NET conJava Solucion.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:ConsumirWS_NET_conJava_Solucion.jpg&amp;diff=6640"/>
				<updated>2012-06-22T13:31:17Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: subida una nueva versión de «Archivo:ConsumirWS NET conJava Solucion.jpg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Solucion para consumir un WS en .Net con clientes Java utilizando un Aqualogic&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6639</id>
		<title>Consumir Web Service .NET con clientes Java mediante Aqualogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6639"/>
				<updated>2012-06-22T13:21:08Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Solución */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contexto ==&lt;br /&gt;
Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL).&lt;br /&gt;
&lt;br /&gt;
[[Archivo:consumirWS_NET_con_Java_contexto.jpg]]&lt;br /&gt;
&lt;br /&gt;
En el WSDL, como respuesta de operación tenemos:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
            &amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;s:any /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Cuando al consumir el WebService nos responde:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;xs:schema xmlns=&amp;quot;&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; id=&amp;quot;NewDataSet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name=&amp;quot;NewDataSet&amp;quot; msdata:IsDataSet=&amp;quot;true&amp;quot; msdata:Locale=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
	&amp;lt;diffgr:diffgram xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; xmlns:diffgr=&amp;quot;urn:schemas-microsoft-com:xml-diffgram-v1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;NewDataSet xmlns=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Table diffgr:id=&amp;quot;Table1&amp;quot; msdata:rowOrder=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;Legajo&amp;gt;123456&amp;lt;/legajo&amp;gt;&lt;br /&gt;
				&amp;lt;Nombre&amp;gt;Mickey&amp;lt;/Nombre&amp;gt;&lt;br /&gt;
				&amp;lt;Apellido&amp;gt;Mouse&amp;lt;/Apellido&amp;gt;&lt;br /&gt;
			&amp;lt;/Table&amp;gt;&lt;br /&gt;
		...&lt;br /&gt;
		&amp;lt;/NewDataSet&amp;gt;&lt;br /&gt;
	&amp;lt;/diffgr:diffgram&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problema == &lt;br /&gt;
Si queremos consumir el WSDL desde un cliente java, al quere mapear el WSDL (por ejemplo con jaxb) nos dará el siguiente error:&lt;br /&gt;
&lt;br /&gt;
'''[ERROR] undefined element declaration 's:schema' '''&lt;br /&gt;
&lt;br /&gt;
=== Explicación ===&lt;br /&gt;
Observando el WSDL, podemos ver que al generar la clase que representan a la respuesta de la operación (BuscarAlumnoResponse), jaxb desconoce como resolver&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;s:any /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Lo que nos esta diciendo el WSDL es que la operación buscarAlumno, tiene como respuesta un elemento schema y cualquier tipo de objeto como respuesta. &lt;br /&gt;
Como vemos en el contrato del servicio, no esta definido realmente el tipo de respuesta (no lo sabemos hasta el momento de ejecutar la operación) lo que nos dificulta la creación del cliente.&lt;br /&gt;
&lt;br /&gt;
=== Solución ===&lt;br /&gt;
Una posible solución es utilizar un [[AquaLogic| Aqualogic Service Bus]], para consumir el webservice y exponerlo en un contrato amigable.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:consumirWS_NET_conJava_Solucion.jpg]]&lt;br /&gt;
&lt;br /&gt;
En el Aqualogic, generaremos un proyecto en el cual business sea consumidor del webservice .NET y el proxy es en contrato que expondremos a los clientes Java, para esto último utilizaremos un XSLT para transformar la respuesta del webservice.&lt;br /&gt;
&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
==== 1. Definir el nuevo contrato de la operación a exponer ==== &lt;br /&gt;
En nuestro caso solo modificaremos la respuesta de la operación:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
	    &amp;lt;s:element name=&amp;quot;alumnos&amp;quot; type=&amp;quot;tns:Alumno&amp;quot; minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;unbounded&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;/s:element&amp;gt;&lt;br /&gt;
    &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
  &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
&amp;lt;/s:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s:complexType name=&amp;quot;Alumno&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;legajo&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;nombre&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;apellido&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 2. Generar un XSLT ====&lt;br /&gt;
Generaremos un XSLT para transformar la respuesta del servicio .NET al nuevo WSDL que expondremos:&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;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; xmlns:dosideas=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:for-each select=&amp;quot;current()/*/*[2]/*&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:element name=&amp;quot;dosideas:BuscarAlumnoResult&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xsl:element name=&amp;quot;dosideas:alumnos&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;xsl:element name=&amp;quot;dosideas:{local-name()}&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                                &amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;
                            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
                    &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 3. Exponer el servicio en el Aqualogic Service Bus ====&lt;br /&gt;
Con los WSDL y XSLT generados, realizaremos los siguientes pasos:&lt;br /&gt;
3.1 Subir el WSDL del servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.2 Subir el nuevo WSDL del servicio.&lt;br /&gt;
&lt;br /&gt;
3.3 Subir el XSLT para transformar la respuesta.&lt;br /&gt;
&lt;br /&gt;
3.4 Crear un Business Service para consumir el servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.5 Crear un Proxy Service que consuma el Business Service y exponga el resultado según el nuevo contrato.&lt;br /&gt;
&lt;br /&gt;
3.6 Configurar el Proxy Service (Message Flow) para modificar la respuesta del Business Service.&lt;br /&gt;
&lt;br /&gt;
*3.6.1 Editar el Route que apunta al Business Service creado y en el Response Action, agregamos una acción de replace, donde:&lt;br /&gt;
**'''XPath:''' //dosideas:BuscarAlumnoResponse&lt;br /&gt;
**'''Expression:''' &amp;lt;EL XSLT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3.6.2 Al Proxy, agregarle un PipelinePair, con un Stage en el Response.&lt;br /&gt;
*3.6.3 En el Stage del Response:&lt;br /&gt;
**'''XPath:''' . (El carácter punto)&lt;br /&gt;
**'''Variable:''' body&lt;br /&gt;
**'''Expression:''' $body&lt;br /&gt;
**'''Replace entire node'''&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[AquaLogic]]&lt;br /&gt;
* [http://www.bea.com/aqualogic/ Web oficial de AquaLogic]&lt;br /&gt;
* [[Spring Web Services]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6638</id>
		<title>Consumir Web Service .NET con clientes Java mediante Aqualogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6638"/>
				<updated>2012-06-22T13:20:20Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Solución */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contexto ==&lt;br /&gt;
Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL).&lt;br /&gt;
&lt;br /&gt;
[[Archivo:consumirWS_NET_con_Java_contexto.jpg]]&lt;br /&gt;
&lt;br /&gt;
En el WSDL, como respuesta de operación tenemos:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
            &amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;s:any /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Cuando al consumir el WebService nos responde:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;xs:schema xmlns=&amp;quot;&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; id=&amp;quot;NewDataSet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name=&amp;quot;NewDataSet&amp;quot; msdata:IsDataSet=&amp;quot;true&amp;quot; msdata:Locale=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
	&amp;lt;diffgr:diffgram xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; xmlns:diffgr=&amp;quot;urn:schemas-microsoft-com:xml-diffgram-v1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;NewDataSet xmlns=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Table diffgr:id=&amp;quot;Table1&amp;quot; msdata:rowOrder=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;Legajo&amp;gt;123456&amp;lt;/legajo&amp;gt;&lt;br /&gt;
				&amp;lt;Nombre&amp;gt;Mickey&amp;lt;/Nombre&amp;gt;&lt;br /&gt;
				&amp;lt;Apellido&amp;gt;Mouse&amp;lt;/Apellido&amp;gt;&lt;br /&gt;
			&amp;lt;/Table&amp;gt;&lt;br /&gt;
		...&lt;br /&gt;
		&amp;lt;/NewDataSet&amp;gt;&lt;br /&gt;
	&amp;lt;/diffgr:diffgram&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problema == &lt;br /&gt;
Si queremos consumir el WSDL desde un cliente java, al quere mapear el WSDL (por ejemplo con jaxb) nos dará el siguiente error:&lt;br /&gt;
&lt;br /&gt;
'''[ERROR] undefined element declaration 's:schema' '''&lt;br /&gt;
&lt;br /&gt;
=== Explicación ===&lt;br /&gt;
Observando el WSDL, podemos ver que al generar la clase que representan a la respuesta de la operación (BuscarAlumnoResponse), jaxb desconoce como resolver&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;s:any /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Lo que nos esta diciendo el WSDL es que la operación buscarAlumno, tiene como respuesta un elemento schema y cualquier tipo de objeto como respuesta. &lt;br /&gt;
Como vemos en el contrato del servicio, no esta definido realmente el tipo de respuesta (no lo sabemos hasta el momento de ejecutar la operación) lo que nos dificulta la creación del cliente.&lt;br /&gt;
&lt;br /&gt;
=== Solución ===&lt;br /&gt;
Una posible solución es utilizar un [[AquaLogic| Aqualogic Service Bus]], para consumir el webservice y exponerlo en un contrato amigable.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:consumirWS_NET_conJava_Solucion.jpg | 800px]]&lt;br /&gt;
&lt;br /&gt;
En el Aqualogic, generaremos un proyecto en el cual business sea consumidor del webservice .NET y el proxy es en contrato que expondremos a los clientes Java, para esto último utilizaremos un XSLT para transformar la respuesta del webservice.&lt;br /&gt;
&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
==== 1. Definir el nuevo contrato de la operación a exponer ==== &lt;br /&gt;
En nuestro caso solo modificaremos la respuesta de la operación:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
	    &amp;lt;s:element name=&amp;quot;alumnos&amp;quot; type=&amp;quot;tns:Alumno&amp;quot; minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;unbounded&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;/s:element&amp;gt;&lt;br /&gt;
    &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
  &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
&amp;lt;/s:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s:complexType name=&amp;quot;Alumno&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;legajo&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;nombre&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;apellido&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 2. Generar un XSLT ====&lt;br /&gt;
Generaremos un XSLT para transformar la respuesta del servicio .NET al nuevo WSDL que expondremos:&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;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; xmlns:dosideas=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:for-each select=&amp;quot;current()/*/*[2]/*&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:element name=&amp;quot;dosideas:BuscarAlumnoResult&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xsl:element name=&amp;quot;dosideas:alumnos&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;xsl:element name=&amp;quot;dosideas:{local-name()}&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                                &amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;
                            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
                    &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 3. Exponer el servicio en el Aqualogic Service Bus ====&lt;br /&gt;
Con los WSDL y XSLT generados, realizaremos los siguientes pasos:&lt;br /&gt;
3.1 Subir el WSDL del servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.2 Subir el nuevo WSDL del servicio.&lt;br /&gt;
&lt;br /&gt;
3.3 Subir el XSLT para transformar la respuesta.&lt;br /&gt;
&lt;br /&gt;
3.4 Crear un Business Service para consumir el servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.5 Crear un Proxy Service que consuma el Business Service y exponga el resultado según el nuevo contrato.&lt;br /&gt;
&lt;br /&gt;
3.6 Configurar el Proxy Service (Message Flow) para modificar la respuesta del Business Service.&lt;br /&gt;
&lt;br /&gt;
*3.6.1 Editar el Route que apunta al Business Service creado y en el Response Action, agregamos una acción de replace, donde:&lt;br /&gt;
**'''XPath:''' //dosideas:BuscarAlumnoResponse&lt;br /&gt;
**'''Expression:''' &amp;lt;EL XSLT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3.6.2 Al Proxy, agregarle un PipelinePair, con un Stage en el Response.&lt;br /&gt;
*3.6.3 En el Stage del Response:&lt;br /&gt;
**'''XPath:''' . (El carácter punto)&lt;br /&gt;
**'''Variable:''' body&lt;br /&gt;
**'''Expression:''' $body&lt;br /&gt;
**'''Replace entire node'''&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[AquaLogic]]&lt;br /&gt;
* [http://www.bea.com/aqualogic/ Web oficial de AquaLogic]&lt;br /&gt;
* [[Spring Web Services]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6637</id>
		<title>Consumir Web Service .NET con clientes Java mediante Aqualogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6637"/>
				<updated>2012-06-22T13:18:33Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Solución */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contexto ==&lt;br /&gt;
Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL).&lt;br /&gt;
&lt;br /&gt;
[[Archivo:consumirWS_NET_con_Java_contexto.jpg]]&lt;br /&gt;
&lt;br /&gt;
En el WSDL, como respuesta de operación tenemos:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
            &amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;s:any /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Cuando al consumir el WebService nos responde:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;xs:schema xmlns=&amp;quot;&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; id=&amp;quot;NewDataSet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name=&amp;quot;NewDataSet&amp;quot; msdata:IsDataSet=&amp;quot;true&amp;quot; msdata:Locale=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
	&amp;lt;diffgr:diffgram xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; xmlns:diffgr=&amp;quot;urn:schemas-microsoft-com:xml-diffgram-v1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;NewDataSet xmlns=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Table diffgr:id=&amp;quot;Table1&amp;quot; msdata:rowOrder=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;Legajo&amp;gt;123456&amp;lt;/legajo&amp;gt;&lt;br /&gt;
				&amp;lt;Nombre&amp;gt;Mickey&amp;lt;/Nombre&amp;gt;&lt;br /&gt;
				&amp;lt;Apellido&amp;gt;Mouse&amp;lt;/Apellido&amp;gt;&lt;br /&gt;
			&amp;lt;/Table&amp;gt;&lt;br /&gt;
		...&lt;br /&gt;
		&amp;lt;/NewDataSet&amp;gt;&lt;br /&gt;
	&amp;lt;/diffgr:diffgram&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problema == &lt;br /&gt;
Si queremos consumir el WSDL desde un cliente java, al quere mapear el WSDL (por ejemplo con jaxb) nos dará el siguiente error:&lt;br /&gt;
&lt;br /&gt;
'''[ERROR] undefined element declaration 's:schema' '''&lt;br /&gt;
&lt;br /&gt;
=== Explicación ===&lt;br /&gt;
Observando el WSDL, podemos ver que al generar la clase que representan a la respuesta de la operación (BuscarAlumnoResponse), jaxb desconoce como resolver&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;s:any /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Lo que nos esta diciendo el WSDL es que la operación buscarAlumno, tiene como respuesta un elemento schema y cualquier tipo de objeto como respuesta. &lt;br /&gt;
Como vemos en el contrato del servicio, no esta definido realmente el tipo de respuesta (no lo sabemos hasta el momento de ejecutar la operación) lo que nos dificulta la creación del cliente.&lt;br /&gt;
&lt;br /&gt;
=== Solución ===&lt;br /&gt;
Una posible solución es utilizar un [[AquaLogic| Aqualogic Service Bus]], para consumir el webservice y exponerlo en un contrato amigable.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:consumirWS_NET_conJava_Solucion.jpg]]&lt;br /&gt;
&lt;br /&gt;
En el Aqualogic, generaremos un proyecto en el cual business sea consumidor del webservice .NET y el proxy es en contrato que expondremos a los clientes Java, para esto último utilizaremos un XSLT para transformar la respuesta del webservice.&lt;br /&gt;
&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
==== 1. Definir el nuevo contrato de la operación a exponer ==== &lt;br /&gt;
En nuestro caso solo modificaremos la respuesta de la operación:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
	    &amp;lt;s:element name=&amp;quot;alumnos&amp;quot; type=&amp;quot;tns:Alumno&amp;quot; minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;unbounded&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;/s:element&amp;gt;&lt;br /&gt;
    &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
  &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
&amp;lt;/s:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s:complexType name=&amp;quot;Alumno&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;legajo&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;nombre&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;apellido&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 2. Generar un XSLT ====&lt;br /&gt;
Generaremos un XSLT para transformar la respuesta del servicio .NET al nuevo WSDL que expondremos:&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;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; xmlns:dosideas=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:for-each select=&amp;quot;current()/*/*[2]/*&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:element name=&amp;quot;dosideas:BuscarAlumnoResult&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xsl:element name=&amp;quot;dosideas:alumnos&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;xsl:element name=&amp;quot;dosideas:{local-name()}&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                                &amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;
                            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
                    &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 3. Exponer el servicio en el Aqualogic Service Bus ====&lt;br /&gt;
Con los WSDL y XSLT generados, realizaremos los siguientes pasos:&lt;br /&gt;
3.1 Subir el WSDL del servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.2 Subir el nuevo WSDL del servicio.&lt;br /&gt;
&lt;br /&gt;
3.3 Subir el XSLT para transformar la respuesta.&lt;br /&gt;
&lt;br /&gt;
3.4 Crear un Business Service para consumir el servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.5 Crear un Proxy Service que consuma el Business Service y exponga el resultado según el nuevo contrato.&lt;br /&gt;
&lt;br /&gt;
3.6 Configurar el Proxy Service (Message Flow) para modificar la respuesta del Business Service.&lt;br /&gt;
&lt;br /&gt;
*3.6.1 Editar el Route que apunta al Business Service creado y en el Response Action, agregamos una acción de replace, donde:&lt;br /&gt;
**'''XPath:''' //dosideas:BuscarAlumnoResponse&lt;br /&gt;
**'''Expression:''' &amp;lt;EL XSLT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3.6.2 Al Proxy, agregarle un PipelinePair, con un Stage en el Response.&lt;br /&gt;
*3.6.3 En el Stage del Response:&lt;br /&gt;
**'''XPath:''' . (El carácter punto)&lt;br /&gt;
**'''Variable:''' body&lt;br /&gt;
**'''Expression:''' $body&lt;br /&gt;
**'''Replace entire node'''&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[AquaLogic]]&lt;br /&gt;
* [http://www.bea.com/aqualogic/ Web oficial de AquaLogic]&lt;br /&gt;
* [[Spring Web Services]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6636</id>
		<title>Consumir Web Service .NET con clientes Java mediante Aqualogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6636"/>
				<updated>2012-06-22T13:18:12Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Solución */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contexto ==&lt;br /&gt;
Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL).&lt;br /&gt;
&lt;br /&gt;
[[Archivo:consumirWS_NET_con_Java_contexto.jpg]]&lt;br /&gt;
&lt;br /&gt;
En el WSDL, como respuesta de operación tenemos:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
            &amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;s:any /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Cuando al consumir el WebService nos responde:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;xs:schema xmlns=&amp;quot;&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; id=&amp;quot;NewDataSet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name=&amp;quot;NewDataSet&amp;quot; msdata:IsDataSet=&amp;quot;true&amp;quot; msdata:Locale=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
	&amp;lt;diffgr:diffgram xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; xmlns:diffgr=&amp;quot;urn:schemas-microsoft-com:xml-diffgram-v1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;NewDataSet xmlns=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Table diffgr:id=&amp;quot;Table1&amp;quot; msdata:rowOrder=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;Legajo&amp;gt;123456&amp;lt;/legajo&amp;gt;&lt;br /&gt;
				&amp;lt;Nombre&amp;gt;Mickey&amp;lt;/Nombre&amp;gt;&lt;br /&gt;
				&amp;lt;Apellido&amp;gt;Mouse&amp;lt;/Apellido&amp;gt;&lt;br /&gt;
			&amp;lt;/Table&amp;gt;&lt;br /&gt;
		...&lt;br /&gt;
		&amp;lt;/NewDataSet&amp;gt;&lt;br /&gt;
	&amp;lt;/diffgr:diffgram&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problema == &lt;br /&gt;
Si queremos consumir el WSDL desde un cliente java, al quere mapear el WSDL (por ejemplo con jaxb) nos dará el siguiente error:&lt;br /&gt;
&lt;br /&gt;
'''[ERROR] undefined element declaration 's:schema' '''&lt;br /&gt;
&lt;br /&gt;
=== Explicación ===&lt;br /&gt;
Observando el WSDL, podemos ver que al generar la clase que representan a la respuesta de la operación (BuscarAlumnoResponse), jaxb desconoce como resolver&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;s:any /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Lo que nos esta diciendo el WSDL es que la operación buscarAlumno, tiene como respuesta un elemento schema y cualquier tipo de objeto como respuesta. &lt;br /&gt;
Como vemos en el contrato del servicio, no esta definido realmente el tipo de respuesta (no lo sabemos hasta el momento de ejecutar la operación) lo que nos dificulta la creación del cliente.&lt;br /&gt;
&lt;br /&gt;
=== Solución ===&lt;br /&gt;
Una posible solución es utilizar un [[AquaLogic| Aqualogic Service Bus]], para consumir el webservice y exponerlo en un contrato amigable.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:consumirWS_NET_conJava_Solucion.jpg | 800px]]&lt;br /&gt;
&lt;br /&gt;
En el Aqualogic, generaremos un proyecto en el cual business sea consumidor del webservice .NET y el proxy es en contrato que expondremos a los clientes Java, para esto último utilizaremos un XSLT para transformar la respuesta del webservice.&lt;br /&gt;
&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
==== 1. Definir el nuevo contrato de la operación a exponer ==== &lt;br /&gt;
En nuestro caso solo modificaremos la respuesta de la operación:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
	    &amp;lt;s:element name=&amp;quot;alumnos&amp;quot; type=&amp;quot;tns:Alumno&amp;quot; minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;unbounded&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;/s:element&amp;gt;&lt;br /&gt;
    &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
  &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
&amp;lt;/s:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s:complexType name=&amp;quot;Alumno&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;legajo&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;nombre&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;apellido&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 2. Generar un XSLT ====&lt;br /&gt;
Generaremos un XSLT para transformar la respuesta del servicio .NET al nuevo WSDL que expondremos:&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;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; xmlns:dosideas=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:for-each select=&amp;quot;current()/*/*[2]/*&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:element name=&amp;quot;dosideas:BuscarAlumnoResult&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xsl:element name=&amp;quot;dosideas:alumnos&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;xsl:element name=&amp;quot;dosideas:{local-name()}&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                                &amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;
                            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
                    &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 3. Exponer el servicio en el Aqualogic Service Bus ====&lt;br /&gt;
Con los WSDL y XSLT generados, realizaremos los siguientes pasos:&lt;br /&gt;
3.1 Subir el WSDL del servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.2 Subir el nuevo WSDL del servicio.&lt;br /&gt;
&lt;br /&gt;
3.3 Subir el XSLT para transformar la respuesta.&lt;br /&gt;
&lt;br /&gt;
3.4 Crear un Business Service para consumir el servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.5 Crear un Proxy Service que consuma el Business Service y exponga el resultado según el nuevo contrato.&lt;br /&gt;
&lt;br /&gt;
3.6 Configurar el Proxy Service (Message Flow) para modificar la respuesta del Business Service.&lt;br /&gt;
&lt;br /&gt;
*3.6.1 Editar el Route que apunta al Business Service creado y en el Response Action, agregamos una acción de replace, donde:&lt;br /&gt;
**'''XPath:''' //dosideas:BuscarAlumnoResponse&lt;br /&gt;
**'''Expression:''' &amp;lt;EL XSLT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3.6.2 Al Proxy, agregarle un PipelinePair, con un Stage en el Response.&lt;br /&gt;
*3.6.3 En el Stage del Response:&lt;br /&gt;
**'''XPath:''' . (El carácter punto)&lt;br /&gt;
**'''Variable:''' body&lt;br /&gt;
**'''Expression:''' $body&lt;br /&gt;
**'''Replace entire node'''&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[AquaLogic]]&lt;br /&gt;
* [http://www.bea.com/aqualogic/ Web oficial de AquaLogic]&lt;br /&gt;
* [[Spring Web Services]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:ConsumirWS_NET_conJava_Solucion.jpg&amp;diff=6635</id>
		<title>Archivo:ConsumirWS NET conJava Solucion.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:ConsumirWS_NET_conJava_Solucion.jpg&amp;diff=6635"/>
				<updated>2012-06-22T13:16:53Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: Solucion para consumir un WS en .Net con clientes Java utilizando un Aqualogic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Solucion para consumir un WS en .Net con clientes Java utilizando un Aqualogic&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6634</id>
		<title>Consumir Web Service .NET con clientes Java mediante Aqualogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6634"/>
				<updated>2012-06-22T13:15:09Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Contexto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contexto ==&lt;br /&gt;
Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL).&lt;br /&gt;
&lt;br /&gt;
[[Archivo:consumirWS_NET_con_Java_contexto.jpg]]&lt;br /&gt;
&lt;br /&gt;
En el WSDL, como respuesta de operación tenemos:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
            &amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;s:any /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Cuando al consumir el WebService nos responde:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;xs:schema xmlns=&amp;quot;&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; id=&amp;quot;NewDataSet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name=&amp;quot;NewDataSet&amp;quot; msdata:IsDataSet=&amp;quot;true&amp;quot; msdata:Locale=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
	&amp;lt;diffgr:diffgram xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; xmlns:diffgr=&amp;quot;urn:schemas-microsoft-com:xml-diffgram-v1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;NewDataSet xmlns=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Table diffgr:id=&amp;quot;Table1&amp;quot; msdata:rowOrder=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;Legajo&amp;gt;123456&amp;lt;/legajo&amp;gt;&lt;br /&gt;
				&amp;lt;Nombre&amp;gt;Mickey&amp;lt;/Nombre&amp;gt;&lt;br /&gt;
				&amp;lt;Apellido&amp;gt;Mouse&amp;lt;/Apellido&amp;gt;&lt;br /&gt;
			&amp;lt;/Table&amp;gt;&lt;br /&gt;
		...&lt;br /&gt;
		&amp;lt;/NewDataSet&amp;gt;&lt;br /&gt;
	&amp;lt;/diffgr:diffgram&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problema == &lt;br /&gt;
Si queremos consumir el WSDL desde un cliente java, al quere mapear el WSDL (por ejemplo con jaxb) nos dará el siguiente error:&lt;br /&gt;
&lt;br /&gt;
'''[ERROR] undefined element declaration 's:schema' '''&lt;br /&gt;
&lt;br /&gt;
=== Explicación ===&lt;br /&gt;
Observando el WSDL, podemos ver que al generar la clase que representan a la respuesta de la operación (BuscarAlumnoResponse), jaxb desconoce como resolver&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;s:any /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Lo que nos esta diciendo el WSDL es que la operación buscarAlumno, tiene como respuesta un elemento schema y cualquier tipo de objeto como respuesta. &lt;br /&gt;
Como vemos en el contrato del servicio, no esta definido realmente el tipo de respuesta (no lo sabemos hasta el momento de ejecutar la operación) lo que nos dificulta la creación del cliente.&lt;br /&gt;
&lt;br /&gt;
=== Solución ===&lt;br /&gt;
Una posible solución es utilizar un [[AquaLogic| Aqualogic Service Bus]], para consumir el webservice y exponerlo en un contrato amigable.&lt;br /&gt;
&lt;br /&gt;
En el Aqualogic, generaremos un proyecto en el cual business sea consumidor del webservice .NET y el proxy es en contrato que expondremos a los clientes Java, para esto último utilizaremos un XSLT para transformar la respuesta del webservice.&lt;br /&gt;
&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
==== 1. Definir el nuevo contrato de la operación a exponer ==== &lt;br /&gt;
En nuestro caso solo modificaremos la respuesta de la operación:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
	    &amp;lt;s:element name=&amp;quot;alumnos&amp;quot; type=&amp;quot;tns:Alumno&amp;quot; minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;unbounded&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;/s:element&amp;gt;&lt;br /&gt;
    &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
  &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
&amp;lt;/s:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s:complexType name=&amp;quot;Alumno&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;legajo&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;nombre&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;apellido&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 2. Generar un XSLT ====&lt;br /&gt;
Generaremos un XSLT para transformar la respuesta del servicio .NET al nuevo WSDL que expondremos:&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;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; xmlns:dosideas=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:for-each select=&amp;quot;current()/*/*[2]/*&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:element name=&amp;quot;dosideas:BuscarAlumnoResult&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xsl:element name=&amp;quot;dosideas:alumnos&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;xsl:element name=&amp;quot;dosideas:{local-name()}&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                                &amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;
                            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
                    &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 3. Exponer el servicio en el Aqualogic Service Bus ====&lt;br /&gt;
Con los WSDL y XSLT generados, realizaremos los siguientes pasos:&lt;br /&gt;
3.1 Subir el WSDL del servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.2 Subir el nuevo WSDL del servicio.&lt;br /&gt;
&lt;br /&gt;
3.3 Subir el XSLT para transformar la respuesta.&lt;br /&gt;
&lt;br /&gt;
3.4 Crear un Business Service para consumir el servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.5 Crear un Proxy Service que consuma el Business Service y exponga el resultado según el nuevo contrato.&lt;br /&gt;
&lt;br /&gt;
3.6 Configurar el Proxy Service (Message Flow) para modificar la respuesta del Business Service.&lt;br /&gt;
&lt;br /&gt;
*3.6.1 Editar el Route que apunta al Business Service creado y en el Response Action, agregamos una acción de replace, donde:&lt;br /&gt;
**'''XPath:''' //dosideas:BuscarAlumnoResponse&lt;br /&gt;
**'''Expression:''' &amp;lt;EL XSLT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3.6.2 Al Proxy, agregarle un PipelinePair, con un Stage en el Response.&lt;br /&gt;
*3.6.3 En el Stage del Response:&lt;br /&gt;
**'''XPath:''' . (El carácter punto)&lt;br /&gt;
**'''Variable:''' body&lt;br /&gt;
**'''Expression:''' $body&lt;br /&gt;
**'''Replace entire node'''&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[AquaLogic]]&lt;br /&gt;
* [http://www.bea.com/aqualogic/ Web oficial de AquaLogic]&lt;br /&gt;
* [[Spring Web Services]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:ConsumirWS_NET_con_Java_contexto.jpg&amp;diff=6633</id>
		<title>Archivo:ConsumirWS NET con Java contexto.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:ConsumirWS_NET_con_Java_contexto.jpg&amp;diff=6633"/>
				<updated>2012-06-22T13:14:28Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL).&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL).&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6632</id>
		<title>Consumir Web Service .NET con clientes Java mediante Aqualogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6632"/>
				<updated>2012-06-22T13:02:08Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Problema */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contexto ==&lt;br /&gt;
Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL).&lt;br /&gt;
En el WSDL, como respuesta de operación tenemos:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
            &amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;s:any /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Cuando al consumir el WebService nos responde:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;xs:schema xmlns=&amp;quot;&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; id=&amp;quot;NewDataSet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name=&amp;quot;NewDataSet&amp;quot; msdata:IsDataSet=&amp;quot;true&amp;quot; msdata:Locale=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
	&amp;lt;diffgr:diffgram xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; xmlns:diffgr=&amp;quot;urn:schemas-microsoft-com:xml-diffgram-v1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;NewDataSet xmlns=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Table diffgr:id=&amp;quot;Table1&amp;quot; msdata:rowOrder=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;Legajo&amp;gt;123456&amp;lt;/legajo&amp;gt;&lt;br /&gt;
				&amp;lt;Nombre&amp;gt;Mickey&amp;lt;/Nombre&amp;gt;&lt;br /&gt;
				&amp;lt;Apellido&amp;gt;Mouse&amp;lt;/Apellido&amp;gt;&lt;br /&gt;
			&amp;lt;/Table&amp;gt;&lt;br /&gt;
		...&lt;br /&gt;
		&amp;lt;/NewDataSet&amp;gt;&lt;br /&gt;
	&amp;lt;/diffgr:diffgram&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== Problema == &lt;br /&gt;
Si queremos consumir el WSDL desde un cliente java, al quere mapear el WSDL (por ejemplo con jaxb) nos dará el siguiente error:&lt;br /&gt;
&lt;br /&gt;
'''[ERROR] undefined element declaration 's:schema' '''&lt;br /&gt;
&lt;br /&gt;
=== Explicación ===&lt;br /&gt;
Observando el WSDL, podemos ver que al generar la clase que representan a la respuesta de la operación (BuscarAlumnoResponse), jaxb desconoce como resolver&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;s:any /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Lo que nos esta diciendo el WSDL es que la operación buscarAlumno, tiene como respuesta un elemento schema y cualquier tipo de objeto como respuesta. &lt;br /&gt;
Como vemos en el contrato del servicio, no esta definido realmente el tipo de respuesta (no lo sabemos hasta el momento de ejecutar la operación) lo que nos dificulta la creación del cliente.&lt;br /&gt;
&lt;br /&gt;
=== Solución ===&lt;br /&gt;
Una posible solución es utilizar un [[AquaLogic| Aqualogic Service Bus]], para consumir el webservice y exponerlo en un contrato amigable.&lt;br /&gt;
&lt;br /&gt;
En el Aqualogic, generaremos un proyecto en el cual business sea consumidor del webservice .NET y el proxy es en contrato que expondremos a los clientes Java, para esto último utilizaremos un XSLT para transformar la respuesta del webservice.&lt;br /&gt;
&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
==== 1. Definir el nuevo contrato de la operación a exponer ==== &lt;br /&gt;
En nuestro caso solo modificaremos la respuesta de la operación:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
	    &amp;lt;s:element name=&amp;quot;alumnos&amp;quot; type=&amp;quot;tns:Alumno&amp;quot; minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;unbounded&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;/s:element&amp;gt;&lt;br /&gt;
    &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
  &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
&amp;lt;/s:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s:complexType name=&amp;quot;Alumno&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;legajo&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;nombre&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;apellido&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 2. Generar un XSLT ====&lt;br /&gt;
Generaremos un XSLT para transformar la respuesta del servicio .NET al nuevo WSDL que expondremos:&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;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; xmlns:dosideas=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:for-each select=&amp;quot;current()/*/*[2]/*&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:element name=&amp;quot;dosideas:BuscarAlumnoResult&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xsl:element name=&amp;quot;dosideas:alumnos&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;xsl:element name=&amp;quot;dosideas:{local-name()}&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                                &amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;
                            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
                    &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 3. Exponer el servicio en el Aqualogic Service Bus ====&lt;br /&gt;
Con los WSDL y XSLT generados, realizaremos los siguientes pasos:&lt;br /&gt;
3.1 Subir el WSDL del servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.2 Subir el nuevo WSDL del servicio.&lt;br /&gt;
&lt;br /&gt;
3.3 Subir el XSLT para transformar la respuesta.&lt;br /&gt;
&lt;br /&gt;
3.4 Crear un Business Service para consumir el servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.5 Crear un Proxy Service que consuma el Business Service y exponga el resultado según el nuevo contrato.&lt;br /&gt;
&lt;br /&gt;
3.6 Configurar el Proxy Service (Message Flow) para modificar la respuesta del Business Service.&lt;br /&gt;
&lt;br /&gt;
*3.6.1 Editar el Route que apunta al Business Service creado y en el Response Action, agregamos una acción de replace, donde:&lt;br /&gt;
**'''XPath:''' //dosideas:BuscarAlumnoResponse&lt;br /&gt;
**'''Expression:''' &amp;lt;EL XSLT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3.6.2 Al Proxy, agregarle un PipelinePair, con un Stage en el Response.&lt;br /&gt;
*3.6.3 En el Stage del Response:&lt;br /&gt;
**'''XPath:''' . (El carácter punto)&lt;br /&gt;
**'''Variable:''' body&lt;br /&gt;
**'''Expression:''' $body&lt;br /&gt;
**'''Replace entire node'''&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[AquaLogic]]&lt;br /&gt;
* [http://www.bea.com/aqualogic/ Web oficial de AquaLogic]&lt;br /&gt;
* [[Spring Web Services]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6631</id>
		<title>Consumir Web Service .NET con clientes Java mediante Aqualogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6631"/>
				<updated>2012-06-22T12:50:13Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* 3. Exponer el servicio en el Aqualogic Service Bus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contexto ==&lt;br /&gt;
Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL).&lt;br /&gt;
En el WSDL, como respuesta de operación tenemos:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
            &amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;s:any /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Cuando al consumir el WebService nos responde:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;xs:schema xmlns=&amp;quot;&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; id=&amp;quot;NewDataSet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name=&amp;quot;NewDataSet&amp;quot; msdata:IsDataSet=&amp;quot;true&amp;quot; msdata:Locale=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
	&amp;lt;diffgr:diffgram xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; xmlns:diffgr=&amp;quot;urn:schemas-microsoft-com:xml-diffgram-v1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;NewDataSet xmlns=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Table diffgr:id=&amp;quot;Table1&amp;quot; msdata:rowOrder=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;Legajo&amp;gt;123456&amp;lt;/legajo&amp;gt;&lt;br /&gt;
				&amp;lt;Nombre&amp;gt;Mickey&amp;lt;/Nombre&amp;gt;&lt;br /&gt;
				&amp;lt;Apellido&amp;gt;Mouse&amp;lt;/Apellido&amp;gt;&lt;br /&gt;
			&amp;lt;/Table&amp;gt;&lt;br /&gt;
		...&lt;br /&gt;
		&amp;lt;/NewDataSet&amp;gt;&lt;br /&gt;
	&amp;lt;/diffgr:diffgram&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== Problema == &lt;br /&gt;
Si queremos consumir el WSDL desde un cliente java, al quere mapear el WSDL (por ejemplo con jaxb) nos dará el siguiente error:&lt;br /&gt;
[ERROR] undefined element declaration 's:schema'&lt;br /&gt;
&lt;br /&gt;
=== Explicación ===&lt;br /&gt;
Observando el WSDL, podemos ver que al generar la clase que representan a la respuesta de la operación (BuscarAlumnoResponse), jaxb desconoce como resolver&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;s:any /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Lo que nos esta diciendo el WSDL es que la operación buscarAlumno, tiene como respuesta un elemento schema y cualquier tipo de objeto como respuesta. &lt;br /&gt;
Como vemos en el contrato del servicio, no esta definido realmente el tipo de respuesta (no lo sabemos hasta el momento de ejecutar la operación) lo que nos dificulta la creación del cliente.&lt;br /&gt;
&lt;br /&gt;
=== Solución ===&lt;br /&gt;
Una posible solución es utilizar un [[AquaLogic| Aqualogic Service Bus]], para consumir el webservice y exponerlo en un contrato amigable.&lt;br /&gt;
&lt;br /&gt;
En el Aqualogic, generaremos un proyecto en el cual business sea consumidor del webservice .NET y el proxy es en contrato que expondremos a los clientes Java, para esto último utilizaremos un XSLT para transformar la respuesta del webservice.&lt;br /&gt;
&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
==== 1. Definir el nuevo contrato de la operación a exponer ==== &lt;br /&gt;
En nuestro caso solo modificaremos la respuesta de la operación:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
	    &amp;lt;s:element name=&amp;quot;alumnos&amp;quot; type=&amp;quot;tns:Alumno&amp;quot; minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;unbounded&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;/s:element&amp;gt;&lt;br /&gt;
    &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
  &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
&amp;lt;/s:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s:complexType name=&amp;quot;Alumno&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;legajo&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;nombre&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;apellido&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 2. Generar un XSLT ====&lt;br /&gt;
Generaremos un XSLT para transformar la respuesta del servicio .NET al nuevo WSDL que expondremos:&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;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; xmlns:dosideas=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:for-each select=&amp;quot;current()/*/*[2]/*&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:element name=&amp;quot;dosideas:BuscarAlumnoResult&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xsl:element name=&amp;quot;dosideas:alumnos&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;xsl:element name=&amp;quot;dosideas:{local-name()}&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                                &amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;
                            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
                    &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 3. Exponer el servicio en el Aqualogic Service Bus ====&lt;br /&gt;
Con los WSDL y XSLT generados, realizaremos los siguientes pasos:&lt;br /&gt;
3.1 Subir el WSDL del servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.2 Subir el nuevo WSDL del servicio.&lt;br /&gt;
&lt;br /&gt;
3.3 Subir el XSLT para transformar la respuesta.&lt;br /&gt;
&lt;br /&gt;
3.4 Crear un Business Service para consumir el servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.5 Crear un Proxy Service que consuma el Business Service y exponga el resultado según el nuevo contrato.&lt;br /&gt;
&lt;br /&gt;
3.6 Configurar el Proxy Service (Message Flow) para modificar la respuesta del Business Service.&lt;br /&gt;
&lt;br /&gt;
*3.6.1 Editar el Route que apunta al Business Service creado y en el Response Action, agregamos una acción de replace, donde:&lt;br /&gt;
**'''XPath:''' //dosideas:BuscarAlumnoResponse&lt;br /&gt;
**'''Expression:''' &amp;lt;EL XSLT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3.6.2 Al Proxy, agregarle un PipelinePair, con un Stage en el Response.&lt;br /&gt;
*3.6.3 En el Stage del Response:&lt;br /&gt;
**'''XPath:''' . (El carácter punto)&lt;br /&gt;
**'''Variable:''' body&lt;br /&gt;
**'''Expression:''' $body&lt;br /&gt;
**'''Replace entire node'''&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[AquaLogic]]&lt;br /&gt;
* [http://www.bea.com/aqualogic/ Web oficial de AquaLogic]&lt;br /&gt;
* [[Spring Web Services]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6630</id>
		<title>Consumir Web Service .NET con clientes Java mediante Aqualogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6630"/>
				<updated>2012-06-22T12:49:54Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* 3. Exponer el servicio en el Aqualogic Service Bus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contexto ==&lt;br /&gt;
Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL).&lt;br /&gt;
En el WSDL, como respuesta de operación tenemos:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
            &amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;s:any /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Cuando al consumir el WebService nos responde:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;xs:schema xmlns=&amp;quot;&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; id=&amp;quot;NewDataSet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name=&amp;quot;NewDataSet&amp;quot; msdata:IsDataSet=&amp;quot;true&amp;quot; msdata:Locale=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
	&amp;lt;diffgr:diffgram xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; xmlns:diffgr=&amp;quot;urn:schemas-microsoft-com:xml-diffgram-v1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;NewDataSet xmlns=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Table diffgr:id=&amp;quot;Table1&amp;quot; msdata:rowOrder=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;Legajo&amp;gt;123456&amp;lt;/legajo&amp;gt;&lt;br /&gt;
				&amp;lt;Nombre&amp;gt;Mickey&amp;lt;/Nombre&amp;gt;&lt;br /&gt;
				&amp;lt;Apellido&amp;gt;Mouse&amp;lt;/Apellido&amp;gt;&lt;br /&gt;
			&amp;lt;/Table&amp;gt;&lt;br /&gt;
		...&lt;br /&gt;
		&amp;lt;/NewDataSet&amp;gt;&lt;br /&gt;
	&amp;lt;/diffgr:diffgram&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== Problema == &lt;br /&gt;
Si queremos consumir el WSDL desde un cliente java, al quere mapear el WSDL (por ejemplo con jaxb) nos dará el siguiente error:&lt;br /&gt;
[ERROR] undefined element declaration 's:schema'&lt;br /&gt;
&lt;br /&gt;
=== Explicación ===&lt;br /&gt;
Observando el WSDL, podemos ver que al generar la clase que representan a la respuesta de la operación (BuscarAlumnoResponse), jaxb desconoce como resolver&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;s:any /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Lo que nos esta diciendo el WSDL es que la operación buscarAlumno, tiene como respuesta un elemento schema y cualquier tipo de objeto como respuesta. &lt;br /&gt;
Como vemos en el contrato del servicio, no esta definido realmente el tipo de respuesta (no lo sabemos hasta el momento de ejecutar la operación) lo que nos dificulta la creación del cliente.&lt;br /&gt;
&lt;br /&gt;
=== Solución ===&lt;br /&gt;
Una posible solución es utilizar un [[AquaLogic| Aqualogic Service Bus]], para consumir el webservice y exponerlo en un contrato amigable.&lt;br /&gt;
&lt;br /&gt;
En el Aqualogic, generaremos un proyecto en el cual business sea consumidor del webservice .NET y el proxy es en contrato que expondremos a los clientes Java, para esto último utilizaremos un XSLT para transformar la respuesta del webservice.&lt;br /&gt;
&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
==== 1. Definir el nuevo contrato de la operación a exponer ==== &lt;br /&gt;
En nuestro caso solo modificaremos la respuesta de la operación:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
	    &amp;lt;s:element name=&amp;quot;alumnos&amp;quot; type=&amp;quot;tns:Alumno&amp;quot; minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;unbounded&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;/s:element&amp;gt;&lt;br /&gt;
    &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
  &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
&amp;lt;/s:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s:complexType name=&amp;quot;Alumno&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;legajo&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;nombre&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;apellido&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 2. Generar un XSLT ====&lt;br /&gt;
Generaremos un XSLT para transformar la respuesta del servicio .NET al nuevo WSDL que expondremos:&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;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; xmlns:dosideas=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:for-each select=&amp;quot;current()/*/*[2]/*&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:element name=&amp;quot;dosideas:BuscarAlumnoResult&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xsl:element name=&amp;quot;dosideas:alumnos&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;xsl:element name=&amp;quot;dosideas:{local-name()}&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                                &amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;
                            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
                    &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 3. Exponer el servicio en el Aqualogic Service Bus ====&lt;br /&gt;
Con los WSDL y XSLT generados, realizaremos los siguientes pasos:&lt;br /&gt;
3.1 Subir el WSDL del servicio .NET&lt;br /&gt;
3.2 Subir el nuevo WSDL del servicio.&lt;br /&gt;
3.3 Subir el XSLT para transformar la respuesta.&lt;br /&gt;
3.4 Crear un Business Service para consumir el servicio .NET&lt;br /&gt;
3.5 Crear un Proxy Service que consuma el Business Service y exponga el resultado según el nuevo contrato.&lt;br /&gt;
3.6 Configurar el Proxy Service (Message Flow) para modificar la respuesta del Business Service.&lt;br /&gt;
&lt;br /&gt;
*3.6.1 Editar el Route que apunta al Business Service creado y en el Response Action, agregamos una acción de replace, donde:&lt;br /&gt;
**'''XPath:''' //dosideas:BuscarAlumnoResponse&lt;br /&gt;
**'''Expression:''' &amp;lt;EL XSLT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3.6.2 Al Proxy, agregarle un PipelinePair, con un Stage en el Response.&lt;br /&gt;
*3.6.3 En el Stage del Response:&lt;br /&gt;
**'''XPath:''' . (El carácter punto)&lt;br /&gt;
**'''Variable:''' body&lt;br /&gt;
**'''Expression:''' $body&lt;br /&gt;
**'''Replace entire node'''&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[AquaLogic]]&lt;br /&gt;
* [http://www.bea.com/aqualogic/ Web oficial de AquaLogic]&lt;br /&gt;
* [[Spring Web Services]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6629</id>
		<title>Consumir Web Service .NET con clientes Java mediante Aqualogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Consumir_Web_Service_.NET_con_clientes_Java_mediante_Aqualogic&amp;diff=6629"/>
				<updated>2012-06-22T12:48:39Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: Página creada con '== Contexto == Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL). En el WSDL, como respuesta de opera…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contexto ==&lt;br /&gt;
Consumir un Webservice realizado en .NET utilizando DataSet, a la cual no tenemos posibilidad de modificar el contrato (WSDL).&lt;br /&gt;
En el WSDL, como respuesta de operación tenemos:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
            &amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;s:any /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Cuando al consumir el WebService nos responde:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;xs:schema xmlns=&amp;quot;&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; id=&amp;quot;NewDataSet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;xs:element name=&amp;quot;NewDataSet&amp;quot; msdata:IsDataSet=&amp;quot;true&amp;quot; msdata:Locale=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
	&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
	&amp;lt;diffgr:diffgram xmlns:msdata=&amp;quot;urn:schemas-microsoft-com:xml-msdata&amp;quot; xmlns:diffgr=&amp;quot;urn:schemas-microsoft-com:xml-diffgram-v1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;NewDataSet xmlns=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;Table diffgr:id=&amp;quot;Table1&amp;quot; msdata:rowOrder=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;Legajo&amp;gt;123456&amp;lt;/legajo&amp;gt;&lt;br /&gt;
				&amp;lt;Nombre&amp;gt;Mickey&amp;lt;/Nombre&amp;gt;&lt;br /&gt;
				&amp;lt;Apellido&amp;gt;Mouse&amp;lt;/Apellido&amp;gt;&lt;br /&gt;
			&amp;lt;/Table&amp;gt;&lt;br /&gt;
		...&lt;br /&gt;
		&amp;lt;/NewDataSet&amp;gt;&lt;br /&gt;
	&amp;lt;/diffgr:diffgram&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== Problema == &lt;br /&gt;
Si queremos consumir el WSDL desde un cliente java, al quere mapear el WSDL (por ejemplo con jaxb) nos dará el siguiente error:&lt;br /&gt;
[ERROR] undefined element declaration 's:schema'&lt;br /&gt;
&lt;br /&gt;
=== Explicación ===&lt;br /&gt;
Observando el WSDL, podemos ver que al generar la clase que representan a la respuesta de la operación (BuscarAlumnoResponse), jaxb desconoce como resolver&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;s:element ref=&amp;quot;s:schema&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;s:any /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Lo que nos esta diciendo el WSDL es que la operación buscarAlumno, tiene como respuesta un elemento schema y cualquier tipo de objeto como respuesta. &lt;br /&gt;
Como vemos en el contrato del servicio, no esta definido realmente el tipo de respuesta (no lo sabemos hasta el momento de ejecutar la operación) lo que nos dificulta la creación del cliente.&lt;br /&gt;
&lt;br /&gt;
=== Solución ===&lt;br /&gt;
Una posible solución es utilizar un [[AquaLogic| Aqualogic Service Bus]], para consumir el webservice y exponerlo en un contrato amigable.&lt;br /&gt;
&lt;br /&gt;
En el Aqualogic, generaremos un proyecto en el cual business sea consumidor del webservice .NET y el proxy es en contrato que expondremos a los clientes Java, para esto último utilizaremos un XSLT para transformar la respuesta del webservice.&lt;br /&gt;
&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
==== 1. Definir el nuevo contrato de la operación a exponer ==== &lt;br /&gt;
En nuestro caso solo modificaremos la respuesta de la operación:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;s:element name=&amp;quot;BuscarAlumnoResponse&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
    &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;s:element minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;1&amp;quot; name=&amp;quot;BuscarAlumnoResult&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;s:complexType&amp;gt;&lt;br /&gt;
          &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
	    &amp;lt;s:element name=&amp;quot;alumnos&amp;quot; type=&amp;quot;tns:Alumno&amp;quot; minOccurs=&amp;quot;0&amp;quot; maxOccurs=&amp;quot;unbounded&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;/s:element&amp;gt;&lt;br /&gt;
    &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
  &amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
&amp;lt;/s:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s:complexType name=&amp;quot;Alumno&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;s:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;legajo&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;nombre&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;s:element name=&amp;quot;apellido&amp;quot; type=&amp;quot;s:string&amp;quot; minOccurs=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/s:sequence&amp;gt;&lt;br /&gt;
&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 2. Generar un XSLT ====&lt;br /&gt;
Generaremos un XSLT para transformar la respuesta del servicio .NET al nuevo WSDL que expondremos:&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;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; xmlns:dosideas=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;*&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:for-each select=&amp;quot;current()/*/*[2]/*&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:element name=&amp;quot;dosideas:BuscarAlumnoResult&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;xsl:element name=&amp;quot;dosideas:alumnos&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;xsl:for-each select=&amp;quot;current()/*&amp;quot;&amp;gt;&lt;br /&gt;
                            &amp;lt;xsl:element name=&amp;quot;dosideas:{local-name()}&amp;quot; namespace=&amp;quot;http://dosideas.com/dataset&amp;quot;&amp;gt;&lt;br /&gt;
                                &amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;
                            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
                    &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
                &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
            &amp;lt;/xsl:element&amp;gt;&lt;br /&gt;
        &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== 3. Exponer el servicio en el Aqualogic Service Bus ====&lt;br /&gt;
Con los WSDL y XSLT generados, realizaremos los siguientes pasos:&lt;br /&gt;
3.1 Subir el WSDL del servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.2 Subir el nuevo WSDL del servicio.&lt;br /&gt;
&lt;br /&gt;
3.3 Subir el XSLT para transformar la respuesta.&lt;br /&gt;
&lt;br /&gt;
3.4 Crear un Business Service para consumir el servicio .NET&lt;br /&gt;
&lt;br /&gt;
3.5 Crear un Proxy Service que consuma el Business Service y exponga el resultado según el nuevo contrato.&lt;br /&gt;
&lt;br /&gt;
3.6 Configurar el Proxy Service (Message Flow) para modificar la respuesta del Business Service.&lt;br /&gt;
&lt;br /&gt;
*3.6.1 Editar el Route que apunta al Business Service creado y en el Response Action, agregamos una acción de replace, donde:&lt;br /&gt;
'''XPath:''' //dosideas:BuscarAlumnoResponse&lt;br /&gt;
'''Expression:''' &amp;lt;EL XSLT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3.6.2 Al Proxy, agregarle un PipelinePair, con un Stage en el Response.&lt;br /&gt;
*3.6.3 En el Stage del Response:&lt;br /&gt;
**'''XPath:''' . (El carácter punto)&lt;br /&gt;
**'''Variable:''' body&lt;br /&gt;
**'''Expression:''' $body&lt;br /&gt;
**'''Replace entire node'''&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[AquaLogic]]&lt;br /&gt;
* [http://www.bea.com/aqualogic/ Web oficial de AquaLogic]&lt;br /&gt;
* [[Spring Web Services]]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=AquaLogic&amp;diff=6628</id>
		<title>AquaLogic</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=AquaLogic&amp;diff=6628"/>
				<updated>2012-06-22T12:22:09Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:AquaLogic]]&lt;br /&gt;
AquaLogic es una suite de software de BEA Systems, orientada a administrar una Arquitectura Orientada a Servicios (SOA). &lt;br /&gt;
&lt;br /&gt;
AquaLogic incluye los siguientes productos: &lt;br /&gt;
* AquaLogic [[BPM]]: herramientas para la Administración de Procesos de Negocios (BPM). &lt;br /&gt;
* Aqualogic User Interaction: herramientas para la creación de portales, comunidades colaborativas, aplicaciones compuestas, y otras aplicaciones que usan una arquitectura de servicios. &lt;br /&gt;
* AquaLogic Enterprise Repository, administra los meta-datos de cualquier software, como procesos de negocio, [[Web Service]], patrones, frameworks, aplicaciones y componentes. Muestra las relaciones e interdependencias entre ellos. &lt;br /&gt;
* AquaLogic Service Bus (actualmente conocido como Oracle Service Bus), es un Enterprise Service Bus (ESB). Permite la interacción entre servicios, transformaciones y más.&lt;br /&gt;
* AquaLogic Data Services Platform, brinda herramientas para crear y administrar distintos servicios de datos. Utiliza el lenguaje [[XQuery]] para componer datos y transformarlos entre varios orígenes de datos, incluyendo [[Base De Datos]] relaciones y [[Web Service]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[WebLogic]]&lt;br /&gt;
* [[Colas De Mensajes Con AquaLogic]]&lt;br /&gt;
* [[Consumir Web Service .NET con clientes Java mediante Aqualogic]]&lt;br /&gt;
* [http://www.bea.com/aqualogic/ Web oficial de AquaLogic]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=6468</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=6468"/>
				<updated>2012-01-06T11:58:24Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Creamos la conexión al FDI */&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;
&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;
===Pasaje de Parametros===&lt;br /&gt;
&lt;br /&gt;
Para pasar parámetros al proceso desde una actividad de creación (aquellas que dan inicio al proceso) que tenga asociada un ScreenFlow, hay que seguir los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
El primer paso es decirle al proceso que va a recibir parametros de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la tarea &amp;quot;begin&amp;quot; y luego en &amp;quot;Argument Mapping&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 1.jpg]]&lt;br /&gt;
* Click en el botón que parece una flecha violeta hacia abajo y ahí agregamos el nombre del parametro que va a recibir. Es recomendable utilizar nombres descriptivos ya que sino se puede volver bastante confuso.&lt;br /&gt;
[[Archivo:Imagen 2.jpg]]&lt;br /&gt;
* Ahora lo único que falta es mapear el parámetro a una variable del proceso (puede ser creada en la misma pantalla haciendo click sobre el botón que está al lado del de crear parametros)&lt;br /&gt;
[[Archivo:Imagen 3.jpg]]&lt;br /&gt;
&lt;br /&gt;
El segundo paso es realizar un proceso similar al primer paso, con la diferencia que debe hacerce en la tarea &amp;quot;end&amp;quot; del ScreenFlow asociado a la actividad de creación.&lt;br /&gt;
&lt;br /&gt;
El tercer paso es mapear las salidas del ScreenFlow con las Entradas del proceso de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la actividad que tiene asociada el ScreenFlow, luego en &amp;quot;Argument Mapping&amp;quot; y luego en la barra de la izquiera seleccionar &amp;quot;NombreDelScreenFlow Out&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 4.jpg]]&lt;br /&gt;
* Luego solo basta con mapear los argumentos, seleccionando los nombres&lt;br /&gt;
[[Archivo:Imagen 5.jpg]]&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;
Si queremos obtener el mensaje de la excepción, podemos utilizar la variable predefinida por BPM '''lastException''' en la cual se guarda la ultima excepción ocurrida en la instancia.&lt;br /&gt;
&lt;br /&gt;
===Creación de Instancias mediante PBL===&lt;br /&gt;
Para crear instancias de procesos mediante PBL se utiliza el siguiente código:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Creando la instancia ConsumidorProceso&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
String mensaje = &amp;quot;Este es un mensaje creado por el productor a las &amp;quot; + 'now';&lt;br /&gt;
ProcessInstance.create(processId : ProcessInstance.organization + &amp;quot;/&amp;quot; + ProcessInstance.organizationalUnit + &amp;quot;/ConsumidorProceso&amp;quot;, &lt;br /&gt;
                       arguments : { &amp;quot;mensaje_InArgument&amp;quot; : mensaje }, argumentsSetName : &amp;quot;BeginIn&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Donde:&lt;br /&gt;
* '''processId''' es el identificador (no el nombre) del proceso que queremos crear, en nuestro caso vamos a crear el proceso &amp;quot;ConsumidorProceso&amp;quot;.&lt;br /&gt;
* '''arguments''' es el array de argumentos de entrada que se definio en el proceso.&lt;br /&gt;
&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn:&lt;br /&gt;
[https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/CrearInstanciaConPBL.fpr.exp Crear Instancia mediante PBL]&lt;br /&gt;
&lt;br /&gt;
===Manipulación de Instancias mediante PAPI===&lt;br /&gt;
Aqualogic BPM 5.7, provee una API para trabajar con el FDI. Esta API se la conoce como PAPI.&lt;br /&gt;
Una de las cosas que nos permite realizar es obtener una instancia de BPM y manipular dicha instancia.&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn: [https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/ManipularInstancias.fpr.exp Manipular instancia por FDI].&lt;br /&gt;
&lt;br /&gt;
A continuación tenemos un ejemplo de como abortar una instancia:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Cerrando instancia con nombre  [&amp;quot; + identificador + &amp;quot;]&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
ProcessService processService = ProcessService();&lt;br /&gt;
try {&lt;br /&gt;
    processService.connectTo(url : Fuego.Server.directoryURL, user : &amp;quot;tester&amp;quot;, password : &amp;quot;tester&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    Instance[] instances = {  };&lt;br /&gt;
    InstanceFilter instanciaFilter = InstanceFilter();&lt;br /&gt;
    instanciaFilter.create(processService : processService);&lt;br /&gt;
&lt;br /&gt;
    SearchScope searchScope = SearchScope(participantScope : ParticipantScope.ALL, &lt;br /&gt;
                                          statusScope : StatusScope.ONLY_INPROCESS);&lt;br /&gt;
instanciaFilter.searchScope = searchScope;&lt;br /&gt;
    instanciaFilter.addAttributeTo(variable : &amp;quot;identificador&amp;quot;, comparator : Comparison.IS, &lt;br /&gt;
                                   value : unaVariable);&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    instances = processService.getInstancesByFilter(filter : instanciaFilter);&lt;br /&gt;
&lt;br /&gt;
    foreach (unaInstancia in instances) {&lt;br /&gt;
        logMessage(&amp;quot;DOS_IDEAS: Cerrando: &amp;quot; + unaInstancia, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
        unaInstancia.abort();&lt;br /&gt;
&lt;br /&gt;
        logMessage(&amp;quot;DOS_IDEAS: Instancia cerrada exitosamente&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
catch (Java.Lang.Exception ex) {&lt;br /&gt;
    logMessage(&amp;quot;DOS_IDEAS: Error al abortar instancia [&amp;quot; + identificador + &amp;quot;]: &amp;quot; + ex.message, severity : Severity.DEBUG);&lt;br /&gt;
}&lt;br /&gt;
finally {&lt;br /&gt;
    processService.disconnectFrom();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creamos la conexión al FDI====&lt;br /&gt;
Se debe proveer un usuario y password existente en la aplicación y '''que tenga los permisos para poder manipular la instancia'''. Si el usuario no posee permisos para manipular la instancia, al realizar la busqueda posiblemente no tenga visibilidad de la instancia.&lt;br /&gt;
En caso de que se este utilizando el Studio, el password es el mismo que el user.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
ProcessService processService = ProcessService();&lt;br /&gt;
processService.connectTo(url : Fuego.Server.directoryURL, user : &amp;quot;tester&amp;quot;, password : &amp;quot;tester&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
La conexión debe ser finalizada mediante el método disconnectFrom&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
processService.disconnectFrom();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creamos el filtro====&lt;br /&gt;
Crea un filtro para buscar las instancias en el FDI.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    InstanceFilter instanciaFilter = InstanceFilter();&lt;br /&gt;
    instanciaFilter.create(processService : processService);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos al filtro, la condición de que obtenga la instancia de todos los participantes y que se encuentren en proceso.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
   SearchScope searchScope = SearchScope(participantScope : ParticipantScope.ALL, &lt;br /&gt;
                                          statusScope : StatusScope.ONLY_INPROCESS);&lt;br /&gt;
instanciaFilter.searchScope = searchScope;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
El alcance de los participantes pueden ser:&lt;br /&gt;
* '''ALL''': todos los participantes.&lt;br /&gt;
* '''ALL_IN_ROLE''': todas las instancias del rol.&lt;br /&gt;
* '''PARTICIPANT''': todas las instancias del participante.&lt;br /&gt;
* '''PARTICIPANT_ROLE''': todas las intancias de los roles del participante.&lt;br /&gt;
&lt;br /&gt;
Agregamos un filtro, para que filtre las instancia cuya '''variable externa''' identificador tenga el valor de unaVariable &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 instanciaFilter.addAttributeTo(variable : &amp;quot;identificador&amp;quot;, comparator : Comparison.IS, value : unaVariable);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Obtenemos las instancias====&lt;br /&gt;
Obtenemos el listado de instancia que concuerdan con el filtro instanciaFilter&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Instance[] instances = processService.getInstancesByFilter(filter : instanciaFilter);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Manipulamos las instancias obtenidas====&lt;br /&gt;
Recorremos la lista de instancias obtenidas y en nuestro caso las abortamos.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
   foreach (unaInstancia in instances) {&lt;br /&gt;
          unaInstancia.abort();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Las posibles acciones que podemos realizar sobre una instancia son:&lt;br /&gt;
* '''abort''': Cancela la instancia.&lt;br /&gt;
* '''suspend''': Suspende la instancia.&lt;br /&gt;
* '''select''': Selecciona la instancia.&lt;br /&gt;
* '''reasign''': Reasigna la instancia a un participante.&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>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=6461</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=6461"/>
				<updated>2011-12-26T18:25:54Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Tratamiento de excepciones de servicios externos */&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;
&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;
===Pasaje de Parametros===&lt;br /&gt;
&lt;br /&gt;
Para pasar parámetros al proceso desde una actividad de creación (aquellas que dan inicio al proceso) que tenga asociada un ScreenFlow, hay que seguir los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
El primer paso es decirle al proceso que va a recibir parametros de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la tarea &amp;quot;begin&amp;quot; y luego en &amp;quot;Argument Mapping&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 1.jpg]]&lt;br /&gt;
* Click en el botón que parece una flecha violeta hacia abajo y ahí agregamos el nombre del parametro que va a recibir. Es recomendable utilizar nombres descriptivos ya que sino se puede volver bastante confuso.&lt;br /&gt;
[[Archivo:Imagen 2.jpg]]&lt;br /&gt;
* Ahora lo único que falta es mapear el parámetro a una variable del proceso (puede ser creada en la misma pantalla haciendo click sobre el botón que está al lado del de crear parametros)&lt;br /&gt;
[[Archivo:Imagen 3.jpg]]&lt;br /&gt;
&lt;br /&gt;
El segundo paso es realizar un proceso similar al primer paso, con la diferencia que debe hacerce en la tarea &amp;quot;end&amp;quot; del ScreenFlow asociado a la actividad de creación.&lt;br /&gt;
&lt;br /&gt;
El tercer paso es mapear las salidas del ScreenFlow con las Entradas del proceso de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la actividad que tiene asociada el ScreenFlow, luego en &amp;quot;Argument Mapping&amp;quot; y luego en la barra de la izquiera seleccionar &amp;quot;NombreDelScreenFlow Out&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 4.jpg]]&lt;br /&gt;
* Luego solo basta con mapear los argumentos, seleccionando los nombres&lt;br /&gt;
[[Archivo:Imagen 5.jpg]]&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;
Si queremos obtener el mensaje de la excepción, podemos utilizar la variable predefinida por BPM '''lastException''' en la cual se guarda la ultima excepción ocurrida en la instancia.&lt;br /&gt;
&lt;br /&gt;
===Creación de Instancias mediante PBL===&lt;br /&gt;
Para crear instancias de procesos mediante PBL se utiliza el siguiente código:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Creando la instancia ConsumidorProceso&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
String mensaje = &amp;quot;Este es un mensaje creado por el productor a las &amp;quot; + 'now';&lt;br /&gt;
ProcessInstance.create(processId : ProcessInstance.organization + &amp;quot;/&amp;quot; + ProcessInstance.organizationalUnit + &amp;quot;/ConsumidorProceso&amp;quot;, &lt;br /&gt;
                       arguments : { &amp;quot;mensaje_InArgument&amp;quot; : mensaje }, argumentsSetName : &amp;quot;BeginIn&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Donde:&lt;br /&gt;
* '''processId''' es el identificador (no el nombre) del proceso que queremos crear, en nuestro caso vamos a crear el proceso &amp;quot;ConsumidorProceso&amp;quot;.&lt;br /&gt;
* '''arguments''' es el array de argumentos de entrada que se definio en el proceso.&lt;br /&gt;
&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn:&lt;br /&gt;
[https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/CrearInstanciaConPBL.fpr.exp Crear Instancia mediante PBL]&lt;br /&gt;
&lt;br /&gt;
===Manipulación de Instancias mediante PAPI===&lt;br /&gt;
Aqualogic BPM 5.7, provee una API para trabajar con el FDI. Esta API se la conoce como PAPI.&lt;br /&gt;
Una de las cosas que nos permite realizar es obtener una instancia de BPM y manipular dicha instancia.&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn: [https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/ManipularInstancias.fpr.exp Manipular instancia por FDI].&lt;br /&gt;
&lt;br /&gt;
A continuación tenemos un ejemplo de como abortar una instancia:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Cerrando instancia con nombre  [&amp;quot; + identificador + &amp;quot;]&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
ProcessService processService = ProcessService();&lt;br /&gt;
try {&lt;br /&gt;
    processService.connectTo(url : Fuego.Server.directoryURL, user : &amp;quot;tester&amp;quot;, password : &amp;quot;tester&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    Instance[] instances = {  };&lt;br /&gt;
    InstanceFilter instanciaFilter = InstanceFilter();&lt;br /&gt;
    instanciaFilter.create(processService : processService);&lt;br /&gt;
&lt;br /&gt;
    SearchScope searchScope = SearchScope(participantScope : ParticipantScope.ALL, &lt;br /&gt;
                                          statusScope : StatusScope.ONLY_INPROCESS);&lt;br /&gt;
instanciaFilter.searchScope = searchScope;&lt;br /&gt;
    instanciaFilter.addAttributeTo(variable : &amp;quot;identificador&amp;quot;, comparator : Comparison.IS, &lt;br /&gt;
                                   value : unaVariable);&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    instances = processService.getInstancesByFilter(filter : instanciaFilter);&lt;br /&gt;
&lt;br /&gt;
    foreach (unaInstancia in instances) {&lt;br /&gt;
        logMessage(&amp;quot;DOS_IDEAS: Cerrando: &amp;quot; + unaInstancia, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
        unaInstancia.abort();&lt;br /&gt;
&lt;br /&gt;
        logMessage(&amp;quot;DOS_IDEAS: Instancia cerrada exitosamente&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
catch (Java.Lang.Exception ex) {&lt;br /&gt;
    logMessage(&amp;quot;DOS_IDEAS: Error al abortar instancia [&amp;quot; + identificador + &amp;quot;]: &amp;quot; + ex.message, severity : Severity.DEBUG);&lt;br /&gt;
}&lt;br /&gt;
finally {&lt;br /&gt;
    processService.disconnectFrom();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creamos la conexión al FDI====&lt;br /&gt;
Se debe provee un usuario y password existente en la aplicación y que tenga los permisos para poder manipular la instancia.&lt;br /&gt;
En caso de que se este utilizando el Studio, el password es el mismo que el user.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
ProcessService processService = ProcessService();&lt;br /&gt;
processService.connectTo(url : Fuego.Server.directoryURL, user : &amp;quot;tester&amp;quot;, password : &amp;quot;tester&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
La conexión debe ser finalizada mediante el método disconnectFrom&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
processService.disconnectFrom();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creamos el filtro====&lt;br /&gt;
Crea un filtro para buscar las instancias en el FDI.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    InstanceFilter instanciaFilter = InstanceFilter();&lt;br /&gt;
    instanciaFilter.create(processService : processService);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos al filtro, la condición de que obtenga la instancia de todos los participantes y que se encuentren en proceso.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
   SearchScope searchScope = SearchScope(participantScope : ParticipantScope.ALL, &lt;br /&gt;
                                          statusScope : StatusScope.ONLY_INPROCESS);&lt;br /&gt;
instanciaFilter.searchScope = searchScope;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
El alcance de los participantes pueden ser:&lt;br /&gt;
* '''ALL''': todos los participantes.&lt;br /&gt;
* '''ALL_IN_ROLE''': todas las instancias del rol.&lt;br /&gt;
* '''PARTICIPANT''': todas las instancias del participante.&lt;br /&gt;
* '''PARTICIPANT_ROLE''': todas las intancias de los roles del participante.&lt;br /&gt;
&lt;br /&gt;
Agregamos un filtro, para que filtre las instancia cuya '''variable externa''' identificador tenga el valor de unaVariable &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 instanciaFilter.addAttributeTo(variable : &amp;quot;identificador&amp;quot;, comparator : Comparison.IS, value : unaVariable);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Obtenemos las instancias====&lt;br /&gt;
Obtenemos el listado de instancia que concuerdan con el filtro instanciaFilter&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Instance[] instances = processService.getInstancesByFilter(filter : instanciaFilter);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Manipulamos las instancias obtenidas====&lt;br /&gt;
Recorremos la lista de instancias obtenidas y en nuestro caso las abortamos.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
   foreach (unaInstancia in instances) {&lt;br /&gt;
          unaInstancia.abort();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Las posibles acciones que podemos realizar sobre una instancia son:&lt;br /&gt;
* '''abort''': Cancela la instancia.&lt;br /&gt;
* '''suspend''': Suspende la instancia.&lt;br /&gt;
* '''select''': Selecciona la instancia.&lt;br /&gt;
* '''reasign''': Reasigna la instancia a un participante.&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>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=6460</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=6460"/>
				<updated>2011-12-26T18:11:31Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Manipulación de Instancias mediante PAPI */&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;
&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;
===Pasaje de Parametros===&lt;br /&gt;
&lt;br /&gt;
Para pasar parámetros al proceso desde una actividad de creación (aquellas que dan inicio al proceso) que tenga asociada un ScreenFlow, hay que seguir los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
El primer paso es decirle al proceso que va a recibir parametros de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la tarea &amp;quot;begin&amp;quot; y luego en &amp;quot;Argument Mapping&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 1.jpg]]&lt;br /&gt;
* Click en el botón que parece una flecha violeta hacia abajo y ahí agregamos el nombre del parametro que va a recibir. Es recomendable utilizar nombres descriptivos ya que sino se puede volver bastante confuso.&lt;br /&gt;
[[Archivo:Imagen 2.jpg]]&lt;br /&gt;
* Ahora lo único que falta es mapear el parámetro a una variable del proceso (puede ser creada en la misma pantalla haciendo click sobre el botón que está al lado del de crear parametros)&lt;br /&gt;
[[Archivo:Imagen 3.jpg]]&lt;br /&gt;
&lt;br /&gt;
El segundo paso es realizar un proceso similar al primer paso, con la diferencia que debe hacerce en la tarea &amp;quot;end&amp;quot; del ScreenFlow asociado a la actividad de creación.&lt;br /&gt;
&lt;br /&gt;
El tercer paso es mapear las salidas del ScreenFlow con las Entradas del proceso de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la actividad que tiene asociada el ScreenFlow, luego en &amp;quot;Argument Mapping&amp;quot; y luego en la barra de la izquiera seleccionar &amp;quot;NombreDelScreenFlow Out&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 4.jpg]]&lt;br /&gt;
* Luego solo basta con mapear los argumentos, seleccionando los nombres&lt;br /&gt;
[[Archivo:Imagen 5.jpg]]&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;
===Creación de Instancias mediante PBL===&lt;br /&gt;
Para crear instancias de procesos mediante PBL se utiliza el siguiente código:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Creando la instancia ConsumidorProceso&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
String mensaje = &amp;quot;Este es un mensaje creado por el productor a las &amp;quot; + 'now';&lt;br /&gt;
ProcessInstance.create(processId : ProcessInstance.organization + &amp;quot;/&amp;quot; + ProcessInstance.organizationalUnit + &amp;quot;/ConsumidorProceso&amp;quot;, &lt;br /&gt;
                       arguments : { &amp;quot;mensaje_InArgument&amp;quot; : mensaje }, argumentsSetName : &amp;quot;BeginIn&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Donde:&lt;br /&gt;
* '''processId''' es el identificador (no el nombre) del proceso que queremos crear, en nuestro caso vamos a crear el proceso &amp;quot;ConsumidorProceso&amp;quot;.&lt;br /&gt;
* '''arguments''' es el array de argumentos de entrada que se definio en el proceso.&lt;br /&gt;
&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn:&lt;br /&gt;
[https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/CrearInstanciaConPBL.fpr.exp Crear Instancia mediante PBL]&lt;br /&gt;
&lt;br /&gt;
===Manipulación de Instancias mediante PAPI===&lt;br /&gt;
Aqualogic BPM 5.7, provee una API para trabajar con el FDI. Esta API se la conoce como PAPI.&lt;br /&gt;
Una de las cosas que nos permite realizar es obtener una instancia de BPM y manipular dicha instancia.&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn: [https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/ManipularInstancias.fpr.exp Manipular instancia por FDI].&lt;br /&gt;
&lt;br /&gt;
A continuación tenemos un ejemplo de como abortar una instancia:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Cerrando instancia con nombre  [&amp;quot; + identificador + &amp;quot;]&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
ProcessService processService = ProcessService();&lt;br /&gt;
try {&lt;br /&gt;
    processService.connectTo(url : Fuego.Server.directoryURL, user : &amp;quot;tester&amp;quot;, password : &amp;quot;tester&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    Instance[] instances = {  };&lt;br /&gt;
    InstanceFilter instanciaFilter = InstanceFilter();&lt;br /&gt;
    instanciaFilter.create(processService : processService);&lt;br /&gt;
&lt;br /&gt;
    SearchScope searchScope = SearchScope(participantScope : ParticipantScope.ALL, &lt;br /&gt;
                                          statusScope : StatusScope.ONLY_INPROCESS);&lt;br /&gt;
instanciaFilter.searchScope = searchScope;&lt;br /&gt;
    instanciaFilter.addAttributeTo(variable : &amp;quot;identificador&amp;quot;, comparator : Comparison.IS, &lt;br /&gt;
                                   value : unaVariable);&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    instances = processService.getInstancesByFilter(filter : instanciaFilter);&lt;br /&gt;
&lt;br /&gt;
    foreach (unaInstancia in instances) {&lt;br /&gt;
        logMessage(&amp;quot;DOS_IDEAS: Cerrando: &amp;quot; + unaInstancia, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
        unaInstancia.abort();&lt;br /&gt;
&lt;br /&gt;
        logMessage(&amp;quot;DOS_IDEAS: Instancia cerrada exitosamente&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
catch (Java.Lang.Exception ex) {&lt;br /&gt;
    logMessage(&amp;quot;DOS_IDEAS: Error al abortar instancia [&amp;quot; + identificador + &amp;quot;]: &amp;quot; + ex.message, severity : Severity.DEBUG);&lt;br /&gt;
}&lt;br /&gt;
finally {&lt;br /&gt;
    processService.disconnectFrom();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creamos la conexión al FDI====&lt;br /&gt;
Se debe provee un usuario y password existente en la aplicación y que tenga los permisos para poder manipular la instancia.&lt;br /&gt;
En caso de que se este utilizando el Studio, el password es el mismo que el user.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
ProcessService processService = ProcessService();&lt;br /&gt;
processService.connectTo(url : Fuego.Server.directoryURL, user : &amp;quot;tester&amp;quot;, password : &amp;quot;tester&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
La conexión debe ser finalizada mediante el método disconnectFrom&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
processService.disconnectFrom();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creamos el filtro====&lt;br /&gt;
Crea un filtro para buscar las instancias en el FDI.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    InstanceFilter instanciaFilter = InstanceFilter();&lt;br /&gt;
    instanciaFilter.create(processService : processService);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos al filtro, la condición de que obtenga la instancia de todos los participantes y que se encuentren en proceso.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
   SearchScope searchScope = SearchScope(participantScope : ParticipantScope.ALL, &lt;br /&gt;
                                          statusScope : StatusScope.ONLY_INPROCESS);&lt;br /&gt;
instanciaFilter.searchScope = searchScope;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
El alcance de los participantes pueden ser:&lt;br /&gt;
* '''ALL''': todos los participantes.&lt;br /&gt;
* '''ALL_IN_ROLE''': todas las instancias del rol.&lt;br /&gt;
* '''PARTICIPANT''': todas las instancias del participante.&lt;br /&gt;
* '''PARTICIPANT_ROLE''': todas las intancias de los roles del participante.&lt;br /&gt;
&lt;br /&gt;
Agregamos un filtro, para que filtre las instancia cuya '''variable externa''' identificador tenga el valor de unaVariable &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 instanciaFilter.addAttributeTo(variable : &amp;quot;identificador&amp;quot;, comparator : Comparison.IS, value : unaVariable);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Obtenemos las instancias====&lt;br /&gt;
Obtenemos el listado de instancia que concuerdan con el filtro instanciaFilter&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Instance[] instances = processService.getInstancesByFilter(filter : instanciaFilter);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Manipulamos las instancias obtenidas====&lt;br /&gt;
Recorremos la lista de instancias obtenidas y en nuestro caso las abortamos.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
   foreach (unaInstancia in instances) {&lt;br /&gt;
          unaInstancia.abort();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Las posibles acciones que podemos realizar sobre una instancia son:&lt;br /&gt;
* '''abort''': Cancela la instancia.&lt;br /&gt;
* '''suspend''': Suspende la instancia.&lt;br /&gt;
* '''select''': Selecciona la instancia.&lt;br /&gt;
* '''reasign''': Reasigna la instancia a un participante.&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>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=6459</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=6459"/>
				<updated>2011-12-26T18:10:46Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Manipulación de Instancias mediante PAPI */&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;
&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;
===Pasaje de Parametros===&lt;br /&gt;
&lt;br /&gt;
Para pasar parámetros al proceso desde una actividad de creación (aquellas que dan inicio al proceso) que tenga asociada un ScreenFlow, hay que seguir los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
El primer paso es decirle al proceso que va a recibir parametros de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la tarea &amp;quot;begin&amp;quot; y luego en &amp;quot;Argument Mapping&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 1.jpg]]&lt;br /&gt;
* Click en el botón que parece una flecha violeta hacia abajo y ahí agregamos el nombre del parametro que va a recibir. Es recomendable utilizar nombres descriptivos ya que sino se puede volver bastante confuso.&lt;br /&gt;
[[Archivo:Imagen 2.jpg]]&lt;br /&gt;
* Ahora lo único que falta es mapear el parámetro a una variable del proceso (puede ser creada en la misma pantalla haciendo click sobre el botón que está al lado del de crear parametros)&lt;br /&gt;
[[Archivo:Imagen 3.jpg]]&lt;br /&gt;
&lt;br /&gt;
El segundo paso es realizar un proceso similar al primer paso, con la diferencia que debe hacerce en la tarea &amp;quot;end&amp;quot; del ScreenFlow asociado a la actividad de creación.&lt;br /&gt;
&lt;br /&gt;
El tercer paso es mapear las salidas del ScreenFlow con las Entradas del proceso de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la actividad que tiene asociada el ScreenFlow, luego en &amp;quot;Argument Mapping&amp;quot; y luego en la barra de la izquiera seleccionar &amp;quot;NombreDelScreenFlow Out&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 4.jpg]]&lt;br /&gt;
* Luego solo basta con mapear los argumentos, seleccionando los nombres&lt;br /&gt;
[[Archivo:Imagen 5.jpg]]&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;
===Creación de Instancias mediante PBL===&lt;br /&gt;
Para crear instancias de procesos mediante PBL se utiliza el siguiente código:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Creando la instancia ConsumidorProceso&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
String mensaje = &amp;quot;Este es un mensaje creado por el productor a las &amp;quot; + 'now';&lt;br /&gt;
ProcessInstance.create(processId : ProcessInstance.organization + &amp;quot;/&amp;quot; + ProcessInstance.organizationalUnit + &amp;quot;/ConsumidorProceso&amp;quot;, &lt;br /&gt;
                       arguments : { &amp;quot;mensaje_InArgument&amp;quot; : mensaje }, argumentsSetName : &amp;quot;BeginIn&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Donde:&lt;br /&gt;
* '''processId''' es el identificador (no el nombre) del proceso que queremos crear, en nuestro caso vamos a crear el proceso &amp;quot;ConsumidorProceso&amp;quot;.&lt;br /&gt;
* '''arguments''' es el array de argumentos de entrada que se definio en el proceso.&lt;br /&gt;
&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn:&lt;br /&gt;
[https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/CrearInstanciaConPBL.fpr.exp Crear Instancia mediante PBL]&lt;br /&gt;
&lt;br /&gt;
===Manipulación de Instancias mediante PAPI===&lt;br /&gt;
Aqualogic BPM 5.7, provee una API para trabajar con el FDI. Esta API se la conoce como PAPI.&lt;br /&gt;
Una de las cosas que nos permite realizar es obtener una instancia de BPM y manipular dicha instancia.&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn: [https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/ManipularInstancias.fpr.exp Ejemplo para manipular instancia por FDI]&lt;br /&gt;
A continuación tenemos un ejemplo de como abortar una instancia:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Cerrando instancia con nombre  [&amp;quot; + identificador + &amp;quot;]&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
ProcessService processService = ProcessService();&lt;br /&gt;
try {&lt;br /&gt;
    processService.connectTo(url : Fuego.Server.directoryURL, user : &amp;quot;tester&amp;quot;, password : &amp;quot;tester&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    Instance[] instances = {  };&lt;br /&gt;
    InstanceFilter instanciaFilter = InstanceFilter();&lt;br /&gt;
    instanciaFilter.create(processService : processService);&lt;br /&gt;
&lt;br /&gt;
    SearchScope searchScope = SearchScope(participantScope : ParticipantScope.ALL, &lt;br /&gt;
                                          statusScope : StatusScope.ONLY_INPROCESS);&lt;br /&gt;
instanciaFilter.searchScope = searchScope;&lt;br /&gt;
    instanciaFilter.addAttributeTo(variable : &amp;quot;identificador&amp;quot;, comparator : Comparison.IS, &lt;br /&gt;
                                   value : unaVariable);&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    instances = processService.getInstancesByFilter(filter : instanciaFilter);&lt;br /&gt;
&lt;br /&gt;
    foreach (unaInstancia in instances) {&lt;br /&gt;
        logMessage(&amp;quot;DOS_IDEAS: Cerrando: &amp;quot; + unaInstancia, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
        unaInstancia.abort();&lt;br /&gt;
&lt;br /&gt;
        logMessage(&amp;quot;DOS_IDEAS: Instancia cerrada exitosamente&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
catch (Java.Lang.Exception ex) {&lt;br /&gt;
    logMessage(&amp;quot;DOS_IDEAS: Error al abortar instancia [&amp;quot; + identificador + &amp;quot;]: &amp;quot; + ex.message, severity : Severity.DEBUG);&lt;br /&gt;
}&lt;br /&gt;
finally {&lt;br /&gt;
    processService.disconnectFrom();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creamos la conexión al FDI====&lt;br /&gt;
Se debe provee un usuario y password existente en la aplicación y que tenga los permisos para poder manipular la instancia.&lt;br /&gt;
En caso de que se este utilizando el Studio, el password es el mismo que el user.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
ProcessService processService = ProcessService();&lt;br /&gt;
processService.connectTo(url : Fuego.Server.directoryURL, user : &amp;quot;tester&amp;quot;, password : &amp;quot;tester&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
La conexión debe ser finalizada mediante el método disconnectFrom&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
processService.disconnectFrom();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creamos el filtro====&lt;br /&gt;
Crea un filtro para buscar las instancias en el FDI.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    InstanceFilter instanciaFilter = InstanceFilter();&lt;br /&gt;
    instanciaFilter.create(processService : processService);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos al filtro, la condición de que obtenga la instancia de todos los participantes y que se encuentren en proceso.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
   SearchScope searchScope = SearchScope(participantScope : ParticipantScope.ALL, &lt;br /&gt;
                                          statusScope : StatusScope.ONLY_INPROCESS);&lt;br /&gt;
instanciaFilter.searchScope = searchScope;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
El alcance de los participantes pueden ser:&lt;br /&gt;
* '''ALL''': todos los participantes.&lt;br /&gt;
* '''ALL_IN_ROLE''': todas las instancias del rol.&lt;br /&gt;
* '''PARTICIPANT''': todas las instancias del participante.&lt;br /&gt;
* '''PARTICIPANT_ROLE''': todas las intancias de los roles del participante.&lt;br /&gt;
&lt;br /&gt;
Agregamos un filtro, para que filtre las instancia cuya '''variable externa''' identificador tenga el valor de unaVariable &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 instanciaFilter.addAttributeTo(variable : &amp;quot;identificador&amp;quot;, comparator : Comparison.IS, value : unaVariable);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Obtenemos las instancias====&lt;br /&gt;
Obtenemos el listado de instancia que concuerdan con el filtro instanciaFilter&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Instance[] instances = processService.getInstancesByFilter(filter : instanciaFilter);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Manipulamos las instancias obtenidas====&lt;br /&gt;
Recorremos la lista de instancias obtenidas y en nuestro caso las abortamos.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
   foreach (unaInstancia in instances) {&lt;br /&gt;
          unaInstancia.abort();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Las posibles acciones que podemos realizar sobre una instancia son:&lt;br /&gt;
* '''abort''': Cancela la instancia.&lt;br /&gt;
* '''suspend''': Suspende la instancia.&lt;br /&gt;
* '''select''': Selecciona la instancia.&lt;br /&gt;
* '''reasign''': Reasigna la instancia a un participante.&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>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=6458</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=6458"/>
				<updated>2011-12-26T18:06:30Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: &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;
&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;
===Pasaje de Parametros===&lt;br /&gt;
&lt;br /&gt;
Para pasar parámetros al proceso desde una actividad de creación (aquellas que dan inicio al proceso) que tenga asociada un ScreenFlow, hay que seguir los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
El primer paso es decirle al proceso que va a recibir parametros de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la tarea &amp;quot;begin&amp;quot; y luego en &amp;quot;Argument Mapping&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 1.jpg]]&lt;br /&gt;
* Click en el botón que parece una flecha violeta hacia abajo y ahí agregamos el nombre del parametro que va a recibir. Es recomendable utilizar nombres descriptivos ya que sino se puede volver bastante confuso.&lt;br /&gt;
[[Archivo:Imagen 2.jpg]]&lt;br /&gt;
* Ahora lo único que falta es mapear el parámetro a una variable del proceso (puede ser creada en la misma pantalla haciendo click sobre el botón que está al lado del de crear parametros)&lt;br /&gt;
[[Archivo:Imagen 3.jpg]]&lt;br /&gt;
&lt;br /&gt;
El segundo paso es realizar un proceso similar al primer paso, con la diferencia que debe hacerce en la tarea &amp;quot;end&amp;quot; del ScreenFlow asociado a la actividad de creación.&lt;br /&gt;
&lt;br /&gt;
El tercer paso es mapear las salidas del ScreenFlow con las Entradas del proceso de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la actividad que tiene asociada el ScreenFlow, luego en &amp;quot;Argument Mapping&amp;quot; y luego en la barra de la izquiera seleccionar &amp;quot;NombreDelScreenFlow Out&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 4.jpg]]&lt;br /&gt;
* Luego solo basta con mapear los argumentos, seleccionando los nombres&lt;br /&gt;
[[Archivo:Imagen 5.jpg]]&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;
===Creación de Instancias mediante PBL===&lt;br /&gt;
Para crear instancias de procesos mediante PBL se utiliza el siguiente código:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Creando la instancia ConsumidorProceso&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
String mensaje = &amp;quot;Este es un mensaje creado por el productor a las &amp;quot; + 'now';&lt;br /&gt;
ProcessInstance.create(processId : ProcessInstance.organization + &amp;quot;/&amp;quot; + ProcessInstance.organizationalUnit + &amp;quot;/ConsumidorProceso&amp;quot;, &lt;br /&gt;
                       arguments : { &amp;quot;mensaje_InArgument&amp;quot; : mensaje }, argumentsSetName : &amp;quot;BeginIn&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Donde:&lt;br /&gt;
* '''processId''' es el identificador (no el nombre) del proceso que queremos crear, en nuestro caso vamos a crear el proceso &amp;quot;ConsumidorProceso&amp;quot;.&lt;br /&gt;
* '''arguments''' es el array de argumentos de entrada que se definio en el proceso.&lt;br /&gt;
&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn:&lt;br /&gt;
[https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/CrearInstanciaConPBL.fpr.exp Crear Instancia mediante PBL]&lt;br /&gt;
&lt;br /&gt;
===Manipulación de Instancias mediante PAPI===&lt;br /&gt;
Aqualogic BPM 5.7, provee una API para trabajar con el FDI. Esta API se la conoce como PAPI.&lt;br /&gt;
Una de las cosas que nos permite realizar es obtener una instancia de BPM y manipular dicha instancia.&lt;br /&gt;
A continuación tenemos un ejemplo de como abortar una instancia:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Cerrando instancia con nombre  [&amp;quot; + identificador + &amp;quot;]&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
ProcessService processService = ProcessService();&lt;br /&gt;
try {&lt;br /&gt;
    processService.connectTo(url : Fuego.Server.directoryURL, user : &amp;quot;tester&amp;quot;, password : &amp;quot;tester&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    Instance[] instances = {  };&lt;br /&gt;
    InstanceFilter instanciaFilter = InstanceFilter();&lt;br /&gt;
    instanciaFilter.create(processService : processService);&lt;br /&gt;
&lt;br /&gt;
    SearchScope searchScope = SearchScope(participantScope : ParticipantScope.ALL, &lt;br /&gt;
                                          statusScope : StatusScope.ONLY_INPROCESS);&lt;br /&gt;
instanciaFilter.searchScope = searchScope;&lt;br /&gt;
    instanciaFilter.addAttributeTo(variable : &amp;quot;identificador&amp;quot;, comparator : Comparison.IS, &lt;br /&gt;
                                   value : unaVariable);&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    instances = processService.getInstancesByFilter(filter : instanciaFilter);&lt;br /&gt;
&lt;br /&gt;
    foreach (unaInstancia in instances) {&lt;br /&gt;
        logMessage(&amp;quot;DOS_IDEAS: Cerrando: &amp;quot; + unaInstancia, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
        unaInstancia.abort();&lt;br /&gt;
&lt;br /&gt;
        logMessage(&amp;quot;DOS_IDEAS: Instancia cerrada exitosamente&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
catch (Java.Lang.Exception ex) {&lt;br /&gt;
    logMessage(&amp;quot;DOS_IDEAS: Error al abortar instancia [&amp;quot; + identificador + &amp;quot;]: &amp;quot; + ex.message, severity : Severity.DEBUG);&lt;br /&gt;
}&lt;br /&gt;
finally {&lt;br /&gt;
    processService.disconnectFrom();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creamos la conexión al FDI====&lt;br /&gt;
Se debe provee un usuario y password existente en la aplicación y que tenga los permisos para poder manipular la instancia.&lt;br /&gt;
En caso de que se este utilizando el Studio, el password es el mismo que el user.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
ProcessService processService = ProcessService();&lt;br /&gt;
processService.connectTo(url : Fuego.Server.directoryURL, user : &amp;quot;tester&amp;quot;, password : &amp;quot;tester&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
La conexión debe ser finalizada mediante el método disconnectFrom&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
processService.disconnectFrom();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creamos el filtro====&lt;br /&gt;
Crea un filtro para buscar las instancias en el FDI.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    InstanceFilter instanciaFilter = InstanceFilter();&lt;br /&gt;
    instanciaFilter.create(processService : processService);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agregamos al filtro, la condición de que obtenga la instancia de todos los participantes y que se encuentren en proceso.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
   SearchScope searchScope = SearchScope(participantScope : ParticipantScope.ALL, &lt;br /&gt;
                                          statusScope : StatusScope.ONLY_INPROCESS);&lt;br /&gt;
instanciaFilter.searchScope = searchScope;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
El alcance de los participantes pueden ser:&lt;br /&gt;
* '''ALL''': todos los participantes.&lt;br /&gt;
* '''ALL_IN_ROLE''': todas las instancias del rol.&lt;br /&gt;
* '''PARTICIPANT''': todas las instancias del participante.&lt;br /&gt;
* '''PARTICIPANT_ROLE''': todas las intancias de los roles del participante.&lt;br /&gt;
&lt;br /&gt;
Agregamos un filtro, para que filtre las instancia cuya '''variable externa''' identificador tenga el valor de unaVariable &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 instanciaFilter.addAttributeTo(variable : &amp;quot;identificador&amp;quot;, comparator : Comparison.IS, value : unaVariable);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Obtenemos las instancias====&lt;br /&gt;
Obtenemos el listado de instancia que concuerdan con el filtro instanciaFilter&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Instance[] instances = processService.getInstancesByFilter(filter : instanciaFilter);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Manipulamos las instancias obtenidas====&lt;br /&gt;
Recorremos la lista de instancias obtenidas y en nuestro caso las abortamos.&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
   foreach (unaInstancia in instances) {&lt;br /&gt;
          unaInstancia.abort();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Las posibles acciones que podemos realizar sobre una instancia son:&lt;br /&gt;
* '''abort''': Cancela la instancia.&lt;br /&gt;
* '''suspend''': Suspende la instancia.&lt;br /&gt;
* '''select''': Selecciona la instancia.&lt;br /&gt;
* '''reasign''': Reasigna la instancia a un participante.&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>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=6457</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=6457"/>
				<updated>2011-12-26T15:08:10Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Creación de Instancias mediante PBL */&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;
&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;
===Pasaje de Parametros===&lt;br /&gt;
&lt;br /&gt;
Para pasar parámetros al proceso desde una actividad de creación (aquellas que dan inicio al proceso) que tenga asociada un ScreenFlow, hay que seguir los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
El primer paso es decirle al proceso que va a recibir parametros de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la tarea &amp;quot;begin&amp;quot; y luego en &amp;quot;Argument Mapping&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 1.jpg]]&lt;br /&gt;
* Click en el botón que parece una flecha violeta hacia abajo y ahí agregamos el nombre del parametro que va a recibir. Es recomendable utilizar nombres descriptivos ya que sino se puede volver bastante confuso.&lt;br /&gt;
[[Archivo:Imagen 2.jpg]]&lt;br /&gt;
* Ahora lo único que falta es mapear el parámetro a una variable del proceso (puede ser creada en la misma pantalla haciendo click sobre el botón que está al lado del de crear parametros)&lt;br /&gt;
[[Archivo:Imagen 3.jpg]]&lt;br /&gt;
&lt;br /&gt;
El segundo paso es realizar un proceso similar al primer paso, con la diferencia que debe hacerce en la tarea &amp;quot;end&amp;quot; del ScreenFlow asociado a la actividad de creación.&lt;br /&gt;
&lt;br /&gt;
El tercer paso es mapear las salidas del ScreenFlow con las Entradas del proceso de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la actividad que tiene asociada el ScreenFlow, luego en &amp;quot;Argument Mapping&amp;quot; y luego en la barra de la izquiera seleccionar &amp;quot;NombreDelScreenFlow Out&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 4.jpg]]&lt;br /&gt;
* Luego solo basta con mapear los argumentos, seleccionando los nombres&lt;br /&gt;
[[Archivo:Imagen 5.jpg]]&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;
===Creación de Instancias mediante PBL===&lt;br /&gt;
Para crear instancias de procesos mediante PBL se utiliza el siguiente código:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Creando la instancia ConsumidorProceso&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
String mensaje = &amp;quot;Este es un mensaje creado por el productor a las &amp;quot; + 'now';&lt;br /&gt;
ProcessInstance.create(processId : ProcessInstance.organization + &amp;quot;/&amp;quot; + ProcessInstance.organizationalUnit + &amp;quot;/ConsumidorProceso&amp;quot;, &lt;br /&gt;
                       arguments : { &amp;quot;mensaje_InArgument&amp;quot; : mensaje }, argumentsSetName : &amp;quot;BeginIn&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Donde:&lt;br /&gt;
* '''processId''' es el identificador (no el nombre) del proceso que queremos crear, en nuestro caso vamos a crear el proceso &amp;quot;ConsumidorProceso&amp;quot;.&lt;br /&gt;
* '''arguments''' es el array de argumentos de entrada que se definio en el proceso.&lt;br /&gt;
&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn:&lt;br /&gt;
[https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/CrearInstanciaConPBL.fpr.exp Crear Instancia mediante PBL]&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>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=6456</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=6456"/>
				<updated>2011-12-26T15:04:33Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Creación de Instancias mediante PBL */&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;
&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;
===Pasaje de Parametros===&lt;br /&gt;
&lt;br /&gt;
Para pasar parámetros al proceso desde una actividad de creación (aquellas que dan inicio al proceso) que tenga asociada un ScreenFlow, hay que seguir los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
El primer paso es decirle al proceso que va a recibir parametros de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la tarea &amp;quot;begin&amp;quot; y luego en &amp;quot;Argument Mapping&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 1.jpg]]&lt;br /&gt;
* Click en el botón que parece una flecha violeta hacia abajo y ahí agregamos el nombre del parametro que va a recibir. Es recomendable utilizar nombres descriptivos ya que sino se puede volver bastante confuso.&lt;br /&gt;
[[Archivo:Imagen 2.jpg]]&lt;br /&gt;
* Ahora lo único que falta es mapear el parámetro a una variable del proceso (puede ser creada en la misma pantalla haciendo click sobre el botón que está al lado del de crear parametros)&lt;br /&gt;
[[Archivo:Imagen 3.jpg]]&lt;br /&gt;
&lt;br /&gt;
El segundo paso es realizar un proceso similar al primer paso, con la diferencia que debe hacerce en la tarea &amp;quot;end&amp;quot; del ScreenFlow asociado a la actividad de creación.&lt;br /&gt;
&lt;br /&gt;
El tercer paso es mapear las salidas del ScreenFlow con las Entradas del proceso de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la actividad que tiene asociada el ScreenFlow, luego en &amp;quot;Argument Mapping&amp;quot; y luego en la barra de la izquiera seleccionar &amp;quot;NombreDelScreenFlow Out&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 4.jpg]]&lt;br /&gt;
* Luego solo basta con mapear los argumentos, seleccionando los nombres&lt;br /&gt;
[[Archivo:Imagen 5.jpg]]&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;
===Creación de Instancias mediante PBL===&lt;br /&gt;
Para crear instancias de procesos mediante PBL se utiliza el siguiente código:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Creando la instancia ConsumidorProceso&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
String mensaje = &amp;quot;Este es un mensaje creado por el productor a las &amp;quot; + 'now';&lt;br /&gt;
ProcessInstance.create(processId : ProcessInstance.organization + &amp;quot;/&amp;quot; + ProcessInstance.organizationalUnit + &amp;quot;/ConsumidorProceso&amp;quot;, &lt;br /&gt;
                       arguments : { &amp;quot;mensaje_InArgument&amp;quot; : mensaje }, argumentsSetName : &amp;quot;BeginIn&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Donde:&lt;br /&gt;
* '''processId''' es el identificador (no el nombre) del proceso que queremos crear, en nuestro caso vamos a crear el proceso &amp;quot;ConsumidorProceso&amp;quot;.&lt;br /&gt;
* '''arguments''' es el array de argumentos de entrada que se definio en el proceso.&lt;br /&gt;
&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn:&lt;br /&gt;
[https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/CrearInstanciaConPBL.fpr Crear Instancia mediante PBL]&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>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=6455</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=6455"/>
				<updated>2011-12-26T15:03:49Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Creación de Instancias mediante PBL */&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;
&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;
===Pasaje de Parametros===&lt;br /&gt;
&lt;br /&gt;
Para pasar parámetros al proceso desde una actividad de creación (aquellas que dan inicio al proceso) que tenga asociada un ScreenFlow, hay que seguir los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
El primer paso es decirle al proceso que va a recibir parametros de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la tarea &amp;quot;begin&amp;quot; y luego en &amp;quot;Argument Mapping&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 1.jpg]]&lt;br /&gt;
* Click en el botón que parece una flecha violeta hacia abajo y ahí agregamos el nombre del parametro que va a recibir. Es recomendable utilizar nombres descriptivos ya que sino se puede volver bastante confuso.&lt;br /&gt;
[[Archivo:Imagen 2.jpg]]&lt;br /&gt;
* Ahora lo único que falta es mapear el parámetro a una variable del proceso (puede ser creada en la misma pantalla haciendo click sobre el botón que está al lado del de crear parametros)&lt;br /&gt;
[[Archivo:Imagen 3.jpg]]&lt;br /&gt;
&lt;br /&gt;
El segundo paso es realizar un proceso similar al primer paso, con la diferencia que debe hacerce en la tarea &amp;quot;end&amp;quot; del ScreenFlow asociado a la actividad de creación.&lt;br /&gt;
&lt;br /&gt;
El tercer paso es mapear las salidas del ScreenFlow con las Entradas del proceso de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la actividad que tiene asociada el ScreenFlow, luego en &amp;quot;Argument Mapping&amp;quot; y luego en la barra de la izquiera seleccionar &amp;quot;NombreDelScreenFlow Out&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 4.jpg]]&lt;br /&gt;
* Luego solo basta con mapear los argumentos, seleccionando los nombres&lt;br /&gt;
[[Archivo:Imagen 5.jpg]]&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;
===Creación de Instancias mediante PBL===&lt;br /&gt;
Para crear instancias de procesos mediante PBL se utiliza el siguiente código:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Creando la instancia ConsumidorProceso&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
String mensaje = &amp;quot;Este es un mensaje creado por el productor a las &amp;quot; + 'now';&lt;br /&gt;
ProcessInstance.create(processId : ProcessInstance.organization + &amp;quot;/&amp;quot; + ProcessInstance.organizationalUnit + &amp;quot;/ConsumidorProceso&amp;quot;, &lt;br /&gt;
                       arguments : { &amp;quot;mensaje_InArgument&amp;quot; : mensaje }, argumentsSetName : &amp;quot;BeginIn&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Donde:&lt;br /&gt;
* '''processId''' es el identificador (no el nombre) del proceso que queremos crear, en nuestro caso vamos a crear el proceso &amp;quot;ConsumidorProceso&amp;quot;.&lt;br /&gt;
* '''arguments''' es el array de argumentos de entrada que se definio en el proceso.&lt;br /&gt;
&lt;br /&gt;
En el siguiente link podemos descargarnos un ejemplo del svn:&lt;br /&gt;
[[https://dosideas-aplicaciones-modelo.googlecode.com/svn/BPM_Ejemplos/trunk/CrearInstanciaConPBL.fpr Crear Instancia mediante PBL]]&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>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=6454</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=6454"/>
				<updated>2011-12-26T13:53:39Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: &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;
&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;
===Pasaje de Parametros===&lt;br /&gt;
&lt;br /&gt;
Para pasar parámetros al proceso desde una actividad de creación (aquellas que dan inicio al proceso) que tenga asociada un ScreenFlow, hay que seguir los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
El primer paso es decirle al proceso que va a recibir parametros de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la tarea &amp;quot;begin&amp;quot; y luego en &amp;quot;Argument Mapping&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 1.jpg]]&lt;br /&gt;
* Click en el botón que parece una flecha violeta hacia abajo y ahí agregamos el nombre del parametro que va a recibir. Es recomendable utilizar nombres descriptivos ya que sino se puede volver bastante confuso.&lt;br /&gt;
[[Archivo:Imagen 2.jpg]]&lt;br /&gt;
* Ahora lo único que falta es mapear el parámetro a una variable del proceso (puede ser creada en la misma pantalla haciendo click sobre el botón que está al lado del de crear parametros)&lt;br /&gt;
[[Archivo:Imagen 3.jpg]]&lt;br /&gt;
&lt;br /&gt;
El segundo paso es realizar un proceso similar al primer paso, con la diferencia que debe hacerce en la tarea &amp;quot;end&amp;quot; del ScreenFlow asociado a la actividad de creación.&lt;br /&gt;
&lt;br /&gt;
El tercer paso es mapear las salidas del ScreenFlow con las Entradas del proceso de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la actividad que tiene asociada el ScreenFlow, luego en &amp;quot;Argument Mapping&amp;quot; y luego en la barra de la izquiera seleccionar &amp;quot;NombreDelScreenFlow Out&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 4.jpg]]&lt;br /&gt;
* Luego solo basta con mapear los argumentos, seleccionando los nombres&lt;br /&gt;
[[Archivo:Imagen 5.jpg]]&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;
===Creación de Instancias mediante PBL===&lt;br /&gt;
Para crear instancias de procesos mediante PBL se utiliza el siguiente código:&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
logMessage(&amp;quot;DOS_IDEAS: Creando la instancia ConsumidorProceso&amp;quot;, severity : Severity.DEBUG);&lt;br /&gt;
&lt;br /&gt;
String mensaje = &amp;quot;Este es un mensaje creado por el productor a las &amp;quot; + 'now';&lt;br /&gt;
ProcessInstance.create(processId : ProcessInstance.organization + &amp;quot;/&amp;quot; + ProcessInstance.organizationalUnit + &amp;quot;/ConsumidorProceso&amp;quot;, &lt;br /&gt;
                       arguments : { &amp;quot;mensaje_InArgument&amp;quot; : mensaje }, argumentsSetName : &amp;quot;BeginIn&amp;quot;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Donde:&lt;br /&gt;
* '''processId''' es el identificador (no el nombre) del proceso que queremos crear.&lt;br /&gt;
* '''arguments''' es el array de argumentos de entrada que se definio en el proceso.&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>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5760</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5760"/>
				<updated>2011-04-29T13:06:39Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Creando un test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]]con [[DSL]]. Para el ejemplo, suponemos un sistema de biblioteca, con las siguientes pantallas y su navegación.&lt;br /&gt;
Se puede observar que pare este sistemas planteamos dos roles de usuario, el Bibliotecario y el Socio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:reservaLibro.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Creando un test ===&lt;br /&gt;
En el siguiente test, vamos a probar la funcionalidad de la reserva de libro.&lt;br /&gt;
Para escribir el siguiente test, se utilizó una sintaxis acotada y simple con las siguientes reglas:&lt;br /&gt;
&lt;br /&gt;
* '''ir'''''&amp;lt;NombreDeLaPagina&amp;gt;'': Los métodos que comiencen con el prefijo “ir”, nos retorna el nuevo contexto (página).&lt;br /&gt;
* '''verificar'''''&amp;lt;Descripción&amp;gt;'':  Los métodos que comiencen con el prefijo &amp;quot;verificar&amp;quot;, poseen los &amp;quot;assert&amp;quot; para comprobar alguna acción realizada en la página, este método siempre retona la misma página (this).&lt;br /&gt;
* '''ingresarComo'''''&amp;lt;Nombre del Rol&amp;gt;'': Rol con el que se probará el sistema.&lt;br /&gt;
* '''aceptar, cancelar, volver, buscar''': Son nombre de las acciones básica que se realizan en un página y pueden (o nó) devolver otra página.&lt;br /&gt;
* ''&amp;lt;acciones propias de la página&amp;gt;'' : Estos métodos realizan acciones sobre el sistema sin ir a otra página. Ej.: reservar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ReservaSeleniumDslTest ====&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class ReservaSeleniumDslTest {&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void comoBibliotecarioQuieroRealizarUnaReserva() {&lt;br /&gt;
        Usuario.ingresaComoBibliotecario()&lt;br /&gt;
        .irReservaDeLibro()&lt;br /&gt;
        .reservar()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarReserva()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta forma, escribimos el test de manera que al leer los métodos a los que se invoca, se entiende paso a paso lo que el test realiza, sin confundirnos con la implementación. Utilizando los patrones &amp;quot;method chaining&amp;quot; ,  &amp;quot;builder&amp;quot;, &amp;quot;Page object&amp;quot; ayuda a realizar una abstracción de la implementación.&lt;br /&gt;
&lt;br /&gt;
Si lo hubieramos realizado solo con selenium, el mismo test quedaría de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
==== ReservaSeleniumTest ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    @Test&lt;br /&gt;
    public void comoBibliotecarioQuieroRealizarUnaReserva() {&lt;br /&gt;
        //Ingresar&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.type(&amp;quot;password&amp;quot;, password);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        //ir Pagina reserva de Libro&lt;br /&gt;
        selenium.click(&amp;quot;link=ReservaLibro&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        //reservar&lt;br /&gt;
        selenium.type(&amp;quot;libro&amp;quot;, &amp;quot;El señor de los anillos&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;codSocio&amp;quot;, &amp;quot;0001&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;fechaHasta&amp;quot;, &amp;quot;2011-01-01&amp;quot;);&lt;br /&gt;
        //Aceptar        &lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA)&lt;br /&gt;
        //verficiar&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;El señor de los anillos&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;0001&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;2011-01-01&amp;quot;));&lt;br /&gt;
        //aceptar para volver a la home&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA)&lt;br /&gt;
        //salir&lt;br /&gt;
        selenium.click(&amp;quot;link=logout&amp;quot;);      &lt;br /&gt;
 }    &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A continuación  las implementaciones de las clases utilizadas en el test.&lt;br /&gt;
&lt;br /&gt;
==== Usuario ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.openqa.selenium.server.SeleniumServer;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.pagina.HomeBibliotecario;&lt;br /&gt;
import com.test.dsl.pagina.HomeUsuario;&lt;br /&gt;
import com.thoughtworks.selenium.DefaultSelenium;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class Usuario {&lt;br /&gt;
&lt;br /&gt;
    public static final String TIEMPO_ESPERA = &amp;quot;90000&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_CERO = &amp;quot;0&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_TEST = &amp;quot;350&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    private static SeleniumServer seleniumServer;&lt;br /&gt;
    private static Selenium selenium ;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    public static void inicializar() throws Exception {&lt;br /&gt;
        seleniumServer = new SeleniumServer();&lt;br /&gt;
        seleniumServer.start();&lt;br /&gt;
        selenium = new DefaultSelenium(&amp;quot;localhost&amp;quot;, 4444, &amp;quot;*chrome&amp;quot;, &amp;quot;http://localhost:8585/&amp;quot;);&lt;br /&gt;
        selenium.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void finalizar() {&lt;br /&gt;
        selenium.stop();&lt;br /&gt;
        seleniumServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static HomeBibliotecario ingresaComoBibliotecario() {&lt;br /&gt;
        Usuario.login(&amp;quot;bibliotecario_test&amp;quot;,&amp;quot;123456&amp;quot;);&lt;br /&gt;
        return new HomeBibliotecario(selenium);       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static HomeUsuario ingresaComoUsuario() {&lt;br /&gt;
        Usuario.login(&amp;quot;usuario_test&amp;quot;,&amp;quot;123456&amp;quot;);&lt;br /&gt;
        return new HomeUsuario(selenium);       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static void login(String username, String password) {&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.type(&amp;quot;password&amp;quot;, password);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&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;
Esta clase es la que determina con que rol vamos a probar la aplicación.&lt;br /&gt;
El método '''ingresarComoBibliotecario''' instancia y devuelve un objeto de la clase '''HomeBibliotecario''' cuya implementación es:&lt;br /&gt;
&lt;br /&gt;
==== HomeBibliotecario ====&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class HomeBibliotecario {&lt;br /&gt;
    &lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public HomeBibliotecario(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro irReservaDeLibro() {&lt;br /&gt;
        selenium.click(&amp;quot;link=ReservaLibro&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new ReservaDeLibro(selenium);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void salir() {&lt;br /&gt;
        selenium.click(&amp;quot;link=logout&amp;quot;);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a utilizar el patrón builder y el método ingresar denuncia devuelve un objeto de la clase AltaDenuncia. De esta manera, cada clase representa a una pantalla de la aplicación, y expone cada funcionalidad que la misma ofrece. AltaDenuncia sería así:&lt;br /&gt;
Volvemos a utilizar el patrón method chaining y el método '''irReservaDeLibro''' devuelve un objeto de la clase '''ReservaDeLibro'''. De esta manera, cada clase representa a una pantalla de la aplicación (page object), y expone cada funcionalidad que la misma ofrece (acciones que puedo realizar en la página y páginas a la que puedo acceder)&lt;br /&gt;
&lt;br /&gt;
==== ReservaDeLibro ====  &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class ReservaDeLibro {&lt;br /&gt;
&lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro reservar() {&lt;br /&gt;
        selenium.type(&amp;quot;libro&amp;quot;, &amp;quot;El señor de los anillos&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;codSocio&amp;quot;, &amp;quot;0001&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;fechaHasta&amp;quot;, &amp;quot;2011-01-01&amp;quot;);&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro aceptar() {&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new ComprobanteDeLibro(selenium);&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ComprobanteDeLibro ====  &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class ComprobanteDeLibro {&lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro verificarReserva() {&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;El señor de los anillos&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;0001&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;2011-01-01&amp;quot;));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public HomeBibliotecario aceptar() {&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new HomeBibliotecario(selenium);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tanto el  aceptar (como el cancelar en ReservaDeLibro), devuelven la home del bibliotecario.&lt;br /&gt;
&lt;br /&gt;
== Conclusiones ==&lt;br /&gt;
&lt;br /&gt;
El resultado de hacer los test de esta manera, es la facilidad de escritura y mantenimiento del test en si mismo. A su vez, se podría diseñar las clases a utilizar en el DSL a conveniencia.&lt;br /&gt;
&lt;br /&gt;
== Enlaces ==&lt;br /&gt;
[[DSL]]&lt;br /&gt;
&lt;br /&gt;
[[Selenium]]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/selenium/wiki/PageObjects Page Objects]&lt;br /&gt;
&lt;br /&gt;
[http://www.slideshare.net/alimenkou/dsl-page-object-and-selenium-a-way-to-reliable-functional-tests Diapositiva de Dsl+Page Object + Selenium]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5759</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5759"/>
				<updated>2011-04-29T13:04:46Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Enlaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]]con [[DSL]]. Para el ejemplo, suponemos un sistema de biblioteca, con las siguientes pantallas y su navegación.&lt;br /&gt;
Se puede observar que pare este sistemas planteamos dos roles de usuario, el Bibliotecario y el Socio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:reservaLibro.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Creando un test ===&lt;br /&gt;
En el siguiente test, vamos a probar la funcionalidad de la reserva de libro.&lt;br /&gt;
Para escribir el siguiente test, se utilizó una sintaxis acotada y simple con las siguientes reglas:&lt;br /&gt;
&lt;br /&gt;
* '''ir'''''&amp;lt;NombreDeLaPagina&amp;gt;'': Los métodos que comiencen con el prefijo “ir”, nos retorna el nuevo contexto (página).&lt;br /&gt;
* '''verificar'''''&amp;lt;Descripción&amp;gt;'':  Los métodos que comiencen con el prefijo &amp;quot;verificar&amp;quot;, poseen los “assert” para comprobar alguna acción realizada en la página, este método siempre retona la misma página (this).&lt;br /&gt;
* '''ingresarComo'''''&amp;lt;Nombre del Rol&amp;gt;'': Rol con el que se probará el sistema.&lt;br /&gt;
* '''aceptar, cancelar, volver, buscar''': Son nombre de las acciones básica que se realizan en un página y pueden (o nó) devolver otra página.&lt;br /&gt;
* ''&amp;lt;acciones propias de la página&amp;gt;'' : Estos métodos realizan acciones sobre el sistema sin ir a otra página. Ej.: reservar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ReservaSeleniumDslTest ====&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class ReservaSeleniumDslTest {&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void comoBibliotecarioQuieroRealizarUnaReserva() {&lt;br /&gt;
        Usuario.ingresaComoBibliotecario()&lt;br /&gt;
        .irReservaDeLibro()&lt;br /&gt;
        .reservar()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarReserva()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta forma, escribimos el test de manera que al leer los métodos a los que se invoca, se entiende paso a paso lo que el test realiza, sin confundirnos con la implementación. Utilizando los patrones &amp;quot;method chaining&amp;quot; ,  &amp;quot;builder&amp;quot;, &amp;quot;Page object&amp;quot; ayuda a realizar una abstracción de la implementación.&lt;br /&gt;
&lt;br /&gt;
Si lo hubieramos realizado solo con selenium, el mismo test quedaría de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
==== ReservaSeleniumTest ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    @Test&lt;br /&gt;
    public void comoBibliotecarioQuieroRealizarUnaReserva() {&lt;br /&gt;
        //Ingresar&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.type(&amp;quot;password&amp;quot;, password);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        //ir Pagina reserva de Libro&lt;br /&gt;
        selenium.click(&amp;quot;link=ReservaLibro&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        //reservar&lt;br /&gt;
        selenium.type(&amp;quot;libro&amp;quot;, &amp;quot;El señor de los anillos&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;codSocio&amp;quot;, &amp;quot;0001&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;fechaHasta&amp;quot;, &amp;quot;2011-01-01&amp;quot;);&lt;br /&gt;
        //Aceptar        &lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA)&lt;br /&gt;
        //verficiar&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;El señor de los anillos&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;0001&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;2011-01-01&amp;quot;));&lt;br /&gt;
        //aceptar para volver a la home&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA)&lt;br /&gt;
        //salir&lt;br /&gt;
        selenium.click(&amp;quot;link=logout&amp;quot;);      &lt;br /&gt;
 }    &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A continuación  las implementaciones de las clases utilizadas en el test.&lt;br /&gt;
&lt;br /&gt;
==== Usuario ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.openqa.selenium.server.SeleniumServer;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.pagina.HomeBibliotecario;&lt;br /&gt;
import com.test.dsl.pagina.HomeUsuario;&lt;br /&gt;
import com.thoughtworks.selenium.DefaultSelenium;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class Usuario {&lt;br /&gt;
&lt;br /&gt;
    public static final String TIEMPO_ESPERA = &amp;quot;90000&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_CERO = &amp;quot;0&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_TEST = &amp;quot;350&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    private static SeleniumServer seleniumServer;&lt;br /&gt;
    private static Selenium selenium ;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    public static void inicializar() throws Exception {&lt;br /&gt;
        seleniumServer = new SeleniumServer();&lt;br /&gt;
        seleniumServer.start();&lt;br /&gt;
        selenium = new DefaultSelenium(&amp;quot;localhost&amp;quot;, 4444, &amp;quot;*chrome&amp;quot;, &amp;quot;http://localhost:8585/&amp;quot;);&lt;br /&gt;
        selenium.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void finalizar() {&lt;br /&gt;
        selenium.stop();&lt;br /&gt;
        seleniumServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static HomeBibliotecario ingresaComoBibliotecario() {&lt;br /&gt;
        Usuario.login(&amp;quot;bibliotecario_test&amp;quot;,&amp;quot;123456&amp;quot;);&lt;br /&gt;
        return new HomeBibliotecario(selenium);       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static HomeUsuario ingresaComoUsuario() {&lt;br /&gt;
        Usuario.login(&amp;quot;usuario_test&amp;quot;,&amp;quot;123456&amp;quot;);&lt;br /&gt;
        return new HomeUsuario(selenium);       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static void login(String username, String password) {&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.type(&amp;quot;password&amp;quot;, password);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&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;
Esta clase es la que determina con que rol vamos a probar la aplicación.&lt;br /&gt;
El método '''ingresarComoBibliotecario''' instancia y devuelve un objeto de la clase '''HomeBibliotecario''' cuya implementación es:&lt;br /&gt;
&lt;br /&gt;
==== HomeBibliotecario ====&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class HomeBibliotecario {&lt;br /&gt;
    &lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public HomeBibliotecario(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro irReservaDeLibro() {&lt;br /&gt;
        selenium.click(&amp;quot;link=ReservaLibro&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new ReservaDeLibro(selenium);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void salir() {&lt;br /&gt;
        selenium.click(&amp;quot;link=logout&amp;quot;);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a utilizar el patrón builder y el método ingresar denuncia devuelve un objeto de la clase AltaDenuncia. De esta manera, cada clase representa a una pantalla de la aplicación, y expone cada funcionalidad que la misma ofrece. AltaDenuncia sería así:&lt;br /&gt;
Volvemos a utilizar el patrón method chaining y el método '''irReservaDeLibro''' devuelve un objeto de la clase '''ReservaDeLibro'''. De esta manera, cada clase representa a una pantalla de la aplicación (page object), y expone cada funcionalidad que la misma ofrece (acciones que puedo realizar en la página y páginas a la que puedo acceder)&lt;br /&gt;
&lt;br /&gt;
==== ReservaDeLibro ====  &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class ReservaDeLibro {&lt;br /&gt;
&lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro reservar() {&lt;br /&gt;
        selenium.type(&amp;quot;libro&amp;quot;, &amp;quot;El señor de los anillos&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;codSocio&amp;quot;, &amp;quot;0001&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;fechaHasta&amp;quot;, &amp;quot;2011-01-01&amp;quot;);&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro aceptar() {&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new ComprobanteDeLibro(selenium);&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ComprobanteDeLibro ====  &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class ComprobanteDeLibro {&lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro verificarReserva() {&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;El señor de los anillos&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;0001&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;2011-01-01&amp;quot;));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public HomeBibliotecario aceptar() {&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new HomeBibliotecario(selenium);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tanto el  aceptar (como el cancelar en ReservaDeLibro), devuelven la home del bibliotecario.&lt;br /&gt;
&lt;br /&gt;
== Conclusiones ==&lt;br /&gt;
&lt;br /&gt;
El resultado de hacer los test de esta manera, es la facilidad de escritura y mantenimiento del test en si mismo. A su vez, se podría diseñar las clases a utilizar en el DSL a conveniencia.&lt;br /&gt;
&lt;br /&gt;
== Enlaces ==&lt;br /&gt;
[[DSL]]&lt;br /&gt;
&lt;br /&gt;
[[Selenium]]&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/selenium/wiki/PageObjects Page Objects]&lt;br /&gt;
&lt;br /&gt;
[http://www.slideshare.net/alimenkou/dsl-page-object-and-selenium-a-way-to-reliable-functional-tests Diapositiva de Dsl+Page Object + Selenium]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5758</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5758"/>
				<updated>2011-04-29T13:03:48Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]]con [[DSL]]. Para el ejemplo, suponemos un sistema de biblioteca, con las siguientes pantallas y su navegación.&lt;br /&gt;
Se puede observar que pare este sistemas planteamos dos roles de usuario, el Bibliotecario y el Socio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:reservaLibro.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Creando un test ===&lt;br /&gt;
En el siguiente test, vamos a probar la funcionalidad de la reserva de libro.&lt;br /&gt;
Para escribir el siguiente test, se utilizó una sintaxis acotada y simple con las siguientes reglas:&lt;br /&gt;
&lt;br /&gt;
* '''ir'''''&amp;lt;NombreDeLaPagina&amp;gt;'': Los métodos que comiencen con el prefijo “ir”, nos retorna el nuevo contexto (página).&lt;br /&gt;
* '''verificar'''''&amp;lt;Descripción&amp;gt;'':  Los métodos que comiencen con el prefijo &amp;quot;verificar&amp;quot;, poseen los “assert” para comprobar alguna acción realizada en la página, este método siempre retona la misma página (this).&lt;br /&gt;
* '''ingresarComo'''''&amp;lt;Nombre del Rol&amp;gt;'': Rol con el que se probará el sistema.&lt;br /&gt;
* '''aceptar, cancelar, volver, buscar''': Son nombre de las acciones básica que se realizan en un página y pueden (o nó) devolver otra página.&lt;br /&gt;
* ''&amp;lt;acciones propias de la página&amp;gt;'' : Estos métodos realizan acciones sobre el sistema sin ir a otra página. Ej.: reservar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ReservaSeleniumDslTest ====&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class ReservaSeleniumDslTest {&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void comoBibliotecarioQuieroRealizarUnaReserva() {&lt;br /&gt;
        Usuario.ingresaComoBibliotecario()&lt;br /&gt;
        .irReservaDeLibro()&lt;br /&gt;
        .reservar()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarReserva()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta forma, escribimos el test de manera que al leer los métodos a los que se invoca, se entiende paso a paso lo que el test realiza, sin confundirnos con la implementación. Utilizando los patrones &amp;quot;method chaining&amp;quot; ,  &amp;quot;builder&amp;quot;, &amp;quot;Page object&amp;quot; ayuda a realizar una abstracción de la implementación.&lt;br /&gt;
&lt;br /&gt;
Si lo hubieramos realizado solo con selenium, el mismo test quedaría de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
==== ReservaSeleniumTest ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    @Test&lt;br /&gt;
    public void comoBibliotecarioQuieroRealizarUnaReserva() {&lt;br /&gt;
        //Ingresar&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.type(&amp;quot;password&amp;quot;, password);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        //ir Pagina reserva de Libro&lt;br /&gt;
        selenium.click(&amp;quot;link=ReservaLibro&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        //reservar&lt;br /&gt;
        selenium.type(&amp;quot;libro&amp;quot;, &amp;quot;El señor de los anillos&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;codSocio&amp;quot;, &amp;quot;0001&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;fechaHasta&amp;quot;, &amp;quot;2011-01-01&amp;quot;);&lt;br /&gt;
        //Aceptar        &lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA)&lt;br /&gt;
        //verficiar&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;El señor de los anillos&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;0001&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;2011-01-01&amp;quot;));&lt;br /&gt;
        //aceptar para volver a la home&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA)&lt;br /&gt;
        //salir&lt;br /&gt;
        selenium.click(&amp;quot;link=logout&amp;quot;);      &lt;br /&gt;
 }    &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A continuación  las implementaciones de las clases utilizadas en el test.&lt;br /&gt;
&lt;br /&gt;
==== Usuario ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.openqa.selenium.server.SeleniumServer;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.pagina.HomeBibliotecario;&lt;br /&gt;
import com.test.dsl.pagina.HomeUsuario;&lt;br /&gt;
import com.thoughtworks.selenium.DefaultSelenium;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class Usuario {&lt;br /&gt;
&lt;br /&gt;
    public static final String TIEMPO_ESPERA = &amp;quot;90000&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_CERO = &amp;quot;0&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_TEST = &amp;quot;350&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    private static SeleniumServer seleniumServer;&lt;br /&gt;
    private static Selenium selenium ;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    public static void inicializar() throws Exception {&lt;br /&gt;
        seleniumServer = new SeleniumServer();&lt;br /&gt;
        seleniumServer.start();&lt;br /&gt;
        selenium = new DefaultSelenium(&amp;quot;localhost&amp;quot;, 4444, &amp;quot;*chrome&amp;quot;, &amp;quot;http://localhost:8585/&amp;quot;);&lt;br /&gt;
        selenium.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void finalizar() {&lt;br /&gt;
        selenium.stop();&lt;br /&gt;
        seleniumServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static HomeBibliotecario ingresaComoBibliotecario() {&lt;br /&gt;
        Usuario.login(&amp;quot;bibliotecario_test&amp;quot;,&amp;quot;123456&amp;quot;);&lt;br /&gt;
        return new HomeBibliotecario(selenium);       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static HomeUsuario ingresaComoUsuario() {&lt;br /&gt;
        Usuario.login(&amp;quot;usuario_test&amp;quot;,&amp;quot;123456&amp;quot;);&lt;br /&gt;
        return new HomeUsuario(selenium);       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static void login(String username, String password) {&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.type(&amp;quot;password&amp;quot;, password);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&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;
Esta clase es la que determina con que rol vamos a probar la aplicación.&lt;br /&gt;
El método '''ingresarComoBibliotecario''' instancia y devuelve un objeto de la clase '''HomeBibliotecario''' cuya implementación es:&lt;br /&gt;
&lt;br /&gt;
==== HomeBibliotecario ====&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class HomeBibliotecario {&lt;br /&gt;
    &lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public HomeBibliotecario(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro irReservaDeLibro() {&lt;br /&gt;
        selenium.click(&amp;quot;link=ReservaLibro&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new ReservaDeLibro(selenium);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void salir() {&lt;br /&gt;
        selenium.click(&amp;quot;link=logout&amp;quot;);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a utilizar el patrón builder y el método ingresar denuncia devuelve un objeto de la clase AltaDenuncia. De esta manera, cada clase representa a una pantalla de la aplicación, y expone cada funcionalidad que la misma ofrece. AltaDenuncia sería así:&lt;br /&gt;
Volvemos a utilizar el patrón method chaining y el método '''irReservaDeLibro''' devuelve un objeto de la clase '''ReservaDeLibro'''. De esta manera, cada clase representa a una pantalla de la aplicación (page object), y expone cada funcionalidad que la misma ofrece (acciones que puedo realizar en la página y páginas a la que puedo acceder)&lt;br /&gt;
&lt;br /&gt;
==== ReservaDeLibro ====  &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class ReservaDeLibro {&lt;br /&gt;
&lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro reservar() {&lt;br /&gt;
        selenium.type(&amp;quot;libro&amp;quot;, &amp;quot;El señor de los anillos&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;codSocio&amp;quot;, &amp;quot;0001&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;fechaHasta&amp;quot;, &amp;quot;2011-01-01&amp;quot;);&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro aceptar() {&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new ComprobanteDeLibro(selenium);&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ComprobanteDeLibro ====  &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class ComprobanteDeLibro {&lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro verificarReserva() {&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;El señor de los anillos&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;0001&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;2011-01-01&amp;quot;));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public HomeBibliotecario aceptar() {&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new HomeBibliotecario(selenium);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tanto el  aceptar (como el cancelar en ReservaDeLibro), devuelven la home del bibliotecario.&lt;br /&gt;
&lt;br /&gt;
== Conclusiones ==&lt;br /&gt;
&lt;br /&gt;
El resultado de hacer los test de esta manera, es la facilidad de escritura y mantenimiento del test en si mismo. A su vez, se podría diseñar las clases a utilizar en el DSL a conveniencia.&lt;br /&gt;
&lt;br /&gt;
== Enlaces ==&lt;br /&gt;
[http://code.google.com/p/selenium/wiki/PageObjects Page Objects]&lt;br /&gt;
[http://www.slideshare.net/alimenkou/dsl-page-object-and-selenium-a-way-to-reliable-functional-tests Diapositiva de Dsl+Page Object + Selenium]&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5757</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5757"/>
				<updated>2011-04-29T12:47:53Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* ReservaSeleniumTest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]]con [[DSL]]. Para el ejemplo, suponemos un sistema de biblioteca, con las siguientes pantallas y su navegación.&lt;br /&gt;
Se puede observar que pare este sistemas planteamos dos roles de usuario, el Bibliotecario y el Socio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:reservaLibro.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Creando un test ===&lt;br /&gt;
En el siguiente test, vamos a probar la funcionalidad de la reserva de libro.&lt;br /&gt;
Para escribir el siguiente test, se utilizó una sintaxis acotada y simple con las siguientes reglas:&lt;br /&gt;
&lt;br /&gt;
* '''ir'''''&amp;lt;NombreDeLaPagina&amp;gt;'': Los métodos que comiencen con el prefijo “ir”, nos retorna el nuevo contexto (página).&lt;br /&gt;
* '''verificar'''''&amp;lt;Descripción&amp;gt;'':  Los métodos que comiencen con el prefijo &amp;quot;verificar&amp;quot;, poseen los “assert” para comprobar alguna acción realizada en la página, este método siempre retona la misma página (this).&lt;br /&gt;
* '''ingresarComo'''''&amp;lt;Nombre del Rol&amp;gt;'': Rol con el que se probará el sistema.&lt;br /&gt;
* '''aceptar, cancelar, volver, buscar''': Son nombre de las acciones básica que se realizan en un página y pueden (o nó) devolver otra página.&lt;br /&gt;
* ''&amp;lt;acciones propias de la página&amp;gt;'' : Estos métodos realizan acciones sobre el sistema sin ir a otra página. Ej.: reservar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ReservaSeleniumDslTest ====&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class ReservaSeleniumDslTest {&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void comoBibliotecarioQuieroRealizarUnaReserva() {&lt;br /&gt;
        Usuario.ingresaComoBibliotecario()&lt;br /&gt;
        .irReservaDeLibro()&lt;br /&gt;
        .reservar()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarReserva()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta forma, escribimos el test de manera que al leer los métodos a los que se invoca, se entiende paso a paso lo que el test realiza, sin confundirnos con la implementación. Utilizando los patrones &amp;quot;method chaining&amp;quot; ,  &amp;quot;builder&amp;quot;, &amp;quot;Page object&amp;quot; ayuda a realizar una abstracción de la implementación.&lt;br /&gt;
&lt;br /&gt;
Si lo hubieramos realizado solo con selenium, el mismo test quedaría de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
==== ReservaSeleniumTest ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    @Test&lt;br /&gt;
    public void comoBibliotecarioQuieroRealizarUnaReserva() {&lt;br /&gt;
        //Ingresar&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.type(&amp;quot;password&amp;quot;, password);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        //ir Pagina reserva de Libro&lt;br /&gt;
        selenium.click(&amp;quot;link=ReservaLibro&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        //reservar&lt;br /&gt;
        selenium.type(&amp;quot;libro&amp;quot;, &amp;quot;El señor de los anillos&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;codSocio&amp;quot;, &amp;quot;0001&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;fechaHasta&amp;quot;, &amp;quot;2011-01-01&amp;quot;);&lt;br /&gt;
        //Aceptar        &lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA)&lt;br /&gt;
        //verficiar&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;El señor de los anillos&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;0001&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;2011-01-01&amp;quot;));&lt;br /&gt;
        //aceptar para volver a la home&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA)&lt;br /&gt;
        //salir&lt;br /&gt;
        selenium.click(&amp;quot;link=logout&amp;quot;);      &lt;br /&gt;
 }    &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A continuación  las implementaciones de las clases utilizadas en el test.&lt;br /&gt;
&lt;br /&gt;
==== Usuario ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.openqa.selenium.server.SeleniumServer;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.pagina.HomeBibliotecario;&lt;br /&gt;
import com.test.dsl.pagina.HomeUsuario;&lt;br /&gt;
import com.thoughtworks.selenium.DefaultSelenium;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class Usuario {&lt;br /&gt;
&lt;br /&gt;
    public static final String TIEMPO_ESPERA = &amp;quot;90000&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_CERO = &amp;quot;0&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_TEST = &amp;quot;350&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    private static SeleniumServer seleniumServer;&lt;br /&gt;
    private static Selenium selenium ;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    public static void inicializar() throws Exception {&lt;br /&gt;
        seleniumServer = new SeleniumServer();&lt;br /&gt;
        seleniumServer.start();&lt;br /&gt;
        selenium = new DefaultSelenium(&amp;quot;localhost&amp;quot;, 4444, &amp;quot;*chrome&amp;quot;, &amp;quot;http://localhost:8585/&amp;quot;);&lt;br /&gt;
        selenium.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void finalizar() {&lt;br /&gt;
        selenium.stop();&lt;br /&gt;
        seleniumServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static HomeBibliotecario ingresaComoBibliotecario() {&lt;br /&gt;
        Usuario.login(&amp;quot;bibliotecario_test&amp;quot;,&amp;quot;123456&amp;quot;);&lt;br /&gt;
        return new HomeBibliotecario(selenium);       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static HomeUsuario ingresaComoUsuario() {&lt;br /&gt;
        Usuario.login(&amp;quot;usuario_test&amp;quot;,&amp;quot;123456&amp;quot;);&lt;br /&gt;
        return new HomeUsuario(selenium);       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static void login(String username, String password) {&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.type(&amp;quot;password&amp;quot;, password);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&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;
Esta clase es la que determina con que rol vamos a probar la aplicación.&lt;br /&gt;
El método '''ingresarComoBibliotecario''' instancia y devuelve un objeto de la clase '''HomeBibliotecario''' cuya implementación es:&lt;br /&gt;
&lt;br /&gt;
==== HomeBibliotecario ====&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class HomeBibliotecario {&lt;br /&gt;
    &lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public HomeBibliotecario(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro irReservaDeLibro() {&lt;br /&gt;
        selenium.click(&amp;quot;link=ReservaLibro&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new ReservaDeLibro(selenium);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void salir() {&lt;br /&gt;
        selenium.click(&amp;quot;link=logout&amp;quot;);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a utilizar el patrón builder y el método ingresar denuncia devuelve un objeto de la clase AltaDenuncia. De esta manera, cada clase representa a una pantalla de la aplicación, y expone cada funcionalidad que la misma ofrece. AltaDenuncia sería así:&lt;br /&gt;
Volvemos a utilizar el patrón method chaining y el método '''irReservaDeLibro''' devuelve un objeto de la clase '''ReservaDeLibro'''. De esta manera, cada clase representa a una pantalla de la aplicación (page object), y expone cada funcionalidad que la misma ofrece (acciones que puedo realizar en la página y páginas a la que puedo acceder)&lt;br /&gt;
&lt;br /&gt;
==== ReservaDeLibro ====  &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class ReservaDeLibro {&lt;br /&gt;
&lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro reservar() {&lt;br /&gt;
        selenium.type(&amp;quot;libro&amp;quot;, &amp;quot;El señor de los anillos&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;codSocio&amp;quot;, &amp;quot;0001&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;fechaHasta&amp;quot;, &amp;quot;2011-01-01&amp;quot;);&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro aceptar() {&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new ComprobanteDeLibro(selenium);&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ComprobanteDeLibro ====  &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class ComprobanteDeLibro {&lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro verificarReserva() {&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;El señor de los anillos&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;0001&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;2011-01-01&amp;quot;));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public HomeBibliotecario aceptar() {&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new HomeBibliotecario(selenium);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tanto el  aceptar (como el cancelar en ReservaDeLibro), devuelven la home del bibliotecario.&lt;br /&gt;
&lt;br /&gt;
== Conclusiones ==&lt;br /&gt;
&lt;br /&gt;
El resultado de hacer los test de esta manera, es la facilidad de escritura y mantenimiento del test en si mismo. A su vez, se podría diseñar las clases a utilizar en el DSL a conveniencia.&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5756</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5756"/>
				<updated>2011-04-29T12:47:23Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: /* Creando un test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]]con [[DSL]]. Para el ejemplo, suponemos un sistema de biblioteca, con las siguientes pantallas y su navegación.&lt;br /&gt;
Se puede observar que pare este sistemas planteamos dos roles de usuario, el Bibliotecario y el Socio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:reservaLibro.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Creando un test ===&lt;br /&gt;
En el siguiente test, vamos a probar la funcionalidad de la reserva de libro.&lt;br /&gt;
Para escribir el siguiente test, se utilizó una sintaxis acotada y simple con las siguientes reglas:&lt;br /&gt;
&lt;br /&gt;
* '''ir'''''&amp;lt;NombreDeLaPagina&amp;gt;'': Los métodos que comiencen con el prefijo “ir”, nos retorna el nuevo contexto (página).&lt;br /&gt;
* '''verificar'''''&amp;lt;Descripción&amp;gt;'':  Los métodos que comiencen con el prefijo &amp;quot;verificar&amp;quot;, poseen los “assert” para comprobar alguna acción realizada en la página, este método siempre retona la misma página (this).&lt;br /&gt;
* '''ingresarComo'''''&amp;lt;Nombre del Rol&amp;gt;'': Rol con el que se probará el sistema.&lt;br /&gt;
* '''aceptar, cancelar, volver, buscar''': Son nombre de las acciones básica que se realizan en un página y pueden (o nó) devolver otra página.&lt;br /&gt;
* ''&amp;lt;acciones propias de la página&amp;gt;'' : Estos métodos realizan acciones sobre el sistema sin ir a otra página. Ej.: reservar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ReservaSeleniumDslTest ====&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class ReservaSeleniumDslTest {&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void comoBibliotecarioQuieroRealizarUnaReserva() {&lt;br /&gt;
        Usuario.ingresaComoBibliotecario()&lt;br /&gt;
        .irReservaDeLibro()&lt;br /&gt;
        .reservar()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarReserva()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta forma, escribimos el test de manera que al leer los métodos a los que se invoca, se entiende paso a paso lo que el test realiza, sin confundirnos con la implementación. Utilizando los patrones &amp;quot;method chaining&amp;quot; ,  &amp;quot;builder&amp;quot;, &amp;quot;Page object&amp;quot; ayuda a realizar una abstracción de la implementación.&lt;br /&gt;
&lt;br /&gt;
Si lo hubieramos realizado solo con selenium, el mismo test quedaría de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
==== ReservaSeleniumTest ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    @Test&lt;br /&gt;
    public void comoBibliotecarioQuieroRealizarUnaReserva() {&lt;br /&gt;
        //Ingresar&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.type(&amp;quot;password&amp;quot;, password);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        //ir Pagina reserva de Libro&lt;br /&gt;
        selenium.click(&amp;quot;link=ReservaLibro&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        //reservar&lt;br /&gt;
        selenium.type(&amp;quot;libro&amp;quot;, &amp;quot;El señor de los anillos&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;codSocio&amp;quot;, &amp;quot;0001&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;fechaHasta&amp;quot;, &amp;quot;2011-01-01&amp;quot;);&lt;br /&gt;
        //Aceptar        &lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA)&lt;br /&gt;
        //verficiar&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;El señor de los anillos&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;0001&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;2011-01-01&amp;quot;));&lt;br /&gt;
        //aceptar para volver a la home&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA)&lt;br /&gt;
        //salir&lt;br /&gt;
        selenium.click(&amp;quot;link=logout&amp;quot;);       }    &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A continuación  las implementaciones de las clases utilizadas en el test.&lt;br /&gt;
&lt;br /&gt;
==== Usuario ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.openqa.selenium.server.SeleniumServer;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.pagina.HomeBibliotecario;&lt;br /&gt;
import com.test.dsl.pagina.HomeUsuario;&lt;br /&gt;
import com.thoughtworks.selenium.DefaultSelenium;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class Usuario {&lt;br /&gt;
&lt;br /&gt;
    public static final String TIEMPO_ESPERA = &amp;quot;90000&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_CERO = &amp;quot;0&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_TEST = &amp;quot;350&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    private static SeleniumServer seleniumServer;&lt;br /&gt;
    private static Selenium selenium ;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    public static void inicializar() throws Exception {&lt;br /&gt;
        seleniumServer = new SeleniumServer();&lt;br /&gt;
        seleniumServer.start();&lt;br /&gt;
        selenium = new DefaultSelenium(&amp;quot;localhost&amp;quot;, 4444, &amp;quot;*chrome&amp;quot;, &amp;quot;http://localhost:8585/&amp;quot;);&lt;br /&gt;
        selenium.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void finalizar() {&lt;br /&gt;
        selenium.stop();&lt;br /&gt;
        seleniumServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static HomeBibliotecario ingresaComoBibliotecario() {&lt;br /&gt;
        Usuario.login(&amp;quot;bibliotecario_test&amp;quot;,&amp;quot;123456&amp;quot;);&lt;br /&gt;
        return new HomeBibliotecario(selenium);       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static HomeUsuario ingresaComoUsuario() {&lt;br /&gt;
        Usuario.login(&amp;quot;usuario_test&amp;quot;,&amp;quot;123456&amp;quot;);&lt;br /&gt;
        return new HomeUsuario(selenium);       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static void login(String username, String password) {&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.type(&amp;quot;password&amp;quot;, password);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&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;
Esta clase es la que determina con que rol vamos a probar la aplicación.&lt;br /&gt;
El método '''ingresarComoBibliotecario''' instancia y devuelve un objeto de la clase '''HomeBibliotecario''' cuya implementación es:&lt;br /&gt;
&lt;br /&gt;
==== HomeBibliotecario ====&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class HomeBibliotecario {&lt;br /&gt;
    &lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public HomeBibliotecario(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro irReservaDeLibro() {&lt;br /&gt;
        selenium.click(&amp;quot;link=ReservaLibro&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new ReservaDeLibro(selenium);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void salir() {&lt;br /&gt;
        selenium.click(&amp;quot;link=logout&amp;quot;);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a utilizar el patrón builder y el método ingresar denuncia devuelve un objeto de la clase AltaDenuncia. De esta manera, cada clase representa a una pantalla de la aplicación, y expone cada funcionalidad que la misma ofrece. AltaDenuncia sería así:&lt;br /&gt;
Volvemos a utilizar el patrón method chaining y el método '''irReservaDeLibro''' devuelve un objeto de la clase '''ReservaDeLibro'''. De esta manera, cada clase representa a una pantalla de la aplicación (page object), y expone cada funcionalidad que la misma ofrece (acciones que puedo realizar en la página y páginas a la que puedo acceder)&lt;br /&gt;
&lt;br /&gt;
==== ReservaDeLibro ====  &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class ReservaDeLibro {&lt;br /&gt;
&lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ReservaDeLibro reservar() {&lt;br /&gt;
        selenium.type(&amp;quot;libro&amp;quot;, &amp;quot;El señor de los anillos&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;codSocio&amp;quot;, &amp;quot;0001&amp;quot;);&lt;br /&gt;
        selenium.type(&amp;quot;fechaHasta&amp;quot;, &amp;quot;2011-01-01&amp;quot;);&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro aceptar() {&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new ComprobanteDeLibro(selenium);&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ComprobanteDeLibro ====  &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Assert;&lt;br /&gt;
&lt;br /&gt;
import com.test.dsl.Usuario;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
&lt;br /&gt;
public class ComprobanteDeLibro {&lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro(Selenium selenium) {&lt;br /&gt;
       this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ComprobanteDeLibro verificarReserva() {&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;El señor de los anillos&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;0001&amp;quot;));&lt;br /&gt;
        Assert.assertTrue(selenium.isTextPresent(&amp;quot;2011-01-01&amp;quot;));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public HomeBibliotecario aceptar() {&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        return new HomeBibliotecario(selenium);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tanto el  aceptar (como el cancelar en ReservaDeLibro), devuelven la home del bibliotecario.&lt;br /&gt;
&lt;br /&gt;
== Conclusiones ==&lt;br /&gt;
&lt;br /&gt;
El resultado de hacer los test de esta manera, es la facilidad de escritura y mantenimiento del test en si mismo. A su vez, se podría diseñar las clases a utilizar en el DSL a conveniencia.&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:ReservaLibro.jpg&amp;diff=5755</id>
		<title>Archivo:ReservaLibro.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:ReservaLibro.jpg&amp;diff=5755"/>
				<updated>2011-04-29T12:41:34Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: subida una nueva versión de «Archivo:ReservaLibro.jpg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagrama de navegación de un sistema simple de biblioteca, para el ejemplo de selenium con dsl.&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:ReservaLibro.jpg&amp;diff=5754</id>
		<title>Archivo:ReservaLibro.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:ReservaLibro.jpg&amp;diff=5754"/>
				<updated>2011-04-29T12:38:17Z</updated>
		
		<summary type="html">&lt;p&gt;Shichibukai: Diagrama de navegación de un sistema simple de biblioteca, para el ejemplo de selenium con dsl.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagrama de navegación de un sistema simple de biblioteca, para el ejemplo de selenium con dsl.&lt;/div&gt;</summary>
		<author><name>Shichibukai</name></author>	</entry>

	</feed>