sábado, 31 de marzo de 2012

UTUTO


UTUTO es una distribución del sistema operativo GNU, que usa su propio núcleo de Linux Libre. El nombre hace referencia a una especie de lagartija (Homonota borelli, Gekkonidae) del norte de Argentina. Ututo fue la primera distribución en ser reconocida como totalmente libre por el Proyecto GNU


Y fue hecha en Argentina!! 


Su primera versión, grabada masivamente por primera vez en octubre del año 2000 en Argentina por Diego Saravia de la Universidad Nacional de Salta. Se hizo famosa por ser la distro que usa Richard Stallman. 


Dejo link:
http://www.ututo.org/

miércoles, 28 de marzo de 2012

Elasticsearch


Elasticsearch es un producto Open Source para realizar busquedas, basado en Apache Lucene. Fue desarrollado por Shay Banon. Shay Banon habia creado Compass en 2004, mientras pensaba la tersera versión de Compass descubrio que era necesario una solución distribuida para las busquedas para poder escalar y brindar un buen servicio. Por lo que creo un producto distribuido para realizar busquedas el cual usa la interfaz comun Http con JSON y REST. Todo sobre la plataforma java.


Elasticsearch puede ser utilizado como buscador de cualquier tipo de documento. Además ofrece una solución escalable dado que es distribuido.



Para nombrar algunas características:

  • ElasticSearch es distribuido. Ningún proyecto por separado es necesario. Las réplicasiones son en tiempo real también, que se llama "la replicación Push".
  • ElasticSearch es totalmente compatible con el tiempo casi real la búsqueda de Apache Lucene.
  • Manejo de multiusuario no es una configuración especial
  • ElasticSearch introduce el concepto de la puerta de enlace, lo que hace que hacer copias de seguridad sea más fácil.
Dejo link:
http://www.elasticsearch.org/


Dejo un video:

domingo, 25 de marzo de 2012

Instalar Mule ESB en linux


Vamos a instalar Mule ESB en linux, Mule es un ESB que funciona muy bien y es el más usado de los ESB open sources.

Primero vamos a bajarlo de : http://www.mulesoft.org/download-mule-esb-community-edition

Luego de descargarlo vamos a copiarlo a opt (utilice root o un usuario con permisos)

mkdir /opt/muleESB
mv Descargas/MuleStudio-CE-for-Linux-64bit_20120120.zip /opt/muleESB/

Descomprimimos:

cd /opt/muleESB
unzip  MuleStudio-CE-for-Linux-64bit_20120120.zip

Ahora damos permisos correspondientes:

chmod u+x MuleStudio/

Y con esto ya estamos. Para utilizar mule tienes que tener configurada la jdk de java. Para esto podemos descargar la jdk del siguiente link: http://www.oracle.com/technetwork/java/javase/downloads/index.html

Cuando descarguemos este .bin solo hay que ejecutarlo y luego configurar la variable de entorno JAVA_HOME.

export JAVA_HOME=/java/sdk/jdk1.6.0_26

Y luego podemos ejecutar Mule

cd  MuleStudio
./muleStudio

Y ya esta!!

