Buscar en el Blog

jueves, 22 de julio de 2010

Cómo exponer un servicio web en Mule 2 usando Apache Axis - Parte 2

En mi anterior publicación explicaba cómo exponer un servicio web en Mule 2 usando Apache Axis. Este servicio web tenía el método helloAxis() el cuál recibía y devolvía cadenas de texto (java.lang.String). En ésta parte 2 de mi publicación explico cómo exponer un servicio web usando objetos (beans) que no forman parte del API de Java. Estos objetos son los siguientes:


Bean Field

package com.blogspot.ingmmurillo.axisws;

import java.io.Serializable;

public class Field implements Serializable{

    private String name;
    private String value;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        String result = "";
        result += "" + name + "";
        result += "" + value + "";
        result += "";
        return result;
    }
}

Como se puede observar se sobreescribe el método toString() usando tags XML para mostrar el contenido de las variables de instancia del objeto. Además, es importante que los beans que se definan implementen la interface java.io.Serializable.

Bean Message

package com.blogspot.ingmmurillo.axisws;

import java.io.Serializable;

public class Message implements Serializable {

    private Field[] fields;
    private String from;
    private String to;

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public Field[] getFields() {
        return fields;
    }

    public void setFields(Field[] fields) {
        this.fields = fields;
    }

    @Override
    public String toString() {
        String result = "";
        if (fields != null) {
            if (fields.length > 0) {

                for (Field f : fields) {
                    result += f;
                }
            }
        }
        result += "" + from + "";
        result += "" + to + "";
        result += "";

        return result;
    }
}

Como se puede observar este bean tiene un arreglo de objetos de tipo Field. De igual forma se sobreescribe el método toString() usando tags XML.

Interface WSComplexDataTypes

package com.blogspot.ingmmurillo.axisws;

public interface WSComplexDataTypes {

    public String sendMessage(Message msg);

}

La interface define el método sendMessage() el cúal recibe como parámetro un objeto de tipo com.blogspot.ingmmurillo.axisws.Message.

Clase WSComplexDataTypesImpl

package com.blogspot.ingmmurillo.axisws;

public class WSComplexDataTypesImpl implements WSComplexDataTypes {

    public String sendMessage(Message msg) {
        return msg.toString();
    }
}


Esta clase contiene la implementación del método sendMessage() el cual hace una llamada al método toString() el cual fue redefinido para cada Bean. Cuando se invoque al servicio web se devolverá el contenido en XML.

Configuración en Mule

<service name="wsComplexData">
            <inbound>
                <axis:inbound-endpoint
                        address="http://localhost:8282/webservices/axis"
                        serviceNamespace="http://ingmmurillo.blogspot.com/webservices/axis"
                        synchronous="true">
                </axis:inbound-endpoint>
            </inbound>
            <component class="com.blogspot.ingmmurillo.axisws.WSComplexDataTypesImpl"/>
        </service>


Pruebas

El servicio web será publicado en Mule bajo el siguiente URL:
http://localhost:8282/webservices/axis/wsComplexData?wsdl Obsérvese que el URL del servicio web se compone de la siguiente forma:

[address]/[service name]?wsdl

Se usó soapUI v3.5 para realizar las pruebas de invocación al servicio web como se puede observar a continuación:



Nótese cómo se arma el XML de invocación al servicio web:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:axis="http://ingmmurillo.blogspot.com/webservices/axis" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
   <soapenv:Header/>
   <soapenv:Body>
      <axis:sendMessage soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <in0>
            <fields>
               <field>
                  <name>FirstName</name>
                  <value>Mauricio</value>
               </field>
               <field>
                  <name>LastName</name>
                  <value>Mauricio</value>
               </field>
            </fields>
            <from>My Blog</from>
            <to>The World</to>
         </in0>
      </axis:sendMessage>
   </soapenv:Body>
</soapenv:Envelope>



Obteniéndose la siguiente respuesta del servicio web publicado en Mule:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <ns1:sendMessageResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://ingmmurillo.blogspot.com/webservices/axis">
         <sendMessageReturn xsi:type="xsd:string"><![CDATA[<fields><field><name>Nombre</name><value>Mauricio</value></field><field><name>Apellido</name><value>Mauricio</value></field><from>Blog</from><to>El mundo</to></fields>]]></sendMessageReturn>
      </ns1:sendMessageResponse>
   </soapenv:Body>
</soapenv:Envelope>

miércoles, 21 de julio de 2010

Java otra vez Nro. 1 en los índices de TIOBE

De acuerdo a los índices de TIOBE para la comunidad de programadores, Java ha recuperado su posición Nro. 1 después de haber bajado su posición hace unos meses. Esto es un buen indicio de que se está retornando la calma a la comunidad Java después de la adquisición de Oracle a Sun Microsystems.

Para el primer semestre del año 2010, los índices de popularidad son:

Ganadores
  1. C (+2.3%)
  2. Java (+1.2%)
  3. Objective-C (+1.1%)
Perdedores
  1. Visual Basic (-1.8%)
  2. PHP (-1.5%)
  3. Go (-0.8%)
En la siguiente tabla se muestran los resultados de índices de popularidad para el mes de Julio.

lunes, 28 de junio de 2010

Cómo exponer un servicio web en Mule 2 usando Apache Axis

Para crear servicios web existen 2 estilos de desarrollo:
  1. Contract-Last. Se comienza con el código Java y se genera el contrato del servicio web (WSDL) a partir de éste.
  2. Contract-First. Se comienza con el contrato del servicio web (WSDL) y se usa Java para implementar dicho contrato.
