Review do Livro: Instant PrimeFaces Starter

Olá, tudo bem?

Fui convidado a escrever um review sobre o livro Instant Primefaces Starter – Packtpub.

Esse livro é um material excelente, em inglês apenas, para aqueles que procuram uma aplicação completa com JSF, EJB e JPA. O que eu realmente gostei desse livro é que o código da aplicação é compatível para acesso de usuários originados PC e mobile.

Esse livro detalha como ter uma aplicação com o código para ser acessado por diversos tipos de clientes, e ao mesmo tempo responsivo para os diversos tipos de aparelhos.

Esse livro não ensina sobre o Primefaces, mas como aplicar seus componentes no seu projeto.

Creio que a única coisa que não gostei desse livro é que é fácil encontrar código não identados. Acaba dificultando um pouco a leitura e o entendimento do código.

O código aplicado no livro tem boas práticas de programação quando falamos de JSF e JPA.

Se você está procurando um livro que tenha uma aplicação JEE completa, com um código que tenha boa prática de programação e tenha uma boa interface tanto para mobile quanto para PC, esse é o livro!

Espero que vocês gostem.

Até mais.

OBS.: O livro é em inglês apenas.

Book Review: Instant PrimeFaces Starter

Hello, how are you?

I have been invited to write a review for the book: Instant PrimeFaces Starter – Packtpub.

This book is an excellent material to those that want a full web application JSF + EJB + JPA. What I loved about this book is the code that works to web and mobile clients.

It details the code about how to get a code working with different type of clients, what is necessary to do if we want a responsive application.

This book does not teach about Primefaces, but teaches how to apply its components into your code.

I believe that the only thing that I did not like about this book is about the code indentation. Sometimes there are some code aligned in a straight line and that makes harder to read the code.

The code has good practices of development when we talk about JSF and JPA.

If you are looking for a book that has a full JEE application, with a code that is written with good practices and can be accessed by browsers of pcs and mobiles, this is the right book to buy.

I hope you guys like it,

See you later.

EasyCriteria 3.0 – Novas funcionalidades

Olá, tudo bem?

É com muita felicidade que anuncio mais uma versão do EasyCriteria. E essa versão agora é para facilitar e ampliar e muito a utilização do framework (caso você não conheça e queira conhecer mais sobre o EasyCriteria clique aqui).

São 2 features e um enorme refactor nessa nova versão que o EasyCriteria até mereceu mudar a versão principal do framework de 2 para 3.

Vamos lá:

Extreme Refactoring

Houve uma refatoração no código onde foi reduzida a complexidade do código, aplicado padrões, atributos como “final” para melhorar alocação de memória e dependências do pom.

Versão 3.0
cobertura_30

Versão 2.2
cobertura_22

Note houve uma diminuição na complexidade ciclomática dos pacotes (mais sobre o teste de complexidade aqui). Apenas o pacote de utils que houve um singelo aumento da complexidade mas ainda assim com redução do número de linhas.

Joins Inifinitos! o/

Pode parecer coisa simples e básica, mas essa era, até essa versão, o maior desafio. Agora é possível fazer quantos joins forem necessários. Veja o código abaixo:

EasyCriteria<Person> easyCriteria = EasyCriteriaFactory.createQueryCriteria(getEntityManager(), Person.class);

easyCriteria.innerJoin("dogs.toys.manufacturer");

easyCriteria.andEquals("dogs.toys.manufacturer.name", "ACME");

easyCriteria.orderByDesc("dogs.toys.name");

Analisando a consulta acima é possível perceber que agora é possível fazer todos os joins desejados para as diversas funcionalidades já existentes. Veja que o método “andEquals” está atravessando os relacionamentos existentes na Entity Person.

É possível ver também que até a ordenação agora aceita os diversos tipos de join.

O que simplificará também a API do EasyCriteria, pois agora não será necessário chamar nenhum outro método que tenha Join em seu nome para criar um “where”. O método andJoinEquals (ou qualquer outro que tenha Join no nome fazendo condição, ex.: andJoinGreaterThan, andJoinStringIn, …) está deprecated e marcado para remoção em futuras versões.

Count

Esse método permite fazer um count no resultado da query. Veja o código abaixo:

EasyCriteria<Person> easyCriteria = EasyCriteriaFactory.createQueryCriteria(getEntityManager(), Person.class);
System.out.println(easyCriteria.count());

O código acima exibiria o total de Pessoas cadastradas no banco de dados. Mas, seria possível fazer algo mais avançado?

A query abaixo funcionaria sem problemas:

List<String> names = new ArrayList<String>();
names.add("John");
names.add("Mary");

EasyCriteria<Manufacturer> easyCriteria = EasyCriteriaFactory.createQueryCriteria(getEntityManager(), Manufacturer.class);
easyCriteria.setDistinctTrue();
easyCriteria.innerJoin("products.sellers");
easyCriteria.andStringNotIn("products.sellers.name", names);
easyCriteria.setFirstResult(0);
easyCriteria.setMaxResults(50);

