viernes, 31 de mayo de 2013

Presencia de WSO2 en Cuba, América Latina y España

He estado revisando varios blogs de habla hispana que tocan los temas de SOA y me ha gustado mucho ver que la suite de WSO2 va ocupando un espacio importante.

La empresa MegaPractical de México tiene una oferta de recursos capacitado en esta suite, como pueden ver aquí [1], considerando que es una empresa que se enfoca en la soluciones de TIBCO podría ser un salto importante a mediano y largo plazo, pasar de una solución propietaria a una  solución open source. Ya el tiempo lo dirá.

Hay un blog también de desarrolladores de WSO2 medio abandonado al parecer que pueden encontrar en [2] que aunque no tiene casi contenido aparece en las búsquedas.

La empresa OpenSistemas pues también le ha echado un ojo a WSO2 y yo creo que los 2 porque han sacado esta entrada [3] muy buena a mi entender sobre el gobierno SOA y como comenzar a implementarlo usando la suite  de WSO2. Básicamente tocan algunos temas de gobierno y como usando el Registro de Gobierno y el Developer Studio de WSO2 se puede implementar un requerimiento de negocio vinculado al gobierno SOA.

Uno de los blogs más interesantes que me he topado es de un venezolano, creo, y que pueden encontrar en [4]. En este blog se abordan tanto temas de SOA como de BPM, lo cual es lógico debido al vínculo que existe entre ambos paradigmas. Otra de las entradas de este blog que me gustó fue esta [5] donde se abordan un conjunto de preguntas que se deben hacer y responder en un proyecto de integración empresarial.

Por último les dejo este otro blog de la empresa GFI Informática de España con una entrada muy interesante en [6] donde se establece una comparativa entre varias soluciones open opensource para SOA donde claro quién gana es WSO2.

Aquí les dejo una imagen que deja constancia de esto último.


Estoy de acuerdo en el tema de los adaptadores, creo que es algo que están sacando bajo demanda, quizás sea por eso que no tienen tantos. En el otro tema que Mule EE les saca un pedacito de ventaja es en el Entorno Productivo, habría que ver qué criterios usaron aquí. En los demás ni hablar, totalmente de acuerdo.

Y claro tenemos a este blog donde se han ido destacando las herramientas de WSO2 y poco a poco iré incluyendo escenarios prácticos de uso de cada herramienta.

Mientras, si no sabes nada de WSO2 y quieres ir viendo algo puedes ir a http://wso2.com que es su sitio oficial y http://wso2.org que es su sitio para los artículos y presentaciones que hacen.
Además tienes estas entradas de mi blog que también te pueden ser de ayuda si no lees mucho inglés:


Y bueno eso es todo. En próximas entradas seguiremos viendo temas prácticos de la suite de WSO2.


miércoles, 29 de mayo de 2013


En cualquier empresa u organización existen sistemas encargados de automatizar parte del trabajo. La implementación de estos sistemas software conlleva una fase de análisis y diseño donde los desarrolladores modelan el funcionamiento del mismo en diferentes escenarios, utilizando técnicas como los casos de uso, que se pueden presentar cuando los usuarios interactúan con el sistema.


Este modelado generalmente muestra determinadas decisiones que pueden ejecutar los usuarios y que se toman a partir de condiciones y bajo ciertos criterios. Estas decisiones, condiciones y criterios son codificadas en un lenguaje de programación y así es como nace el programa informático, el sistema software en cuestión.


Es muy común ver tanto en el modelado como en la implementación cosas como estas:
SI [ se cumplen condiciones/criterios] THEN [acción/decisión] ELSE [acción/decisión] esto no es otra cosa que una regla de negocio cuando implica decisiones de negocio, y son encapsuladas dentro de las aplicaciones y codificadas, lo que las hace muy difícil de cambiar.


Pero hay un problema, las empresas y organizaciones, cuyas decisiones, condiciones y criterios son codificadas dentro de un sistema software son entes cambiantes, y lo que hoy era una cosa mañana puede ser otra completamente distinta. Entonces: ¿qué pasa cuando las decisiones, condiciones y criterios cambian en el negocio? Pues las aplicaciones dejan de ser útiles y hay que modificarlas o cambiarlas. O seguirlas usando y obligar al negocio a no cambiar. Ese es uno de las causas del llamado GAP o distanciamiento entre el Negocio y los departamentos de TI que tanto afecta a las empresas.

