From 4ba9dc1925b392ff3939a819a87d7bbdb3ebb3a8 Mon Sep 17 00:00:00 2001 From: Dancovich Date: Wed, 8 May 2013 13:31:32 -0300 Subject: [PATCH] Remoção da dependência demoiselle-validation em escopo de teste. --- impl/core/pom.xml | 117 +++++++++++++++++++++++++++------------------------------------------------------------------------------------------ impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/management/Management.java | 15 +++++++++++++-- impl/core/src/main/resources/demoiselle-core-bundle.properties | 4 ++-- impl/core/src/test/java/management/AnnotationTestCase.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/core/src/test/java/management/ManagementBootstrapTestCase.java | 53 +++++------------------------------------------------ impl/core/src/test/java/management/ValidationTestCase.java | 63 ++++++++++++++++++++++++++++++++++++++++++++++++--------------- impl/core/src/test/java/management/testclasses/DummyManagedClass.java | 42 +++++++++++++++++++++--------------------- impl/core/src/test/java/management/testclasses/DummyValidator.java | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/core/src/test/java/management/testclasses/DummyValidatorAnnotation.java | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 336 insertions(+), 178 deletions(-) create mode 100644 impl/core/src/test/java/management/AnnotationTestCase.java create mode 100644 impl/core/src/test/java/management/testclasses/DummyValidator.java create mode 100644 impl/core/src/test/java/management/testclasses/DummyValidatorAnnotation.java diff --git a/impl/core/pom.xml b/impl/core/pom.xml index da14eb3..8b50d8a 100755 --- a/impl/core/pom.xml +++ b/impl/core/pom.xml @@ -99,59 +99,20 @@ cobertura-maven-plugin - + - - + + @@ -202,50 +163,28 @@ hibernate-validator test - - - - - + + + + + org.slf4j slf4j-log4j12 test - - - br.gov.frameworkdemoiselle.component - demoiselle-validation - test - ${demoiselle.validation.version} - + @@ -274,9 +213,7 @@ - + 2.4.0-BETA2-SNAPSHOT diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/management/Management.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/management/Management.java index 967ffec..c25dd6b 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/management/Management.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/management/Management.java @@ -241,11 +241,22 @@ public class Management { errorBuffer.append(violation.getMessage()).append('\r').append('\n'); } - throw new DemoiselleException(bundle.getString("validation-constraint-violation",managedType.getType().getCanonicalName(),errorBuffer.toString())); + if (errorBuffer.length()>0){ + errorBuffer.insert(0, "\r\n"); + errorBuffer.insert(errorBuffer.length(), "\r\n"); + } + + throw new DemoiselleException( + bundle.getString( + "management-validation-constraint-violation" + ,managedType.getType().getCanonicalName() + ,propertyName,errorBuffer.toString() + ) + ); } } else{ - logger.warn(bundle.getString("validation-validator-not-found")); + logger.warn(bundle.getString("management-validation-validator-not-found")); } Method getterMethod = managedType.getFields().get(propertyName).getGetterMethod(); diff --git a/impl/core/src/main/resources/demoiselle-core-bundle.properties b/impl/core/src/main/resources/demoiselle-core-bundle.properties index 039f0f2..dbb2440 100644 --- a/impl/core/src/main/resources/demoiselle-core-bundle.properties +++ b/impl/core/src/main/resources/demoiselle-core-bundle.properties @@ -114,5 +114,5 @@ management-debug-stoping-custom-context=Desligando contexto {0} para classe gere management-debug-registering-managed-type=Registrando classe gerenciada [{0}] management-debug-processing-management-extension=Processando extens\u00E3o de gerenciamento [{0}] management-debug-removing-management-extension=Desativando extens\u00E3o de gerenciamento [{0}] - -validation-validator-not-found=Nenhum provedor de valida\u00E7\u00E3o de beans encontrado, as anota\u00E7\u00F5es de valida\u00E7\u00E3o n\u00E3o ser\u00E3o processadas +management-validation-constraint-violation=Ocorreu um erro de valida\u00E7\u00E3o na classe [{0}] ao definir um valor para a propriedade [{1}]\: [{2}] +management-validation-validator-not-found=Nenhum provedor de valida\u00E7\u00E3o de beans encontrado, as anota\u00E7\u00F5es de valida\u00E7\u00E3o n\u00E3o ser\u00E3o processadas diff --git a/impl/core/src/test/java/management/AnnotationTestCase.java b/impl/core/src/test/java/management/AnnotationTestCase.java new file mode 100644 index 0000000..de66274 --- /dev/null +++ b/impl/core/src/test/java/management/AnnotationTestCase.java @@ -0,0 +1,95 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package management; + +import java.io.File; + +import management.testclasses.DummyManagementExtension; +import management.testclasses.ManagedClassStore; + +import org.jboss.arquillian.container.test.api.Deployer; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.FileAsset; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +import test.LocaleProducer; + +@RunWith(Arquillian.class) +// @Ignore +public class AnnotationTestCase { + + /** + * Deployment containing a malformed managed class. Tests using this deployment will check if deployment fails (it + * has to). + */ + @Deployment(name = "wrong_annotation", managed = false) + public static JavaArchive createWrongAnnotationDeployment() { + return ShrinkWrap + .create(JavaArchive.class) + .addClass(LocaleProducer.class) + .addPackages(true, "br") + .addAsResource(new FileAsset(new File("src/test/resources/test/beans.xml")), "beans.xml") + .addAsManifestResource( + new File("src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension"), + "services/javax.enterprise.inject.spi.Extension") + .addPackages(false, ManagementBootstrapTestCase.class.getPackage()) + //.addClasses(DummyManagementExtension.class, DummyManagedClassPropertyError.class, ManagedClassStore.class); + .addClasses(DummyManagementExtension.class, ManagedClassStore.class); + } + + @Test + public void testWrongAnnotation(@ArquillianResource Deployer deployer) { + + try { + deployer.deploy("wrong_annotation"); + + // O processo de deploy precisa falhar, pois temos uma classe anotada com falhas. + Assert.fail(); + } catch (Exception e) { + //SUCCESS + } finally { + deployer.undeploy("wrong_annotation"); + } + } + +} diff --git a/impl/core/src/test/java/management/ManagementBootstrapTestCase.java b/impl/core/src/test/java/management/ManagementBootstrapTestCase.java index 941d326..7bd0899 100644 --- a/impl/core/src/test/java/management/ManagementBootstrapTestCase.java +++ b/impl/core/src/test/java/management/ManagementBootstrapTestCase.java @@ -39,15 +39,14 @@ package management; import java.io.File; import java.util.List; +import javax.enterprise.inject.spi.BeforeShutdown; + import management.testclasses.DummyManagedClass; -import management.testclasses.DummyManagedClassPropertyError; import management.testclasses.DummyManagementExtension; import management.testclasses.ManagedClassStore; -import org.jboss.arquillian.container.test.api.Deployer; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.FileAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; @@ -63,14 +62,11 @@ import br.gov.frameworkdemoiselle.util.Beans; @RunWith(Arquillian.class) public class ManagementBootstrapTestCase { - @ArquillianResource - private Deployer deployer; - /** * Deployment to test normal deployment behaviour * */ - @Deployment(name = "default",managed=false,testable=false) + @Deployment public static JavaArchive createDeployment() { return ShrinkWrap .create(JavaArchive.class) @@ -85,39 +81,16 @@ public class ManagementBootstrapTestCase { } /** - * Deployment containing a malformed managed class. Tests using this deployment will - * check if deployment fails (it has to). - * - */ - @Deployment(name = "wrong_annotation",managed=false,testable=false) - public static JavaArchive createWrongAnnotationDeployment() { - return ShrinkWrap - .create(JavaArchive.class) - .addClass(LocaleProducer.class) - .addPackages(true, "br") - .addAsResource(new FileAsset(new File("src/test/resources/test/beans.xml")), "beans.xml") - .addAsManifestResource( - new File("src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension"), - "services/javax.enterprise.inject.spi.Extension") - .addPackages(false, ManagementBootstrapTestCase.class.getPackage()) - .addClasses(DummyManagementExtension.class,DummyManagedClassPropertyError.class,ManagedClassStore.class); - } - - /** * Test if a a management extension (a library that implements {@link ManagementExtension}) is correctly detected. */ @Test public void testManagementExtensionRegistration() { - deployer.deploy("default"); - // "store" é application scoped e é usado pelo DummyManagementExtension para // armazenar todos os beans anotados com @ManagementController. Se o bootstrap rodou corretamente, // ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos. ManagedClassStore store = Beans.getReference(ManagedClassStore.class); Assert.assertEquals(1, store.getManagedTypes().size()); - - deployer.undeploy("default"); } /** @@ -126,8 +99,6 @@ public class ManagementBootstrapTestCase { */ @Test public void testManagementExtensionShutdown() { - deployer.deploy("default"); - // "store" é application scoped e é usado pelo DummyManagementExtension para // armazenar todos os beans anotados com @ManagementController. Se o bootstrap rodou corretamente, // ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos. @@ -137,25 +108,11 @@ public class ManagementBootstrapTestCase { //Detecta se a classe anotada foi detectada List managedTypes = store.getManagedTypes(); Assert.assertEquals(1, managedTypes.size()); - - deployer.undeploy("default"); + Beans.getBeanManager().fireEvent(new BeforeShutdown() {}); + //Após o "undeploy", o ciclo de vida precisa ter removido a classe gerenciada da lista. Assert.assertEquals(0, managedTypes.size()); } - @Test - public void testWrongAnnotation(){ - - try{ - deployer.deploy("wrong_annotation"); - - //O processo de deploy precisa falhar, pois temos uma classe anotada com falhas. - Assert.fail(); - } - catch(Exception e){ - deployer.undeploy("wrong_annotation"); - } - } - } diff --git a/impl/core/src/test/java/management/ValidationTestCase.java b/impl/core/src/test/java/management/ValidationTestCase.java index f4e4c28..147b207 100644 --- a/impl/core/src/test/java/management/ValidationTestCase.java +++ b/impl/core/src/test/java/management/ValidationTestCase.java @@ -4,6 +4,8 @@ import java.io.File; import management.testclasses.DummyManagedClass; import management.testclasses.DummyManagementExtension; +import management.testclasses.DummyValidator; +import management.testclasses.DummyValidatorAnnotation; import management.testclasses.ManagedClassStore; import org.jboss.arquillian.container.test.api.Deployment; @@ -21,7 +23,7 @@ import br.gov.frameworkdemoiselle.util.Beans; @RunWith(Arquillian.class) public class ValidationTestCase { - + @Deployment public static JavaArchive createDeployment() { return ShrinkWrap @@ -33,30 +35,61 @@ public class ValidationTestCase { new File("src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension"), "services/javax.enterprise.inject.spi.Extension") .addPackages(false, NotificationTestCase.class.getPackage()) - .addClasses(DummyManagementExtension.class,ManagedClassStore.class,DummyManagedClass.class); + .addClasses(DummyManagementExtension.class + , ManagedClassStore.class + , DummyManagedClass.class + , DummyValidator.class + , DummyValidatorAnnotation.class); } - + /** - * Test if changing properties of a management controller passes through - * validation phase. + * Test if a management controller accepts a valid value annotated with a core validation (from javax.validation) + * when a property is being set by a management client */ @Test - public void testManagedClassValidation(){ - - //Testa se é possível definir um valor válido para uma propriedade. + public void testSetValidValue() { + // Testa se é possível definir um valor válido para uma propriedade. ManagedClassStore store = Beans.getReference(ManagedClassStore.class); store.setProperty(DummyManagedClass.class, "id", new Integer(1)); Assert.assertEquals(new Integer(1), store.getProperty(DummyManagedClass.class, "id")); - - //Testa se definir um valor inválido dispara o erro adequado - try{ - store.setProperty(DummyManagedClass.class, "id", new Integer(5)); + } + + /** + * Test if a management controller refuses a valid value annotated with a core validation (from javax.validation) + * when a property is being set by a management client + */ + @Test + public void testSetInvalidValue() { + // Testa se é possível definir um valor válido para uma propriedade. + try { + ManagedClassStore store = Beans.getReference(ManagedClassStore.class); + store.setProperty(DummyManagedClass.class, "id", (Integer) null); + Assert.fail(); + } catch (DemoiselleException de) { + // Classes de gerenciamento disparam Demoiselle Exception quando uma validação falha } - catch(DemoiselleException e){ - //SUCCESS + } + + /** + * Tests if custom validators (outside the javax.validation package) run as normal + */ + @Test + public void testCustomValidation() { + + try { + ManagedClassStore store = Beans.getReference(ManagedClassStore.class); + + // Atributo "gender" deve aceitar apenas "M" ou "F", tanto maiúsculo quanto minúsculo. A anotação + // customizada DummyValidatorAnnotation é uma simples validação que testa se uma string passada está + // na lista de strings aceitas. + store.setProperty(DummyManagedClass.class, "gender", "J"); + + Assert.fail(); + } catch (DemoiselleException e) { + Assert.assertTrue( e.getMessage().contains("Test Message") ); } - + } } diff --git a/impl/core/src/test/java/management/testclasses/DummyManagedClass.java b/impl/core/src/test/java/management/testclasses/DummyManagedClass.java index 1311c7a..54198bf 100644 --- a/impl/core/src/test/java/management/testclasses/DummyManagedClass.java +++ b/impl/core/src/test/java/management/testclasses/DummyManagedClass.java @@ -38,11 +38,11 @@ package management.testclasses; import java.util.UUID; +import javax.validation.constraints.NotNull; + import br.gov.frameworkdemoiselle.annotation.ManagedOperation; import br.gov.frameworkdemoiselle.annotation.ManagedProperty; import br.gov.frameworkdemoiselle.stereotype.ManagementController; -import br.gov.frameworkdemoiselle.validation.annotation.AllowedValues; -import br.gov.frameworkdemoiselle.validation.annotation.AllowedValues.ValueType; @ManagementController public class DummyManagedClass { @@ -51,10 +51,14 @@ public class DummyManagedClass { private String name; @ManagedProperty - @AllowedValues(allows={"1","2","3","4"},valueType=ValueType.INTEGER) + @NotNull private Integer id; @ManagedProperty + @DummyValidatorAnnotation(allows={"f","m","F","M"}) + private String gender; + + @ManagedProperty private Integer firstFactor , secondFactor; @ManagedProperty @@ -153,24 +157,8 @@ public class DummyManagedClass { } @ManagedOperation - public Integer calculateFactorsNonSynchronized(Integer firstFactor , Integer secondFactor){ - setFirstFactor(firstFactor); - setSecondFactor(secondFactor); - - try { - int temp = firstFactor + secondFactor; - Thread.sleep( (long)(Math.random() * 100)); - - temp = temp + firstFactor; - Thread.sleep( (long)(Math.random() * 100)); - - temp = temp + secondFactor; - Thread.sleep( (long)(Math.random() * 100)); - - return temp; - } catch (InterruptedException e) { - throw new RuntimeException(e); - } + public Integer sumFactors(){ + return (firstFactor!=null ? firstFactor.intValue() : 0) + (secondFactor!=null ? secondFactor.intValue() : 0); } @ManagedOperation @@ -197,6 +185,18 @@ public class DummyManagedClass { public void nonOperationAnnotatedMethod(){ System.out.println("Test"); } + + + public String getGender() { + return gender; + } + + + public void setGender(String gender) { + this.gender = gender; + } + + } diff --git a/impl/core/src/test/java/management/testclasses/DummyValidator.java b/impl/core/src/test/java/management/testclasses/DummyValidator.java new file mode 100644 index 0000000..6b52131 --- /dev/null +++ b/impl/core/src/test/java/management/testclasses/DummyValidator.java @@ -0,0 +1,64 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package management.testclasses; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + + +public class DummyValidator implements ConstraintValidator { + + String[] allows; + + @Override + public void initialize(DummyValidatorAnnotation constraintAnnotation) { + allows = constraintAnnotation.allows(); + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + + for (String allow : allows){ + if (allow.equals(value)){ + return true; + } + } + + return false; + } + +} diff --git a/impl/core/src/test/java/management/testclasses/DummyValidatorAnnotation.java b/impl/core/src/test/java/management/testclasses/DummyValidatorAnnotation.java new file mode 100644 index 0000000..16892f5 --- /dev/null +++ b/impl/core/src/test/java/management/testclasses/DummyValidatorAnnotation.java @@ -0,0 +1,61 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package management.testclasses; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +@Target({ FIELD}) +@Retention(RUNTIME) +@Constraint(validatedBy = DummyValidator.class) +public @interface DummyValidatorAnnotation { + + String[] allows(); + + String message() default "Test Message"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} -- libgit2 0.21.2