Kanban vs Scrum




  • Jim: “¡Por fin hemos conseguido implantar Scrum del todo!”
  • Fred:“ ¿Y qué tal os va?”
  • Jim: “Bueno, mucho mejor que lo que teníamos antes...”
  • Fred:“...¿pero?”
  • Jim: “... pero claro, está el equipo de operación y mantenimiento.”
  • Fred:“sí, ¿Y?”
  • Jim: “Bueno, nos encanta todo lo de organizar por prioridades en una Pila de Producto, los equipos auto-organizados, el Scrum diario, las retrospectivas, etc....”
  • Fred: “¿Y cuál es el problema?”
  • Jim: “Seguimos fracasando en nuestros Sprints”
  • Fred: “¿Por qué?”
  • Jim: “Porque nos resulta muy difícil comprometernos a una planificación de 2 semanas. Las iteraciones no tienen mucho sentido para nosotros, simplemente nos ponemos con lo más urgente que tenemos cada día.¿Quizás deberíamos hacer iteraciones de una semana?
  • Fred: “¿Os podríais comprometer al trabajo de una semana? ¿Se os permitiría concentraros en eso y trabajar en paz durante una semana?”
  • Jim: “En realidad no, tenemos asuntos que van surgiendo en el día a día. Quizás si hiciéramos sprints de un día...”
  • Fred: “¿Vuestras tareas tardan menos de un día en solucionarse?”
  • Jim: “No, a veces tardan varios días”
  • Fred: “Así que los sprints de 1 día tampoco funcionarían. ¿Habéis considerado eliminar por completo los sprints?”
  • Jim: “Bueno, la verdad es que eso nos gustaría. Pero ¿no va eso en contra de Scrum?”
  • Fred: “Scrum es solo una herramienta. Tú eliges cuándo y cómo usarla. ¡No seas su esclavo!”
  • Jim:“¿Qué deberíamos hacer entonces?”
  • Fred:“¿Has oído hablar de Kanban?”
  • Jim:“¿Qué es eso? ¿En qué se diferencia de Scrum?”
  • Fred:“¡Toma, lee este libro!”
  • Jim: “Pero a mi me gusta el resto de Scrum, ¿tengo que cambiar ahora?”
  • Fred:“¡No! Puedes combinar ambas técnicas”
  • Jim:“¿Qué? ¿Cómo?”
  • Fred:“Sólo sigue leyendo..”


Así comienza el libro quiero recomendarles, muy bueno explica Kanban confrontándolo con Scrum de forma totalmente didáctica. Y al final una aplicación practica.

Dejo el link:

http://www.proyectalis.com/documentos/KanbanVsScrum_Castellano_FINAL-printed.pdf


sábado, 24 de marzo de 2012

Chakra


Estoy probando Chakra Linux, es un arch que intenta ser más amigable que arch; facilitando la instalación y el uso como la configuración.  Chakra utiliza KDE 4 como gestor de ventanas; además promueve el uso de aplicaciones KDE. Mi primera impresión es que esta bueno.

Ojo cuiden su mascota!



Dejo link del proyecto:

http://chakra-linux.org/


SenseiDB

LinkedIn han librearado la versión 1.0.0 de la base de datos NoSQL SenseiDB. La base de datos Sensei es una base NoSQL que fue diseñana para facilitar las modificaciones y consultas complejas.

Entre las características de esta base podemos nombrar:

  • Búsqueda de full-text
  • Búsqueda por key-value veloz
  • Alta performance durante actualizaciones concurrentes pesadas y alto tráfico de queries
  • Integración con Hadoop


Esta base hace incapie en las busquedas por lo que usuarios de Solr o Lucene usaran todos los conceptos; para las busquedas usa BQL (Browser query language) que es muy similar a SQL.

Para la obtención de datos sólo es a través de puertas de enlace(no hay un "INSERT"). Cada grupo está conectado a una única puerta de enlace. Este es uno de los puntos críticos de entender, ya SenseiDB no se manejan atomicidad ni aislamiento. Aquellos que se aplica de manera externa a nivel de puerta de enlace. La puerta de enlace debe asegurarse de que el flujo de datos se comporta de una manera esperada.

Gracias a LinkedIn ahora es Open Source!

Dejo links:
http://senseidb.com/
http://senseidb.github.com/sensei/overview.html
https://linkedin.jira.com/wiki/display/SENSEI/Home
https://github.com/linkedin/sensei


miércoles, 21 de marzo de 2012

Muchas patentes son totalmente ridículas

Encontré tarde una entrevista a Linus Tolvar, digo tarde porque es vieja; pero de igual forma quiero compartirla:

http://www.pagina12.com.ar/diario/dialogos/21-169096-2011-05-30.html

Código de Android incluido en la versión 3.3 de Kernel de Linux

Buenísima noticia, ahora el kernel de Linux cuenta con código Android. Porque es tan importante la noticia? Esta noticia es un claro ejemplo que cuando el conocimiento se comparte, se complementa y mejora.

