25 noviembre, 2012

Hashtable

Hashtable es una estructura Java de tipo diccionario que permite almacenar elementos identificados por pares clave/valor de forma sencilla. Es similar a HashMap, con la diferencia de que Hashtable es sincronizado.

Hashtable no permite que se incluyan ni keys ni values a null, en caso de intentar añadir un elemento a null, saltará la excepción NullPointerException.

Hashtable tiene varios constructores:

  • Hashtable()
  • Hashtable(int size)
  • Hashtable(int size, float fillRatio)
  • Hashtable(Map m)

Hashtable <String, String> ejemplo= new Hashtable();

Para añadir elementos en el Hashtable existe el método put(Object key, Object value), con el que podremos ir introduciendo los elementos de nuestro Hashtable.

ejemplo.put ("ES", "España");
ejemplo.put ("EN", "Reino Unido");
ejemplo.put ("FR", "Francia");
ejemplo.put ("US", "Estados Unidos");

Para listar las claves de un Hashtable podemos utilizar el método keys() que devuelve un enumerado con las keys de nuestro hashtable, una vez obtenido basta con recorrerlo:

Enumeration <String> e = ejemplo.keys();
while(e.hasMoreElements())
   System.out.println(e.nextElement());

Hashtable no permite trabajar directamente con Iterator, pero es posible obtener un set que permite el uso de Iterators, haciendo uso de métodos de Map como entrySet() y keySet() e iterar sobre ellos:

Set set = ejemplo.keySet();
Iterator i = set.iterator();
String str;
while(i.hasNext()){
    str=(String)i.next();
    System.out.println(str +" = " + ejemplo.get(str));
}

Dispone de otros métodos que permiten obtener los elementos de un Hashtable como:

  • elements(): retorna un Enumeration con los valores del hashtable
  • values(): retorna un Collection con los valores del hashtable

Podemos ver la especificación en el siguiente enlace. http://bit.ly/QEoI7Y



04 julio, 2012

Xjc - Obtener clases Java a partir de un XSD con JAXB

Hace un tiempo, me encontré con la necesidad de generar clases Java a partir de un XSD, para obtenerlas de una forma rápida y sencilla, utilicé JAXB.

JAXB, es un API de Java que proporciona una forma fácil y práctica de correlacionar clases Java y esquemas XML. A partir de un esquema, que especifica la estructura de datos de un XML, JAXB genera un conjunto de clases de Java, JavaBeans, que contienen todo el código necesario, para analizar documentos XML que estén basados en el esquema.


Xjc es el compilador de esquemas que tiene JAXB para generar las clases Java. Es un comando que se utiliza desde la consola de líneas de comando. Una vez que existe la correlación entre el esquema y los JavaBeans, los documentos XML se pueden convertir en, y desde, objetos Java mediante la serialización y la deserealización.

