Translate

miércoles, 27 de junio de 2012

Flex - itemCreationPolicy: La política de creación de un objeto es útil

Pre-requisitos: Conocimientos básicos de Flex.

Esta particularidad de Flex es bastante útil desde mi punto de vista por dos puntos principalmente.

  • Para ahorrar memoria.
  • Para mejorar el comportamiento al a vista del usuario.
Todo objecto que se añade en flex tiene una  itemCreationPolicy que puede ser de dos tipos

  • Deferred: Que hace que el objeto se cree cuando es instaciado. Valor por defecto
  • Inmediate: Que hace que el objeto se cree al inciar la aplicación.

El  comportamiento deferred es el que está puesto por defecto ya que si fuera al contrario y todos los componentes cargaran en nuestra aplicación esta podría consumir mucha memoria y perder rendimiento.

Los que tienen el valor deferred se crean cuando el objeto es instanciado es decir cuando aparece en pantalla y el objeto tes visible.

Pero en ciertos casos necesitamos que este objeto aunque no se vea en pantalla necesitamos que se cree para que por ejemplo se carguen en él unos datos recuperados de base de datos o que al cargase se ejecute algún evento que necesitemos que ocurra.

En estos casos lo mejor es poner el campo  itemCreationPolicy="immediate" para que aunque no sea visible se comporte como si lo fuera y se cree al cargase la pantalla.

Todos los componentes de flex tienen esta propiedad itemCreationPolicy y puede aplicase cuando se crea necesario:


 <s:Button id="newButtonImmediate" 
            includeIn="Immediate" 
            itemCreationPolicy="immediate"/>



Referencias:

http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf63611-7ffa.html

jueves, 21 de junio de 2012

Flex - Eclipse: Modificar el Context Root en una aplicación

Modify the application´s context root

En las primeras versiones del Flex Plugin para la integración del entorno con Eclipse podíamos modificar el context root en alguna de las pantallas de configuración como Flex Compiler o Flex Build Path.

Pero actualmente en la última versión del plugin a día de hoy la versión 4.6 no es posible modificarlo.

Para ello lo que hago es abrir el archivo ".flexProperties" que está oculto y tenemos que hacer que aparezca, para ellos pinchamos en el botón que tiene las flechas



abrimos el archivo y en el apartado serverContextRoot ponemos el contexto que queramos.

serverContextRoot ="/MyContextRoot".

Hay que tener cuidado porque a veces al modificar alguno de los apartados de la configuración de Flex del proyecto este archivo puede volverse a modificar y volver a si valor original que es

serverContextRoot ="/WebContent"

Hay acordarse de hacer un build de la aplicación(build) para que la compilar la aplicación este parámetro se incorpore.

Esto principalmente puede servir para configurar las llamadas al protocolo amf cuando hacemos llamadas a servicios remotos,

http://localhost:8080/MyContextRoot/messagebroker/amf

http://localhost:8080/WebContent/messagebroker/amf



lunes, 18 de junio de 2012

Spring JPA MongoDB: java.lang.NoSuchMethodError: com.mysema.query.mongodb.MongodbQuery

En nuestros proyecto estamos estamos trabajando con Spring Data Jpa para MySql y para MongoDb.

Al hora de hacer una query en MongoDb utilizando QueryDSL para utilizar los predicado que facilitan la creación de queries, nos ha dado el siguiente error.


------
java.lang.NoSuchMethodError: com.mysema.query.mongodb.MongodbQuery.<init>(Lcom/mongodb/DBCollection;Lcom/google/common/base/Function;Lcom/mysema/query/mongodb/MongodbSerializer;)V
 at org.springframework.data.mongodb.repository.support.SpringDataMongodbQuery.<init>(SpringDataMongodbQuery.java:58)
 at org.springframework.data.mongodb.repository.support.SpringDataMongodbQuery.<init>(SpringDataMongodbQuery.java:44)
 at org.springframework.data.mongodb.repository.support.QueryDslMongoRepository.createQueryFor(QueryDslMongoRepository.java:167)
 at org.springframework.data.mongodb.repository.support.QueryDslMongoRepository.count(QueryDslMongoRepository.java:154)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:601)
 at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:334)
 at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:319)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
 at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
