Lançada a versão 1.0.9 beta do apache Easy-Cassandra.

   Lançada a mais nova versão do framework que visa facilitar a persistência de objetos do apache Cassandra. Dentre as suas novidades está nas anotações, nessa versão estará usando as anotações do JPA. Outra novidade é o uso do recurso de JPQL, com isso se pode realizar querys com objetos e a ferramenta se encarregará de fazer a tradução para o Cassandra, para isso se utiliza a interface JCassandra que estende de javax.persistence.Query. A expectativa é que aumentar ainda mais a produtividade para o desenvolvimento.
JCassandra jCassandra=persistence.createJCassandra("select * from Person");
List persons=jCassandra.getResultList();

tabela 1: exemplo usando o jpql no Easy-Cassandra

Conforme dito acima as anotações foram adaptadas conforme mostra a tabela 2.
Easy-Cassandra 1.0.8
Easy-Cassandra 1.0.9 (Com JPA anotação)
org.easycassandra.annotations.ColumnFamilyValue
javax.persistence.Entity
org.easycassandra.annotations.ColumnValue
javax.persistence.Column
org.easycassandra.annotations.EmbeddedValue
javax.persistence.Embedded
org.easycassandra.annotations.EnumeratedValue
javax.persistence.Enumerated
org.easycassandra.annotations.KeyValue
javax.persistence.Id
org.easycassandra.annotations.KeyValue equals true
javax.persistence.GeneratedValue
org.easycassandra.annotations.IndexValue
org.easycassandra.annotations.Index

tabela 2: relação entre as anotações da versão 1.0.8 e 1.0.9 com anotação jpa.




   Também foi adicionado funcionalidade na anotação @Version do jpa, seu objetivo é verificar o tempo de inserção ou modificação do objeto.

@Entity(name = "autocount")
public class Count implements Serializable {

private static final long serialVersionUID = 3L;

@Id
@GeneratedValue
private BigInteger id;


@Column(name = "name")
private String name;

@Version
private Long timeStampLong;

@Version
private Date timeStampDate;

@Version
private Calendar timeStampCalendar;

//getter and setter
}

tabela 3: Usando a anotação version

   Para demonstrar novos recursos do framework será feito um exemplo de álbuns musicais que possa ser chamados em várias plataformas, para isso será usado web services. Para realizar esse exemplo será utilizado o java EE 6. Como o foco desse artigo não será o java EE 6, não entraremos em detalhes do mesmo. Após modelar e realizar as anotações com o jpa nossa classe ficará como mostra a tabela4.

@XmlRootElement
@Entity
public class Album implements Serializable{
@Id
private Long id;
@Column(name="nameOfAlbum")
private String name;
@Column
private String style;
@Column
private Calendar release;
@Column
private Double price;
@Embedded
private Artist artist;
//getter and setter
}
@XmlRootElement
public class Artist implements Serializable{
/**
* name of the artist
*/
@Column(name="nameOfArtist")
private String name;
/**
* was born
*/
@Column
private String country;
@Enumerated
private Sex sex;
//getter and setter
}

@XmlRootElement
public enum Sex {
MALE,FAMALE
}

tabela 4: classe com anotações jpa para o Easy-Cassandra


   Uma vez pronta a classe de anotação o que será feito agora é recurso para o rest, uma coisa que vale salientar é que a inteface JCassandra estende da interface javax.persistence.Query, assim se pode estar a utilizando a interface Query (interessante para quem já está acostumado com o uso do jpa). Sendo que nem todas os métodos dessa interface estão implementados.
Assim realizando as chamadas com o novo recurso de jpql no Cassandra ficará de acordo mostra a tabela 5. Vale salientar como é feito para o Easy-Cassandra gerenciar a classe. Esse processo é realizado sem a necessidade do uso do xml, para isso é usado do método addFamilyObjec na Classe EasyCassandraManager. É necessário que a classe seja adicionada antes de se criar um jpql da respectiva classe. No nosso exemplo ele será feito na classe PersistenceManagement tão logo uma conexão para o cassandra for criada, como mostra a tabela 5.

@ApplicationScoped
public class PersistenceManagement {
@Produces
private Persistence persistence;
@Inject
public void init(){
persistence=EasyCassandraManager.getPersistence("javabahia", "localhost", 9160);
EasyCassandraManager.addFamilyObject(Album.class);
}
}