Las decisiones, condiciones y criterios se conocen en el argot informático como reglas de negocio y pueden ser extraídas de los sistemas software para evitar que este tipo de problemas ocurran y se pueden usar herramientas que las automaticen y las pongan a disposición de cualquier aplicación que las necesite.
Si tomamos por ejemplo los sistemas de gestión de las universidades nos podríamos encontrar con reglas de negocio como estas.


Ej de reglas de negocio:
  • SI el usuario es de tipo VIP ENTONCES  procesar su petición inmediatamente, SI NO si el monto de la petición supera los 200USD enviar la petición al director de área para su aprobación.
  • SI la cantidad de peticiones durante 1 minuto es mayor de 200 ENTONCES adicionar un impuesto del 0.5%
  • SI el estudiante tiene suspendidas 2 pruebas en la asignatura X ENTONCES no tiene derecho a presentarse a la prueba final de la asignatura X y se debe notificar al jefe de la asignatura correspondiente.
  • SI el estudiante tiene 5 puntos en más de 10 preguntas escritas de la asignatura X ENTONCES convalidarle el próximo examen de dicha asignatura.
  • SI existen más del 50 % de desaprobados en un grupo de clase ENTONCES notificar al jefe de asignatura correspondiente.
  • SI el real de consumo eléctrico en la universidad sobrepasa el 100 % de lo planificado ENTONCES notificar al rector.
  • SI el espacio de consumo en la bandeja de entrada de la cuenta de correos llega al 95 % ENTONCES enviar una notificación al usuario.



La empresa WSO2 ha desarrollado una herramienta que consiste en un Sistema para la Administración/Gestión de Reglas de Negocio o BRMS por sus siglas en inglés.
Esta herramienta conocida como Bussiness Rules Server o BRS, permite la gestión de la codificación, ejecución y mantenimiento del conjunto de reglas de negocio de una empresa u organización. Para lograr esto usa Drools, un framework desarrollado por la Empresa REDHAT para JBOSS facilitando la implementación de reglas de negocio.
BRS permite que estas reglas sean expuestas como servicios web, brindando todas las potencialidades de la plataforma Carbon, para que sean accesibles a cualquier sistema software que necesite consultar las reglas. Esto hace sumamente sencillo su consumo.
Aquellas organizaciones que apuestan por soluciones BPM deben apostar además por sistemas que permitan la gestión de las reglas de negocio. De esta manera las reglas están fuera del proceso pero son usadas por este y consumidas a través de llamadas a servicios web.
Lo que se podría hacer entonces con las aplicaciones propias que ya tenemos si quisiéramos irlas evolucionando y adecuarlas a las tecnologías actuales pasaría por los siguientes pasos.

  • Extraer de todas las aplicaciones que ya tenemos desarrolladas las reglas de negocio.
  • Codificar todas las reglas de negocio en un formato estándar usando Drools.
  • Exponer las reglas de negocio como servicios web, usando los estándares ws-* para proveer seguridad, rendimiento, confidencialidad, etc. usando la suite de WSO2 y el BRS.
  • Reimplementar los procesos de negocio eliminado la reglas implementadas en los mismos y consumiéndolas desde el BRS de WSO2.

Ventajas:

  • Se hace evidente que todas las reglas implementadas con Drools y expuestas como servicios podrían ser reutilizadas fácilmente por múltiples aplicaciones.
  • Además su mantenimiento y gestión en el tiempo se facilitaría de igual manera ya que al no estar codificada dentro de las aplicaciones, en cuyo caso requeriría una modificación de las mismas.
  • El personal del negocio puede modificar las reglas de negocio, dárselas al personal técnico y este realizar los cambios. En caso de que se posea un sistema o componente que no requiera de habilidades técnicas o de programación entonces el mismo personal del negocio puede actualizar las reglas a ser expuestas a través de servicios web.
En otra entrada veremos cómo se pueden crear reglas de negocio usando esta herramienta y exponerla como servicios web.

StratosLive, la propuesta de WSO2 en PaaS. Ejemplos prácticos.

StratosLive es una Plataforma como servicio ,o Paas, desplegada en Amazon usando Stratos, la solución para la nube de WSO2.
Quisiera mostrarles un ejemplo de cómo se puede emplear para el despliegue de aplicaciones y servicios.

El escenario en cuestión es el siguiente:
  • Se tiene una aplicación web en Java que se desea desplegar en una Nube Pública.
  • Se conoce de StratosLive como una PaaS y se desea probar como es este proceso.
En el ejemplo se está usando la aplicación del framework Axis2 para ser desplegada en la Nube. Para seguir el ejemplo esta aplicación se puede descargar de aquí y  bajar su .war que está en un fichero .zip.
StratosLive usa Apache Tomcat por debajo, como todas las aplicaciones de WSO2, por eso es que es tan fácil ya desplegar aplicaciones web con WSO2. Lo que debemos hacer entonces ahora es registrarnos en la Nube.



