Commit 74ae7e0c964056214685af582e61a20c63fed77b
1 parent
79d89477
Exists in
master
Implementação de testes de bootstrap e notification do módulo de
gerenciamento e monitoração (antigo demoiselle-management).
Showing
14 changed files
with
453 additions
and
200 deletions
Show diff stats
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ManagementBootstrap.java
@@ -11,12 +11,12 @@ import javax.enterprise.inject.spi.AfterDeploymentValidation; | @@ -11,12 +11,12 @@ import javax.enterprise.inject.spi.AfterDeploymentValidation; | ||
11 | import javax.enterprise.inject.spi.AnnotatedType; | 11 | import javax.enterprise.inject.spi.AnnotatedType; |
12 | import javax.enterprise.inject.spi.Bean; | 12 | import javax.enterprise.inject.spi.Bean; |
13 | import javax.enterprise.inject.spi.BeanManager; | 13 | import javax.enterprise.inject.spi.BeanManager; |
14 | +import javax.enterprise.inject.spi.BeforeShutdown; | ||
14 | import javax.enterprise.inject.spi.Extension; | 15 | import javax.enterprise.inject.spi.Extension; |
15 | import javax.enterprise.inject.spi.ProcessAnnotatedType; | 16 | import javax.enterprise.inject.spi.ProcessAnnotatedType; |
16 | 17 | ||
17 | import br.gov.frameworkdemoiselle.internal.context.ContextManager; | 18 | import br.gov.frameworkdemoiselle.internal.context.ContextManager; |
18 | import br.gov.frameworkdemoiselle.internal.context.ManagedContext; | 19 | import br.gov.frameworkdemoiselle.internal.context.ManagedContext; |
19 | -import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess; | ||
20 | import br.gov.frameworkdemoiselle.management.annotation.Managed; | 20 | import br.gov.frameworkdemoiselle.management.annotation.Managed; |
21 | import br.gov.frameworkdemoiselle.management.extension.ManagementExtension; | 21 | import br.gov.frameworkdemoiselle.management.extension.ManagementExtension; |
22 | import br.gov.frameworkdemoiselle.management.internal.ManagedType; | 22 | import br.gov.frameworkdemoiselle.management.internal.ManagedType; |
@@ -60,11 +60,13 @@ public class ManagementBootstrap implements Extension { | @@ -60,11 +60,13 @@ public class ManagementBootstrap implements Extension { | ||
60 | monitoringManager.initialize(managementExtensionCache); | 60 | monitoringManager.initialize(managementExtensionCache); |
61 | } | 61 | } |
62 | 62 | ||
63 | - public void unregisterAvailableManagedTypes(@Observes final AfterShutdownProccess event) { | 63 | + public void unregisterAvailableManagedTypes(@Observes final BeforeShutdown event) { |
64 | 64 | ||
65 | MonitoringManager manager = Beans.getReference(MonitoringManager.class); | 65 | MonitoringManager manager = Beans.getReference(MonitoringManager.class); |
66 | manager.shutdown(managementExtensionCache); | 66 | manager.shutdown(managementExtensionCache); |
67 | - | 67 | + |
68 | + managementExtensionCache.clear(); | ||
69 | + types.clear(); | ||
68 | } | 70 | } |
69 | 71 | ||
70 | } | 72 | } |
impl/core/src/main/java/br/gov/frameworkdemoiselle/management/internal/MonitoringManager.java
@@ -13,6 +13,7 @@ import javax.management.ReflectionException; | @@ -13,6 +13,7 @@ import javax.management.ReflectionException; | ||
13 | import org.slf4j.Logger; | 13 | import org.slf4j.Logger; |
14 | 14 | ||
15 | import br.gov.frameworkdemoiselle.DemoiselleException; | 15 | import br.gov.frameworkdemoiselle.DemoiselleException; |
16 | +import br.gov.frameworkdemoiselle.annotation.Name; | ||
16 | import br.gov.frameworkdemoiselle.internal.context.ContextManager; | 17 | import br.gov.frameworkdemoiselle.internal.context.ContextManager; |
17 | import br.gov.frameworkdemoiselle.internal.context.ManagedContext; | 18 | import br.gov.frameworkdemoiselle.internal.context.ManagedContext; |
18 | import br.gov.frameworkdemoiselle.management.annotation.Managed; | 19 | import br.gov.frameworkdemoiselle.management.annotation.Managed; |
@@ -38,12 +39,14 @@ public class MonitoringManager { | @@ -38,12 +39,14 @@ public class MonitoringManager { | ||
38 | private Logger logger; | 39 | private Logger logger; |
39 | 40 | ||
40 | @Inject | 41 | @Inject |
42 | + @Name("demoiselle-core-bundle") | ||
41 | private ResourceBundle bundle; | 43 | private ResourceBundle bundle; |
42 | 44 | ||
43 | private final List<ManagedType> managedTypes = new ArrayList<ManagedType>(); | 45 | private final List<ManagedType> managedTypes = new ArrayList<ManagedType>(); |
44 | 46 | ||
45 | public void addManagedType(ManagedType managedType) { | 47 | public void addManagedType(ManagedType managedType) { |
46 | managedTypes.add(managedType); | 48 | managedTypes.add(managedType); |
49 | + logger.debug(bundle.getString("management-debug-registering-managed-type",managedType.getType().getCanonicalName())); | ||
47 | } | 50 | } |
48 | 51 | ||
49 | /** | 52 | /** |
@@ -189,8 +192,13 @@ public class MonitoringManager { | @@ -189,8 +192,13 @@ public class MonitoringManager { | ||
189 | //Manda uma notificação de mudança de atributo | 192 | //Manda uma notificação de mudança de atributo |
190 | NotificationManager notificationManager = Beans.getReference(NotificationManager.class); | 193 | NotificationManager notificationManager = Beans.getReference(NotificationManager.class); |
191 | Class<? extends Object> attributeType = newValue!=null ? newValue.getClass() : null; | 194 | Class<? extends Object> attributeType = newValue!=null ? newValue.getClass() : null; |
192 | - AttributeChangeNotification notification = new AttributeChangeNotification(bundle.getString(""), propertyName, attributeType, oldValue, newValue); | ||
193 | - notificationManager.sendAttributeChangedMessage(notification); | 195 | + |
196 | + AttributeChangeNotification notification = new AttributeChangeNotification(bundle.getString("management-notification-attribute-changed",propertyName,managedType.getType().getCanonicalName()) | ||
197 | + , propertyName | ||
198 | + , attributeType | ||
199 | + , oldValue | ||
200 | + , newValue); | ||
201 | + notificationManager.sendNotification(notification); | ||
194 | 202 | ||
195 | } catch (Exception e) { | 203 | } catch (Exception e) { |
196 | throw new DemoiselleException(bundle.getString( | 204 | throw new DemoiselleException(bundle.getString( |
@@ -233,6 +241,8 @@ public class MonitoringManager { | @@ -233,6 +241,8 @@ public class MonitoringManager { | ||
233 | ManagementExtension monitoringExtension = Beans.getReference(monitoringExtensionClass); | 241 | ManagementExtension monitoringExtension = Beans.getReference(monitoringExtensionClass); |
234 | 242 | ||
235 | monitoringExtension.shutdown(this.getManagedTypes()); | 243 | monitoringExtension.shutdown(this.getManagedTypes()); |
244 | + | ||
245 | + logger.debug( bundle.getString("management-debug-removing-management-extension",monitoringExtension.getClass().getCanonicalName()) ); | ||
236 | 246 | ||
237 | } | 247 | } |
238 | 248 | ||
@@ -246,6 +256,8 @@ public class MonitoringManager { | @@ -246,6 +256,8 @@ public class MonitoringManager { | ||
246 | .getReference(monitoringExtensionClass); | 256 | .getReference(monitoringExtensionClass); |
247 | 257 | ||
248 | monitoringExtension.initialize(this.getManagedTypes()); | 258 | monitoringExtension.initialize(this.getManagedTypes()); |
259 | + | ||
260 | + logger.debug( bundle.getString("management-debug-processing-management-extension",monitoringExtension.getClass().getCanonicalName()) ); | ||
249 | 261 | ||
250 | } | 262 | } |
251 | 263 |
impl/core/src/main/java/br/gov/frameworkdemoiselle/management/notification/NotificationManager.java
@@ -5,6 +5,7 @@ import java.io.Serializable; | @@ -5,6 +5,7 @@ import java.io.Serializable; | ||
5 | import javax.enterprise.context.ApplicationScoped; | 5 | import javax.enterprise.context.ApplicationScoped; |
6 | import javax.enterprise.event.Event; | 6 | import javax.enterprise.event.Event; |
7 | import javax.enterprise.event.Observes; | 7 | import javax.enterprise.event.Observes; |
8 | +import javax.enterprise.util.AnnotationLiteral; | ||
8 | import javax.inject.Inject; | 9 | import javax.inject.Inject; |
9 | 10 | ||
10 | import br.gov.frameworkdemoiselle.management.internal.notification.event.NotificationEvent; | 11 | import br.gov.frameworkdemoiselle.management.internal.notification.event.NotificationEvent; |
@@ -48,16 +49,32 @@ public class NotificationManager implements Serializable{ | @@ -48,16 +49,32 @@ public class NotificationManager implements Serializable{ | ||
48 | * @param notification The notification to send | 49 | * @param notification The notification to send |
49 | */ | 50 | */ |
50 | public void sendNotification(Notification notification) { | 51 | public void sendNotification(Notification notification) { |
51 | - genericNotificationEvent.fire(new NotificationEvent(notification)); | 52 | + if (! AttributeChangeNotification.class.isInstance(notification) ){ |
53 | + getGenericNotificationEvent().fire(new NotificationEvent(notification)); | ||
54 | + } | ||
55 | + else{ | ||
56 | + getAttributeChangeNotificationEvent().fire(new NotificationEvent(notification)); | ||
57 | + } | ||
58 | + } | ||
59 | + | ||
60 | + @SuppressWarnings("unchecked") | ||
61 | + private Event<NotificationEvent> getGenericNotificationEvent() { | ||
62 | + if (genericNotificationEvent==null){ | ||
63 | + genericNotificationEvent = Beans.getReference(Event.class , new AnnotationLiteral<Generic>() {}); | ||
64 | + } | ||
65 | + | ||
66 | + return genericNotificationEvent; | ||
52 | } | 67 | } |
53 | 68 | ||
54 | - /** | ||
55 | - * Sends a notification comunicating about a change of value for an attribute. | ||
56 | - * | ||
57 | - * @param notification Special notification communicating a change of value in an attribute. | ||
58 | - * | ||
59 | - */ | ||
60 | - public void sendAttributeChangedMessage(AttributeChangeNotification notification){ | ||
61 | - attributeChangeNotificationEvent.fire(new NotificationEvent(notification)); | 69 | + @SuppressWarnings("unchecked") |
70 | + private Event<NotificationEvent> getAttributeChangeNotificationEvent() { | ||
71 | + if (attributeChangeNotificationEvent==null){ | ||
72 | + attributeChangeNotificationEvent = Beans.getReference(Event.class , new AnnotationLiteral<AttributeChange>() {}); | ||
73 | + } | ||
74 | + | ||
75 | + return attributeChangeNotificationEvent; | ||
62 | } | 76 | } |
77 | + | ||
78 | + | ||
79 | + | ||
63 | } | 80 | } |
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} | @@ -98,15 +98,19 @@ user-has-role=Usu\u00E1rio {0} possui a(s) role(s)\: {1} | ||
98 | 98 | ||
99 | 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. | 99 | 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. |
100 | 100 | ||
101 | -management-null-class-defined=A classe gerenciada informada n\u00E3o pode ser nula. | ||
102 | -management-no-annotation-found=Classe {0} precisa ser anotada com @Managed. | ||
103 | -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}. | ||
104 | -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. | ||
105 | -management-introspection-error=Erro ao ler atributos da classe gerenciada {0}. | ||
106 | -management-type-not-found=A classe gerenciada informada n\u00E3o existe: {0}. | ||
107 | -management-invoke-error=Erro ao tentar invocar a opera\u00E7\u00E3o "{0}" da classe gerenciada, a opera\u00E7\u00E3o n\u00E3o foi encontrada. | ||
108 | -management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1}. | ||
109 | -management-debug-setting-property=Definindo novo valor para propriedade {0} da classe gerenciada {1}. | ||
110 | -management-debug-invoking-operation=Invocando opera\u00E7\u00E3o {0} da classe gerenciada {1}. | ||
111 | -management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1}. | ||
112 | -management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1}. | 101 | +management-notification-attribute-changed=O atributo [{0}] da classe gerenciada [{1}] foi alterado |
102 | +management-null-class-defined=A classe gerenciada informada n\u00E3o pode ser nula | ||
103 | +management-no-annotation-found=Classe {0} precisa ser anotada com @Managed | ||
104 | +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} | ||
105 | +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 | ||
106 | +management-introspection-error=Erro ao ler atributos da classe gerenciada {0} | ||
107 | +management-type-not-found=A classe gerenciada informada n\u00E3o existe\: {0} | ||
108 | +management-invoke-error=Erro ao tentar invocar a opera\u00E7\u00E3o "{0}" da classe gerenciada, a opera\u00E7\u00E3o n\u00E3o foi encontrada | ||
109 | +management-debug-acessing-property=Acessando propriedade {0} da classe gerenciada {1} | ||
110 | +management-debug-setting-property=Definindo novo valor para propriedade {0} da classe gerenciada {1} | ||
111 | +management-debug-invoking-operation=Invocando opera\u00E7\u00E3o {0} da classe gerenciada {1} | ||
112 | +management-debug-starting-custom-context=Levantando contexto {0} para executar comando na classe gerenciada {1} | ||
113 | +management-debug-stoping-custom-context=Desligando contexto {0} para classe gerenciada {1} | ||
114 | +management-debug-registering-managed-type=Registrando classe gerenciada [{0}] | ||
115 | +management-debug-processing-management-extension=Processando extens\u00E3o de gerenciamento [{0}] | ||
116 | +management-debug-removing-management-extension=Desativando extens\u00E3o de gerenciamento [{0}] | ||
113 | \ No newline at end of file | 117 | \ No newline at end of file |
impl/core/src/test/java/management/DummyManagedClass.java
@@ -1,74 +0,0 @@ | @@ -1,74 +0,0 @@ | ||
1 | -package management; | ||
2 | - | ||
3 | -import java.util.UUID; | ||
4 | - | ||
5 | -import br.gov.frameworkdemoiselle.management.annotation.Managed; | ||
6 | -import br.gov.frameworkdemoiselle.management.annotation.Operation; | ||
7 | -import br.gov.frameworkdemoiselle.management.annotation.Property; | ||
8 | -import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues; | ||
9 | -import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues.ValueType; | ||
10 | - | ||
11 | -@Managed | ||
12 | -public class DummyManagedClass { | ||
13 | - | ||
14 | - @Property | ||
15 | - @AllowedValues(allows={"f","m","F","M"},valueType=ValueType.INTEGER) | ||
16 | - private Integer id; | ||
17 | - | ||
18 | - @Property | ||
19 | - private String uuid; | ||
20 | - | ||
21 | - @Property | ||
22 | - private String writeOnlyProperty; | ||
23 | - | ||
24 | - /** | ||
25 | - * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas uma letra. | ||
26 | - */ | ||
27 | - @Property | ||
28 | - private Integer a; | ||
29 | - | ||
30 | - /** | ||
31 | - * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas letras maiúsculas. | ||
32 | - */ | ||
33 | - @Property | ||
34 | - private Integer MAIUSCULO; | ||
35 | - | ||
36 | - public Integer getId() { | ||
37 | - return id; | ||
38 | - } | ||
39 | - | ||
40 | - public void setId(Integer id) { | ||
41 | - this.id = id; | ||
42 | - } | ||
43 | - | ||
44 | - public String getUuid() { | ||
45 | - return uuid; | ||
46 | - } | ||
47 | - | ||
48 | - public void setWriteOnlyProperty(String newValue){ | ||
49 | - this.writeOnlyProperty = newValue; | ||
50 | - } | ||
51 | - | ||
52 | - public Integer getA() { | ||
53 | - return a; | ||
54 | - } | ||
55 | - | ||
56 | - public void setA(Integer a) { | ||
57 | - this.a = a; | ||
58 | - } | ||
59 | - | ||
60 | - public Integer getMAIUSCULO() { | ||
61 | - return MAIUSCULO; | ||
62 | - } | ||
63 | - | ||
64 | - | ||
65 | - public void setMAIUSCULO(Integer mAIUSCULO) { | ||
66 | - MAIUSCULO = mAIUSCULO; | ||
67 | - } | ||
68 | - | ||
69 | - @Operation(description="Generates a random UUID") | ||
70 | - public String generateUUID(){ | ||
71 | - this.uuid = UUID.randomUUID().toString(); | ||
72 | - return this.uuid; | ||
73 | - } | ||
74 | -} |
impl/core/src/test/java/management/DummyManagementExtension.java
@@ -1,29 +0,0 @@ | @@ -1,29 +0,0 @@ | ||
1 | -package management; | ||
2 | - | ||
3 | -import java.util.List; | ||
4 | - | ||
5 | -import javax.inject.Inject; | ||
6 | - | ||
7 | -import br.gov.frameworkdemoiselle.management.extension.ManagementExtension; | ||
8 | -import br.gov.frameworkdemoiselle.management.internal.ManagedType; | ||
9 | - | ||
10 | -public class DummyManagementExtension implements ManagementExtension { | ||
11 | - | ||
12 | - @Inject | ||
13 | - private ManagedClassStore store; | ||
14 | - | ||
15 | - @Override | ||
16 | - public void initialize(List<ManagedType> managedTypes) { | ||
17 | - // Armazena os beans managed detectados neste store, | ||
18 | - // para depois serem testados. | ||
19 | - store.setManagedTypes(managedTypes); | ||
20 | - } | ||
21 | - | ||
22 | - @Override | ||
23 | - public void shutdown(List<ManagedType> managedTypes) { | ||
24 | - // Limpa o store, depois o teste verificará se | ||
25 | - // o processo de shutdown rodou e limpou o store. | ||
26 | - store.setManagedTypes(null); | ||
27 | - } | ||
28 | - | ||
29 | -} |
impl/core/src/test/java/management/ManagedClassStore.java
1 | package management; | 1 | package management; |
2 | 2 | ||
3 | +import java.util.ArrayList; | ||
4 | +import java.util.Collection; | ||
3 | import java.util.List; | 5 | import java.util.List; |
4 | 6 | ||
5 | import javax.enterprise.context.ApplicationScoped; | 7 | import javax.enterprise.context.ApplicationScoped; |
@@ -9,15 +11,15 @@ import br.gov.frameworkdemoiselle.management.internal.ManagedType; | @@ -9,15 +11,15 @@ import br.gov.frameworkdemoiselle.management.internal.ManagedType; | ||
9 | @ApplicationScoped | 11 | @ApplicationScoped |
10 | public class ManagedClassStore { | 12 | public class ManagedClassStore { |
11 | 13 | ||
12 | - private List<ManagedType> managedTypes = null; | 14 | + private List<ManagedType> managedTypes = new ArrayList<ManagedType>(); |
13 | 15 | ||
14 | 16 | ||
15 | public List<ManagedType> getManagedTypes() { | 17 | public List<ManagedType> getManagedTypes() { |
16 | return managedTypes; | 18 | return managedTypes; |
17 | } | 19 | } |
18 | 20 | ||
19 | - public void setManagedTypes(List<ManagedType> managedTypes) { | ||
20 | - this.managedTypes = managedTypes; | 21 | + public void addManagedTypes(Collection<ManagedType> managedTypes){ |
22 | + this.managedTypes.addAll(managedTypes); | ||
21 | } | 23 | } |
22 | 24 | ||
23 | } | 25 | } |
impl/core/src/test/java/management/ManagementBootstrapTest.java
@@ -1,68 +0,0 @@ | @@ -1,68 +0,0 @@ | ||
1 | -package management; | ||
2 | - | ||
3 | -import javax.inject.Inject; | ||
4 | - | ||
5 | -import org.jboss.arquillian.container.test.api.Deployment; | ||
6 | -import org.jboss.arquillian.junit.Arquillian; | ||
7 | -import org.jboss.shrinkwrap.api.spec.JavaArchive; | ||
8 | -import org.junit.Assert; | ||
9 | -import org.junit.Test; | ||
10 | -import org.junit.runner.RunWith; | ||
11 | - | ||
12 | -import test.Tests; | ||
13 | -import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess; | ||
14 | -import br.gov.frameworkdemoiselle.management.extension.ManagementExtension; | ||
15 | -import br.gov.frameworkdemoiselle.util.Beans; | ||
16 | - | ||
17 | - | ||
18 | -@RunWith(Arquillian.class) | ||
19 | -public class ManagementBootstrapTest { | ||
20 | - | ||
21 | - @Inject | ||
22 | - private ManagedClassStore store; | ||
23 | - | ||
24 | - @Deployment | ||
25 | - public static JavaArchive createDeployment() { | ||
26 | - JavaArchive deployment = Tests.createDeployment(ManagementBootstrapTest.class); | ||
27 | - | ||
28 | - /*deployment | ||
29 | - .addClass(ManagedClassStore.class) | ||
30 | - .addClass(DummyManagedClass.class) | ||
31 | - .addClass(DummyManagementExtension.class);*/ | ||
32 | - | ||
33 | - return deployment; | ||
34 | - } | ||
35 | - | ||
36 | - /** | ||
37 | - * Test if a a management extension (a library that implements {@link ManagementExtension}) is correctly detected. | ||
38 | - */ | ||
39 | - @Test | ||
40 | - public void testManagementExtensionRegistration(){ | ||
41 | - | ||
42 | - //"store" é application scoped e é usado pelo DummyManagementExtension para | ||
43 | - //armazenar todos os beans anotados com @Managed. Se o bootstrap rodou corretamente, | ||
44 | - //ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos. | ||
45 | - Assert.assertNotNull(store.getManagedTypes()); | ||
46 | - Assert.assertEquals(1, store.getManagedTypes().size()); | ||
47 | - | ||
48 | - } | ||
49 | - | ||
50 | - /** | ||
51 | - * Test if a a management extension's (a library that implements {@link ManagementExtension}) shutdown | ||
52 | - * method is correctly called upon application shutdown. | ||
53 | - */ | ||
54 | - @Test | ||
55 | - public void testManagementExtensionShutdown(){ | ||
56 | - | ||
57 | - //"store" é application scoped e é usado pelo DummyManagementExtension para | ||
58 | - //armazenar todos os beans anotados com @Managed. Se o bootstrap rodou corretamente, | ||
59 | - //ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos. | ||
60 | - //Nós então disparamos o evento de shutdown onde ele deverá limpar o store. | ||
61 | - Assert.assertNotNull(store.getManagedTypes()); | ||
62 | - Assert.assertEquals(1, store.getManagedTypes().size()); | ||
63 | - | ||
64 | - Beans.getBeanManager().fireEvent(new AfterShutdownProccess() {}); | ||
65 | - Assert.assertNull(store.getManagedTypes()); | ||
66 | - } | ||
67 | - | ||
68 | -} |
impl/core/src/test/java/management/ManagementBootstrapTestCase.java
0 → 100644
@@ -0,0 +1,124 @@ | @@ -0,0 +1,124 @@ | ||
1 | +package management; | ||
2 | + | ||
3 | +import java.io.File; | ||
4 | +import java.util.List; | ||
5 | + | ||
6 | +import management.testclasses.DummyManagedClass; | ||
7 | +import management.testclasses.DummyManagedClassPropertyError; | ||
8 | +import management.testclasses.DummyManagementExtension; | ||
9 | + | ||
10 | +import org.jboss.arquillian.container.test.api.Deployer; | ||
11 | +import org.jboss.arquillian.container.test.api.Deployment; | ||
12 | +import org.jboss.arquillian.junit.Arquillian; | ||
13 | +import org.jboss.arquillian.test.api.ArquillianResource; | ||
14 | +import org.jboss.shrinkwrap.api.ShrinkWrap; | ||
15 | +import org.jboss.shrinkwrap.api.asset.FileAsset; | ||
16 | +import org.jboss.shrinkwrap.api.spec.JavaArchive; | ||
17 | +import org.junit.Assert; | ||
18 | +import org.junit.Test; | ||
19 | +import org.junit.runner.RunWith; | ||
20 | + | ||
21 | +import test.LocaleProducer; | ||
22 | +import br.gov.frameworkdemoiselle.management.extension.ManagementExtension; | ||
23 | +import br.gov.frameworkdemoiselle.management.internal.ManagedType; | ||
24 | +import br.gov.frameworkdemoiselle.util.Beans; | ||
25 | + | ||
26 | +@RunWith(Arquillian.class) | ||
27 | +public class ManagementBootstrapTestCase { | ||
28 | + | ||
29 | + @ArquillianResource | ||
30 | + private Deployer deployer; | ||
31 | + | ||
32 | + /** | ||
33 | + * Deployment to test normal deployment behaviour | ||
34 | + * | ||
35 | + */ | ||
36 | + @Deployment(name = "default",managed=false,testable=false) | ||
37 | + public static JavaArchive createDeployment() { | ||
38 | + return ShrinkWrap | ||
39 | + .create(JavaArchive.class) | ||
40 | + .addClass(LocaleProducer.class) | ||
41 | + .addPackages(true, "br") | ||
42 | + .addAsResource(new FileAsset(new File("src/test/resources/test/beans.xml")), "beans.xml") | ||
43 | + .addAsManifestResource( | ||
44 | + new File("src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension"), | ||
45 | + "services/javax.enterprise.inject.spi.Extension") | ||
46 | + .addPackages(false, ManagementBootstrapTestCase.class.getPackage()) | ||
47 | + .addClasses(DummyManagementExtension.class,DummyManagedClass.class); | ||
48 | + } | ||
49 | + | ||
50 | + /** | ||
51 | + * Deployment containing a malformed managed class. Tests using this deployment will | ||
52 | + * check if deployment fails (it has to). | ||
53 | + * | ||
54 | + */ | ||
55 | + @Deployment(name = "wrong_annotation",managed=false,testable=false) | ||
56 | + public static JavaArchive createWrongAnnotationDeployment() { | ||
57 | + return ShrinkWrap | ||
58 | + .create(JavaArchive.class) | ||
59 | + .addClass(LocaleProducer.class) | ||
60 | + .addPackages(true, "br") | ||
61 | + .addAsResource(new FileAsset(new File("src/test/resources/test/beans.xml")), "beans.xml") | ||
62 | + .addAsManifestResource( | ||
63 | + new File("src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension"), | ||
64 | + "services/javax.enterprise.inject.spi.Extension") | ||
65 | + .addPackages(false, ManagementBootstrapTestCase.class.getPackage()) | ||
66 | + .addClasses(DummyManagementExtension.class,DummyManagedClassPropertyError.class); | ||
67 | + } | ||
68 | + | ||
69 | + /** | ||
70 | + * Test if a a management extension (a library that implements {@link ManagementExtension}) is correctly detected. | ||
71 | + */ | ||
72 | + @Test | ||
73 | + public void testManagementExtensionRegistration() { | ||
74 | + deployer.deploy("default"); | ||
75 | + | ||
76 | + // "store" é application scoped e é usado pelo DummyManagementExtension para | ||
77 | + // armazenar todos os beans anotados com @Managed. Se o bootstrap rodou corretamente, | ||
78 | + // ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos. | ||
79 | + ManagedClassStore store = Beans.getReference(ManagedClassStore.class); | ||
80 | + | ||
81 | + Assert.assertEquals(1, store.getManagedTypes().size()); | ||
82 | + | ||
83 | + deployer.undeploy("default"); | ||
84 | + } | ||
85 | + | ||
86 | + /** | ||
87 | + * Test if a a management extension's shutdown method is | ||
88 | + * correctly called upon application shutdown. | ||
89 | + */ | ||
90 | + @Test | ||
91 | + public void testManagementExtensionShutdown() { | ||
92 | + deployer.deploy("default"); | ||
93 | + | ||
94 | + // "store" é application scoped e é usado pelo DummyManagementExtension para | ||
95 | + // armazenar todos os beans anotados com @Managed. Se o bootstrap rodou corretamente, | ||
96 | + // ele chamou DummyManagementExtension.initialize e este store conterá o bean de teste que anotamos. | ||
97 | + // Nós então disparamos o evento de shutdown onde ele deverá limpar o store. | ||
98 | + ManagedClassStore store = Beans.getReference(ManagedClassStore.class); | ||
99 | + | ||
100 | + //Detecta se a classe anotada foi detectada | ||
101 | + List<ManagedType> managedTypes = store.getManagedTypes(); | ||
102 | + Assert.assertEquals(1, managedTypes.size()); | ||
103 | + | ||
104 | + deployer.undeploy("default"); | ||
105 | + | ||
106 | + //Após o "undeploy", o ciclo de vida precisa ter removido a classe gerenciada da lista. | ||
107 | + Assert.assertEquals(0, managedTypes.size()); | ||
108 | + } | ||
109 | + | ||
110 | + @Test | ||
111 | + public void testWrongAnnotation(){ | ||
112 | + | ||
113 | + try{ | ||
114 | + deployer.deploy("wrong_annotation"); | ||
115 | + | ||
116 | + //O processo de deploy precisa falhar, pois temos uma classe anotada com falhas. | ||
117 | + Assert.fail(); | ||
118 | + } | ||
119 | + catch(Exception e){ | ||
120 | + deployer.undeploy("wrong_annotation"); | ||
121 | + } | ||
122 | + } | ||
123 | + | ||
124 | +} |
impl/core/src/test/java/management/NotificationTestCase.java
0 → 100644
@@ -0,0 +1,100 @@ | @@ -0,0 +1,100 @@ | ||
1 | +package management; | ||
2 | + | ||
3 | +import java.io.File; | ||
4 | + | ||
5 | +import javax.inject.Inject; | ||
6 | + | ||
7 | +import junit.framework.Assert; | ||
8 | +import management.testclasses.DummyManagedClass; | ||
9 | +import management.testclasses.DummyNotificationListener; | ||
10 | + | ||
11 | +import org.jboss.arquillian.container.test.api.Deployment; | ||
12 | +import org.jboss.arquillian.junit.Arquillian; | ||
13 | +import org.jboss.shrinkwrap.api.ShrinkWrap; | ||
14 | +import org.jboss.shrinkwrap.api.asset.FileAsset; | ||
15 | +import org.jboss.shrinkwrap.api.spec.JavaArchive; | ||
16 | +import org.junit.Test; | ||
17 | +import org.junit.runner.RunWith; | ||
18 | + | ||
19 | +import test.LocaleProducer; | ||
20 | +import br.gov.frameworkdemoiselle.annotation.Name; | ||
21 | +import br.gov.frameworkdemoiselle.management.internal.ManagedType; | ||
22 | +import br.gov.frameworkdemoiselle.management.internal.MonitoringManager; | ||
23 | +import br.gov.frameworkdemoiselle.management.notification.AttributeChangeNotification; | ||
24 | +import br.gov.frameworkdemoiselle.management.notification.Notification; | ||
25 | +import br.gov.frameworkdemoiselle.management.notification.NotificationManager; | ||
26 | +import br.gov.frameworkdemoiselle.util.Beans; | ||
27 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | ||
28 | + | ||
29 | +/** | ||
30 | + * Test the {@link NotificationManager} with a dummy extension | ||
31 | + * to check if notifications are correctly propagated | ||
32 | + * | ||
33 | + * @author serpro | ||
34 | + * | ||
35 | + */ | ||
36 | +@RunWith(Arquillian.class) | ||
37 | +public class NotificationTestCase { | ||
38 | + | ||
39 | + @Inject | ||
40 | + private NotificationManager manager; | ||
41 | + | ||
42 | + @Inject | ||
43 | + @Name("demoiselle-core-bundle") | ||
44 | + private ResourceBundle bundle; | ||
45 | + | ||
46 | + @Deployment | ||
47 | + public static JavaArchive createDeployment() { | ||
48 | + return ShrinkWrap | ||
49 | + .create(JavaArchive.class) | ||
50 | + .addClass(LocaleProducer.class) | ||
51 | + .addPackages(true, "br") | ||
52 | + .addAsResource(new FileAsset(new File("src/test/resources/test/beans.xml")), "beans.xml") | ||
53 | + .addAsManifestResource( | ||
54 | + new File("src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension"), | ||
55 | + "services/javax.enterprise.inject.spi.Extension") | ||
56 | + .addPackages(false, ManagementBootstrapTestCase.class.getPackage()) | ||
57 | + .addClasses(DummyNotificationListener.class,DummyManagedClass.class); | ||
58 | + } | ||
59 | + | ||
60 | + /** | ||
61 | + * Test sending a normal notification | ||
62 | + */ | ||
63 | + @Test | ||
64 | + public void testSendGenericNotification(){ | ||
65 | + manager.sendNotification(new Notification("Test Message")); | ||
66 | + DummyNotificationListener listener = Beans.getReference(DummyNotificationListener.class); | ||
67 | + Assert.assertEquals("Test Message", listener.getMessage()); | ||
68 | + } | ||
69 | + | ||
70 | + /** | ||
71 | + * Test sending a notification of change in attribute | ||
72 | + */ | ||
73 | + @Test | ||
74 | + public void testSendAttributeChangeNotification(){ | ||
75 | + manager.sendNotification(new AttributeChangeNotification("Test Message", "attribute", String.class, "old", "new")); | ||
76 | + DummyNotificationListener listener = Beans.getReference(DummyNotificationListener.class); | ||
77 | + Assert.assertEquals("Test Message - attribute", listener.getMessage()); | ||
78 | + } | ||
79 | + | ||
80 | + /** | ||
81 | + * Test if notifications are automatically sent when an attribute from a managed | ||
82 | + * class change values | ||
83 | + */ | ||
84 | + @Test | ||
85 | + public void testNotifyChangeManagedClass(){ | ||
86 | + MonitoringManager manager = Beans.getReference(MonitoringManager.class); | ||
87 | + | ||
88 | + for (ManagedType type : manager.getManagedTypes()){ | ||
89 | + if (type.getType().equals(DummyManagedClass.class)){ | ||
90 | + manager.setProperty(type, "id", new Integer(10)); | ||
91 | + break; | ||
92 | + } | ||
93 | + } | ||
94 | + | ||
95 | + DummyNotificationListener listener = Beans.getReference(DummyNotificationListener.class); | ||
96 | + Assert.assertEquals( bundle.getString("management-notification-attribute-changed","id",DummyManagedClass.class.getCanonicalName()) + " - id" | ||
97 | + , listener.getMessage()); | ||
98 | + } | ||
99 | + | ||
100 | +} |
impl/core/src/test/java/management/testclasses/DummyManagedClass.java
0 → 100644
@@ -0,0 +1,74 @@ | @@ -0,0 +1,74 @@ | ||
1 | +package management.testclasses; | ||
2 | + | ||
3 | +import java.util.UUID; | ||
4 | + | ||
5 | +import br.gov.frameworkdemoiselle.management.annotation.Managed; | ||
6 | +import br.gov.frameworkdemoiselle.management.annotation.Operation; | ||
7 | +import br.gov.frameworkdemoiselle.management.annotation.Property; | ||
8 | +import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues; | ||
9 | +import br.gov.frameworkdemoiselle.management.annotation.validation.AllowedValues.ValueType; | ||
10 | + | ||
11 | +@Managed | ||
12 | +public class DummyManagedClass { | ||
13 | + | ||
14 | + @Property | ||
15 | + @AllowedValues(allows={"f","m","F","M"},valueType=ValueType.INTEGER) | ||
16 | + private Integer id; | ||
17 | + | ||
18 | + @Property | ||
19 | + private String uuid; | ||
20 | + | ||
21 | + @Property | ||
22 | + private String writeOnlyProperty; | ||
23 | + | ||
24 | + /** | ||
25 | + * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas uma letra. | ||
26 | + */ | ||
27 | + @Property | ||
28 | + private Integer a; | ||
29 | + | ||
30 | + /** | ||
31 | + * Propriedade para testar detecção de métodos GET e SET quando propriedade tem apenas letras maiúsculas. | ||
32 | + */ | ||
33 | + @Property | ||
34 | + private Integer MAIUSCULO; | ||
35 | + | ||
36 | + public Integer getId() { | ||
37 | + return id; | ||
38 | + } | ||
39 | + | ||
40 | + public void setId(Integer id) { | ||
41 | + this.id = id; | ||
42 | + } | ||
43 | + | ||
44 | + public String getUuid() { | ||
45 | + return uuid; | ||
46 | + } | ||
47 | + | ||
48 | + public void setWriteOnlyProperty(String newValue){ | ||
49 | + this.writeOnlyProperty = newValue; | ||
50 | + } | ||
51 | + | ||
52 | + public Integer getA() { | ||
53 | + return a; | ||
54 | + } | ||
55 | + | ||
56 | + public void setA(Integer a) { | ||
57 | + this.a = a; | ||
58 | + } | ||
59 | + | ||
60 | + public Integer getMAIUSCULO() { | ||
61 | + return MAIUSCULO; | ||
62 | + } | ||
63 | + | ||
64 | + | ||
65 | + public void setMAIUSCULO(Integer mAIUSCULO) { | ||
66 | + MAIUSCULO = mAIUSCULO; | ||
67 | + } | ||
68 | + | ||
69 | + @Operation(description="Generates a random UUID") | ||
70 | + public String generateUUID(){ | ||
71 | + this.uuid = UUID.randomUUID().toString(); | ||
72 | + return this.uuid; | ||
73 | + } | ||
74 | +} |
impl/core/src/test/java/management/testclasses/DummyManagedClassPropertyError.java
0 → 100644
@@ -0,0 +1,23 @@ | @@ -0,0 +1,23 @@ | ||
1 | +package management.testclasses; | ||
2 | + | ||
3 | +import br.gov.frameworkdemoiselle.management.annotation.Managed; | ||
4 | +import br.gov.frameworkdemoiselle.management.annotation.Property; | ||
5 | + | ||
6 | + | ||
7 | +/** | ||
8 | + * | ||
9 | + * Used in tests to detect if the bootstrap detects wrong annotations | ||
10 | + * | ||
11 | + * @author serpro | ||
12 | + * | ||
13 | + */ | ||
14 | +@Managed | ||
15 | +public class DummyManagedClassPropertyError { | ||
16 | + | ||
17 | + /** | ||
18 | + * Property with no setter or getter | ||
19 | + */ | ||
20 | + @Property | ||
21 | + private Long property; | ||
22 | + | ||
23 | +} |
impl/core/src/test/java/management/testclasses/DummyManagementExtension.java
0 → 100644
@@ -0,0 +1,31 @@ | @@ -0,0 +1,31 @@ | ||
1 | +package management.testclasses; | ||
2 | + | ||
3 | +import java.util.List; | ||
4 | + | ||
5 | +import javax.inject.Inject; | ||
6 | + | ||
7 | +import management.ManagedClassStore; | ||
8 | + | ||
9 | +import br.gov.frameworkdemoiselle.management.extension.ManagementExtension; | ||
10 | +import br.gov.frameworkdemoiselle.management.internal.ManagedType; | ||
11 | + | ||
12 | +public class DummyManagementExtension implements ManagementExtension { | ||
13 | + | ||
14 | + @Inject | ||
15 | + private ManagedClassStore store; | ||
16 | + | ||
17 | + @Override | ||
18 | + public void initialize(List<ManagedType> managedTypes) { | ||
19 | + // Armazena os beans managed detectados neste store, | ||
20 | + // para depois serem testados. | ||
21 | + store.addManagedTypes(managedTypes); | ||
22 | + } | ||
23 | + | ||
24 | + @Override | ||
25 | + public void shutdown(List<ManagedType> managedTypes) { | ||
26 | + // Limpa o store, depois o teste verificará se | ||
27 | + // o processo de shutdown rodou e limpou o store. | ||
28 | + store.getManagedTypes().clear(); | ||
29 | + } | ||
30 | + | ||
31 | +} |
impl/core/src/test/java/management/testclasses/DummyNotificationListener.java
0 → 100644
@@ -0,0 +1,35 @@ | @@ -0,0 +1,35 @@ | ||
1 | +package management.testclasses; | ||
2 | + | ||
3 | +import javax.enterprise.context.ApplicationScoped; | ||
4 | +import javax.enterprise.event.Observes; | ||
5 | + | ||
6 | +import br.gov.frameworkdemoiselle.management.internal.notification.event.NotificationEvent; | ||
7 | +import br.gov.frameworkdemoiselle.management.internal.notification.qualifier.AttributeChange; | ||
8 | +import br.gov.frameworkdemoiselle.management.internal.notification.qualifier.Generic; | ||
9 | +import br.gov.frameworkdemoiselle.management.notification.AttributeChangeNotification; | ||
10 | +import br.gov.frameworkdemoiselle.management.notification.NotificationManager; | ||
11 | + | ||
12 | +/** | ||
13 | + * Dummy class to test receiving of notifications sent by the {@link NotificationManager} | ||
14 | + * | ||
15 | + * @author serpro | ||
16 | + * | ||
17 | + */ | ||
18 | +@ApplicationScoped | ||
19 | +public class DummyNotificationListener { | ||
20 | + | ||
21 | + private String message = null; | ||
22 | + | ||
23 | + public void listenNotification(@Observes @Generic NotificationEvent event){ | ||
24 | + message = event.getNotification().getMessage().toString(); | ||
25 | + } | ||
26 | + | ||
27 | + public void listenAttributeChangeNotification(@Observes @AttributeChange NotificationEvent event){ | ||
28 | + AttributeChangeNotification notification = (AttributeChangeNotification)event.getNotification(); | ||
29 | + message = notification.getMessage().toString() + " - " + notification.getAttributeName(); | ||
30 | + } | ||
31 | + | ||
32 | + public String getMessage() { | ||
33 | + return message; | ||
34 | + } | ||
35 | +} |