diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ManagementBootstrap.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ManagementBootstrap.java index c7f51d9..23ef787 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ManagementBootstrap.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ManagementBootstrap.java @@ -11,12 +11,12 @@ import javax.enterprise.inject.spi.AfterDeploymentValidation; import javax.enterprise.inject.spi.AnnotatedType; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.BeforeShutdown; import javax.enterprise.inject.spi.Extension; import javax.enterprise.inject.spi.ProcessAnnotatedType; import br.gov.frameworkdemoiselle.internal.context.ContextManager; import br.gov.frameworkdemoiselle.internal.context.ManagedContext; -import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess; import br.gov.frameworkdemoiselle.management.annotation.Managed; import br.gov.frameworkdemoiselle.management.extension.ManagementExtension; import br.gov.frameworkdemoiselle.management.internal.ManagedType; @@ -60,11 +60,13 @@ public class ManagementBootstrap implements Extension { monitoringManager.initialize(managementExtensionCache); } - public void unregisterAvailableManagedTypes(@Observes final AfterShutdownProccess event) { + public void unregisterAvailableManagedTypes(@Observes final BeforeShutdown event) { MonitoringManager manager = Beans.getReference(MonitoringManager.class); manager.shutdown(managementExtensionCache); - + + managementExtensionCache.clear(); + types.clear(); } } diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/management/internal/MonitoringManager.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/management/internal/MonitoringManager.java index ab1c034..bfaf2a4 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/management/internal/MonitoringManager.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/management/internal/MonitoringManager.java @@ -13,6 +13,7 @@ import javax.management.ReflectionException; import org.slf4j.Logger; import br.gov.frameworkdemoiselle.DemoiselleException; +import br.gov.frameworkdemoiselle.annotation.Name; import br.gov.frameworkdemoiselle.internal.context.ContextManager; import br.gov.frameworkdemoiselle.internal.context.ManagedContext; import br.gov.frameworkdemoiselle.management.annotation.Managed; @@ -38,12 +39,14 @@ public class MonitoringManager { private Logger logger; @Inject + @Name("demoiselle-core-bundle") private ResourceBundle bundle; private final List managedTypes = new ArrayList(); public void addManagedType(ManagedType managedType) { managedTypes.add(managedType); + logger.debug(bundle.getString("management-debug-registering-managed-type",managedType.getType().getCanonicalName())); } /** @@ -189,8 +192,13 @@ public class MonitoringManager { //Manda uma notificação de mudança de atributo NotificationManager notificationManager = Beans.getReference(NotificationManager.class); Class attributeType = newValue!=null ? newValue.getClass() : null; - AttributeChangeNotification notification = new AttributeChangeNotification(bundle.getString(""), propertyName, attributeType, oldValue, newValue); - notificationManager.sendAttributeChangedMessage(notification); + + AttributeChangeNotification notification = new AttributeChangeNotification(bundle.getString("management-notification-attribute-changed",propertyName,managedType.getType().getCanonicalName()) + , propertyName + , attributeType + , oldValue + , newValue); + notificationManager.sendNotification(notification); } catch (Exception e) { throw new DemoiselleException(bundle.getString( @@ -233,6 +241,8 @@ public class MonitoringManager { ManagementExtension monitoringExtension = Beans.getReference(monitoringExtensionClass); monitoringExtension.shutdown(this.getManagedTypes()); + + logger.debug( bundle.getString("management-debug-removing-management-extension",monitoringExtension.getClass().getCanonicalName()) ); } @@ -246,6 +256,8 @@ public class MonitoringManager { .getReference(monitoringExtensionClass); monitoringExtension.initialize(this.getManagedTypes()); + + logger.debug( bundle.getString("management-debug-processing-management-extension",monitoringExtension.getClass().getCanonicalName()) ); } diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/management/notification/NotificationManager.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/management/notification/NotificationManager.java index f0b2a70..8382b14 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/management/notification/NotificationManager.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/management/notification/NotificationManager.java @@ -5,6 +5,7 @@ import java.io.Serializable; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Event; import javax.enterprise.event.Observes; +import javax.enterprise.util.AnnotationLiteral; import javax.inject.Inject; import br.gov.frameworkdemoiselle.management.internal.notification.event.NotificationEvent; @@ -48,16 +49,32 @@ public class NotificationManager implements Serializable{ * @param notification The notification to send */ public void sendNotification(Notification notification) { - genericNotificationEvent.fire(new NotificationEvent(notification)); + if (! AttributeChangeNotification.class.isInstance(notification) ){ + getGenericNotificationEvent().fire(new NotificationEvent(notification)); + } + else{ + getAttributeChangeNotificationEvent().fire(new NotificationEvent(notification)); + } + } + + @SuppressWarnings("unchecked") + private Event getGenericNotificationEvent() { + if (genericNotificationEvent==null){ + genericNotificationEvent = Beans.getReference(Event.class , new AnnotationLiteral() {}); + } + + return genericNotificationEvent; } - /** - * Sends a notification comunicating about a change of value for an attribute. - * - * @param notification Special notification communicating a change of value in an attribute. - * - */ - public void sendAttributeChangedMessage(AttributeChangeNotification notification){ - attributeChangeNotificationEvent.fire(new NotificationEvent(notification)); + @SuppressWarnings("unchecked") + private Event getAttributeChangeNotificationEvent() { + if (attributeChangeNotificationEvent==null){ + attributeChangeNotificationEvent = Beans.getReference(Event.class , new AnnotationLiteral() {}); + } + + return attributeChangeNotificationEvent; } + + + } diff --git a/impl/core/src/main/resources/demoiselle-core-bundle.properties b/impl/core/src/main/resources/demoiselle-core-bundle.properties index b50c510..1923cc0 100644 --- a/impl/core/src/main/resources/demoiselle-core-bundle.properties +++ b/impl/core/src/main/resources/demoiselle-core-bundle.properties @@ -98,15 +98,19 @@ user-has-role=Usu\u00E1rio {0} possui a(s) role(s)\: {1} authenticator-not-defined=Nenhum mecanismo de autentica\u00E7\u00E3o foi definido. Para utilizar {0} \u00E9 preciso definir a propriedade frameworkdemoiselle.security.authenticator.class como mecanismo de autentica\u00E7\u00E3o desejado no arquivo demoiselle.properties. -management-null-class-defined=A classe gerenciada informada n\u00E3o pode ser nula. -management-no-annotation-found=Classe {0} precisa ser anotada com @Managed. -management-invalid-property-no-getter-setter=Falha ao inicializar classe gerenciada {0}, n\u00E3o foi encontrado um m\u00E9todo get ou m\u00E9todo set para a propriedade {1}. -management-invalid-property-as-operation=Falha ao inicializar classe gerenciada {0}, n\u00E3o \u00E9 poss\u00EDvel declarar uma propriedade cujo m\u00E9todo get ou set \u00E9 uma opera\u00E7\u00E3o. -management-introspection-error=Erro ao ler atributos da classe gerenciada {0}. -management-type-not-found=A classe gerenciada informada n\u00E3o existe: {0}. -management-invoke-error=Erro ao tentar invocar a opera\u00E7\u00E3o "{0}" da classe gerenciada, a opera\u00E7\u00E3o n\u00E3o foi encontrada. -management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1}. -management-debug-setting-property=Definindo novo valor para propriedade {0} da classe gerenciada {1}. -management-debug-invoking-operation=Invocando opera\u00E7\u00E3o {0} da classe gerenciada {1}. -management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1}. -management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1}. +management-notification-attribute-changed=O atributo [{0}] da classe gerenciada [{1}] foi alterado +management-null-class-defined=A classe gerenciada informada n\u00E3o pode ser nula +management-no-annotation-found=Classe {0} precisa ser anotada com @Managed +management-invalid-property-no-getter-setter=Falha ao inicializar classe gerenciada {0}, n\u00E3o foi encontrado um m\u00E9todo get ou m\u00E9todo set para a propriedade {1} +management-invalid-property-as-operation=Falha ao inicializar classe gerenciada {0}, n\u00E3o \u00E9 poss\u00EDvel declarar uma propriedade cujo m\u00E9todo get ou set \u00E9 uma opera\u00E7\u00E3o +management-introspection-error=Erro ao ler atributos da classe gerenciada {0} +management-type-not-found=A classe gerenciada informada n\u00E3o existe\: {0} +management-invoke-error=Erro ao tentar invocar a opera\u00E7\u00E3o "{0}" da classe gerenciada, a opera\u00E7\u00E3o n\u00E3o foi encontrada +management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1} +management-debug-setting-property=Definindo novo valor para propriedade {0} da classe gerenciada {1} +management-debug-invoking-operation=Invocando opera\u00E7\u00E3o {0} da classe gerenciada {1} +management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1} +management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1} +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}] \ No newline at end of file diff --git a/impl/core/src/test/java/management/DummyManagedClass.java b/impl/core/src/test/java/management/DummyManagedClass.java deleted file mode 100644 index 5511456..0000000 --- a/impl/core/src/test/java/management/DummyManagedClass.java +++ /dev/null @@ -1,74 +0,0 @@ -package management; - -import java.util.UUID; - -import br.gov.frameworkdemoiselle.management.annotation.Managed; -import br.gov.frameworkdemoiselle.management.annotation.Operation; -import br.gov.frameworkdemoiselle.management.annotation.Property; -import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues; -import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues.ValueType; - -@Managed -public class DummyManagedClass { - - @Property - @AllowedValues(allows={"f","m","F","M"},valueType=ValueType.INTEGER) - private Integer id; - - @Property - private String uuid; - - @Property - private String writeOnlyProperty; - - /** - * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas uma letra. - */ - @Property - private Integer a; - - /** - * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas letras maiúsculas. - */ - @Property - private Integer MAIUSCULO; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getUuid() { - return uuid; - } - - public void setWriteOnlyProperty(String newValue){ - this.writeOnlyProperty = newValue; - } - - public Integer getA() { - return a; - } - - public void setA(Integer a) { - this.a = a; - } - - public Integer getMAIUSCULO() { - return MAIUSCULO; - } - - - public void setMAIUSCULO(Integer mAIUSCULO) { - MAIUSCULO = mAIUSCULO; - } - - @Operation(description="Generates a random UUID") - public String generateUUID(){ - this.uuid = UUID.randomUUID().toString(); - return this.uuid; - } -} diff --git a/impl/core/src/test/java/management/DummyManagementExtension.java b/impl/core/src/test/java/management/DummyManagementExtension.java deleted file mode 100644 index ac48b12..0000000 --- a/impl/core/src/test/java/management/DummyManagementExtension.java +++ /dev/null @@ -1,29 +0,0 @@ -package management; - -import java.util.List; - -import javax.inject.Inject; - -import br.gov.frameworkdemoiselle.management.extension.ManagementExtension; -import br.gov.frameworkdemoiselle.management.internal.ManagedType; - -public class DummyManagementExtension implements ManagementExtension { - - @Inject - private ManagedClassStore store; - - @Override - public void initialize(List managedTypes) { - // Armazena os beans managed detectados neste store, - // para depois serem testados. - store.setManagedTypes(managedTypes); - } - - @Override - public void shutdown(List managedTypes) { - // Limpa o store, depois o teste verificará se - // o processo de shutdown rodou e limpou o store. - store.setManagedTypes(null); - } - -} diff --git a/impl/core/src/test/java/management/ManagedClassStore.java b/impl/core/src/test/java/management/ManagedClassStore.java index 73f2acd..5645590 100644 --- a/impl/core/src/test/java/management/ManagedClassStore.java +++ b/impl/core/src/test/java/management/ManagedClassStore.java @@ -1,5 +1,7 @@ package management; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import javax.enterprise.context.ApplicationScoped; @@ -9,15 +11,15 @@ import br.gov.frameworkdemoiselle.management.internal.ManagedType; @ApplicationScoped public class ManagedClassStore { - private List managedTypes = null; + private List managedTypes = new ArrayList(); public List getManagedTypes() { return managedTypes; } - public void setManagedTypes(List managedTypes) { - this.managedTypes = managedTypes; + public void addManagedTypes(Collection managedTypes){ + this.managedTypes.addAll(managedTypes); } } diff --git a/impl/core/src/test/java/management/ManagementBootstrapTest.java b/impl/core/src/test/java/management/ManagementBootstrapTest.java deleted file mode 100644 index ec1d97e..0000000 --- a/impl/core/src/test/java/management/ManagementBootstrapTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package management; - -import javax.inject.Inject; - -import org.jboss.arquillian.container.test.api.Deployment; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; - -import test.Tests; -import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess; -import br.gov.frameworkdemoiselle.management.extension.ManagementExtension; -import br.gov.frameworkdemoiselle.util.Beans; - - -@RunWith(Arquillian.class) -public class ManagementBootstrapTest { - - @Inject - private ManagedClassStore store; - - @Deployment - public static JavaArchive createDeployment() { - JavaArchive deployment = Tests.createDeployment(ManagementBootstrapTest.class); - - /*deployment - .addClass(ManagedClassStore.class) - .addClass(DummyManagedClass.class) - .addClass(DummyManagementExtension.class);*/ - - return deployment; - } - - /** - * Test if a a management extension (a library that implements {@link ManagementExtension}) is correctly detected. - */ - @Test - public void testManagementExtensionRegistration(){ - - //"store" é application scoped e é usado pelo DummyManagementExtension para - //armazenar todos os beans anotados com @Managed. Se o bootstrap rodou corretamente, - //ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos. - Assert.assertNotNull(store.getManagedTypes()); - Assert.assertEquals(1, store.getManagedTypes().size()); - - } - - /** - * Test if a a management extension's (a library that implements {@link ManagementExtension}) shutdown - * method is correctly called upon application shutdown. - */ - @Test - public void testManagementExtensionShutdown(){ - - //"store" é application scoped e é usado pelo DummyManagementExtension para - //armazenar todos os beans anotados com @Managed. Se o bootstrap rodou corretamente, - //ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos. - //Nós então disparamos o evento de shutdown onde ele deverá limpar o store. - Assert.assertNotNull(store.getManagedTypes()); - Assert.assertEquals(1, store.getManagedTypes().size()); - - Beans.getBeanManager().fireEvent(new AfterShutdownProccess() {}); - Assert.assertNull(store.getManagedTypes()); - } - -} diff --git a/impl/core/src/test/java/management/ManagementBootstrapTestCase.java b/impl/core/src/test/java/management/ManagementBootstrapTestCase.java new file mode 100644 index 0000000..50d30be --- /dev/null +++ b/impl/core/src/test/java/management/ManagementBootstrapTestCase.java @@ -0,0 +1,124 @@ +package management; + +import java.io.File; +import java.util.List; + +import management.testclasses.DummyManagedClass; +import management.testclasses.DummyManagedClassPropertyError; +import management.testclasses.DummyManagementExtension; + +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; +import br.gov.frameworkdemoiselle.management.extension.ManagementExtension; +import br.gov.frameworkdemoiselle.management.internal.ManagedType; +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) + public static JavaArchive createDeployment() { + 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,DummyManagedClass.class); + } + + /** + * 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); + } + + /** + * 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 @Managed. 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"); + } + + /** + * Test if a a management extension's shutdown method is + * correctly called upon application shutdown. + */ + @Test + public void testManagementExtensionShutdown() { + deployer.deploy("default"); + + // "store" é application scoped e é usado pelo DummyManagementExtension para + // armazenar todos os beans anotados com @Managed. Se o bootstrap rodou corretamente, + // ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos. + // Nós então disparamos o evento de shutdown onde ele deverá limpar o store. + ManagedClassStore store = Beans.getReference(ManagedClassStore.class); + + //Detecta se a classe anotada foi detectada + List managedTypes = store.getManagedTypes(); + Assert.assertEquals(1, managedTypes.size()); + + deployer.undeploy("default"); + + //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/NotificationTestCase.java b/impl/core/src/test/java/management/NotificationTestCase.java new file mode 100644 index 0000000..0165f5e --- /dev/null +++ b/impl/core/src/test/java/management/NotificationTestCase.java @@ -0,0 +1,100 @@ +package management; + +import java.io.File; + +import javax.inject.Inject; + +import junit.framework.Assert; +import management.testclasses.DummyManagedClass; +import management.testclasses.DummyNotificationListener; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.FileAsset; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +import test.LocaleProducer; +import br.gov.frameworkdemoiselle.annotation.Name; +import br.gov.frameworkdemoiselle.management.internal.ManagedType; +import br.gov.frameworkdemoiselle.management.internal.MonitoringManager; +import br.gov.frameworkdemoiselle.management.notification.AttributeChangeNotification; +import br.gov.frameworkdemoiselle.management.notification.Notification; +import br.gov.frameworkdemoiselle.management.notification.NotificationManager; +import br.gov.frameworkdemoiselle.util.Beans; +import br.gov.frameworkdemoiselle.util.ResourceBundle; + +/** + * Test the {@link NotificationManager} with a dummy extension + * to check if notifications are correctly propagated + * + * @author serpro + * + */ +@RunWith(Arquillian.class) +public class NotificationTestCase { + + @Inject + private NotificationManager manager; + + @Inject + @Name("demoiselle-core-bundle") + private ResourceBundle bundle; + + @Deployment + public static JavaArchive createDeployment() { + 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(DummyNotificationListener.class,DummyManagedClass.class); + } + + /** + * Test sending a normal notification + */ + @Test + public void testSendGenericNotification(){ + manager.sendNotification(new Notification("Test Message")); + DummyNotificationListener listener = Beans.getReference(DummyNotificationListener.class); + Assert.assertEquals("Test Message", listener.getMessage()); + } + + /** + * Test sending a notification of change in attribute + */ + @Test + public void testSendAttributeChangeNotification(){ + manager.sendNotification(new AttributeChangeNotification("Test Message", "attribute", String.class, "old", "new")); + DummyNotificationListener listener = Beans.getReference(DummyNotificationListener.class); + Assert.assertEquals("Test Message - attribute", listener.getMessage()); + } + + /** + * Test if notifications are automatically sent when an attribute from a managed + * class change values + */ + @Test + public void testNotifyChangeManagedClass(){ + MonitoringManager manager = Beans.getReference(MonitoringManager.class); + + for (ManagedType type : manager.getManagedTypes()){ + if (type.getType().equals(DummyManagedClass.class)){ + manager.setProperty(type, "id", new Integer(10)); + break; + } + } + + DummyNotificationListener listener = Beans.getReference(DummyNotificationListener.class); + Assert.assertEquals( bundle.getString("management-notification-attribute-changed","id",DummyManagedClass.class.getCanonicalName()) + " - id" + , listener.getMessage()); + } + +} diff --git a/impl/core/src/test/java/management/testclasses/DummyManagedClass.java b/impl/core/src/test/java/management/testclasses/DummyManagedClass.java new file mode 100644 index 0000000..5d0b9b0 --- /dev/null +++ b/impl/core/src/test/java/management/testclasses/DummyManagedClass.java @@ -0,0 +1,74 @@ +package management.testclasses; + +import java.util.UUID; + +import br.gov.frameworkdemoiselle.management.annotation.Managed; +import br.gov.frameworkdemoiselle.management.annotation.Operation; +import br.gov.frameworkdemoiselle.management.annotation.Property; +import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues; +import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues.ValueType; + +@Managed +public class DummyManagedClass { + + @Property + @AllowedValues(allows={"f","m","F","M"},valueType=ValueType.INTEGER) + private Integer id; + + @Property + private String uuid; + + @Property + private String writeOnlyProperty; + + /** + * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas uma letra. + */ + @Property + private Integer a; + + /** + * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas letras maiúsculas. + */ + @Property + private Integer MAIUSCULO; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setWriteOnlyProperty(String newValue){ + this.writeOnlyProperty = newValue; + } + + public Integer getA() { + return a; + } + + public void setA(Integer a) { + this.a = a; + } + + public Integer getMAIUSCULO() { + return MAIUSCULO; + } + + + public void setMAIUSCULO(Integer mAIUSCULO) { + MAIUSCULO = mAIUSCULO; + } + + @Operation(description="Generates a random UUID") + public String generateUUID(){ + this.uuid = UUID.randomUUID().toString(); + return this.uuid; + } +} diff --git a/impl/core/src/test/java/management/testclasses/DummyManagedClassPropertyError.java b/impl/core/src/test/java/management/testclasses/DummyManagedClassPropertyError.java new file mode 100644 index 0000000..561383b --- /dev/null +++ b/impl/core/src/test/java/management/testclasses/DummyManagedClassPropertyError.java @@ -0,0 +1,23 @@ +package management.testclasses; + +import br.gov.frameworkdemoiselle.management.annotation.Managed; +import br.gov.frameworkdemoiselle.management.annotation.Property; + + +/** + * + * Used in tests to detect if the bootstrap detects wrong annotations + * + * @author serpro + * + */ +@Managed +public class DummyManagedClassPropertyError { + + /** + * Property with no setter or getter + */ + @Property + private Long property; + +} diff --git a/impl/core/src/test/java/management/testclasses/DummyManagementExtension.java b/impl/core/src/test/java/management/testclasses/DummyManagementExtension.java new file mode 100644 index 0000000..a1e0c3b --- /dev/null +++ b/impl/core/src/test/java/management/testclasses/DummyManagementExtension.java @@ -0,0 +1,31 @@ +package management.testclasses; + +import java.util.List; + +import javax.inject.Inject; + +import management.ManagedClassStore; + +import br.gov.frameworkdemoiselle.management.extension.ManagementExtension; +import br.gov.frameworkdemoiselle.management.internal.ManagedType; + +public class DummyManagementExtension implements ManagementExtension { + + @Inject + private ManagedClassStore store; + + @Override + public void initialize(List managedTypes) { + // Armazena os beans managed detectados neste store, + // para depois serem testados. + store.addManagedTypes(managedTypes); + } + + @Override + public void shutdown(List managedTypes) { + // Limpa o store, depois o teste verificará se + // o processo de shutdown rodou e limpou o store. + store.getManagedTypes().clear(); + } + +} diff --git a/impl/core/src/test/java/management/testclasses/DummyNotificationListener.java b/impl/core/src/test/java/management/testclasses/DummyNotificationListener.java new file mode 100644 index 0000000..a3a4776 --- /dev/null +++ b/impl/core/src/test/java/management/testclasses/DummyNotificationListener.java @@ -0,0 +1,35 @@ +package management.testclasses; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Observes; + +import br.gov.frameworkdemoiselle.management.internal.notification.event.NotificationEvent; +import br.gov.frameworkdemoiselle.management.internal.notification.qualifier.AttributeChange; +import br.gov.frameworkdemoiselle.management.internal.notification.qualifier.Generic; +import br.gov.frameworkdemoiselle.management.notification.AttributeChangeNotification; +import br.gov.frameworkdemoiselle.management.notification.NotificationManager; + +/** + * Dummy class to test receiving of notifications sent by the {@link NotificationManager} + * + * @author serpro + * + */ +@ApplicationScoped +public class DummyNotificationListener { + + private String message = null; + + public void listenNotification(@Observes @Generic NotificationEvent event){ + message = event.getNotification().getMessage().toString(); + } + + public void listenAttributeChangeNotification(@Observes @AttributeChange NotificationEvent event){ + AttributeChangeNotification notification = (AttributeChangeNotification)event.getNotification(); + message = notification.getMessage().toString() + " - " + notification.getAttributeName(); + } + + public String getMessage() { + return message; + } +} -- libgit2 0.21.2