El Kernel de Linux se va hacer más robusto gracias a que entre otras cosas lo usa Android y otras comunidades. Con el perfeccionamiento del Kernel nos vemos beneficiados todos los que usamos Linux!!!

Dejo la fuente:

http://www.efectosocial.net/2012/03/19/codigo-de-android-incluido-en-la-version-3-3-de-kernel/


IOS vs Android, cual da más trabajo?

Quede sorprendido con la siguiente infografia, no pensé nunca que IOS le gane a Android en empleos de desarrollo.


Si no ven bien pueden hacer click en la imagen.

Que opinan de esta infografia? sorprendidos?

sábado, 17 de marzo de 2012

The best Linux distro of 2011!




Buscando una nueva distro para la notebook me encontré con el siguiente articulo:

http://tuxradar.com/content/best-distro-2011

Hace un comparativo de las diferentes distros de Linux, y queda como distro ganadora Debian. Personalmente estoy fascinado por Linux Mint me parece muy cómodo, fácil de usar y elegante.

Ustedes cual prefieren??

miércoles, 14 de marzo de 2012

Play framework 2

Finalmente se anuncio de play framework 2, con nuevas novedades y una integración completa con scala.

Dejo link del anuncio y la nueva web:

http://blog.typesafe.com/introducing-play-20
http://www.playframework.org/

domingo, 11 de marzo de 2012

Porque utilizar ESB?


En arquitectura SOA el software se ve como funcionalidad colgada en una rul la cual se organiza para solucionar una necesidad del negocio.
Por ejemplo tenemos organizado 4 modulos los cuales se interrelacionan esto se veria de la siguiente forma:




Por que no poner un software que mantenga las rutas de comunicación sería como un router de nuestros servicios.



Se ve mejor no? Ese software que se encuentra en el medio de las comunicaciones de mis servicios es un ESB.



Ahora bien si un servicio expone su funcionalidad con SOAP otro con REST otro con RMI, otro con JMS etc. tengo que escribir mucho código de traducción para poder comunicar servicios. Ya se pongamos esta traducción en el ESB de esta forma el centraliza las traducciones y reutiliza ese código para comunicara diferentes servicios.



De esta forma el ESB nos permite comunicar diferentes piezas de software que se expresan de forma diferente. Ojo esto no es una funcionalidad que tengan todos los ESB por ejemplo Apache Synapsis no la trae. Pero la gran mayoría si.



En resumen esto es un ESB. 

Instalar características opcionales en ServiceMix


Para listar las características de serviceMix desde la consola con este comando:

karaf@root>features:list

Con esto tenemos el listado de características instaladas como las que no estan instaladas.
Para instalar una característica solo con el comando:

karaf@root>features:install webconsole

Con esto por ejemplo instalamos la web consola. Y con el siguiente comando lo verificamos:


karaf@root> features:list | grep webconsole



Agregar ActiveMQ al ejemplo de ServiceMix


Continuando con el ejemplo:
http://emanuelpeg.blogspot.com/2012/03/usando-apache-camel-desde-apache.html

En el anterior ejemplo creamos una ruta que movía un archivo de una carpeta a otra, bueno ahora vamos a crear un evento de ActiveMQ cuando se mueva un archivo.

Por lo tanto el archivo xml que habia llamado copia queda así:




    
      
        
        

        
          
            FileMovedEvent(file: ${file:name}, timestamp: ${date:now:hh:MM:ss.SSS})
          
        
        
      
    




Donde  FileMovedEvent va ser un evento generado por la copia y va a ser publicado en  activemq://events

Si vemos el log no vamos a ver nada porque los eventos no sos consumidos por un cliente por lo que vamos a hacer un cliente:




    
      
        
        
     
    




Guardamos este archivo tambien en la carpeta deploy con el nombre que quieran, yo le voy a poner cliente.xml

Con este cliente vamos a poder ver en el log las copias.
Reiniciamos copia.xml
osgi:stop 156
osgi:start 156

Y listo!



Dejo link de la fuente:
http://servicemix.apache.org/docs/4.4.0/quickstart/


Usando Apache Camel desde Apache ServiceMix


