Translate

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!!

lunes, 27 de febrero de 2012

Udacity, la primea universidad online gratuita para todo el mundo


El renombrado profesor de Stanford, Sebastian Thrun, ha dejado la docencia en el centro y ha anunciado un proyecto revolucionario: Udacity, una “universidad” online gratuita e interactiva para cualquier persona en el mundo. El primer curso: cómo construir un motor de búsqueda.

En la pagina web dice:
Creemos que la enseñanza universitaria puede ser a la vez alta calidad y bajo costo.

La verdad es que estoy totalmente de acuerdo con esta premisa, y voy a aprovechar haciendo estos cursos.

Dejo el link:
http://www.udacity.com/

sábado, 25 de febrero de 2012

Agile Open Paraná 2012




En el contexto de los exitosos eventos del Agile Open Tour, se organizará un nuevo Agile Open Paraná 2012 "Compartiendo Metodologías Ágiles" el Viernes 30 de Marzo.


No tengo ni una sola palabra para agregar. En realidad 2... 


Ha inscribirse!!

Dejo el link:



jueves, 23 de febrero de 2012

Hyperpolyglot


Cuando alguien hace un buen trabajo no queda otra que sacarse el sombrero y si es licito compartir ese trabajo a la comunidad. Por esta razón quiero compartir una pagina que encontré que tiene diferentes comparaciones de lenguajes de programación. Estas comparaciones son muy completas y tienen una buena calidad.

Las comparativas son:


Interpreted Languages:PHP, Perl, Python, Ruby
Interpreted Languages:Tcl, Lua, JavaScript, Io
Operating System Automation:POSIX Shell, AppleScript, PowerShell
C++ Style Languages:C++, Objective C, Java, C#
Pascal Style Languages:Pascal, Ada, PL/pgSQL, MySQL
Lisp Dialects:Common Lisp, Scheme, Clojure, Emacs Lisp
Type Inference Languages:Standard ML, OCaml, Scala, Haskell
Untyped Declarative Languages:Prolog, Erlang, Oz
Concatenative Languages:Forth, PostScript, Factor
Tabular Data Selection:SQL, Awk, Pig
Computer Algebra Software:Maxima, Mathematica
Numerical Analysis Software:Fortran, MATLAB, R, NumPy


Dejo el link:
http://hyperpolyglot.org/

miércoles, 22 de febrero de 2012

Code Hero

"Code Hero" es el video juego que fue diseñado para aprender a programar en javascript. Es un juego en primera persona y usa la api Unity3D.
Lo realmente malo es que se descarga para windows o mac solamente; pruebo si mi wine lo tira!

Dejo el video:



Dejo link:
http://primerlabs.com/codehero

LungoJS



Quiero compartir un screencast sobre LongoJS un framework que aprovecha las caracteristicas de HTML 5, CSS 3 y javascript para desarrollar aplicaciones moviles.

LungoJS - RESTful + Templating + Cache (Spanish) from LungoJS on Vimeo.


Dejo la fuente y links:
http://www.genbetadev.com/desarrollo-aplicaciones-moviles/lungojs-usando-restful-templating-cache-screencast
http://vimeo.com/37014134
http://www.lungojs.com/

Apache celebra su 17 aniversario con un release de su servidor

Leo en infoq que el servidor Apache cumple 17 añitos y para festejarlo libera su versión 2.4 de su servidor http.


Dejo mis felicitaciones!!


Y dejo links:
http://httpd.apache.org/
http://www.infoq.com/news/2012/02/Apache-HTTP-Server-2-4


martes, 21 de febrero de 2012

Infografía sobre HTML 5

Comparto una Infografía sobre HTML 5 y sus nuevos tags y propiedades:

Pinned Image

viernes, 17 de febrero de 2012

Spring data y mongodb parte 2

Spring data nos brinda muchos beneficios para poder utilizar MongoDB entre los cuales ya nombramos en este post:

http://emanuelpeg.blogspot.com/2012/02/mongodb-spring-data.html

Pero vamos a empezar?

Spring MongoDB requiere MongoDB 1.4 o superior y JDK 1.5 o superior. Obiamente que lo ideal seria utilizar Spring MongoDB en un proyecto que use Spring.

Antes que nada debemos iniciar MongoDB como lo explica el siguiente post:

Podemos hacer un proyecto Spring con maven y agregar las siguientes dependencias:


    org.springframework.data
    spring-data-mongodb
    1.0.0.M5
  


y el siguiente repositorio:


  
    spring-milestone
    Spring Maven MILESTONE Repository
    http://maven.springframework.org/milestone
  