La información que deben introducir es la siguiente:
  • Dominio.
  • El tipo de pago que se hará, si solo se quiere usar como prueba seleccionen Demo.
  • Nombre y Apellidos.
  • Usuario y contraseña.
  • Dirección de correo electrónico.


Una vez pasado el registro recibirán un correo para validar su cuenta y darles acceso al sistema. Al cual podrán entrar usando su usuario@dominio.

Luego es lo mismo que con el AS normal, van a Manage->Web Applications->Add


Dan clic en “Choose File” y seleccionan su war, en este caso el de axis2 pero puede ser cualquier otro.

Una vez que se cargue pueden ver la aplicación en Manage->Web Applications->List

Como se ve en la imagen se pueden hacer varias cosas con la aplicación, borrarla, recargarla o detenerla y además se puede ir a la aplicación dando donde dice “Go To URL”.
Si damos clic en el nombre de la aplicación en la columna Context veremos algo como esto:
Aquí se pueden ver las sesiones activas, expiradas, la cantidad máxima de sesiones, las rechazadas y algunas estadísticas más siempre interesantes para saber como va ejecutándose la aplicación.
Para probar la aplicación debemos dar clic donde decía “Go To URL” y veremos lo siguiente:
La página clásica del framework de axis2.
A partir de aquí todo es como se trabaja normalmente con axis2 desplegado en un contenedor de aplicaciones para Java.
Cosas interesantes:
  • Ya no necesitamos un contenedor de aplicaciones para desplegar las aplicaciones que hagamos. Tampoco hay que preocuparse por configurarlo.
  • No necesitamos configurar un servidor y darle salida a internet.
  • Podemos usar las potencialidades de Stratos para desplegar no solo la aplicación si no su BD y usar varios de los patrones de integración en la Nube que existen con el objetivo de asegurar las comunicaciones.
  • Iremos pagando en función de lo que usemos.

Los invito a crear una cuenta en StratosLive y a probar todos los ejemplos que vaya poniendo aquí en dicha solución. Así no tendrán que descargarse y configurar las herramientas de WSO2 y podrán probar esta magnífica solución.
De momento creo que podrían ir desplegando el servicio, tal y como hicimos en esta entrada

viernes, 24 de mayo de 2013

En esta entrada implementaremos el siguiente escenario.


Si al servicio que implementamos, desplegamos y consumimos en las entradas anteriores quisiéramos consumirlo nuevamente pero de forma segura deberíamos de hacer algunos cambios en su diseño.

Esto no lo hicimos desde el inicio para dar pie a esta entrada :-D pero la idea es que de los bindings del servicio que ya tenemos que son el HTTP, SOAP11 y SOAP12 pues tengamos 2 puertos por cada uno de ellos. Uno seguro y el otro inseguro. Ya tenemos los inseguros así que debemos crear los seguros.


Vean que cuando se usa el estándar SOAP versión 1.2 se usa el namespace referenciado por soap12 y que al inicio del WSDL podrán encontrar xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"

Una vez hecha la modificación la imagen gráfica del WSDL visto con el eclipse tendría esta forma.



El código en la vista XML del WSDL de uno de estos puertos sería algo como esto:
    <wsdl:port name="HolamundoHttpsSoap12Endpoint"
                binding="ns:HolamundoSoap12Binding">
                <soap12:address location="https://www.example.org/" />
    </wsdl:port>



Lo importante es que el nombre del puerto lleva una s detrás del http para indicar que se usará un canal encriptado https. Y lo otro es que la dirección usa https en vez de http.

Si vuelven a revisar el WSDL que muestra el Application Server verán lo siguiente:

A partir de aquí deberíamos volver a redesplegar el servicio y probarlo a consumir de forma insegura como ya expliqué en otras entradas.
Una vez que comprueben que los cambios introducidos no han afectado el consumo inseguro pues implementaremos los siguientes pasos:

Paso 1:  iremos al dashboard del servicio y le asignaremos el menor nivel de seguridad. En el caso de la suite de wso2 es el uso del UserNameToken. O sea encriptar el canal de comunicación y usar HTTPS y enviar un token que contenga el usuario y la contraseña, ambos en texto plano, de quien desee consumir el servicio. Este usuario debe ser uno de los que están en alguno de los almacenes de usuario que tiene configurada la herramienta.

Paso 2:  usando la funcionalidad del “Try it” consumiremos el servicio seguro especificando el usuario/contraseña del admin del Application Server, que es el único usuario que tenemos hasta el momento en la herramienta.

