Buscar en el Blog

viernes, 29 de octubre de 2010

Cómo instalar el JDK en la distribución de GNU/Linux: Ubuntu

En ésta publicación explico cómo instalar el Java Development Kit (JDK) v1.6 en la distribución de GNU/Linux: Ubuntu.

1. Descargar el JDK para la plataforma Linux jdk-6u22-linux-i586.bin

2. Copiar el archivo jdk-6u22-linux-i586.bin a la carpeta /usr. En mi caso el archivo fue descargado en el escritorio de Ubuntuen la ubicación /home/ingmmurillo/Desktop.

    - Abrir la consola de comandos (Shell)
    - Ingresar como superusuario (su)
ingmmurillo@ubuntu:~# cd /home/ingmmurillo/Desktop
ingmmurillo@ubuntu:/Desktop~# su
    - Copiar el archivo jdk-6u22-linux-i586.bin a la carpeta /usr
root@ubuntu:/home/ingmmurillo/Desktop# cp jdk-6u22-linux-i586.bin /usr 

3. Ir al directorio /usr y ejecutar el comando sh jdk-6u22-linux-i586.bin
root@ubuntu:/home/ingmmurillo/Desktop#cd /usr 
root@ubuntu:/usr# sh jdk-6u22-linux-i586.bin

4. Se comenzará a desempaquetar los archivos y al final pedirá la aceptación de los términos y condiciones. Una vez que se tenga todo listo el JDK estará instalado en el directorio /usr/jdk1.6.0_22

5. Por último se tiene que configurar la variable de entorno JAVA_HOME y agregar los binarios de Java al PATH del sistema operativo de la siguiente manera.

   - Ir al directorio /home/
   - Abrir el archivo _bashrc con un editor de texto
   - Colocar al final del archivo lo siguiente:
export JAVA_HOME='/usr/jdk1.6.0_22'
PATH=.:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

Para probar que la instalación del JDK y la configuración de las variables de entorno fue exitosa, abrir una terminal de comandos y ejecutar el comando java -version que deberá mostrar un mensaje similar al siguiente:
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode)

martes, 21 de septiembre de 2010

Recomendaciones para trabajar con aplicaciones Flex

Adobe Flex es una tecnología super interesante para construir interfaces gráficas de usuario web ricas en contenido, lo que se conoce como RIA (Rich Internet Application). La tecnología Flex trabaja con archivos de extensión .swf (ShockWave Flash) para lo cuál es necesario tener instalado Adobe Flash Player en cada navegador web del cliente que accederá a la aplicación.

Con la experiencia que he tenido con las aplicaciones desarrolladas en Flex, comparto algunas recomendaciones para subir los aplicativos a la nube (Internet).

1. De preferencia usar un servidor proxy como BlazeDS a diferencia de configurar el archivo crossdomain.xml

2. La configuración de las propiedades del proyecto en el IDE son claves. Una vez que se haya definido el domino en el cuál estará la aplicación por ejemplo http://www.midominio.com/flex, configurar las propiedades del Flex Server como: 

Root URL = http://www.midominio.com/flex
Context Root = /flex

3. Es recomendable hacer primero un Clean y luego un Build del proyecto.

4. Sí se tiene problemas con la compilación del proyecto y el nuevo dominio configurar el archivo hosts del sistema operativo.

En Windows > C:\Windows\System32\drivers\etc\hosts
En Linux /etc/hosts
5. Configurar adecuadamente los archivos de configuración de BlazeDS: services-config.xml y proxy-config.xml.

6. Cuando se trabaja con balanceadores de carga, es recomendable hacer un loopback al mismo servidor en base al dominio con el cuál se está trabajando.

Espero que éstas recomendaciones les sea de mucha utilidad, sí tienen alguna pregunta no duden en contactarme.

viernes, 17 de septiembre de 2010

miércoles, 11 de agosto de 2010

Utilización de JAXB para mapear clases Java a representaciones XML

JAXB es una tecnología Java que permite mapear clases de Java a representaciones XML. JAXB provee dos funciones fundamentales:

  1. marshal. Consiste en presentar un objeto Java en XML. Java Object > XML
  2. unmarshal. Consiste en presentar XML en un objeto Java. XML > Java Object
La versión 2.2.1 del API de JAXB puede ser descargada desde el siguiente link: https://jaxb.dev.java.net/2.2.1/JAXB2_20100511.jar

Esta versión trabaja con anotaciones con las cuáles se indica cuál será la raíz del documento XML, los elementos y los atributos. Las principales anotaciones son:

  • @XmlRootElement
  • @XmlElement
  • @XmlAttribute
En mi publicación anterior de "cómo exponer un servicio web en Mule" en el Bean Message sobrescribí el método toString para mostrar el contenido del objeto usando tags XML. Con el uso del API de JAXB ésto ya no es necesario y es reemplazado por anotaciones, como se muestra a continuación:

package com.blogspot.ingmmurillo.axisws;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;

@XmlRootElement
public class Message implements Serializable {

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

    @XmlAttribute
    public String getFrom() {
        return from;
    }

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

    @XmlAttribute
    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() {

        OutputStream xmlOutput = new OutputStream() {
            private StringBuilder string = new StringBuilder();

            @Override
            public void write
                    (
                            int b) throws IOException {
                this.string.append((char) b);
            }

            @Override
            public String toString
                    () {
                return this.string.toString();
            }
        };

        JAXBContext contextObj = null;
        Marshaller marshallerObj = null;
        try {
            contextObj = JAXBContext.newInstance(Message.class);
            marshallerObj = contextObj.createMarshaller();
            marshallerObj.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshallerObj.marshal(this, xmlOutput);
            xmlOutput.flush();
            xmlOutput.close();
        } catch (JAXBException e) {
            e.printStackTrace();
            return e.getMessage();
        } catch (IOException e) {
            e.printStackTrace();
            return e.getMessage();
        } finally {
            if (contextObj != null) {
                contextObj = null;
            }
            if (marshallerObj != null) {
                marshallerObj = null;
            }
        }

        return xmlOutput.toString();
    }    
}

Al realizar la invocación del servicio web la respuesta obtenida es la siguiente:

<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[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message to="The World" from="My Blog">
    <fields>
        <name>FirstName</name>
        <value>Mauricio</value>
    </fields>
    <fields>
        <name>LastName</name>
        <value>Mauricio</value>
    </fields>
</message>]]></sendMessageReturn>
      </ns1:sendMessageResponse>
   </soapenv:Body>
</soapenv:Envelope>


El XML de respuesta ahora fue generado automáticamente usando JAXB. En conclusión, JAXB permite ahorrar tiempo para realizar los procesos de marshal y unmarshal. Además, JAXB permite que el mantenimiento de un bean sea menos costoso, ayudando a los desarrolladores a trabajar de forma más ágil.

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>