¿Cómo utilizar el comando?

  1. Si no lo tienes ya, descargar JAXB de aquí y seguir los pasos de instalación indicados. Si estás en Windows, tendrás que hacer doble clic sobre el .zip. Se creará una carpeta, en el directorio en el que hayas guardado el zip, con el mismo nombre. ( Yo recomiendo hacerlo en el directorio C, para evitar problemas). 
  2. Abre la consola en el directorio que contenga la XSD. 
  3. Crea un directorio, en él se guardarán las clases Java de nuestro XSD, el directorio lo crearemos, donde tengamos la XSD.
  4. Ejecuta el comando xjc.bat desde la consola, (en mi caso, es lo siguiente: C:\jaxb-ri-20110512\bin\xjc.bat miEsquema.xsd -p mipaquete -
  5. En el directorio mipaquete puedes encontrar los JavaBeans asociados al XSD. Y ya podemos importarlas en nuestro proyecto.
Y en pocos minutos, tenemos disponibles los JavaBeans que permiten manipular los XML que sigan un XSD determinado.

24 junio, 2012

MDA - Arquitectura Dirigida por Modelos


Al hilo de lo hablado en el post anterior sobre Jet y para ir ampliando conocimientos ahora voy a hablar de MDA. MDA es un marco de trabajo que fue definido en 2001 por el ObjectManagement Group (OMG)  organización creada en 1990 con el fin de potenciar el desarrollo de aplicaciones orientadas a objetos distribuidas. Esta organización, también ha definido estándares importantes como UML, CORBA, MOF, etc… 

La clave del MDA es la importancia de los modelos, en el proceso de desarrollo de software. MDA propone la definición y uso de modelos a diferente nivel de abstracción, así como la posibilidad de la generación automática de código a partir de los modelos definidos y de las reglas de transformación entre dichos modelos (aquí es donde entrarían los motores de transformación de código como Jet).

Permite el despliegue de aplicaciones, diseñadas sin dependencias de plataforma, diseñadas mediante el uso de estándares como pueda ser UML y sobre cualquier plataforma existente, como J2EE, Servicios Web, etc..

Resuelve los retos de los sistemas actuales, están altamente conectados y en constante cambio, tanto en reglas de negocio como en tecnología. MDA propone un marco de trabajo para una arquitectura que asegura:
  • Portabilidad, aumentando el re-uso de las aplicaciones y reduciendo el coste y complejidad del desarrollo y administración de las aplicaciones.
  • Interoperabilidad entre plataformas, usando métodos rigurosos para garantizar que los estándares basados en implementaciones de tecnologías múltiples tengan todos idénticas reglas de negocio.
  • Independencia de plataforma, reduciendo el tiempo, costo y complejidad asociada con aplicaciones desplegadas en diferentes tecnologías.
  • Especificidad del dominio, a través de modelos específicos del dominio, que permiten implementaciones rápidas de aplicaciones nuevas, en una industria específica sobre diversas plataformas.
  • Productividad, permitiendo a los desarrolladores, diseñadores y administradores de sistemas usar lenguajes y conceptos con los que se sienten cómodos, facilitando la comunicación e integración transparente entre los equipos de trabajo.

Qué no es MDA

Se tiende a malinterpretar este acrónimo y por ello se debe tener claro qué no es MDA:
  • MDA no es un proceso de desarrollo
  • MDA no es una especificación
  • MDA no es una implementación
  • MDA no es una implementación de referencia de ningún estándar particular.
  • MDA no es simplemente generar código

Plantillas Jet

En el post anterior, he hablado del editor Jet-Editor, ahora voy a hablar un poco de qué es Jet. Jet es un motor de transformación que suele utilizarse para la generación de código automático (Java, XML, ...) a partir de plantillas.

Un generador de código, es una parte fundamental en el desarrollo dirigido por modelos (MDD). El objetivo de MDD es describir un sistema de software utilizando modelos abstractos, ya sean EMF, modelos UML o ECORE, posteriormente se refinan y se transforman estos modelos en código. Lo que ayuda a la automatización de los procesos, a la calidad del código, etc.

A través de Jet, se pueden crear los artefactos o plantillas que permiten definir las implementaciones que se han de aplicar en las transformaciones.

Para aquellos que quieran saber cómo empezar a utilizar Jet os recomiendo estos tutoriales:





Jet Editor - Plugin Eclipse

Para aquellos que hayáis tenido que trabajar con plantillas Jet, sabréis que puede llegar a ser horrible trabajar con ellas, sobre todo si no se dispone de alguna herramienta o editor que facilite el trabajo, de lo contrario, se trabajaría directamente con texto plano.

Existen varios editores, pero hoy os voy a hablar de Jet-Editor, es un plugin que se puede integrar en Eclipse fácilmente a través del update-site. Editor que permite trabajar con plantillas Jet, las plantillas utilizadas en EMF.

Si no tenemos ningún editor,

Plantilla jet sin editor

Con el editor Jet-Editor para eclipse, lo vemos así:

Plantilla Jet con Editor Jet-Editor

Como veis, ahora se resaltan partes de nuestro código, se diferencia entre la parte que contiene algo de lógica, de la parte que se mostrará tal cual.

Cierto es, que tampoco ayuda muchísimo..pero algo de ayuda siempre viene bien ¿conocéis algún editor mejor? :)

JET-Editor Eclipse Plugin


19 mayo, 2012

Pencils para Android 4.0 - WireframeSketcher


La última versión de WireframeSketcher incorpora nuevos pencils para Android 4.0. Se podrán utilizar tanto para teléfonos Android como tablets, e incluye diálogos, barras de acción, controles, listas y menús. En la web de WireframeSketcher podemos encontrar también una galería con plantillas adicionales, bibliotecas de widgets, etc.

Para usar estas plantillas, es tan sencillo como crear un directorio “assets” en nuestro proyecto y guardar ahí las nuevas plantillas, están disponibles en la web, automáticamente estarán accesibles desde la paleta del editor en el directorio Assets.


Podremos crear los bocetos de pantallas para nuestros teléfonos y tablets de forma sencilla arrastrando los elementos desde la paleta al editor.


04 febrero, 2012

BAM - Busines Activity Monitoring

BAM puede proporcionar análisis en tiempo real de la información de negocio de fuentes transaccionales incluyendo servicios web, colas de mensajes, etc. permite correlacionar eventos heterogéneos y obtener patrones de comportamiento. 

Proporciona una plataforma que permite optimizar los procesos de negocio, a través de BAM se pretende incrementar la competitividad y la toma rápida de decisiones, donde la visualización de la información juega un papel fundamental. 

En el mundo empresarial continuamente se produce información acerca de las ventas, la producción, la logística...y desafortunadamente en muchos casos situaciones anómalas o críticas no son conocidas hasta que es demasiado tarde para actuar.

La solución a esta problemática pasa por disponer de indicadores apropiados (Indicadores Clave de Rendimiento  - KPI) a la actividad de negocio, capturar dichos datos que los componen en tiempo real e integrarlos para su visualización.

Como en un proceso de negocio normalmente se suele manejar gran número de indicadores, tratar toda esa información de forma numérica puede ser poco trivial, se suele representar gráficamente en forma de cuadro de mandos o dashboard, que son una interfaz gráfica de usuario que permite dar una visión global y en detalle de los indicadores de negocio más importantes a tiempo real.
La visualización de la información ayuda a identificar patrones de comportamiento de negocio y relaciones de causa-efecto que de otra forma sería difícil de identificar.

