
Le BigoDay

Atletas ELSA
Tiago, o dançarino:
Gabriel, o "Runner" (a partir de 13:40):
Testes com Selenium WebDriver
public class LoginTest { @Test public void loginTest() { WebDriver driver = new FirefoxDriver(); driver.get("localhost:8080/elsa/login"); } }
public class LoginTest { @Test public void loginTest() { WebDriver driver = new FirefoxDriver(); driver.get("localhost:8080/elsa/login"); driver.findElement(By.id("username")).sendKeys("usuario"); driver.findElement(By.id("password")).sendKeys("senha"); driver.findElement(By.id("loginButton")).click(); } }
public class LoginPage { public void login(WebDriver driver){ driver.findElement(By.id("username")).sendKeys("usuario"); driver.findElement(By.id("password")).sendKeys("senha"); driver.findElement(By.id("loginButton")).click(); } }
public class LoginTest { public LoginPage loginPage; public WebDriver driver; @Before public void setup() { loginPage = new LoginPage(); driver = new FirefoxDriver(); driver.get("localhost:8080/elsa/login"); } @Test public void loginTest() { loginPage.login(driver); String welcomeMessage = driver.findElement( By.xpath("/html/body/div/div[4]/div/ul/li/span")).getText(); assertEquals("Bem vindo ao Prontuário Eletrônico Online do ELSA.", welcomeMessage); } }
Aqui já passamos a instanciar LoginPage e o WebDriver no método setup que está anotado com @Before e, desta forma, é executado sempre antes de cada método anotado com @Test. Além disso, buscamos o valor da mensagem de boas vindas através do método findElement e utilizamos como parâmetro a busca de um elemento presente na página pelo xpath correspondente. Finalmente, fizemos uma asserção para garantir que a mensagem que aparece é a esperada.
Agora que nosso teste está pronto executamos esperando a barra verde que instantaneamente fica vermelha, informando que o nosso teste falhou. Aqui vale uma breve explicação. Como estamos trabalhando com ambiente web, devemos saber que nem sempre a resposta é imediata para as requisições feitas para os servidores onde estão as aplicações. Então o melhor a ser feito para contornarmos o problema é implementarmos uma condição esperada de parada com um timeout, desta maneira o teste pode ser executado com mais confiabilidade.
@Test public void loginTest() { loginPage.login(driver); ExpectedCondition<Boolean> expectedCondition = new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver webDriver) { webDriver.findElement(By.xpath("/html/body/div/div[4]/div/ul/li/span")); return true; } }; Wait<WebDriver> wait = new WebDriverWait(driver, 15); wait.until(expectedCondition); String welcomeMessage = driver.findElement( By.xpath("/html/body/div/div[4]/div/ul/li/span")).getText(); assertEquals("Bem vindo ao Prontuário Eletrônico Online do ELSA.", welcomeMessage); }
PrimeFaces autoComplete weird behavior
A few weeks ago, while changing the behavior of an auto-complete field we have in our system, I came across a very weird bug. The field was supposed to suggest a list of Technicians, based on the name the user typed.
I was asked to have it accept not only the name of the Technician but also their ids.
To make the long story short: we are using a PrimeFaces AutoComplete component with the forceSelection flag set to true. The problem was that even tough the user did not selected any of the suggestions on the list, the value he typed was still being submitted to the form.
At first this was not a problem, because our Converter is using the Technician id, and when searching for a name, there was no match. But when the search includes the id, undesired thing happens, i.e. the field which as supposed to be empty, was filled with the Technician's information whose id the user typed.
With the help of Firebug, I found out that the hidden input Primefaces uses to implement the auto-completion, was not being cleaned when none of the suggestions was picked, thus, submitting a value the user didn't know was there.
To solve the problem, I hacked into Primefaces's jar, and, after formatting the autocomplete.js with the help of my friend Eclipse, I found this line:
jQuery(this).val("");
On a lucky/educated guess, I added the following line below that one:
jQuery(a.jqh).val("");
After repacking the jar, the problem was gone. I am not sure if this is a bug or the correct behavior, but it happened in Primefaces version 2.2.1.
Presentation Layer Validation: Bean Validation Within JSF 2.0
The Problem
Two constraints were created and for each one, a validator was implemented (which executes the validation logic). Both constraints were used at field-level on JPA entities, the Username and FloatRange constraints were annotated on fields of type string and float, respectively. However, just the Username constraint worked.. Hereunder you can take a look at the implemented code, or part of it :)
@Documented @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = UsernameValidator.class) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE }) public @interface Username { String message() default "{constraint.username.invalid}"; Class<? extends Payload>[] payload() default {}; Class<?>[] groups() default {}; }
public class UsernameValidator implements ConstraintValidator<Username, String> { @Override public void initialize(Username annotation) {} @Override public boolean isValid(String value, ConstraintValidatorContext context) { // validation logic ommited } }
@Documented @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = FloatRangeValidator.class) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE }) public @interface FloatRange { String message() default "{constraint.range}"; Class<? extends Payload>[] payload() default {}; Class<?>[] groups() default {}; float min(); float max(); }
public class FloatRangeValidator implements ConstraintValidator<FloatRange, Float> { private float min; private float max; @Override public void initialize(FloatRange annotation) { this.min = annotation.min(); this.max = annotation.max(); } @Override public boolean isValid(Float value, ConstraintValidatorContext context) { // validation logic ommited } }
The Solution
After a lot of googling and force brute tests... A co worker (Marcelo Yamashita) came with the solution. He tried to use the @FloatRange constraint at property-level, man... that worked! Then, reading more carefully the Hibernate Validator documentation, more specifically the item 2.1.1. Field-level constraints, i noticed the note that says:
Well, if i've got it right, by properties it means POJO fields which have getter/setter, or not? If so, then houston, we have a problem... both target annotated fields, belong to JPA entities thus, they have getters and setters! It doesn’t make them properties? Anyway, the workaround rocks, but if you have any idea about the why this happens, please, feel free to share it with the world :)Static fields and properties cannot be validated.
Test Party
Tutorial de Instalação do dcm4chee
Neste tutorial vamos descrever a instalação do dcm4chee 2.17.0 em sua versão para o PostgreSQL na plataforma Windows 7 (32 bits). A instalação num ambiente diferente deste pode requerer configurações extras, não descritas neste tutorial.
1. Requisitos básicos
JDK versão 5 ou superior
As instruções de instalação da JDK 6 e a configuração da variável de ambiente JAVA_HOME estão disponíveis aqui.PostgreSQL
Apesar de já disponível, a versão 9 do PostgreSQL exige configurações extras não abordadas neste tutorial. Recomendamos a versão 8.4, cujas instruções de instalação estão disponíveis aqui.2. Downloads
JBossAS
O dcm4chee roda sobre o servidor de aplicação JBoss 4.2.3 GA, especificamente. Faça o download do JBoss do site oficial através deste link: jboss-4.2.3.GA.zip.dcm4chee
Faça o download do dcm4chee em sua versão para o PostgreSQL do site oficial através deste link: dcm4chee-2.17.0-psql.zip.ARR
O dcm4chee permite a auditoria das operações realizadas, como transferência de arquivos, buscas, etc. Porém esta funcionalidade está num módulo separado, o Audit Record Repository (ARR). Faça o download do ARR em sua versão para o PostgreSQL do site oficial através deste link: dcm4chee-arr-3.0.11-psql.zip.3. Estrutura de pastas
Descompacte os arquivos baixados na seção anterior numa pasta de sua preferência. É importante o caminho da pasta não conter espaços, pois isto pode acarretar em erros na instalação.No exemplo deste tutorial vamos extraí-los na pasta “C:\dicom”. Assim, teremos a estrutura de pastas da figura abaixo:
4. Bases de dados
pacsdb
Para criar a base de dados utilizada pelo dcm4chee, abra o prompt de comando e execute o comando “createdb” passando o nome da nova base de dados, “pacsdb”. No exemplo deste tutorial o comando fica assim: “createdb -U postgres pacsdb”.O parâmetro “postgres” é o usuário utilizado para conectar no banco de dados, no caso o super-usuário, por questões de permissão. O mesmo será passado como parâmetro nos comandos seguintes.
O script de criação das tabelas e outras estruturas da base de dados “pacsdb” está disponível no arquivo “create.psql”, presente na pasta “sql”, dentro da pasta raiz de instalação do dcm4chee.
Execute o comando “psql” passando como parâmetros o nome da base de dados, “pacsdb”, e o arquivo que contém o script. No exemplo deste tutorial o comando fica assim: “psql -d pacsdb -U postgres -f C:\dicom\dcm4chee-2.17.0-psql\sql\create.psql”.
arrdb
O ARR possui sua própria base de dados, de nome “arrdb”. Para criar esta base de dados, no prompt de comando execute o comando “createdb” passando o nome da nova base de dados, “arrdb”. No exemplo deste tutorial o comando fica assim: “createdb -U postgres arrdb”.O script de criação das tabelas e outras estruturas da base de dados “arrdb” está disponível no arquivo “dcm4chee-arr-sql.ddl”, presente na pasta “sql”, dentro da pasta raiz de instalação do ARR.
Execute o comando “psql” passando como parâmetros o nome da base de dados, “arrdb”, e o arquivo que contém o script. No exemplo deste tutorial o comando fica assim: “psql -d arrdb -U postgres -f C:\dicom\dcm4chee-arr-3.0.11-psql\sql\dcm4chee-arr-sql.ddl”.
Permissões
Para que o dcm4chee e o ARR consigam acessar as suas bases de dados é preciso configurar as respectivas conexões no arquivo “pg_hba.conf”, localizado na pasta “data” dentro da pasta raiz de instalação do PostgreSQL.No exemplo deste tutorial é a pasta: “C:\Program Files\PostgreSQL\8.4\data”.
Neste arquivo adicione as linhas:
host pacsdb postgres 127.0.0.1/32 trustLogo acima da linha:
host arrdb postgres 127.0.0.1/32 trust
host all all 127.0.0.1/32 md5Conforme a figura abaixo.
Salve o arquivo. Esta configurção dá permissão de acesso às bases de dados pacsdb e arrdb para o usuário “postgres” (utilizado pelo dcm4chee e pelo ARR por padrão) para conexões solicitadas pelo IP local (127.0.0.1). Para outras conexões é solicitada a senha do usuário.
5. Scripts finais de instalação
O próximo passo da instalação do dcm4chee é rodar o script “install_jboss.bat”, localizado na pasta “bin” dentro da pasta raiz de instalação do dcm4chee, passando a pasta raiz de instalação do JBoss como parâmetro. No exemplo deste tutorial o comando para executar este script fica assim:“install_jboss C:\dicom\jboss-4.2.3.GA”.
Este script vai integrar o dcm4chee com o JBoss, copiando arquivos deste último para a estrutura de pastas do dcm4chee.
Para completar a instalação, temos de rodar o script “install_arr.bat”, localizado na pasta “bin” dentro da pasta raiz de instalação do dcm4chee, passando a pasta raiz de instalação do ARR. No exemplo deste tutorial o comando para executar o script fica assim: “install_arr C:\dicom\dcm4chee-arr-3.0.11-psql”.
Este script vai integrar o dcm4chee com o ARR, copiando arquivos deste último para a estrutura de pastas do dcm4chee.
Pronto. A instalação está completa.
6. Testando a instalação
Para testar a instalação, execute o script “run.bat”, localizado na pasta “bin” dentro da pasta raiz de instalação do dcm4chee. Este script vai inicializar o servidor dcm4chee.Se todos os passos anteriores deram certo, não haverá mensagem de erro (ERROR) na console, apenas informativas (INFO), como na figura abaixo.
Para testar o dcm4chee, acesse a URL “http://localhost:8080/dcm4chee-web” no seu navegador. Faça o login com o usuário “admin” e senha “admin”.
Para testar o ARR, clique no link “Audit Repository”. Forneça o usuário “admin” e a senha “admin”.
Para parar o dcm4chee pressione as teclas Ctrl + C na console onde o dcm4chee foi inicializado.
7. Configurações adicionais
Permissões do sistema de arquivos
Para configurar as permissões de escrita e leitura do dcm4chee no sistema de arquivos do Windows, acesse a URL “http://localhost:8080/jmx-console” no seu browser (o dcm4chee tem de estar inicializado). Forneça o usuário “admin” e a senha “admin”.Selecione o link “group=ONLINE_STORAGE, service=FileSystemMgt”, sob o cabeçalho “dcm4chee.archive”.
Localize o cabeçalho “addRWFileSystem()”
Clique no botão “Invoke”.
Instalar o dcm4chee como serviço
Para não ter de executar o comando “run” a cada vez que for utilizar o dcm4chee, você pode instalá-lo como um serviço do Windows. Assim, ele será inicializado a cada vez que o Windows iniciar.Para tanto, execute o script “install_service.bat”, localizado na pasta “bin” dentro da pasta raiz de instalação do dcm4chee, passando o parâmetro “service”.
Se receber uma mensagem de acesso negado, abra o prompt de comando como administrador (clique com o botão direito do mouse sobre o ícone do prompt de comando e selecione a opção “Executar como administrador”) e tente novamente.
Instalação do PostgreSQL
Faça o download da versão 8.4.8-1 para Windows do PostgreSQL:
http://www.enterprisedb.com/products-services-training/pgdownload
Execute o instalador baixado (arquivo postgresql-8.4.1-1-windows.exe).
Aparecerá a tela de boas vindas.
Clique no botão “Next”.
Será solicitada a escolha de um diretório raiz para a instalação do PostgreSQL. Por padrão a instalação ocorre no diretório “C:\Program Files\PostgreSQL\8.4”.
Clique no botão “Next”.
Será solicitada a escolha de um diretório de armazenamento dos dados do banco. Por padrão a instalação ocorre no diretório “C:\Program Files\PostgreSQL\8.4\data”.
Clique no botão “Next”.
Será solicitada a escolha da senha do super-usuário do banco de dados. Digite a senha escolhida e repita-a no segundo campo para a confirmação.
Clique no botão “Next”.
Será solicitada a escolha do número da porta, a ser utilizado por outras aplicações para conectarem-se ao banco de dados. Recomenda-se deixar o padrão 5432.
Clique no botão “Next”.
Na próxima tela será solicitada a escolha da localidade, para as configurações de linguagem da interface e formatos de data. Selecione “Portuguese, Brazil”. Nesta mesma tela você também pode escolher se deseja que a linguagem pl/psql seja instalada.
Clique no botão “Next”.
A próxima tela apenas informa que o instalador está pronto para iniciar a instalação.
Clique no botão “Next”.
Aguarde a instalação terminar.
Clique no botão “Next”.
Pronto, a instação está conculída. Caso queira instalar complementos ao PostgreSQL deixe marcada a opção “Launch Stack Builder at exit?”. Senão, desmarque esta opção.
Clique no botão “Finish”.
A partir de agora você pode gerenciar seu banco de dados através da aplicação pgAdmin, que oferece uma interface gráfica pra tanto.
Você também pode gerenciá-lo através do prompt de comando, chamando o comando “psql” na pasta “bin” dentro do diretório de instalação do PostgreSQL (para o diretório padrão da instalação, é a pasta “C:\Program Files\PostgreSQL\8.4\bin”).
No exemplo abaixo, estou chamando o comando psql passando o nome do usuário “postgres” como parâmetro. Para maiores detalhes sobre os parâmetros, chame o comando “psql --help”.
Para mostrar a lista de comandos do psql digite “\?”. Para mostrar a lista de comandos SQL digite “\h”. Para sair do psql digite o comando “\q”.
Para executar o psql de qualquer diretório, adicione o caminho da pasta “bin” do PostgreSQL à variável de ambiente “Path” do Windows.
A mensagem de aviso da imagem acima ocorre porque a página de código padrão do prompt de comando do Windows difere da utilizada pelo psql. Para evitar este problema, temos de alterar a página de código do prompt de comando do windows. Para isso, antes de chamar o psql, digite o comando "cmd /c chcp 1252".
Isto vai recarregar o prompt de comando com a página de código utilizada pelo psql. Porém, a fonte padrão do prompt de comando não é adequada para esta página de código, tendo de ser alterada. Para tanto, clique com o botão direito do mouse sobre a barra superior da janela e selecione a opção "Propriedades".
Na aba "Fonte", selecione a fonte "Lucida Console" e clique no botão "OK".
Pronto, agora você pode chamar o comando psql sem problemas.
All Tests?
No entanto, acabamos descobrindo esses dias que algumas vezes a prática de subir para o servidor os novos códigos estava quebrando a regra de termos apenas códigos 100%. Nos cobramos mutuamente na retrospectiva, mas não tínhamos a detecção real do problema.
Eis que alguém resolveu dar uma olhada no AllTests e descobriu o real problema: nem todas as novas classes de teste estavam sendo adicinoadas lá. Com isso, alguns testes não estavam sendo executados, e erros não estavam sendo encontrados. Se uma solução rápida seria atualizar a suíte de teste, decidimos por uma ainda mais ágil: apagar a suíte.
Por mais que a decisão pareça radical, ela é simples: ao invés de mandar rodar o AllTests, usamos o botão direito em cima da fonte de código com os pacotes de teste e um "Run As..". Esse procedimento executa absolutamente todos os testes, no Eclipse. Agora, voltamos a ter certeza que o servidor está 100%.
Integração de Componentes PrimeFaces
Trecho 1:
<f:facet name="header">
#{gen['th.user']}
</f:facet>
<h:outputtext value="#{entry.user.name}"/>
Trecho 2:
<f:facet name="header">
<h:outputtext value="#{gen['th.user']}"/>
</f:facet>
<h:outputtext value="#{entry.user.name}"/>
Mas não são. O primeiro vai mostrar na tela direitinho. Mas não vai necessariamente integrar bem com outros componentes Primefaces, como o exportador de pdf. Essa é um exemplo das várias recomendações da maioria dos tutoriais de JSF: sempre que for escrever algo na tela, use um componente pra isso. No mínimo vai facilitar a integração.
Fica a dica.
Brilhando no Facool


Transitar entre o campus não é mais passar em branco, sem ser percebido. Agora, sair para pegar um sol é ser alvo de paparazzi. Nas fotos, Amanda, Carolina, Diogo e Luciano. Os originais estão em lá no site do Facool.
Seleção ELSA
Sistema de Coleta Versão 1.0
Do ponto de vista extremamente tradicional, poderia ser avaliado como fracasso, pois alguns centros do estudo já não estão coletando dados diretamente com os participantes. Contudo, a natureza incremental do desenvolvimento, associado a uma definição de prioridades pelo product owner, gerou diferentes implantações que foram agregando valor desde a primeira liberação.
O trabalho não acabou. A cadeia de produtos para estudos epidemiológicos que estamos criando sempre traz novidades para serem implementadas. No entanto, é bom saber que chegamos à totalidade dos formulários e funcionalidades de coleta. Que arredondamos o número da versão para 1.0. Porém, o melhor de tudo, é saber que os seis centros não estavam parados a espera da primeira versão do software. É comprovar na prática que o ROI já vinha sendo percebido a bem mais tempo.