Para mayor comprensión pueden ver el siguiente post:
http://emanuelpeg.blogspot.com/2012/03/primeros-pasos-con-apache-servicemix.html

La idea sería construir un pequeño ejemplo de integración con Apache Camel y vamos a deployarlo en ServiceMix. La idea es copiar un archivo desde la carpeta input a la carpeta output y para mantener un registro escribir un log.

Uno de los caminos más simples para deployear un router de Camel en ServiceMix es definir el router en un Blueprint XML.




    
      
        
        
        
      
    




Este archivo hay que guardarlo en la carpeta deploy de servicemix yo le puse copia.xml

Ahora a deployear, si ejecutamos osgi:list vamos a ver nuestro servicio llamado “copia.xml”


Con osgi:start y el id del servicio podemos levantar el servicio; en mi caso el número 156

osgi:start 156

y si lo queremos parar con

osgi:stop 156

Ya esta! Si hacemos:

log:display | grep INFO

Podemos ver como se movieron los archivos.




Primeros pasos con Apache ServiceMix



Para instalar ServiceMix vea este post: http://emanuelpeg.blogspot.com/2012/03/instalar-apache-servicemix-en-linux.html

Ya en la consola podemos listar los paquetes o bundles que estan activos y los que no:

karaf@root> osgi:list

Con este comando listamos todos los paquetes instalados. Se muestra el id, estado, si es bluepring o Spring XML , el nivel, nombre y versión del paquete.

Podemos utilizar el pipe y comandos de unix, por ejemplo si necesitamos ver los paquetes de cxf:

karaf@root> osgi:list | grep cxf

Si se quiere trabajar con el log esta el comando:

karaf@root> log:display

Si solo se desea ver excepciones:

karaf@root> log:display-exception

Y también podemos cambiar el nivel de logeo con :

karaf@root> log:set DEBUG
karaf@root> log:display | grep DEBUG

Bueno este fue una primera vista general sobre Apache ServiceMix

Instalar Apache ServiceMix en Linux


Comenzamos bajando servicemix pueden bajarlo de aca: http://apache.dattatec.com//servicemix/servicemix-4/4.4.0/ o con wget pueden directamente usar esta url  http://apache.dattatec.com/servicemix/servicemix-4/4.4.0/apache-servicemix-full-4.4.0.tar.gz

Yo baje el tar, pero pueden bajar el zip para windows. Primero movemos el tar donde lo vamos a instalar   tiene que usar el usuario root o alguno que tenga permisos de escritura en la carpeta destino.

mkdir /opt/servicemix
mv apache-servicemix-full-4.4.0.tar.gz /opt/servicemix /

Y luego desempaquetamos:

tar xvfz apache-servicemix-full-4.4.0.tar.gz

Y borramos el tar:

rm apache-servicemix-full-4.4.0.tar.gz

Luego ejecutamos serviceMix

cd apache-servicemix-4.4.0/bin
./servicemix

Y obtendremos una pantalla así:


Dejo link: 



sábado, 10 de marzo de 2012

viernes, 9 de marzo de 2012

Akka 2.0 Released!

Akka el framework para Scala y java a sacado una nueva versión; como recordaran akka es un framework que se basa en el concepto de actores para brindarnos una arquitectura distribuida.

Para más información del release dejo el link:

http://akka.io/news/2012/03/06/akka-20-released.html


jueves, 8 de marzo de 2012

Apache ServiceMix







Apache ServiceMix es un flexible ESB open source, que integra funcionalidad de diversos productos de Apache como Apache ActiveMQ, Camel, CXF, ODE y Karaf. Provee el funcionamiento de un ESB integrado a una herramienta OSGI.

Las características de Apache ServiceMix son:


  • Mensajería segura gracias a Apache ActiveMQ
  • Mensajería, enrrutamiento y patrones de integración para Empresas con Apache Camel
  • ServiceMix NMR incluye eventos ricos, mensajería y auditoría lo que permite una integración con bajo acoplamiento.
  • Completo WS-BPEL con Apache ODE.
  • Basado en OSGI con la utilización Apache Karaf.


Además es licencia Apache 2.


Dejo Link:

http://servicemix.apache.org/