Debemos agregar un archivo log4j.properties si necesitamos ver el log. El archivo va a contener lo siguiente:

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

log4j.category.org.springframework.data.document.mongodb=DEBUG
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %40.40c:%4L - %m%n


Para el siguiente ejemplo vamos hacer una clase persona:

package org.spring.mongodb.example;

public class Person {

  private String id;
  private String name;
  private int age;
   
  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
  
  //Getters and setters
  
  @Override
  public String toString() {
    return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
  }
  
}


Buenisimo, ahora hacemos un main para probar:

package org.spring.mongodb.example;

import static org.springframework.data.mongodb.core.query.Criteria.where;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;

import com.mongodb.Mongo;

public class MongoApp {

  private static final Log log = LogFactory.getLog(MongoApp.class);

  public static void main(String[] args) throws Exception {

    MongoOperations mongoOps = new MongoTemplate(new Mongo(), "database");

    mongoOps.insert(new Person("Joe", 34));

    log.info(mongoOps.findOne(new Query(where("name").is("Joe")), Person.class));

    mongoOps.dropCollection("person");
  }
}


Es magia.

En 4 lineas de código se guarda en la base de datos NoSQL MongoDB y se consulta con una consulta con where y se logea el resultado y al terminar la prueba se borra los datos; en 4 lineas.

En este pequeño ejemplo se pueden ver 4 cosas:

  • Se puede instanciar MongoTemplate con el objeto estandar de MongoDB com.mongodb.Mongo y el nombre de la base.
  • Se puede guardar un POJO así de simple sin metadata, ni herencia, ni nada raro.
  • MongoDB sabe el ObjectID por convensión, se maneja el campo id por convesión
  • La clase Persona puede tener solo getters, dado que asigna los datos por convensión. Si los nombres de los parametros del contructor coinciden con los datos usa estos datos para construir el objeto.



Para la proxima un ejemplo más copado. Continuara...

miércoles, 15 de febrero de 2012

Apache Apollo la nueva generación de mensajería!





ActiveMQ Apollo es más rapido, seguro, confiable y facil de mantener broker de mensajería. El cual fue construido a partir de Apache ActiveMQ. Los ingenieros de Apache le dieron una vuelta de rosca a ActiveMQ.

Apollo sólo soporta el protocolo STOMP pero al igual que ActiveMQ, ha sido diseñado para correr sobre varios protocolos. En futuras versiones se añadirá soporte OpenWirepor lo que puede ser compatible con ActiveMQ 5.x clientes JMS.

Entre los cambios de arquitectura podemos nombrar:


  • Refactor basado en Thread Model
  • Implementación para scala 2.8
  • Protocolo agnóstico
  • Administración basada en REST



Dejo links:
http://activemq.apache.org/apollo/
http://activemq.apache.org/apollo/documentation/architecture.html
http://activemq.apache.org/apollo/documentation/getting-started.html

martes, 14 de febrero de 2012

Documentación completa de Play Framework disponible en español


Me llego el siguiente mail de la gente de play, una gran noticia:

"Finalmente hemos concluido la traducción de la documentación de Play
Framework. Pueden consultarla en http://playdoces.appspot.com/

Hace apenas tres meses anunciábamos en esta lista que junto con varios
colegas iniciábamos la traducción de la documentación de Play
Framework, y al mismo tiempo invitábamos a todos los usuarios de este
framework a sumarse a la tarea.

Hoy, mientras nos preparamos para el lanzamiento de play 2.0, gracias
a la colaboración de colegas de América Latina y España ya podemos dar
por concluida la traducción de toda la documentación del sitio de play
Framework.

Aquí tienen los links:

Página principal: http://playdoces.appspot.com/

Si vives en alguno de los países a quienes google restringe el acceso
a las aplicaciones de Google Application Engine (¿qué habrá pasado con
el lema de “No seas malo”?), también tenemos una copia del sitio
alojada en openshift: http://playdoces-opensas.rhcloud.com/

Anuncio de la versión 2.0 de play: http://playdoces.appspot.com/2.0

Hola mundo en play: http://playdoces.appspot.com/documentation/latest/firstapp

Tutorial completo de play: una aplicación completa paso a paso:
http://playdoces.appspot.com/documentation/latest/guide1

y muchos artículos más que pueden encontrar en
http://playdoces-opensas.rhcloud.com/documentation/latest/home

También pueden ver el anuncio en el blog:
http://playlatam.wordpress.com/2012/02/14/documentacion-completa-de-play-framework-disponible-en-espanol/