Paso 3: implementaremos un cliente de este servicio en JAVA usando para ello el Developer Studio de WSO2.

Así que manos a la obra.

Para implementar el paso 1 nos vamos al dashboard de servicio que luce como sigue en la parte de “Quality of Service Configuration”:
Damos clic en Security y  se nos mostrará la interrogante de si habilitamos la seguridad, y seleccionamos Yes. Automáticamente se despliega el listado de posibles escenarios de seguridad. Solo les mostraré los básicos pero son 16.


Como ven marcamos el de UsernameToken y vamos al final de la página para darle al botón Next.

Luego de dar Next se nos pide especificar los grupos que tendrán permiso de acceso al servicio. Una autenticación básica para poder validar el usuario y la contraseña que se introduzcan.
Y por último damos Finish.
Y eso es todo, ya tenemos un servicio seguro sin tocar su implementación.

Cuando volvemos al Dashboard del servicio vemos que ahora solo el servicio está exponiendo un único endpoint, el seguro.
Ahora vamos a realizar el paso 2.
Le damos clic a “Try it” y veremos lo que nos sale.
En mi caso el firefox me dice que la conexión está cifrada pero no verificada, es que no confía en el certificado auto firmado que viene por defecto con la herramienta.

Luego de dar en que entendemos los riesgos y añadir la excepción vemos lo siguiente:

Como ven ya el Try it detectó la seguridad y nos da la opción de que podamos añadir el usuario y la contraseña. Introducimos admin y admin que son los valores por defecto y asignamos un nombre y un apellido y la respuesta no se hace esperar.



Ahora funciona, pero realmente funciona? Una manera de comprobarlo es ver los mensajes que se intercambian. Aquellos que sepan usar el TCPMon los invito a hacerlo pero al estar el canal encriptado poco podrán hacer a no ser que realicen una configuración y usando el par de llaves asimétricas del servidor puedan ver dentro del canal cifrado, pero a aquellos que quieran ver la estructura de los mensajes sin complicarse tanto los invito entonces a usar otra funcionalidad de la suite de WSO2 y de su framework CARBON y por lo tanto incluida en todas  las herramientas: el SOAP TRACER.

Para usarlo nos vamos a la pestaña Monitor del menú:

Y pinchamos en SOAP Tracer.
Se nos pregunta si queremos habilitar el soap tracer y le damos que YES. Veremos lo siguiente:

Ahora volvemos al  try it y consumimos de nuevo el servicio. Y cuando regresamos al soap tracer tendremos lo siguiente:

O sea el soap tracer ha capturado los mensajes, nos muestra la hora de consumo del servicio y los mensajes tanto de entrada como de salida. Es imposible mostrarlos completamente pero en el mensaje request vean como se ha añadido un encabezado “Security” y dentro del mismo un timestamp para evitar que el mensaje sea usado, reenviado, fuera de ese rango de tiempo como una medida de proteccion. También verán que hay un token Username que tiene el usuario y el password introducidos por el usuario. Cada uno de los mensajes pueden visualizarlo a pantalla completa si lo desean y ver su contenido adecuadamente.

Para finalizar esta entrada que ya se ha extendido vamos al paso 3. Consumiremos el servicio asegurado con usernametoken.

Los invito a probar el cliente creado en la otra entrada, les resultará imposible porque el endpoint que usábamos ya no existe. Si lo cambian por  el que existe ahora recibirán varios errores relacionados con el certificado que deberían tener y que no tienen. Aun.

Creamos un proyecto siguiendo los mismos pasos que vimos en la otra entrada para generar las clases del stub.
Luego de implementar el cliente y añadir las dependencias tal y como hicimos para el consumo del servicio inseguro nos sigue dando un error y está claro porque no hemos hecho nada con la seguridad.

Hasta  el momento mi implementación luce así:
package org.blogs.ejemplos.serviciosaxis2;

import java.rmi.RemoteException;
import org.apache.axis2.AxisFault;
import org.blogs.ejemplos.serviciosaxis2.HolamundoWSDLStub.Holaati;
import org.blogs.ejemplos.serviciosaxis2.HolamundoWSDLStub.HolaatiResponse;
import org.blogs.ejemplos.serviciosaxis2.HolamundoWSDLStub.Persona;

public class Cliente {

