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 extends Payload>[] payload() default {};
+
+}
--
libgit2 0.21.2