Queremos agradecer a @rodriguezlaurag y @mfmontanari de Argentina,
@gualtrapa de España, @pjquero de Venezuela and @alfonsokim de México,
y también a los desarrolladores de la traducción japonesa del sitio de
Play, @garbagetown y @ikeike443, cuyo trabajo forkeamos
descaradamente.

Esperamos que nos ayuden a difundir esta noticia y que esta iniciativa
ayude a impulsar el uso de Play en los países de habla hispana.

Saludos

Sas (@develsas)"



Felicitaciones!! 

lunes, 13 de febrero de 2012

Más de Spring Data y MongoDB

Sigo leyendo sobre spring-data un proyecto que se las trae. Ahora vamos analizar el proyecto Spring Data con MongoDB.

Repository es la interfaz más general de Spring Data; CRUDRepository extiende esta y agrega metodos basicos para hacer las operaciones CRUD.


public interface CrudRepository
    extends Repository {
                                                                                         
    T save(T entity);
                                                                                         
    T findOne(ID primaryKey);
                                                                                         
    Iterable findAll();

    Long count();
                                                                                         
    void delete(T entity);
                                                                                         
    boolean exists(ID primaryKey);
                                                                                         
    // … more functionality omitted.
}



PagingAndSortingRepository nos provee los metodos de busqueda:


public interface PagingAndSortingRepository extends CrudRepository {

    Iterable findAll(Sort sort);

    Page findAll(Pageable pageable);
}





Donde Pageable es una clase que sirve para paginar; por ejemplo si quisieramos ir a 2 pagina y la pagina va cada 20 filas se debe instanciar de la siguiente manera: new PageRequest(1, 20)

Seteamos spring para que cree los proxys de nuestra interfaces:


  






Luego inyectamos el objeto a la clase que lo deberia usarlo:

public class SomeClient {

  @Autowired
  private PersonRepository repository;

  public void doSomething() {
    List persons = repository.findByLastname("Matthews");
  }
}




Tambien se pueden definir implementaciones para las interfaces por ejemplo si tenemos un metodo particular. Simplemente hay que definir la implementación:


interface UserRepositoryCustom {

  public void someCustomMethod(User user);
}


class UserRepositoryImpl implements UserRepositoryCustom {

  public void someCustomMethod(User user) {
    // Your custom implementation
  }
}


Como se puede ver no hay que extender de ninguna clase de Spring data, ni hay que hacer algo raro. Ahora hacemos la interfaz posta, la cual va tener los metodos que provee Spring Data y el metodo custom:


public interface UserRepository extends CrudRepository, UserRepositoryCustom {

  // Declare query methods here
}



Esa es una primera parte de Spring Data con MongoDB. Mientras voy aprendiendo escribo algo acá!

Dejo link:
http://static.springsource.org/spring-data/data-document/docs/current/reference/html/

viernes, 10 de febrero de 2012

Instalar MongoDB en Linux

No es el super tutorial, no por culpa mía sino que es muy fácil instalar mongoDB. 
Empezamos bajando la base de este link: http://www.mongodb.org/downloads 
Una vez que hallamos bajado el archivo nos logeamos como root en el directorio que se bajo la base y movemos el archivo a opt (o a la que quieran ustedes)


# mv mongodb-linux-x86_64-2.0.3-rc0.tgz /opt/
# cd /opt


Ahora vamos a descomprimir el archivo y de paso borramos el tgz:


# tar -xvf mongodb-linux-x86_64-2.0.3-rc0.tgz 
# rm mongodb-linux-x86_64-2.0.3-rc0.tgz 

Se crea la carpeta data

# mkdir -p /data/db/
# chown `id -u` /data/db

Luego de crear el directorio de datos dado que MongoDb usa una carpeta para datos con el path configurable pero nosotros vamos usar el path por defecto.

Y ahora a levantar:

# cd mongodb-linux-x86_64-2.0.3-rc0/bin
# ./mongod

Ahora podemos jugar un rato: 

#db.foo.save( { a : 1 } )
#db.foo.find()

Dejo links:

miércoles, 8 de febrero de 2012

NoSQL

Dejo un gráfico que muestra en que conceptos se basaron para desarrollar las bases NoSQL.

Los puntos son: Consistencia, distribuido o capacidad de distribuirse y disponibilidad. En El grafico se puede ver por ejemplo que Voldemort es una base clave-valor que se apoyo sobre los conceptos de disponibilidad y capacidad de distribuirse.