                /**

                * @param args

                */
                public static void main(String[] args) {

                               try {
                                               HolamundoWSDLStub stub = new HolamundoWSDLStub();

                                               Holaati holaati = new Holaati();
                                               Persona param = new Persona();
                                               param.setNombre("nombre1");
                                               param.setApellidos("apellido1");
                                               holaati.setPersona(param);

                                               HolaatiResponse respuesta = stub.holaati(holaati);
                                               System.out.println("La respuesta es:   " 
              + respuesta.get_return().getSaludo());

                               } catch (AxisFault e) {
                                               e.printStackTrace();
                               } catch (RemoteException e) {
                                               e.printStackTrace();
                               }
                }
}




Luego de realizar los cambios necesarios en el código nos queda la siguiente implementación con los comentario de las cosas nuevas incluidos. Pruébenlo y me dicen.
import java.rmi.RemoteException;

import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axis2.AxisFault;
import org.apache.axis2.client.Options;
import org.apache.neethi.Policy;
import org.apache.neethi.PolicyEngine;
import org.apache.rampart.RampartMessageData;
import org.blogs.ejemplos.serviciosaxis2.HolamundoWSDLStub.Holaati;
import org.blogs.ejemplos.serviciosaxis2.HolamundoWSDLStub.HolaatiResponse;
import org.blogs.ejemplos.serviciosaxis2.HolamundoWSDLStub.Persona;

public class Cliente {

