Buscar en el Blog

Mostrando entradas con la etiqueta Apache Axis. Mostrar todas las entradas
Mostrando entradas con la etiqueta Apache Axis. Mostrar todas las entradas

jueves, 8 de marzo de 2012

Cómo obtener la IP de un cliente de servicio web expuesto con Axis

Para obtener la dirección IP del cliente que consume un servicio web publicado con Apache Axis se tiene que hacer lo siguiente:

1. Dentro de la clase que tiene el método que se está invocando en el servicio web importar las siguientes clases:

import org.apache.axis.Constants;
import org.apache.axis.MessageContext;

2. Finalmente, incluir el siguiente código:

MessageContext curContext = MessageContext.getCurrentContext();
String ip = curContext.getProperty(Constants.MC_REMOTE_ADDR).toString();

martes, 14 de diciembre de 2010

Cómo instalar Apache Tomcat 6 en Ubuntu Server

En ésta publicación explicaré cómo instalar Apache Tomcat 6 en un servidor Ubuntu v10.04.

1. En la consola de comandos (shell) usar el comando apt-get install

sudo apt-get install tomcat6

NOTA: es necesario que el servidor tenga acceso a Internet, ya que el comando apt-get install obtiene los paquetes de instalación de un servidor de Internet.

2. Para instalar la documentación de Apache Tomcat 6 ejecutar el siguiente comando:

sudo apt-get install tomcat6-docs

3. Para instalar la aplicación de administración de Apache Tomcat 6 (Tomcat Manager) ejecutar el siguiente comando:

sudo apt-get install tomcat6-admin

Como se describe anteriormente, la instalación de Apache Tomcat 6 no es complicada pero sí es importante conocer los siguientes aspectos relacionados con la instalación.

Ubicación de los archivos de configuración

Los archivos de configuración se crean en el directorio /etc/tomcat6. Aquí se podrán encontrar los archivos server.xml para poder cambiar el puerto del servidor Tomcat y tomcat-users.xml para poder crear usuarios que utilizarán el Tomcat Manager.

Para editar los archivos de configuración es necesario usar el comando sudo seguido de un editor de texto que puede ser vi o nano. Sí no se tiene experiencia con vi, recomiendo 100% usar el editor de texto nano como se muestra a continuación:

cd /etc/tomcat6 
sudo nano server.xml

cd /etc/tomcat6 
sudo nano tomcat-users.xml

Gestión de los servicios [Iniciar | Detener | Reiniciar]

Para detener el servicio de Apache Tomcat 6 ejecutar el siguiente comando:

sudo /etc/init.d/tomcat6 stop

Para iniciar el servicio ejecutar el comando:

sudo /etc/init.d/tomcat6 start

Para reiniciar el servicio ejecutar el comando:

sudo /etc/init.d/tomcat6 restart

Permisos para el Administrador de Tomcat (Tomcat Manager)

Para que el Tomcat Manager corra sin problemas, es necesario darle los siguientes permisos:

sudo chgrp -R tomcat6 /etc/tomcat6
sudo chmod -R gtw /etc/tomcat6

Además, es necesario crear por lo menos un usuario en el archivo de configuración tomcat-users.xml con el rol manager como se muestra a continuación:


<role rolename="manager"> 
<user username="ingmmurillo" password="1234" roles="manager">

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>

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


    viernes, 21 de mayo de 2010

    Tarea de Ant para generar clientes de servicios web usando Apache Axis

    A continuación comparto la tarea de Apache Ant para poder crear los client stubs para consumir servicios web usando Apache Axis.

    La última versión de Apache Axis es la v1.4, se lo puede descargar del siguiente link: http://www.apache.org/dyn/closer.cgi/ws/axis/1_4

    La tarea de Ant para crear los client stubs de un servicio web es la siguiente:

    <property name="axis.home" location="${lib.home}/apache-axis-1.4"/>
    
        <target name="axis-generate-client-stubs" depends="init"
                description="Generate the client stubs for a web service">
            <path id="axis.path">
                <fileset dir="${axis.home}/lib">
                    <include name="*.jar"/>
                </fileset>
            </path>
            <java classname="org.apache.axis.wsdl.WSDL2Java" fork="true">
                <arg value="-client"/>
                <arg value="-o"/>
                <arg value="${javaproject.home}/src-generated"/>
                <arg value="http://www.webservicex.net/CurrencyConvertor.asmx?WSDL"/>
                <arg value="-p"/>
                <arg value="com.myapplication.webservices"/>
                <classpath>
                    <path refid="axis.path"/>
                </classpath>
            </java>
        </target>
    
    

    En dónde:

    •  axis.home direcciona al directorio que contiene las librerías de Apache Axis
    •  -o  para configurar la ubicación en dónde se crearán las clases Java para el cliente del servicio web, en éste ejemplo: ${javaproject.home}/src-generated
    • La URL dónde se encuentra publicado el servicio web, en éste caso:  http://www.webservicex.net/CurrencyConvertor.asmx?WSDL
    • -p para definir el paquete Java en el cuál se crearán las clases del cliente del servicio web, por ejemplo: com.myapplication.webservices

    miércoles, 21 de abril de 2010

    Convertir un objeto GregorianCalendar a XMLGregorianCalendar

    Cuando se trabaja con servicios web en Java las fechas son manejadas a través de instancias de la clase javax.xml.datatype.XMLGregorianCalendar. Sin embargo, generalmente se trabaja con instancias de la clase java.util.GregorianCalendar para trabajar con fechas.

    Al generar un client stub para un servicio web usando Apache Axis los tipos de dato fecha del WSDL se mapean a objetos del tipo XMLGregorianCalendar. Sí se dispone de un objeto GregorianCalendar con el siguiente código se puede realizar la conversión a un objeto del tipo XMLGregorianCalendar.

    try {
    
    GregorianCalendar fechaX = new GregorianCalendar();
    fechaX.setTime(objetoTipoDate);
    XMLGregorianCalendar fechaXML = DatatypeFactory.newInstance().newXMLGregorianCalendar(fechaX);
    
    } catch (DatatypeConfigurationException e) {}