19 June 2016

Code quality in WSO2 projects with SonarQube

Una de las principales preocupaciones en todo proyecto de desarrollo es la deuda técnica (a.k.a technical debt), y los proyectos con WSO2 no son la excepción, en muchos productos de su "Suite" el desarrollo se basa en ficheros xml, pero...

¿Como verificar la cálidad de estos desarrollos?


La respuesta es sencilla, utilizando SonarQube y una forma rápida de empezar es usando su "XML Plugin" para crear "custom XPath Rule".


¿Qué empezamos a validar?

La respuesta sigue siendo sencilla, entre otras cosas las "Best Practices for Mediation" que WSO2 tiene publicadas. Como se puede ver en la siguiente imagen, para este post he elegido la implementación de una de ellas.


Finalmente, como resultado del análisis de nuestros proyectos podemos obtener reportes completos de las malas prácticas y la localización exacta de cada una de ellas.

Enjoy!!!
- FIN -

08 May 2016

WSO2 ESB Scatter-Gather EIP

Este patrón nos permite enviar mensajes en paralelo a múltiples destinatarios y recopilar sus respuestas para devolverla como una sola.


Es decir con una sola petición de entrada podremos enviar varias peticiones (a diferentes endpoints y con differente formato de petición), recopilar todas las respuestas, procesarlas(aplicar transformaciones) y devolver un solo mensaje.

En el siguiente ejemplo crearé un servicio proxy que invocara en paralelo las operaciones "echoInt" y "echoString" del servicio "echo" que viene con el ESB, recogerá las respuestas y devolverá un un mensaje con el resultado de las mismas.



El servicio proxy:
<proxy name="scatter-gather-proxy" ...>
  <target 
    inSequence="scatter-gather-sequence-in" 
    outSequence="scatter-gather-sequence-out"/>
</proxy>


La secuencia de entrada (inSequence) usando "Clone mediator":
<sequence name="scatter-gather-sequence-in" ...>
  <log level="custom">
    <property name="MSG" value="SEQUENCIA ENTRADA"/>
  </log>
  <clone id="echoClone">
    <target sequence="scatter-gather-echoInt-sequence-in"/>
    <target sequence="scatter-gather-echoString-sequence-in"/>
  </clone>
</sequence>


La secuencia de entrada para invocar echoInt:
<sequence name="scatter-gather-echoInt-sequence-in" ...>
  <log level="custom">
    <property name="secuencia" 
                 value="scatter-gather-echoInt-sequence-in entrada"/>
  </log>
  <property description="SOAPAction" name="SOAPAction" scope="transport"
    type="STRING" value="urn:echoInt"/>
  <payloadFactory description="echoInt" media-type="xml">
    <format>
      <echo:echoInt xmlns:echo="http://echo.services.core.carbon.wso2.org">
        <in xmlns="">$1</in>
      </echo:echoInt>
    </format>
    <args>
      <arg evaluator="xml" expression="//echoData/number"/>
    </args>
  </payloadFactory>
  <log level="custom">
    <property name="secuencia" 
                 value="scatter-gather-echoInt-sequence-in salida"/>
  </log>
  <send>
    <endpoint key="echo-endpoint"/>
  </send>
</sequence>


La secuencia de entrada para invocar echoString:
<sequence name="scatter-gather-echoString-sequence-in" ...>
  <log level="custom">
    <property name="secuencia" 
                 value="scatter-gather-echoString-sequence-in entrada"/>
  </log>
  <property description="SOAPAction" name="SOAPAction" scope="transport"
    type="STRING" value="urn:echoString"/>
  <payloadFactory description="echoString" media-type="xml">
    <format>
      <echo:echoString xmlns:echo="http://echo.services.core.carbon.wso2.org">
        <in xmlns="">$1</in>
      </echo:echoString>
    </format>
    <args>
      <arg evaluator="xml" expression="//echoData/text"/>
    </args>
  </payloadFactory>
  <log level="custom">
    <property name="secuencia" 
                 value="scatter-gather-echoString-sequence-in salida"/>
  </log>
  <send>
    <endpoint key="echo-endpoint"/>
  </send>
</sequence>


La secuencia de entrada (outSequence) usando "Aggregate mediator":
<sequence name="scatter-gather-sequence-out" ...>
  <log level="custom">
    <property name="msg" value="SEQUENCIA SALIDA"/>
  </log>
  <aggregate id="echoClone">
    <completeCondition>
      <messageCount max="2" min="2"/>
    </completeCondition>
    <onComplete expression="//soapenv:Body/*[1]" 
                 xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
      <log level="full">
        <property name="ON-COMPLETE" value="EJECUTANDO AGREGATOR"/>
      </log>
      <payloadFactory description="make response" media-type="xml">
        <format>
          <aggregateResult xmlns="">
            <returnInt>$1</returnInt>
            <returnString>$2</returnString>
          </aggregateResult>
        </format>
        <args>
          <arg evaluator="xml" 
                  expression="//ns:echoIntResponse/return" 
                  xmlns:ns="http://echo.services.core.carbon.wso2.org"/>
          <arg evaluator="xml" 
                  expression="//ns:echoStringResponse/return" 
                  xmlns:ns="http://echo.services.core.carbon.wso2.org"/>
        </args>
      </payloadFactory>
      <send/>
    </onComplete>
  </aggregate>
</sequence>


Enlaces relacionados:
- FIN -