 private static Policy loadPolicy(String xmlPath) throws Exception {
  StAXOMBuilder builder = new StAXOMBuilder(xmlPath);
  return PolicyEngine.getPolicy(builder.getDocumentElement());
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  try {

   String trustStore = null;

   // ubicación del almace de llaves que contiene el certificado del
   // servidor AS
   trustStore = "c:\\keys\\cliente.jks";

   // ubicacción de la política que usa el servicio para la seguridad.
   String policyFilePath = "d:\\UTOverTransport.xml";
   // se definen las propiedades para encriptar el canal de comuncación
   // especificando el almacen de certificados de donde se extraerá el
   // certificado correspondiente al servidor
   System.setProperty("javax.net.ssl.trustStore", trustStore);
   System.setProperty("javax.net.ssl.trustStorePassword", "cliente");

   // aqui especificamos el endpoint seguro
   HolamundoWSDLStub stub = new HolamundoWSDLStub(
     "https://192.168.0.224:9445/services/HolamundoWSDL/");

   // optenemos las opciones del servicio
   Options options = stub._getServiceClient().getOptions();
   // enganchamos el modulo de rampart para la seguridad en el flujo de
   // los mensajes.
   stub._getServiceClient().engageModule("rampart");

   // pasamos el usuario y la contraseña
   options.setUserName("admin");
   options.setPassword("admin");
   // asignamos la política de servicio a las opciones del stub.
   options.setProperty(RampartMessageData.KEY_RAMPART_POLICY,
     loadPolicy(policyFilePath));
   stub._getServiceClient().setOptions(options);

   Holaati holaati = new Holaati();
   Persona param = new Persona();
   param.setNombre("nombre1");
   param.setApellidos("apellido1");
   holaati.setPersona(param);

   HolaatiResponse respuesta = stub.holaati(holaati);

   System.out.println("La respuesta es:   "
     + respuesta.get_return().getSaludo());

  } catch (AxisFault e) {
   e.printStackTrace();
  } catch (RemoteException e) {
   e.printStackTrace();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}




Las librerías que usé fueron las siguientes(tengan en cuenta que las versiones pueden variar):

axiom-1.2.11.wso2v1.jar
axis2-1.6.1.wso2v1.jar
commons-codec-1.3.0.wso2v1.jar
commons-httpclient-3.1.0.wso2v1.jar
commons-io-2.0.0.wso2v1.jar
geronimo-stax-api_1.0_spec-1.0.1.wso2v1.jar
httpcore-4.1.0.wso2v1.jar
neethi-2.0.4.wso2v3.jar
opensaml2-2.0.0.alpha1-wso2v1.jar
org.wso2.carbon.addressing-3.2.0.jar
org.wso2.carbon.logging-3.2.0.jar
org.wso2.securevault-1.0.0.jar
rampart-core-1.6.1.wso2v1.jar
rampart-policy-1.6.1.wso2v1.jar
rampart-trust-1.6.1.wso2v1.jar
woden-1.0.0.M8-wso2v1.jar
wsdl4j-1.6.2.wso2v2.jar
wss4j-1.5.11.wso2v1.jar
XmlSchema-1.4.7.wso2v1.jar

Luego de implementar un ciclo sencillo para consumir varias veces el servicio pueden ver las siguientes estadísticas en su dashboard.


En otras entradas estaremos viendo cómo usar el SOAPUI para consumir un servicio y hacer pruebas de carga y estrés.

jueves, 23 de mayo de 2013

Supongamos que tenemos que consumir un servicio desplegado en el Application Server de WSO2.

El WSDL del servicio es el siguiente:
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://serviciosaxis2.ejemplos.blogs.org" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://serviciosaxis2.ejemplos.blogs.org">

  <wsdl:types>

    <xs:schema xmlns:ax24="http://serviciosaxis2.ejemplos.blogs.org/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://serviciosaxis2.ejemplos.blogs.org">

         <xs:element name="holaati">

            <xs:complexType>

               <xs:sequence>

                  <xs:element minOccurs="0" name="persona" nillable="true" type="ns:Persona"/>

               </xs:sequence>

            </xs:complexType>

         </xs:element>

         <xs:element name="holaatiResponse">

            <xs:complexType>

               <xs:sequence>

                  <xs:element minOccurs="0" name="return" nillable="true" type="ns:PersonaRespuesta"/>

               </xs:sequence>

            </xs:complexType>

         </xs:element>

                  <xs:complexType name="Persona">

            <xs:sequence>

               <xs:element minOccurs="0" name="apellidos" nillable="true" type="xs:string"/>

               <xs:element minOccurs="0" name="nombre" nillable="true" type="xs:string"/>

            </xs:sequence>

         </xs:complexType>

         <xs:complexType name="PersonaRespuesta">

            <xs:sequence>

               <xs:element minOccurs="0" name="saludo" nillable="true" type="xs:string"/>

            </xs:sequence>

         </xs:complexType>

      </xs:schema>

  </wsdl:types>

  <wsdl:message name="holaatiResponse">

    <wsdl:part name="parameters" element="ns:holaatiResponse">

    </wsdl:part>

  </wsdl:message>

  <wsdl:message name="holaatiRequest">

    <wsdl:part name="parameters" element="ns:holaati">

    </wsdl:part>

  </wsdl:message>

  <wsdl:portType name="HolamundoPortType">

    <wsdl:operation name="holaati">

      <wsdl:input message="ns:holaatiRequest" wsaw:Action="urn:holaati">

    </wsdl:input>

      <wsdl:output message="ns:holaatiResponse" wsaw:Action="urn:holaatiResponse">

    </wsdl:output>

    </wsdl:operation>

  </wsdl:portType>

  <wsdl:binding name="HolamundoSoap11Binding" type="ns:HolamundoPortType">

    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

    <wsdl:operation name="holaati">

      <soap:operation soapAction="urn:holaati" style="document"/>

      <wsdl:input>

        <soap:body use="literal"/>

      </wsdl:input>

      <wsdl:output>

        <soap:body use="literal"/>

      </wsdl:output>

    </wsdl:operation>

  </wsdl:binding>

  <wsdl:binding name="HolamundoHttpBinding" type="ns:HolamundoPortType">

    <http:binding verb="POST"/>

    <wsdl:operation name="holaati">

      <http:operation location="holaati"/>

      <wsdl:input>

        <mime:content part="parameters" type="text/xml"/>

      </wsdl:input>

      <wsdl:output>

        <mime:content part="parameters" type="text/xml"/>

      </wsdl:output>

    </wsdl:operation>

  </wsdl:binding>

  <wsdl:binding name="HolamundoSoap12Binding" type="ns:HolamundoPortType">

    <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

    <wsdl:operation name="holaati">

      <soap12:operation soapAction="urn:holaati" style="document"/>

      <wsdl:input>

        <soap12:body use="literal"/>

      </wsdl:input>

      <wsdl:output>

        <soap12:body use="literal"/>

      </wsdl:output>

    </wsdl:operation>

  </wsdl:binding>

  <wsdl:service name="HolamundoWSDL">

    <wsdl:port name="HolamundoHttpEndpoint" binding="ns:HolamundoHttpBinding">

      <http:address location="http://192.168.0.37:9765/services/HolamundoWSDL.HolamundoHttpEndpoint/"/>

    </wsdl:port>

    <wsdl:port name="HolamundoHttpSoap11Endpoint" binding="ns:HolamundoSoap11Binding">

      <soap:address location="http://192.168.0.37:9765/services/HolamundoWSDL.HolamundoHttpSoap11Endpoint/"/>

    </wsdl:port>

    <wsdl:port name="HolamundoHttpSoap12Endpoint" binding="ns:HolamundoSoap12Binding">

      <soap12:address location="http://192.168.0.37:9765/services/HolamundoWSDL.HolamundoHttpSoap12Endpoint/"/>

    </wsdl:port>

  </wsdl:service>

</wsdl:definitions>





Abrimos el eclipse y vamos al dashboard del Developer Studio y seleccionamos la opción “Generate Axis2 Web Service Client”

En dependencia de donde tengamos nuestro servicio será la opción que marcaremos y cargaremos el fichero. En mi caso usaré esta URL: http://192.168.0.37:9765/services/HolamundoWSDL?wsdl que se corresponde con el último servicio que desplegamos en la otra entrada.

Ahí nos pedirá que creemos  un proyecto si no tenemos uno aun.

Creamos el proyecto y damos Finish.


Ahora se nos muestra esta pantalla y damos Finish igual.



Así ya hemos creado el proyecto completo del cliente del servicio como pueden ver a continuación.


Crearemos una clase que será la que consumirá el servicio. La clase que ven que se creó automáticamente contiene la funcionalidad para interactuar con el servicio web.
Esta clase quedará de la siguiente manera:

Si la prueban ahora les dará un error porque faltan algunas dependencias. En esto nos ayuda el Developer Studio.
Damos clic derecho en el proyecto y nos vamos a configurar el Build Path.


Seleccionamos Add Library y luego damos en WSO2 ClassPath Libraries.

Damos en Next y marcamos todas las de Axis2.

Y en la pestaña del IS marcamos lo siguiente:


Por ultimo nos falta agregar una librería que fue introducida recientemente en el framework carbon y que no viene en la versión del Developer Studio que estoy empleando, por lo que tengo que buscarle en:
[AS]\repository\components\plugins\ org.wso2.securevault_1.0.0.wso2v2.jar la agregamos y listo. Ya podemos ejecutar nuestro cliente.

Cuando ejecutamos nuestra clase vemos la siguiente respuesta:


Lo que nos indica que obtuvimos la respuesta del servicio web que esperábamos.

Luego de ejecutar el cliente varias veces podemos ir al dashboard del servicio y ver la estadísticas de su uso.



Y bueno eso es todo hasta el momento.


Desplegando un servicio Axis2 en el Application Server de WSO2

En esta entrada veremos como desplegar el servicio axis2 que creamos en la entrada anterior.

Para ello nos descargamos la instalación del Application Server versión 5.1.0 del siguiente sitio.

Una vez tengamos el .zip lo descompactamos, vamos a la carpeta [AS]/bin/ y ejecutamos el fichero wso2server.sh si estamos en Linux o wso2server.bat si estamos en Windows. [AS] es donde descompactamos el .zip.

Aquí pueden ver lo que tiene el .zip adentro.

Una vez que se inicie el servidor si se fijan en la consola podrán ver que muestra la URL que deben poner en el navegador para tener acceso a la herramienta. Tengan en cuenta también que por defecto  el usuario es admin y la contraseña es admin.

Por defecto la URL tiene esta estructura: https://IP:9443/carbon/ donde IP es la IP de su máquina, aunque también pueden poner el nombre.
Cuando entran a esa URL la página que se les muestra es la siguiente:

Ahí ponen usuario y contraseña y listo.
Una vez que entren buscan en el menú la opción “AAR Service”, dan clic y verán esta pantalla.
Es la que se usa para desplegar un archivo .aar así que da clic en el botón que dice “Examinar” buscan donde tienen su servicio, el primero que creamos, y lo despliegan dando clic en el botón Upload.
Deben de esperar unos segundos y refrescar la página para que vean el servicio.

El servicio en mi caso se llama “Holamundo” y eso es porque ese es el nombre que tiene en el fichero services.xml como pueden ver en la entrada anterior.
Para ver su WSDL basta con que den clic en WSDL1.1 y si quieren probar el servicio dan clic donde dice “Try it”.

Cuando le den al try it verán una página como esta.
Vean que le cambié la posición a horizontal para que se viera bien todo el XML del mensaje.

Cuando entren un nombre y un apellido y le den al botón “Send” les dará un error. Así que ya saben, no se preocupen. La causa está en que este servicio está inicialmente para desplegarse en una instalación de axis2, pero no en el Application Server y si se fijan en el endpoint verán que no apunta al puerto por el que escucha el Application Server si no por el 8080 como si fuera a desplegarse en axis2.

La solución es bastante sencilla y me permite enseñarles un poco más de la herramienta.
Debemos ir al dashboard del servicio: listamos todos los servicios, damos clic en el nombre del servicio y ya estamos en el dashboard. Luego damos clic donde dice “parameters” y veremos algo como esto:


Damos clic en “Add New” y ponemos el nombre “modifyUserWSDLPortAddress” damos OK y luego cambiamos esto “TODO: Enter value here” por esto “true”.

Le damos al botón Update y listo. Así le hemos dicho al Application Server que para este servicio modifique los puertos para que se correspondan con las herramientas.
Ahora vuelven a probar

Y ya pueden ver como tiene bien el endpoint. Esto una vez que se aprende se puede hacer en el mismo services.xml de la implementación del servicio cuando se está trabajando en el developer studio.

Cuando le dan al botón Send, la respuesta nos dice.


Y así probamos ya el primer servicio.

El segundo caso es casi lo mismo, aquí lo único que hice fue cambiarle el nombre al servicio en el WSDL que estoy usando, aunque si hubiera tenido el mismo nombre aún se lo hubiera podido cambiar en el fichero services.xml.
Lo desplegamos de la misma forma y cuando vamos a probarlo vemos lo siguiente.

Como ven ya en este caso tenía bien el puerto porque el parámetro se añadió automáticamente al services.xml cuando el servicio se creó desde un WSDL.
Le puse nombre y apellidos y la respuesta es la siguiente:

Y eso es todo.

En otra entrada veremos cómo crear un cliente para un servicio axis2 desde JAVA también usando el Developer Studio de WSO2.

miércoles, 22 de mayo de 2013


Para crear un servicio de axis2 usando el Developer Studio se pueden usar 2 variantes:

  1. Si ya tienes el código implementado puedes generar el servicio a partir del mismo.
  2. Si tienes el WSDL, diseño del servicio, lo puedes usar para generar el esqueleto de la implementación del servicio y de ahí su implementación final.

Veremos las 2 variantes.

Variante 1.


En el Dashboard, la imagen que ven al inicio, damos clic en Axis2 Service Project y verán lo siguiente:


Usaremos la primera opción ya que la segunda es para la variante 2.

Damos siguiente y nos lleva a esta pantalla. Ahí definimos un nombre para el proyecto, el nombre del paquete y el nombre que tendrá la clase donde implementaremos el servicio. En mi caso lo pongo como sigue:

Damos siguiente y veremos una pantalla con algunos valores referentes a Maven, porque el proyecto que se crea es un proyecto de Maven, eso yo lo dejo así  y doy Finish.


Ya aquí se nos crea el proyecto y lo pueden ver en la siguiente imagen:



Es sobre esta clase donde debemos implementar los métodos que queramos sean expuestos a través del servicio web. Es importante que tanto los parámetros de entrada y de salida sean clases para que macheen con el estilo document/literal que es la buena práctica recomendada por el WS-I, estándar para la interoperabilidad entre servicios web.

Luego de realizar una implementación sencilla tendríamos lo siguiente:


Donde las clases que estamos usando las he creado y son las siguientes:



Como se ve es una implementación muy sencilla pero que se ajusta a nuestro propósito.

Si queremos que se genere el WSDL de este servicio le damos clic derecho al proyecto y seleccionamos la opción “Generate WSDL” tal y como muestra la siguiente imagen.


Cuando hacemos esto se nos muestra la siguiente ventana.


Y vean que yo le digo que me guarde el WSDL dentro de la carpeta META-INF. Luego le damos OK.

Una vez hecho esto verán el WSDL del servicio.

Lo otro que nos queda es desplegar el servicio como un fichero .aar, para hacerlo  podemos dar clic derecho en el proyecto y seleccionar la opción “Export Project as Deployable Archive”.


Ahí ponemos donde queremos guardar el servicio y listo. Ya tendremos el fichero en la ubicación seleccionada.


Variante 2.

Ahora supongamos que ya teníamos el WSDL del Servicio. Usaremos este WSDL.

Realizaríamos el primer paso de la variante 1 pero en este caso seleccionamos la opción que pueden ver en esta imagen.

Ahora seleccionamos donde tenemos el WSDL y le damos un nombre al proyecto.

Eso nos crea el proyecto como pueden ver en la siguiente imagen.

La  clase donde debemos implementar es HolamundoSkeleton.java si cambian la clase o desean implementar en otra tengan en cuenta que deben ir al fichero marcado en la siguiente imagen:

Y modificar el nombre de la clase poniendo la clase que realmente contiene la implementación. Esta es la estructura de ese fichero:
Otra cosa que hago es mover el WSDL del servicio para dentro de la carpeta META-INF, eso es importante porque si no después les da un error.

Al inicio la clase que implementa el servicio tiene esta forma:

Luego de implementar la funcionalidad que queremos la clase queda como sigue:


Para crear el .aar seguimos los mismos pasos que en la variante anterior.

En otra entrada veremos como lo podemos desplegar en el Application Server de WSO2.