martes, 6 de marzo de 2012

Usar y distribuir software libre es entender y promover un bien social

Quiero compartir una noticia muy interesante:

Beatriz Busaniche, licenciada en Comunicación Social de la Universidad Nacional de Rosario trabaja para la Fundación Vía Libre y es especialista en software libre. Entre sus ventajas destaca la libertad que ofrece a quienes lo utilizan y la oportunidad de enseñar y aprender la informática de manera ética e integral.

El Software Libre (SL) es un tema que actualmente está en boca de todos. Los que está a favor argumentan la libertad que ofrece a quienes lo utilizan y la posibilidad de construir ciudadanía en relación a las nuevas tecnologías. Mientras que los detractores de esta filosofía suelen sostener que sin monopolio de copia no habría innovación. Beatriz Busaniche* señaló cuales son las ventajas del software libre y habló sobre su situación actual en Argentina.

Dejo el link:
http://www.redusers.com/noticias/usar-y-distribuir-software-libre-es-entender-y-promover-un-bien-social/

Software Libre

Una explicación simple del software libre:

domingo, 4 de marzo de 2012

Resource-oriented architecture

Resource-oriented architecture (ROA) es un estilo arquitectónico basado en Rest, como sabrán SOA es un estilo arquitectónico que indica que funcionalidades del negocio deben estar colgadas es servicios web (normalmente) lo cual permite desacoplamiento de funcionalidad de negocio y reutilización. ROA en cambio no se basa en exponer funcionalidad sino recursos. Lo cual marca una diferencia importante con SOA, SOA se centra en verbos "realizar movimiento bancario" mientra que ROA se basa en los sustantivos "movimientos bancarios".

ROA se basa en REST para exponer los recursos, es decir usa todas las características de REST por lo tanto expone los recursos con URL RestFul. Es decir el movimiento bancario va estar en /movimiento-bancario y se lo va a poder crear con el método PUT, listar con el GET, modificar con POST y borrar con DELETE.

ROA propone exponer los recursos, de forma tal que sea muy similar a la forma que accedemos a base de datos; select - GET, delete - DELETE, update - POST, insert - PUT. Dando una forma clara de acceder, borrar y modificar cada uno de los recursos.

También al basarse en REST se crean arquitecturas livianas flexibles.

Personalmente creo que la gran desventaja es que no contamos con todo el estándar ws-* y el conjunto de herramientas que permiten la orquestación,interacción, seguridad, etc. que si nos brinda SOA.

Creo que el tiempo va a coronar un ganador por ahora a utilizar la mejor herramienta para los problemas particulares y hacer camino al andar!

Dejo Links:

http://en.wikipedia.org/wiki/Resource-oriented_architecture
http://www.infoq.com/articles/RESTSOAFuture

SOAP vs REST: ¿Cual usar en cada caso?


Desde que REST salió a la luz, siempre ha habido un debate en torno a su comparación con SOAP. La arquitectura REST es sencilla, precisamente ese es su atractivo principal.

REST fue rápidamente catalogado como alternativa a SOAP. Aún así, actualmente SOAP todavía posee el monopolio en el mundo de los Servicios Web. Ambos difieren en muchos aspectos comenzando por que REST fue concebido en el ámbito académico y SOAP es un estándar de la industria, creado por un consorcio del cual Microsoft formaba parte.

Las principales diferencias en el funcionamiento de ambos son:

  • SOAP es un estilo de arquitectura orientado a RPC (Remote Procedure Call), es decir, un estilo basado en llamadas a procedimientos remotos, mientras que para REST solamente existen los métodos de HTTP y está orientado a recursos.
  • REST no permite el uso estricto de “sesión” puesto que por definición es sin estado, mientras que para SOAP, al ser orientado a RPC, los servicios Web crean sesiones para invocar a los métodos remotos.
  • SOAP utiliza HTTP como un túnel por el que pasa sus mensajes, se vale de XML para encapsular datos y funciones en los mensajes. Si dibujásemos una pila de protocolos, SOAP iría justo encima de HTTP, mientras que REST propone HTTP como nivel de aplicación.