Mule 2 provee de dos tecnologías para trabajar con servicios web: Apache Axis y Apache CXF. En éste post explicaré como exponer un servicio web en Mule usando Apache Axis y el estilo de desarrollo Contract-Last.

En el siguiente código expondré un servicio web muy simple que solicita como entrada un nombre y un apellido y devuelve de respuesta una cadena de texto. Para trabajar con el estilo de desarrollo  Contract-Last, primero se debe de partir con la codificación Java, creando una interface con la firma de o los métodos a exponer en el servicio web y una o varias clases que implementen la interface como se muestra a continuación:


Interface HelloAxis

package com.blogspot.ingmmurillo.axisws;

public interface HelloAxis {

    public String helloAxis(String firstName, String lastName);

}

Clase HelloAxisImpl

package com.blogspot.ingmmurillo.axisws;

public class HelloAxisImpl implements HelloAxis {

    public String helloAxis(String firstName, String lastName) {

        String greeting = "Welcome to Axis " + firstName + " " + lastName;

        return greeting; 
    }
}


Una vez que se tenga codificado el código Java se usará la siguiente configuración en Mule para exponer el servicio web usando Axis, es decir para que Mule genere automáticamente el contrato (WSDL).

Configuración en Mule

<service name="helloaxis">
            <inbound>
                <axis:inbound-endpoint
                        address="http://localhost:8282/webservices/axis"
                        serviceNamespace="http://ingmmurillo.blogspot.com/webservices/axis"
                        synchronous="true">
                    <axis:soap-method method="helloAxis">
                        <axis:soap-parameter parameter="firstName" type="string" mode="IN"/>
                        <axis:soap-parameter parameter="lastName" type="string" mode="IN"/>
                        <axis:soap-return type="string"/>
                    </axis:soap-method>
                </axis:inbound-endpoint>
            </inbound>
            <component class="com.blogspot.ingmmurillo.axisws.HelloAxisImpl"/>
        </service>


En la siguiente captura de pantalla se muestra comó se consumiría el servicio web, las parámetros de entrada y la respuesta del mismo usando el cliente de servicios web SoapUI. Tomése en cuenta que la invocación al WSDL es de la siguiente forma: http://localhost:8282/webservices/axis/helloaxis?wsdl


    jueves, 3 de junio de 2010

    Cómo verificar la versión del JDK con el cúal se compilo una clase

    Existen 2 formas para verificar la versión del JDK (Java Development Kit) con el cúal fue compilada una clase.
    1. Usando el comando javap
    2. Codificando en Java para leer los 8 primeros bytes, usando clases del paquete java.io
    Los archivos de clase Java (.class) tienen 3 elementos iniciales importantes que se encuentran distribuídos en los primeros 8 bytes del archivo.


    4 Bytes
    2  Bytes
    2 Bytes
    Número Mágico
    Versión Menor
    Versión Mayor
    0xCAFEBABE
    {0,3}
    {45,46,47,48,49,50}
    11001010111111101011101010111110
     
    Los primeros 4 bytes corresponden a un número único que identifica que el archivo corresponde a un archivo de clase Java, éste número se lo conoce como número mágico y en hexadecimal corresponde al número  0xCAFEBABE.
    Los 2 bytes siguientes representan la versión menor  y los 2 bytes subsiguientes representan la versión mayor del JDK con el cuál fue compilada la clase. En la siguiente tabla se describen las versiones de la plataforma Java:


    Minor Version
    Major Version
    Java Platform
    Version
    Release Date
    3
    45
    1.0
    23-ENE-1996
    3
    45
    1.1
    19-FEB-1997
    0
    46
    1.2
    08-DIC-1998
    0
    47
    1.3
    08-MAY-2000
    0
    48
    1.4
    06-FEB-2002
    0
    49
    1.5
    30-SEP-2004
    0
    50
    1.6
    11-DIC-2006
      Utilización del comando javap

    Para utilizar el comando javap, es necesario abrir la consola de comandos del sistema operativo y ubicarse en dónde se encuentra el archivo de clase compilado, por ejemplo: suponiendo que la clase MiClase.class se encuentre en el paquete com.mypackage, el comando se usaría de la siguiente forma:

    javap -verbose MiClase

    Y se obtendría el siguiente resultado.



    Como se puede observar aquí se muestra los valores de minor version y major version, con los cuáles se pueden identificar con cuál JDK fue compilada la clase. 

    Código fuente para leer los 8 primeros bytes del archivo de clase

    Adicional al comando se podría usar el siguiente code snippet para leer los 8 bytes del archivo de clase Java:

    try {
    
        String nombreArchivo = "c:\java\src\com\mypackage\MiClase.class";
        DataInputStream in = new DataInputStream(new FileInputStream(nombreArchivo));
    
        int numeroMagico = in.readInt();
        
        if (numeroMagico != 0xCAFEBABE) {
            System.out.println(nombreArchivo + " no es una clase valida...");
        }
    
        int versionMenor = in.readUnsignedShort();
        int versionMayor = in.readUnsignedShort();
    
        System.out.println("major version = " + versionMayor);
    
        in.close();
    
    } catch (IOException e) {
        System.err.println(e);
    }
    
    

    martes, 1 de junio de 2010

    Cumpleaños Nro. 15 de Java

    James Gosling, uno de los creadores de la plataforma Java, publica en su blog que Java cumple hoy 15 años. Durante éste tiempo Java ha evolucionado bastante, lo que sí me preocupa es cómo ha caído la popularidad en los últimos años según los índices de TIOBE. Sin embargo, el futuro y destino de Java sigue en manos de nosotros los desarrolladores de software y sobre todo de las decisiones que Oracle tome para que Java siga cumpliendo muchísimos años más.


    HAPPY 15th BIRTHDAY JAVA!!!!!