El cálculo de los indicadores se complementa con un conjunto de reglas que permiten lanzar alarmas cuando muestran una tendencia anómala. 

BAM se compone de:
  • Integración de aplicaciones y datos: servicios de gestión de sucesos, repositorio de mensajes, etc
  • Procesamiento de datos en tiempo real
  • Entorno de visualización
Para los casos en los que se desee detectar excepciones de negocio de manera proactiva, ya sea antes o justo después de producirse, no podemos basarnos únicamente en sistemas tradiciones de Business Intelligence (BI). BAM puede utilizar potencialmente datos analizados a partir de un sistema de BI para obtener los umbrales de los datos que analiza. 
También se puede integrar con sistemas de minería de datos y herramientas OLAP para proporcionar capacidades de vigilancia. Por ejemplo, si una herramienta de minería de datos informa de una lista de cuentas de presunto fraude, esta información puede ser alimentada en una herramienta de BAM y el sistema se asegurará de que las cuentas sean congelada y se lancen las alarmas pertinentes.

Los procesos de negocio pueden ser muy complejos, pueden requerir comunicación entre múltiples actores y sistemas. Para supervisar estos sistemas se necesita de una tecnologías que controle esa complejidad en tiempo real y de manera inteligente. CEP - Complex Event Processing permite tratar esa complejidad. Dispone de capacidades de alto rendimiento, baja latencia, cálculos complejos y escalabilidad. El motor CEP es el componente ideal para dar sentido a los diferentes eventos que se generan .

Podemos decir que BAM es una capa intermedia entre los responsables del negocio y el flujo de información en el proceso de negocio. El usuario no sólo ve la información si no que además es capaz de reaccionar y ejecutar acciones en caso de ser necesarias.

Además de un motor CEP, son necesarios más componentes:
  • Decision Support - Un soporte para la toma de decisiones, que a través de reglas sea capaz de interpretar y reconocer situaciones. 
  • Action-ready Dashboard - Cuadros de mando Action-Ready. Las decisiones generadas se transforman en acciones y se integran en el cuadro de mando. 
  • Respuestas / Acciones - Las respuestas o acciones indicadas por el usuario son capturadas dentro del sistema BAM y se envían a los sistemas pertinentes para su ejecución en forma de alarmas.
  • Adaptación - Las respuestas o acciones indicadas por el usuario son integradas de nuevo en el sistema de decisión para mejorar el soporte en la toma de decisiones y en la generación de la "respuesta - acción" en el cuadro de mando. 
Dejo aquí una primera visión de qué es un sistema BAM.

Usando OXM de Spring 3.0 con JAXB

OXM (Object to XML Mapping) permite convertir un documento XML desde/hacia un objeto.  Este proceso de conversión también se conoce como serialización XML o enlace de datos.  Un marshaller serializa un objeto a XML, y un unmarshaller deserializa un XML a un objeto.

Características que presenta:
  • Fácil de utilizar
  • Interfaces consistentes
  • Jerarquía de excepciones consistentes
Spring ofrece una abstracción consistente para los marcos más populares de Java, permitiendo cambiar fácilmente de uno a otro. Soporta JaxB, Castor, XMLBean, JiBX y XStream.


JAXB es un framework de mapeo objeto / XML compatible con el esquema XML de W3C. Spring proporciona Jaxb2Marshaller que utiliza JAXB 2.0 API.


La configuración para el uso de Jaxb2Marshaller es:

<beans>
    <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="classesToBeBound">
            <list>
                <value>myapp.springrest.domain.Movie</value>                
            </list>
        </property>
    </bean>
</beans>
 

Los pasos para utilizar OXM serían
  • Crear un proyecto y modificar el pom.xml para incluir la siguiente dependencia:
        <dependency>           
            <groupId>org.codehaus.castor</groupId>
            <artifactId>castor</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
            <version>2.9.1</version>
        </dependency>
 

  • Crear la clase a serializar, para utilizarlo con JaxB, es necesario incluir la anotación @XmlRootElement(name="example")
  • Crear interfaz O/X Mapper
  • Crear la clase de implementación para la interfaz
  • Incluir el bean con la clase de implementación en el fichero applicationContext.xml , de esta forma podremos utilizar nuestros propios métodos de marshaller y unmarshaller
<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <context:component-scan base-package="com.unitedcoders.examples.spring.oxm.beans" />
    <bean id="oxMapper" class="com.unitedcoders.examples.spring.oxm.mapper.OxMapperImpl">
        <property name="marshaller" ref="jaxbMarshaller" />
        <property name="unmarshaller" ref="jaxbMarshaller" />
    </bean>
    <oxm:jaxb2-marshaller id="jaxbMarshaller">
        <oxm:class-to-be-bound name="com.unitedcoders.examples.spring.oxm.beans.Person" />
    </oxm:jaxb2-marshaller>
</beans>

  • Creamos una clase Main para comprobar
Podéis encontrar más información en este post