@RequestScoped
public class PersistenceService {

@Inject
private Persistence persistence;

public List findAllAlbum() {
Query query=persistence.createJCassandra(" select * from Album");
return query.getResultList();
}

public Album findById(Long id) {
Query query=persistence.createJCassandra(" select * from Album where id =:id");
query.setParameter("id", id);
return (Album) query.getSingleResult();

}

public boolean save(Album album) {
return persistence.insert(album);
}

public void remove(Long id) {
persistence.deleteByKeyValue(id, Album.class);
}

public String update(Long id, String name, String style, Double price,String nameOfArtis,String country) {
StringBuilder query=new StringBuilder();


boolean updatable=createMethod(query, name, style, price, country, nameOfArtis);

if(!updatable){
return "nothing is update";
}

Query jCassandra=persistence.createJCassandra(query.toString());
setParameter(name, jCassandra, style, price, nameOfArtis, country);
jCassandra.setParameter("id", id);
return jCassandra.executeUpdate()==1?"executed with sucess":" error in update ";

}

private void setParameter(String name, Query jCassandra, String style, Double price, String nameOfArtis, String country) {
if(!isnull(name)){
jCassandra.setParameter("name", name);
}
if(!isnull(style)){

jCassandra.setParameter("style", style);
}
if(!isnull(price)){
jCassandra.setParameter("price", price);
}
if(!isnull(nameOfArtis)){

jCassandra.setParameter("artist", nameOfArtis);
}
if(!isnull(country)){
jCassandra.setParameter("country", country);
}
}

private boolean createMethod(StringBuilder query, String name, String style, Double price, String country, String nameOfArtis) {
String conecion="";
boolean updatable=false;
query.append("update Album set ");
if(!isnull(name)){
query.append(conecion);
query.append(" name =:name ");
updatable=true;
conecion=" , ";
}
if(!isnull(style)){
query.append(conecion);
query.append(" style =:style ");
updatable=true;
conecion=" , ";
}
if(!isnull(price)){
query.append(conecion);
query.append(" price =:price ");
updatable=true;
}

if(!isnull(country)){
query.append(conecion);
query.append(" artist.country =:country ");
updatable=true;
conecion=" , ";
}
if(!isnull(nameOfArtis)){
query.append(conecion);
query.append(" artist.name =:artist ");
updatable=true;
}

query.append(" where id =:id ");
return updatable;
}



private boolean isnull(Object object){

return object==null;
}

}



tabela 5: realizando um jpql no cassandra


Uma vez implementados as querys será feito agora as chamadas agora será criado o recurso conforme mostra a tabela 6.
@Path("/album")
@RequestScoped
public class AlbumResource {
@Inject
private PersistenceService persistenceService;

@GET
@Produces(MediaType.TEXT_XML)
public List getProdutos() {
return persistenceService.findAllAlbum();
}
@Path("{id}")
@GET
@javax.ws.rs.Produces(MediaType.TEXT_XML)
public Album getAlbum(@PathParam("id") long id) {
return persistenceService.findById(id);
}

@Path("update/{id}")
@GET
@javax.ws.rs.Produces(MediaType.TEXT_PLAIN)
public String updateAlbum(@PathParam("id") Long id ,@QueryParam("name") String name,@QueryParam("style") String style,@QueryParam("price") Double price,@QueryParam("artist") String nameOfArtis,@QueryParam("country") String country) {

return persistenceService.update(id,name,style,price,nameOfArtis,country);
}
@POST
@Consumes(MediaType.TEXT_XML)
@Produces(MediaType.TEXT_PLAIN)
public String addAlbum(Album album) {
boolean sucess=persistenceService.save(album);
if(sucess){
return album.getName() + " added!";
}
return album.getName() + " not added!";
}



@Path("{id}")
@DELETE
@Produces(MediaType.TEXT_PLAIN)
public String removeAlbum(@PathParam("id") Long id) {
persistenceService.remove(id);
return "Album removed.";
}
}

tabela 6: criando um servidor  rest com o JAX-RS


   Uma das maneiras de se realizar os testes é utilizando o poster, um plugin para o firefox, que estará disponível nos links. Com ele se poderá realizar todos os testes, inclusive aqueles que envolvam o post e remove. É possível realizar alguns testes já no navegador:
Lista de álbum
Lista o álbum com o id 1
Lista o álbum com o id N
Insere ou atualiza um álbum com id igual a 12 com o nome, país Brasil, estilo eletrônico, preço 23 e o artista eu

tabela 7: exemplos de serviços com o rest


   Com isso foi demonstrado as novidades da nova versão do Easy-Cassandra, versão 1.0.9, que visa facilitar a vida do desenvolvedor. Foi demonstrado as mudanças para anotações típicas do jpa, novo recurso que recupera o timestamp da linha além do uso do JPQL por parte do framework. Muito ainda se tem de melhorar na ferramenta, mas com ajuda da comunidade isso será possível.
Link:
Exemplo servidor rest (AlbumServerRest.rar): https://github.com/otaviojava/Easy-Cassandra/downloads
Download o código e a documentação para a versão 1.0.9 ( documento 03): https://github.com/otaviojava/Easy-Cassandra/downloads
Anúncios

Um comentário sobre “Lançada a versão 1.0.9 beta do apache Easy-Cassandra.

  1. bruno disse:

    E ae cara, blz?
    Este framework permite a conexão com o Cassandra tb né?
    Gostei mto da idéia e acredito que vai me ajudar mais ainda no desenvolvimento do meu tcc!
    Pelo visto o Cassandra tem fácil integração apenas com o Java, por ser nativo as suas funções…infelizmente não consegui fazer funcionar com PHP!
    Vlw

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s