terça-feira, 13 de maio de 2008

Desenvolvimento de Software

Essa figura é manjadíssima, mas tem gente que não conhece.

Ela ilustra muito bem o que acontece, normalmente, no desenvolvimento de software.

segunda-feira, 11 de fevereiro de 2008

37 dicas para um bom HTML

Segue link de um post com 37 dicas para um bom HTML.


Clique aqui

Destacar Palavras

public static String destacarExpressoesApresentacao(String textoOriginal, String[] palavrasProcuradas)
{
String textoComDestaques = textoOriginal;
int qtdPalavras = palavrasProcuradas.length;

for(int i = 0; i < qtdPalavras; i++)
{
String regex = montaRegex(palavrasProcuradas[i]);

Pattern pattern = Pattern.compile("(?i)" + regex.toLowerCase());
Matcher matcher = pattern.matcher(textoComDestaques);

while(matcher.find())
{
String palavra = matcher.group();
textoComDestaques = textoComDestaques.replaceAll(palavra,"" + palavra.toUpperCase() + "");
}

}

return textoComDestaques;
}


private static String montaRegex(String regex)
{
regex = regex.replaceAll("(?i)[aáàãâ]", "[AÁÀÃÂ]");
regex = regex.replaceAll("(?i)[eéèê]", "[EÉÈÊ]");
regex = regex.replaceAll("(?i)[iíì]", "[IÍÌ]");
regex = regex.replaceAll("(?i)[oóòõô]", "[OÓÒÕÔ]");
regex = regex.replaceAll("(?i)[uúù]", "[UÚÙ]");
regex = regex.replaceAll("(?i)[cç]", "[CÇ]");

return regex;
}

terça-feira, 22 de janeiro de 2008

TestNG - Uma ótima alternativa

O TestNG é uma ferramenta largamente utilizada para fazer Testes de Unidade (pelo que andei ouvindo, até mais que isso), aqui na empresa temos um companheiro, Israel Freitas, que usa essa ferramenta e tenta a muito tempo evangelizar outros, porém pouco lhe dei ouvidos, "já que eu tenho o JUnit pra que procurar outra ferramenta que faz a mesma coisa de maneira diferente" ? Mas por insistência dele, resolvi fazer um teste e publicar algo sobre o assunto, confesso que minha opinião sobre o TestNG mudou de maneira drástica.

Esta ferramenta foi criada por Cédric Beust (a senior software engineer at Google) e Alexandru Popescu, esta já usa conceitos como Annotations bem antes do JUnit, além disso, percebi muitas funcionalidades e facilidades oferecidas por ele.

Um conceito interessante é o de dependência entre testes, vale a pena ser estudado.

O TestNG (a versão testada é a 5.6) permite a utilização dos asserts do JUnit, inserindo somente o import: import static org.testng.AssertJUnit.*;

Para ilustrar, criei um exemplo bem simples:


Foi criado a classe POJO somente com 2 atributos e seus getters e setters:

public class POJO {

private int id;
private String nome;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}


Um teste bem simples foi feito pra a classe:

import org.testng.annotations.*;
import static org.testng.AssertJUnit.*;

public class POJOTest{

@BeforeClass
public void setUp() {

}

@Test
public void gettersAndSettersTest()
{
POJO pojo = getEntidade();
assertEquals(pojo.getId(), 1);
}

private POJO getEntidade() {
POJO pojo = new POJO();
pojo.setId(1);
pojo.setNome("nome");
return pojo;
}

}
* Perceba que uso os asserts do JUnit.

Criei o arquivo de configuração do TestNG:
*tire os '$' de todas as linhas

<$!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<$suite name="My First TestNG test">
<$test name="Hello Test!">
<$classes>
<$class name="POJOTest" />
<$/classes>
<$/test>
<$/suite>

Utilizando o plugin para o Eclipse rodei este teste com extrema facilidade e o log do resultado foi gerado:

[Parser] Running:
C:\Arquivos de programas\Apache Software Foundation\Tomcat 5.5\webapps\TestNGExamples\temp-testng-customsuite.xml

PASSED: gettersAndSettersTest

===============================================
POJOTest
Tests run: 1, Failures: 0, Skips: 0
===============================================


===============================================
TestNGExamples
Total tests run: 1, Failures: 0, Skips: 0
===============================================

O nível de detalhes do log do resultado é determinado na propriedade "Log Level" da configuração da execução do TestNG.


Os links abaixo vão ajudar muito na utilização do TestNG.

Site oficial
Plugin pro Eclipse
Annotations pra todos os gostos
TestNG com Ant
Automatizando a Migração do JUnit para o TestNG
Comparação entre TestNG e JUnit4
Bom artigo sobre o assunto


Avaliação geral:

Como um usuário do JUnit, considero o TestNG um adversário de peso, bem mais rico quando se fala de annotations. Acredito que esta ferramenta deve ter seu uso considerado, além de ser muito robusta e cheia de novidades, tem muita documentação disponível na WEB.
A única carência que percebi, foi a ausência de asserts, porém com introdução dos asserts do JUnit a carência foi resolvida.

fonte: Think about Tests

segunda-feira, 21 de janeiro de 2008

Criteria Subquery

DetachedCriteria subQuery = DetachedCriteria.forClass(Informacao.class, "subInformacao");
ProjectionList p = Projections.projectionList().create();

p.add(Projections.property("subInformacao.id"), "id");
subQuery.setProjection(p);

Criteria criteria = getSession().createCriteria(Aluno.class, "a");

ProjectionList p2 = Projections.projectionList().create();

p2.add(Projections.property("a.id"), "id");
p2.add(Projections.property("a.nome"), "nome");

criteria.setProjection(p2);
criteria.add(Property.forName("a.id").in(subQuery));

criteria.setResultTransformer(new AliasToBeanResultTransformer(Aluno.class));
Collection alunos = criteria.list();

System.out.println(alunos.size());

// CONSOLE:
// select
// this_.id as y0_,
// this_.nome as y1_
// from
// Aluno this_
// where
// this_.id in (
// select
// this0__.id as y0_
// from
// Informacao this0__
// )

Criteria Desconsiderando acento(postgres)

Criteria criteria = getSession().createCriteria(Aluno.class, "a");

ProjectionList retorno = Projections.projectionList().create();

retorno.add(Projections.property("a.id"), "id");
retorno.add(Projections.property("a.nome"), "nome");

criteria.setProjection(retorno);

criteria.add( Restrictions.sqlRestriction("to_ascii({alias}.nome) ilike to_ascii(?)", "%jose%", Hibernate.STRING));

criteria.setResultTransformer(new AliasToBeanResultTransformer(Aluno.class));
Collection alunos = criteria.list();

System.out.println(alunos.size());

// CONSOLE:
// select
// this_.id as y0_,
// this_.nome as y1_
// from
// Aluno this_
// where
// to_ascii(this_.nome) ilike to_ascii(?)

}

Criteria Restrictions.or

Criteria criteria = getSession().createCriteria(Aluno.class, "a");

ProjectionList retorno = Projections.projectionList().create();

retorno.add(Projections.property("a.id"), "id");
retorno.add(Projections.property("a.nome"), "nome");

criteria.setProjection(retorno);

criteria.add(Restrictions.or(Restrictions.eq("a.nome", "Joana"),
Restrictions.eq("a.idade", 56)));

criteria.setResultTransformer(new AliasToBeanResultTransformer(Aluno.class));
Collection alunos = criteria.list();

System.out.println(alunos.size());

// CONSOLE:
// select
// this_.id as y0_,
// this_.nome as y1_
// from
// Aluno this_
// where
// (
// this_.nome=?
// or this_.idade=?
// )
}