----- 
El código utilizado el el siguiente:

 
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;

import charris.example.domain.Product;

public interface ProductRepository extends MongoRepository<Product, String>, QueryDslPredicateExecutor<Product> {

}



El error proviene al hacer una query como esta:

 
ProductRepository repo = context.getBean(ProductRepository.class);
Product p = repo.findOne(QProduct.product.name.eq("ProductName"));



El problema consistía en un problema de versiones entre los jar de
  1. querydl-mongodb
  2. spring-data
El error se solucionó poniendo las versiones  adecuadas de los JAR. Nosotros tuvimos que recurrir a los Nightly builds de spring data para que funcionara perfectamente.

Las versiones de los Jars fueron las siguientes a fecha (18/06/2012)

  •  querydsl-mongodb-2.5.0.jar
  • querydsl-mongodb-2.5.0-apt.jar
  • querydsl-mongodb-2.5.0-apt-one-jar.jar
  • spring-data-commons-core-1.3.2.BUILD-20120618.140513-1.jar
  • spring-data-jpa-1.1.1.BUILD-20120606.192912-1.jar
  • spring-data-mongodb-1.1.0.BUILD-20120614.104654-40.jar

lunes, 11 de junio de 2012

ANT: Tratamiento de Strings en ANT con AntelopeTasks

Managing Strings with ANT (Antelope Tasks)

pre-requisitos: Conocimientos de ANT y algo de configuración de librerías auxiliares de ANT;

Cuando la funcionalidad básica de de ANT se queda corta es necesario utilizar otras librerías auxiliares que nos dan la funcionalidad extra que no tenemos con las librerías básicas de ANT.

Como ejemplos tenemos:

  • ant-contrib: Aporta tareas para programar con ant más fácilmente (if, foreach,etc..)
  • Antelope: Aparte de una interfaz gráfica, tiene una amplia gama de tareas en mi caso el tratamiento de Strings que es el que he utilizado.
 Configuración:

Una vez descargado el .jar de Antelope  podemos consultar la documentación de instalación de las tareas adicionales y podemos ver que la configuración es puede hacer de dos maneras:

  • La fácil: Copiando el Jar en el directorio lib donde tengamos instalado ant. Pero a mi no me gusta este método porque me interesa que tendría que hacer esto en cada equipo y también en la instalación de Ant del servidor de integración. Prefiero que esta configuración esté dentro de los archivos de mi proyecto.
  • La más independiente: Referenciando al archivo jar de antelope y la tarea que voy a usar en mi script de Ant.
Para ello en el comienzo de mi script de Ant pongo el siguiente código donde referencio al archivo .jar y la tarea que voy a usar que es StringUtilTask que entre otras funciones tiene las opciones de transformar un string a minúsculas y también la de cortar un string.

 
<?xml version="1.0" encoding="UTF-8"?>
<project default="run" basedir="." name="GX2 Packager"> 
<taskdef name="stringutil" classname="ise.antelope.tasks.StringUtilTask">
  <classpath>
 <pathelement location="${AntLibs}/AntelopeTasks_3.5.1.jar"/>
  </classpath> 
</taskdef>


A la hora de utilizar la funcionalidad es tan sencillo como fijarse en los ejemplos que trae la documentación, os dejo el ejemplo del lowercase.

Es muy sencillo en la propiedad project_name_lowecase se guardará el contenido transformado en minúsculas que venga en la propiedad project_name.

  
<!-- Guardamos el nombre proyecto en minusculas-->
<stringutil string="${project_name}" property="project_name_lowercase">
        <lowercase/>
</stringutil>