En el debate de comparación entre REST y SOAP, la mayoría de los desarrolladores de aplicaciones Web toman posiciones muy extremas a favor de uno u otro. Los afines a SOAP, suelen pronunciarse diciendo que SOAP es más flexible que REST a la hora de implementar servicios Web y muestran como un defecto de REST la restricción “sin estado”, mientras que los adeptos de REST (también llamados Restafarians), critican la escasa transparencia de SOAP y opinan que hace las cosas más difíciles de lo que de verdad son, dicen que SOAP da “un paso hacia delante y dos hacia atrás”. Además opinan que SOAP puede suponer un problema porque puede dar lugar a la creación de agujeros de seguridad en las implementaciones HTTP.

Yo personalmente creo que los dos son utiles y se debe buscar la mejor herramienta para cada caso, dejo un link sobre este tema:

http://www.estebanetayo.es/?p=438


The Git Community Book


Todo indica que SVN es bueno pero GIT es mejor, por lo tanto ha estudiar GIT!

Dejo un link sobre el libro de la comunidad:

http://book.git-scm.com/

Y mientras leen el libro dejo una canción de GIT:




Porque tu mama no debe ser tu amigo en facebook

Un poco de humor no viene mal...


viernes, 2 de marzo de 2012

Spring data + mongoDB

Bueno vamos a hacer otro ejemplo con Spring data y mongoDB. La idea seria que tengo un usuario y debo guardarlo en una base NoSQL como MongoDB.

Antes de empezar es necesario instalar mongoDB y levantar la base como lo indica el siguiente tutorial:

http://emanuelpeg.blogspot.com/2012/02/instalar-mongodb-en-linux.html

Vamos hacer el proyecto con maven:

mvn archetype:generate

Creamos el proyecto comunacho de maven, con los nombres de paquetes que deseen. Vamos a agregar al pom las dependencias necesarias:

		
			org.springframework.data
			spring-data-mongodb
			1.0.1.RELEASE
		
		
		
			org.springframework
			spring-core
			${spring.version}
		

		
			org.springframework
			spring-context
			${spring.version}
		

		
			org.springframework
			spring-aop
			${spring.version}
		

		
			org.springframework
			spring-aspects
			${spring.version}
		

		
			org.springframework
			spring-tx
			${spring.version}
		

		
			junit
			junit
			4.10
			test
		

		
			org.springframework
			spring-test
			${spring.version}
			test
		


donde:


	3.1.0.RELEASE



Además agregamos el repositorio:

	
		
			spring-release
			Spring Maven Release Repository
			http://repo.springsource.org/libs-release
		
	


Hacemos maven para agregar las dependencias:

mvn clean install
mvn eclipse:eclipse

Ahora importamos el proyecto a eclipse o su IDE favorita, la mía es eclipse.

Creamos la clase User, vamos a hacer antes una clase padre que contenga las particularidades generales de las clases del modelo que van a hacer persistidas:

public abstract class PersistentEntity {
	@Id
	private Long id;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}


}


Ahora hacemos la clase User:

@Document
public class User extends PersistentEntity {

	private String userName;
	
	private String password;
	
	private List emails = new ArrayList();
	
	public User() {
	}
	
	public User(String userName, String password) {
		super();
		this.userName = userName;
		this.password = password;
	}

	public User(String userName, String password, List emails) {
		this(userName, password);
		this.emails = emails;
	}

	//getters and setters

} 


Vamos a escribir un DAO para ello vamos hacer lo siguiente vamos a generar una clase genérica que contenga métodos genéricos de acceso a datos y vamos a heredar de esta clase; a la vez cada clase va a tener su interfaz que la describa.

La interfaz del genericDAO:

package org.assembly.edda.repository;

import java.io.Serializable;
import java.util.List;

import org.assembly.edda.model.PersistentEntity;

public interface GenericDAO {
	
	T get(ID id);
	
	T save(T object);
	
	void delete(T object);
	
	List findAll();
} 


Su implementación:

package org.assembly.edda.dao;

import java.io.Serializable;
import java.util.List;