System.out.println(easyCriteria.count());
List<Manufacturer> manufactures = easyCriteria.getResultList();

Note no código acima que com o EasyCriteria é possível realizar um “count” e com o mesmo objeto realizar a consulta necessária.

É importante ressaltar que: o método count ignorará os valores definidos em setMaxResults e setFirstResult. Atualmente para utilizar esse tipo de count com maxResults e firstReslt seria necessário realizar uma subquery e atualmente isso não é feito pelo framework.

100% de cobertura

E o projeto ainda continua com 100% de cobertura em testes unitários com OpenJPA, Hibernate e EclipseLink utilizando JUnit e o plugin Cobertura.

Espere que a ferramenta seja bastante útil a todos vocês.

Para utilizar basta adicionar a dependência no POM:

<dependency>
    <groupId>uaihebert.com</groupId>
    <artifactId>EasyCriteria</artifactId>
    <version>3.0.0</version>
</dependency>

Ou fazer o download do jar aqui: http://uaihebert.com/wp-content/uploads/EasyCriteria/EasyCriteria-3.0.0_2013-08-02.jar

Até mais pessoal. o_

EasyCriteria 3.0 – New Features

Hello, how are you?

It is with a great joy that I announce a new version of the EasyCriteria framework. This new version will make easier and increase the framework utilization (click here if you do not know nothing about the EasyCriteria framework).

2 new features and a huge refactoring are present in this new version, these features/refactoring deserve a new major version in the framework. The new version is now 3.0.

Let us see what is new:

Extreme Refactoring

This refactoring was done to reduce the code complexity, to apply more code patterns, using “final” attribute to make a better memory use and changing “pom.xml” dependences.

Version 3.0
cobertura_30

Version 2.2
cobertura_22

Notice in the pictures above that the Cyclomatic complexity has been reduced a lot (click here to know more about Cyclomatic complexity). Just the “utils” package that had a small increase of complexity but it had some lines removed.

Multiple Joins! o/

It might look that multiple joins are something easy, but until this version, it was the major feature to be released. Now it is possible to do all the joins that you want, take a look at the code below:

EasyCriteria<Person> easyCriteria = EasyCriteriaFactory.createQueryCriteria(getEntityManager(), Person.class); 
easyCriteria.innerJoin("dogs.toys.manufacturer");
easyCriteria.andEquals("dogs.toys.manufacturer.name", "ACME");
easyCriteria.orderByDesc("dogs.toys.name");

Looking at the code above it is possible to see that it is possible to do “joins” for every method in the framework. Notice that the “andEquals” method is crossing all possible relationships in the entity Person.

The orderBy method also supports multiple joins.

This change will make the EasyCriteria API simpler, now it will not be necessary to call any method with Join in the name to create a “where”. The andJoinEquals method (or any other method with the word “Join” that creates a condition, e.g.: andJoinGreaterThan, andJoinStringIn), is deprecated and will be removed in future versions.

Count

This method allows doing a count in the query result. Take a look at the code below:

EasyCriteria<Person> easyCriteria = EasyCriteriaFactory.createQueryCriteria(getEntityManager(), Person.class);
System.out.println(easyCriteria.count());

The code above would count all Person found in the database. But, what about the complicated queries… would it do the count?

The query below would work without problems:

List<String> names = new ArrayList<String>();
names.add("John");
names.add("Mary");

EasyCriteria<Manufacturer> easyCriteria = EasyCriteriaFactory.createQueryCriteria(getEntityManager(), Manufacturer.class);
easyCriteria.setDistinctTrue();
easyCriteria.innerJoin("products.sellers");
easyCriteria.andStringNotIn("products.sellers.name", names);
easyCriteria.setFirstResult(0);
easyCriteria.setMaxResults(50);

System.out.println(easyCriteria.count());

List<Manufacturer> manufactures = easyCriteria.getResultList();

Notice in the code above that it is possible to do a count and with the same object execute the query.

One important thing to notice is that the count method ignores the values defined in the methods setFirstResult and setMaxResults. To do a count with firstResult and maxResults it would be necessary to do a SubQuery, and this is not supported yet.

100% of Coverage

This project still with 100% of coverage in the unit tests with OpenJPA, EclipseLink and Hibernate, JUnit and the Cobertura framework.

I hope that this tool will be really useful to you.

To use it with maven, just add to the pom:

<dependency>
    <groupId>uaihebert.com</groupId>
    <artifactId>EasyCriteria</artifactId>
    <version>3.0.0</version>
</dependency>

To manually download it, click here: http://uaihebert.com/wp-content/uploads/EasyCriteria/EasyCriteria-3.0.0_2013-08-02.jar

See you later.