Translate
viernes, 21 de mayo de 2010
Configurar una cache con Spring con ehcache
viernes, 14 de mayo de 2010
Apache Tuscany y Spring
Comenzamos escribiendo la interfaz:
@Remotable
public interface ExampleService {
String sayHello();
}
Su implementación :
@Service(ExampleService.class)
public class ExampleServiceImpl implements
ExampleService {
private String hello = "Holasss !!! \n";
public void setHello(String hello) {
this.hello = hello;
}
/**
* @see org.assembly.nornas.ExampleService#sayHello()
*/
@Override
public String sayHello() {
System.out.print("llamaron a Say");
return hello;
}
@Init
public void init() {
System.out.println("Starting with "+ExampleServiceImpl.class + " \n");
}
}
Ahora tenemos que configurar el beans de spring, en un archivo que llamaremos: appcontext-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sca="http://www.springframework.org/schema/sca"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/sca http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd ">
<bean id="service.example" class="com.elpaquete.ExampleServiceImpl">
<property name="hello" value="Hola desde Spring!!" ></property>
</bean>
<sca:service name="ExampleService"
type="org.assembly.nornas.sandbox.service.example.ExampleService" target="service.example" />
</beans>
Notaron que además de declarar el bean le indicamos a Apache Tuscany cual es la interfaz de nuestro bean que va a ser un componente de Apache Tuscany.
Ahora escribimos el archivo ExampleSpring.composite:
<?xml version="1.0" encoding="UTF-8" ?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
xmlns:t="http://tuscany.apache.org/xmlns/sca/1.0"
targetNamespace="http://nornas"
xmlns:nornas="http://nornas"
name="Example" >
<component name="ExampleServiceComponent">
<implementation.spring location="spring-sandbox.xml" />
<service name="ExampleService">
<interface.java interface="org.assembly.nornas.sandbox.service.example.ExampleService"/>
<binding.ws uri="http://localhost:8080/nornas/ws" />
<t:binding.atom uri="http://localhost:8080/nornas/atom" />
<t:binding.jsonrpc uri="http://localhost:8080/nornas/jsonrpc" />
<t:binding.rss uri = "http://localhost:8080/nornas/rss"/>
<binding.sca />
</service>
</component>
</composite>
Notaron que la implementación del componente no se indica clase si no el archivo appcontext-spring.xml, Apache tuscany va a leer y buscar de ahí la implementación.
Ya lo tenemos, ahora vamos a hacer la clase main:
public class MainSpring {
public static void main(String[] args) throws IOException {
System.out.println("Starting ...");
SCADomain scaDomain = SCADomain.newInstance("ExampleSpring.composite");
System.out.println("Example in "+scaDomain.getURI());
System.in.read();
System.out.println("Stopping ...");
scaDomain.close();
System.out.println();
}
}
Si todo salio bien, en http://localhost:8080/nornas/ws?wsdl va a estar wsdl de su web service soap.
Por ultimo las dependencias de maven:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6.SEC01</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-sca-api</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-core-spi</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-policy-security</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-host-embedded</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-data-api</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-java-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-atom-abdera</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-rss-rome</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-ws-axis2</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-jsonrpc-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-rmi-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-resource-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-http-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-host-jetty</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-spring</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-spring-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
sábado, 8 de mayo de 2010
Desarrollar un ejemplo con Apache Tuscany
En otro post les prometo dar más detalles de mi tesis.
Si no leyeron estos posts, sería bueno que lo hagan :
http://emanuelpeg.blogspot.com/2010/02/apache-tuscany_4551.html
http://emanuelpeg.blogspot.com/2010/02/sca.html
La idea es desarrollar un ejemplo facil usando maven.
Veamos la descripción del componente:
import org.osoa.sca.annotations.Remotable;
@Remotable
public interface ExampleService {
String sayHello();
}
Veamos la implementación:
import org.assembly.nornas.service.example.ExampleService;
import org.osoa.sca.annotations.Init;
import org.osoa.sca.annotations.Service;
@Service(ExampleService.class)
public class ExampleServiceImpl implements
ExampleService {
@Override
public String sayHello() {
System.out.print("llamaron a Say");
return "Holasss !!! \n";
}
@Init
public void init() {
System.out.println("Starting with "+ExampleServiceImpl.class + " \n");
}
}
Ahora hay que hacer un archivo composite que describe el componente:
Example.composite
<?xml version="1.0" encoding="UTF-8" ?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
xmlns:t="http://tuscany.apache.org/xmlns/sca/1.0"
targetNamespace="http://nornas"
xmlns:nornas="http://nornas"
name="Example" >
<component name="ExampleServiceComponent">
<implementation.java class="org.assembly.nornas.serviceImpl.example.ExampleServiceImpl" />
<service name="ExampleService">
<interface.java interface="org.assembly.nornas.service.example.ExampleService"/>
<binding.ws uri="http://localhost:8080/nornas/ws" />
<t:binding.atom uri="http://localhost:8080/nornas/atom" />
<t:binding.jsonrpc uri="http://localhost:8080/nornas/jsonrpc" />
<t:binding.rss uri = "http://localhost:8080/nornas/rss"/>
<binding.sca />
</service>
</component>
</composite>
Ahora vamos a correr todo esto, para lo cual vamos a tener que hacer una clase que tenga el método main:
import java.io.IOException;
import org.apache.tuscany.sca.host.embedded.SCADomain;
public class Main {
public static void main(String[] args) throws IOException {
System.out.println("Starting ...");
SCADomain scaDomain = SCADomain.newInstance("Example.composite");
scaDomain.getURI();
System.out.println("store.composite ready for big business !!!");
System.in.read();
System.out.println("Stopping ...");
scaDomain.close();
System.out.println();
}
}
Ojo hago esto porque no tengo servidor, para otro ejemplo probamos con tomcat o jetty. Internamente Apache tuscany levanta un jetty.
Y Listo!!
Si vamos a esta url: http://localhost:8080/nornas/ws?wsdl deberíamos tener en wsdl de nuestro web server SOAP.
Si fueron observadores vieron que use varios bildings (solo lo hice para probarlos)
Les dejo las dependencias del pom para correr el ejemplo:
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-core-spi</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-policy-security</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-host-embedded</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-data-api</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-java-runtime</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-atom-abdera</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-rss-rome</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-ws-axis2</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-jsonrpc-runtime</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-rmi-runtime</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-resource-runtime</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-http-runtime</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-host-jetty</artifactId>
<version>1.6</version>
</dependency>
Acabamos de hacer un servicio SOA con Apache Tuscany, muy fácil no?
miércoles, 5 de mayo de 2010
Manual de Osgi
http://www.javahispano.org/contenidos/archivo/14922/OSGI_Roberto_Montero.pdf
domingo, 25 de abril de 2010
W3C
Les dejo el link: http://www.w3c.es/Divulgacion/
xForm
¿Qué es XForms?
Es un nuevo lenguaje de etiquetado para formularios Web, diseñado para ser el sustituto de los formularios tradicionales HTML , y que va a permitir a los desarrolladores de formularios Web distinguir entre el propósito del formulario y su presentación. Esta separación clara entre contenido y presentación ofrece grandes ventajas en términos de:
- Reutilización: ya que los módulos XForms pueden reutilizarse independientemente de los datos que recogen
- Independencia de Dispositivo: gracias a que los controles de la interfaz de usuario son abstractos y sólo se indican sus características genéricas, lo que permite su representación en diferentes dispositivos
- Accesibilidad: al separar presentación y contenido la información está disponible de forma más sencilla para los usuarios que precisen de ayudas técnicas para la navegación en la Web.
¿Para qué sirve?
XForms puede hacer todo lo que hacen los formularios HTML, pero además permite:
- Comprobar automáticamente los valores de los datos mientras el usuario los introduce.
- Indicar que ciertos campos son obligatorios y que el formulario no podrá ser enviado sin esta información.
- Enviar formularios de datos como XML , ya que XForms es XML.
- La integración con Servicios Web, por ejemplo, usando SOAP y XML RPC.
- Enviar el mismo formulario a diferentes servidores (por ejemplo, la búsqueda de una palabra se envía a diferentes motores de búsqueda).
- Guardar y restaurar valores en y desde un archivo.
- Utilizar el resultado de un envío como entrada para un formulario posterior.
- Obtener los datos iniciales para un formulario a partir de un documento externo.
- Deducir valores desde otros valores presentes en el formulario, por ejemplo que el campo "cantidad total" contenga la suma de todas la compras individuales.
- Forzar valores para que aparezcan de determinada forma, por ejemplo obligando a que los valores estén comprendidos en un rango determinado.
- Construir formularios al estilo de "cesta de la compra" y "asistentes" sin necesidad de programar.
- Utilizar nuevos métodos de envío en comparación con los formularios HTML. Todos ellos son métodos HTTP estándar para enviar datos a través de la red.
- Mejorar la experiencia de los usuarios.
- Combinar tecnologías XML existentes.
- Lograr la Independencia de Dispositivo.
- Facilitar la creación de formularios complejos.
Si quieren leer más : http://www.w3c.es/Divulgacion/GuiasBreves/XForms
sábado, 20 de marzo de 2010
HSQLDB, HyperSQL 2.0
HSQLDB (HyperSQL base de datos) es el principal motor de base de datos relacional SQL escrito en Java. Dispone de un controlador JDBC y apoya ANSI casi completa de SQL-92(formato de árbol BNF), además de muchos de SQL: 2008 las mejoras. Ofrece un pequeño motor de base de datos rápido que ofrece en memoria y un disco basado en tablas y tiene soporte incorporado y los modos de servidor. Además, incluye herramientas como una herramienta de línea de comandos SQL y herramientas de consulta GUI.
El producto está siendo utilizado como una base de datos y motor de persistencia en muchos proyectos Open Source Software y en proyectos comerciales y productos. En su versión actual es muy estable y fiable. Es mejor conocida por su pequeño tamaño, la capacidad de ejecutar completamente en la memoria, su flexibilidad y velocidad.
Versión 2.0 es compatible con la más amplia gama de características estándar SQL visto en ningún otro motor de fuente abierta de bases de datos. Hemos llegado a la conformidad con SQL estándar SQL casi lleno-1992 de nivel avanzado y SQL: 2008 las características de lenguaje básico más una extensa lista de SQL: 2008 y las características opcionales muchas extensiones. El motor es totalmente compatible con múltiples subprocesos y 2PL y modelos de control MVCC transacción.
Es totalmente gratuito para uso y distribución con licencia BSD estándar. Completamente libre de costo o restricciones y totalmente compatible con todas las principales licencias de código abierto. Código fuente de Java y una extensa documentación incluida.
Yo uso esta base para correr test que interactúan con base de datos. Si usamos maven agregamos la siguiente dependencia en el pom:
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.10</version>
</dependency>
Y la configuramos con spring el dataSource:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem:testDB" />
<property name="username" value="sa"/>
<property name="password" value=""/>
<property name="defaultAutoCommit">
<value>false</value>
</property>
<property name="poolPreparedStatements">
<value>true</value>
</property>
<property name="initialSize">
<value>1</value>
</property>
<property name="maxActive">
<value>90</value>
</property>
<property name="maxIdle">
<value>50</value>
</property>
</bean>
Y listo!!
Mapeos de Enums en Hibernate
Esta información fue provista por un amigo mío y del blog, Lucas Acosta
Cuando usamos Enum y tenemos que guardar con hibérnate podemos hacer lo que sugiere la documentación de hibérnate:
Podemos guardar nuestro Enum en una columna como varchar:
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
public class EnumUserType<E extends Enum<E>> implements UserType {
private Class<E> clazz = null;
protected EnumUserType(Class<E> c) {
this.clazz = c;
}
private static final int[] SQL_TYPES = {Types.VARCHAR};
public int[] sqlTypes() {
return SQL_TYPES;
}
public Class returnedClass() {
return clazz;
}
public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException {
String name = resultSet.getString(names[0]);
E result = null;
if (!resultSet.wasNull()) {
result = Enum.valueOf(clazz, name);
}
return result;
}
public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException {
if (null == value) {
preparedStatement.setNull(index, Types.VARCHAR);
} else {
preparedStatement.setString(index, ((Enum)value).name());
}
}
public Object deepCopy(Object value) throws HibernateException{
return value;
}
public boolean isMutable() {
return false;
}
public Object assemble(Serializable cached, Object owner) throws HibernateException
return cached;
}
public Serializable disassemble(Object value) throws HibernateException {
return (Serializable)value;
}
public Object replace(Object original, Object target, Object owner) throws HibernateException {
return original;
}
public int hashCode(Object x) throws HibernateException {
return x.hashCode();
}
public boolean equals(Object x, Object y) throws HibernateException {
if (x == y)
return true;
if (null == x || null == y) return false;
return x.equals(y);
}
}
Supongamos que tenemos este Enum:
public enum MyEnum {
ENUM_A, ENUM_B;
}
Hacemos el userType :
public class MyEnumUserType extends EnumUserType<MyEnum> {
public MyEnumUserType() {
super(MyEnum.class);
}
}
Y Por ultimo mapeamos:
<property name="sample" type="mypackage.MyEnumUserType" not-null="true"/>
Borrar base de datos en test!!
Cuando hacemos test de DAOs, servicios o que tenga que interactuar con una base de datos es bueno usar una base de datos en memoria como HSQLDB.
El problema está en que cada test inserta datos en la base, lo que hace que el resultado de un test dependa de la ejecución de otro test; esto no es bueno.
Si trabajamos con base de datos en memoria y Spring lo que podríamos hacer es bajarla y volverla a subir usando: @DirtiesContext en cada uno de los test. @DirtiesContext es una anotación de spring que baja y sube el contexto. Esto es una solución, pero no la más optima los test van a demorar más dado que por cada test se baja y sube el contexto. La solución más óptima es borrar la base en cada test de este modo:
@After
public void tearDown() {
this.restoreEmptyDatabase();
}
private void restoreEmptyDatabase() {
LocalSessionFactoryBean sessionFactory = (LocalSessionFactoryBean) this.applicationContext
.getBean("&sessionFactory");
sessionFactory.dropDatabaseSchema();
sessionFactory.createDatabaseSchema();
}
Podríamos ponerlo en el After o Before es indistindo este método borrara la base por test.
viernes, 19 de marzo de 2010
Reflexiones sobre los problemas del desarrollo orientado a pruebas
sábado, 13 de marzo de 2010
Apache ActiveMQ
Antes de comenzar a hablar de ActiveMQ debemos entender JMS. JMS trata sobre la comunicación de aplicaciones de forma asíncrona. Funciona de forma similar que un mail, JMS envía el mensaje a la aplicación sin esperar que la reciba la otra aplicación.
La vía indirecta es la clave de JMS. Cuando una aplicación envía información a otra mediante JMS, no hay vínculo directo entre ambas aplicaciones. En su lugar, la aplicación emisora coloca el mensaje en manos de un servicio que garantiza su entrega a la aplicación receptora. Hay dos conceptos principales en JMS: corredor de mensajes (message brokers) y destinos (destinations)
Apache ActiveMQ es un estupendo message brokers de código abierto y una maravillosa opción para la mensajería asíncrona con JMS. Aunque ActiveMQ comenzó como un proyecto de CodeHaus, se traslado a Apache.
Apache ActiveMQ es rápido, soporta varios lenguajes Java, C, C++, C#, Ruby, Perl, Python, PHP, soporte a Enterprise Integration Patterns, integración con spring, y se distribuye bajo licencia Apache 2.0 License
Dejo links:
miércoles, 10 de marzo de 2010
domingo, 28 de febrero de 2010
Tutorial basico de Hibernate en castellano
http://www.davidmarco.es/tutoriales/hibernate-reference/
sábado, 27 de febrero de 2010
The Apache Software Foundation Celebrating a Decade of Open Source Leadership.
Feliz Cumple!!!
Apache Tuscany
Apache Provee soluciones para todo y más todavía. Tuscany es una implementación de la especificación SCA.
Apache Tuscany provee una infraestructura para facilitar el desarrollo de una Arquitectura orientada a servicios (SOA). Apache Tuscany implementa SCA por lo tanto reduce el costo de desarrollo de soluciones basadas en SOA.
Apache Tuscany provee soporte para SCA 1.0. También se integra muy bien con tecnologías web 2.0 y OSGI. Soporta SCO y SDO 2.0 para C++ y 2.1 para Java.