import org.assembly.edda.model.PersistentEntity;
import org.assembly.edda.model.User.User;
import org.assembly.edda.repository.GenericDAO;
import org.springframework.data.mongodb.core.MongoTemplate;

/**
 * @author emanuel
 *
 */
public abstract class GenericDAOImpl implements GenericDAO {

	private MongoTemplate mongoTemplate;
	
	public void setMongoTemplate(MongoTemplate mongoTemplate) {
		this.mongoTemplate = mongoTemplate;
	}
	
	protected abstract Class getEntityClass();
	
	public T get(ID id) {
		return (T) mongoTemplate.findById(id, getEntityClass());
	}

	public T save(T objectToSave) {
		mongoTemplate.save(objectToSave);
		return objectToSave;
	}

	public void delete(T objectToDelete) {
		mongoTemplate.remove(objectToDelete);
	}
	
	public List findAll() {
		return mongoTemplate.findAll(getEntityClass());
	}

}


Ahora la interfaz de UserDAO:

package org.assembly.edda.repository.user;

import org.assembly.edda.model.User.User;
import org.assembly.edda.repository.GenericDAO;

public interface UserDAO extends GenericDAO{

}


y su implementación:

package org.assembly.edda.dao.user;

import org.assembly.edda.dao.GenericDAOImpl;
import org.assembly.edda.model.User.User;
import org.assembly.edda.repository.user.UserDAO;

/**
 * @author emanuel
 *
 */
public class UserDAOImpl extends GenericDAOImpl implements UserDAO{

	
	@Override
	protected Class getEntityClass() {
		return User.class;
	}

}


Ahora vamos a escribir el ApplicationContext.xml de spring:



        
    
    
    
    	
    
    
    
    	
    	
    

	
    
    	
    
    
	
	
	
	
		
		
	
    



Bueno con esto estamos, solo debemos testar para ver si funciona. Creamos un test; ojo tener levantada la base cuando se lo corre. Para testear esto lo voy hacer más difícil voy a generar una clase padre generica y luego el test concreto (solo para ver como queda)

package org.assembly.edda.dao;

import static org.junit.Assert.*;
import java.util.List;

import org.assembly.edda.model.PersistentEntity;
import org.assembly.edda.repository.GenericDAO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;


/**
 * @author emanuel
 *
 */
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
public abstract class GenericDAOTest> {
	
	protected abstract DAO getDAO();
	protected abstract T createObject();
	protected abstract T createOtherObject();
	protected abstract void assertEqualsObject(T object, T objectSaved);
	
	@Test
	public void find() {
		T object = createObject();
		getDAO().save(object);
		
		T objectSaved = getDAO().get(object.getId());
		assertEqualsObject(object, objectSaved);
	}

	
	@Test
	public void findAll() {
		T object = createObject();
		getDAO().save(object);
		
		T otherObject = createOtherObject();
		getDAO().save(otherObject);
		
		List all = getDAO().findAll();
		
		assertEquals(2, all.size());
	}

}

Y la implementación del test:

package org.assembly.edda.dao.user;

import static org.junit.Assert.*;

import javax.annotation.Resource;

import org.assembly.edda.dao.GenericDAOTest;
import org.assembly.edda.model.User.User;



public class UserDAOTest extends GenericDAOTest {

	@Resource
	private UserDAOImpl dao;
	
	public void setDao(UserDAOImpl dao) {
		this.dao = dao;
	}
	
	@Override
	protected UserDAOImpl getDAO() {
		return dao;
	}

	@Override
	protected User createObject() {
		User user = new User("Pepe", "0303456yalalala");
		user.setId(4l);
		return user;
	}

	@Override
	protected User createOtherObject() {
		User user = new User("Pepe", "0303456yalalala");
		user.setId(5l);
		return user;
	}
	
	@Override
	protected void assertEqualsObject(User object, User objectSaved) {
		assertEquals(object.getId(), objectSaved.getId());
		assertEquals(object.getUserName(), objectSaved.getUserName());
		assertEquals(object.getEmails(), objectSaved.getEmails());
		assertEquals(object.getPassword(), objectSaved.getPassword());
	}


}



Eso es todo amigos!!