Commit 88493d655a1c39a464ae2f88d926e57b8ef6e055

Authored by Luciano Borges
1 parent 0fab1f17
Exists in master

Ajuste na estrutura de pacotes

Showing 18 changed files with 940 additions and 942 deletions   Show diff stats
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/configuration/JMXConfig.java
... ... @@ -1,142 +0,0 @@
1   -/*
2   - * Demoiselle Framework
3   - * Copyright (C) 2010 SERPRO
4   - * ----------------------------------------------------------------------------
5   - * This file is part of Demoiselle Framework.
6   - *
7   - * Demoiselle Framework is free software; you can redistribute it and/or
8   - * modify it under the terms of the GNU Lesser General Public License version 3
9   - * as published by the Free Software Foundation.
10   - *
11   - * This program is distributed in the hope that it will be useful,
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   - * GNU General Public License for more details.
15   - *
16   - * You should have received a copy of the GNU Lesser General Public License version 3
17   - * along with this program; if not, see <http://www.gnu.org/licenses/>
18   - * or write to the Free Software Foundation, Inc., 51 Franklin Street,
19   - * Fifth Floor, Boston, MA 02110-1301, USA.
20   - * ----------------------------------------------------------------------------
21   - * Este arquivo é parte do Framework Demoiselle.
22   - *
23   - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
24   - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
25   - * do Software Livre (FSF).
26   - *
27   - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
28   - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
29   - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
30   - * para maiores detalhes.
31   - *
32   - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
33   - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
34   - * ou escreva para a Fundação do Software Livre (FSF) Inc.,
35   - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
36   - */
37   -package br.gov.frameworkdemoiselle.configuration;
38   -
39   -import javax.management.NotificationBroadcaster;
40   -
41   -import br.gov.frameworkdemoiselle.annotation.Name;
42   -import br.gov.frameworkdemoiselle.configuration.Configuration;
43   -import br.gov.frameworkdemoiselle.stereotype.ManagementController;
44   -
45   -/**
46   - *
47   - * Contains configuration parameters to control how {@link Managed} classes are exposed to the MBean server.
48   - *
49   - * To use this class, inject it into your code using the {@link Inject} annotation.
50   - *
51   - * ex:<pre><code>
52   - *
53   - * public class BusinessClass(){
54   - *
55   - * //...
56   - *
57   - * &at;Inject
58   - * private JMXConfig jmxConfiguration;
59   - *
60   - * //...
61   - *
62   - * }
63   - * </code></pre>
64   - *
65   - * @author serpro
66   - *
67   - */
68   -@Configuration(prefix = "frameworkdemoiselle.management.jmx.")
69   -public class JMXConfig {
70   -
71   - @Name("mbean.domain")
72   - private String mbeanDomain;
73   -
74   - @Name("notification.domain")
75   - private String notificationDomain = "br.gov.frameworkdemoiselle.jmx";
76   -
77   - @Name("notification.name")
78   - private String notificationMBeanName = "NotificationBroadcaster";
79   -
80   - /**
81   - * </p>The domain to register all {@link ManagementController} classes found during boot.</p>
82   - *
83   - * <p>The full name of a MBean has the format of <code>domain:name=MBeanName</code> (ex: <code>br.gov.frameworkdemoiselle.jmx:name=NotificationBroadcaster</code>), this
84   - * parameter is the "domain" portion of the full name.</p>
85   - *
86   - * <p>The default is <code>null</code> and when is set to <code>null</code>, all {@link Managed} classes will use it's own package as the domain.</p>
87   - *
88   - */
89   - public String getMbeanDomain() {
90   - return mbeanDomain;
91   - }
92   -
93   - /**
94   - * @see #getMbeanDomain()
95   - */
96   - public void setMbeanDomain(String mbeanDomain) {
97   - this.mbeanDomain = mbeanDomain;
98   - }
99   -
100   - /**
101   - * <p>The name the {@link NotificationBroadcaster} MBean will be registered to. The full name
102   - * of a MBean has the format of <code>domain:name=MBeanName</code> (ex: <code>br.gov.frameworkdemoiselle.jmx:name=NotificationBroadcaster</code>), this
103   - * parameter is the ":name=MBeanName" portion without the ":name=".</p>
104   - *
105   - * <p>The default is the value returned by {@link Class#getSimpleName()} when called from the {@link NotificationBroadcaster} class.</p>
106   - *
107   - * @see #getMbeanDomain()
108   - */
109   - public String getNotificationMBeanName() {
110   - return notificationMBeanName;
111   - }
112   -
113   - /**
114   - * @see #getNotificationMBeanName()
115   - */
116   - public void setNotificationMBeanName(String notificationMBeanName) {
117   - this.notificationMBeanName = notificationMBeanName;
118   - }
119   -
120   - /**
121   - * </p>The domain to register the {@link NotificationBroadcaster} MBean.</p>
122   - *
123   - * <p>The full name of a MBean has the format of <code>domain:name=MBeanName</code> (ex: <code>br.gov.frameworkdemoiselle.jmx:name=NotificationBroadcaster</code>), this
124   - * parameter is the "domain" portion of the full name.</p>
125   - *
126   - * <p>The default is <code>br.gov.frameworkdemoiselle.jmx</code>.</p>
127   - *
128   - */
129   - public String getNotificationDomain() {
130   - return notificationDomain;
131   - }
132   -
133   - /**
134   - * @see #getNotificationDomain()
135   - */
136   - public void setNotificationDomain(String notificationDomain) {
137   - this.notificationDomain = notificationDomain;
138   - }
139   -
140   -
141   -
142   -}
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/DynamicMBeanProxy.java
... ... @@ -1,300 +0,0 @@
1   -/*
2   - * Demoiselle Framework
3   - * Copyright (C) 2010 SERPRO
4   - * ----------------------------------------------------------------------------
5   - * This file is part of Demoiselle Framework.
6   - *
7   - * Demoiselle Framework is free software; you can redistribute it and/or
8   - * modify it under the terms of the GNU Lesser General Public License version 3
9   - * as published by the Free Software Foundation.
10   - *
11   - * This program is distributed in the hope that it will be useful,
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   - * GNU General Public License for more details.
15   - *
16   - * You should have received a copy of the GNU Lesser General Public License version 3
17   - * along with this program; if not, see <http://www.gnu.org/licenses/>
18   - * or write to the Free Software Foundation, Inc., 51 Franklin Street,
19   - * Fifth Floor, Boston, MA 02110-1301, USA.
20   - * ----------------------------------------------------------------------------
21   - * Este arquivo é parte do Framework Demoiselle.
22   - *
23   - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
24   - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
25   - * do Software Livre (FSF).
26   - *
27   - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
28   - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
29   - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
30   - * para maiores detalhes.
31   - *
32   - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
33   - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
34   - * ou escreva para a Fundação do Software Livre (FSF) Inc.,
35   - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
36   - */
37   -package br.gov.frameworkdemoiselle.internal;
38   -
39   -import java.util.ArrayList;
40   -import java.util.Locale;
41   -import java.util.Map.Entry;
42   -
43   -import javax.management.Attribute;
44   -import javax.management.AttributeList;
45   -import javax.management.AttributeNotFoundException;
46   -import javax.management.DynamicMBean;
47   -import javax.management.InvalidAttributeValueException;
48   -import javax.management.MBeanAttributeInfo;
49   -import javax.management.MBeanException;
50   -import javax.management.MBeanInfo;
51   -import javax.management.MBeanOperationInfo;
52   -import javax.management.MBeanParameterInfo;
53   -import javax.management.ReflectionException;
54   -
55   -import br.gov.frameworkdemoiselle.DemoiselleException;
56   -import br.gov.frameworkdemoiselle.internal.management.ManagedType;
57   -import br.gov.frameworkdemoiselle.internal.management.ManagedType.FieldDetail;
58   -import br.gov.frameworkdemoiselle.internal.management.ManagedType.MethodDetail;
59   -import br.gov.frameworkdemoiselle.internal.management.ManagedType.ParameterDetail;
60   -import br.gov.frameworkdemoiselle.internal.management.Management;
61   -import br.gov.frameworkdemoiselle.management.ManagedAttributeNotFoundException;
62   -import br.gov.frameworkdemoiselle.management.ManagedInvokationException;
63   -import br.gov.frameworkdemoiselle.stereotype.ManagementController;
64   -import br.gov.frameworkdemoiselle.util.Beans;
65   -import br.gov.frameworkdemoiselle.util.ResourceBundle;
66   -
67   -/**
68   - * <p>
69   - * This class is a MBean that gets registered everytime you mark a class with {@link ManagementController}. It dynamicaly reads the
70   - * fields and operations contained in a {@link ManagementController} class and exposes them to the MBean server. Everytime a client
71   - * tries to call an operation or read/write a property inside a ManagementController class, this class will call the appropriate
72   - * method and pass the result to the MBean client.
73   - * </p>
74   - *
75   - * @author SERPRO
76   - */
77   -public class DynamicMBeanProxy implements DynamicMBean {
78   -
79   - private MBeanInfo delegateInfo;
80   -
81   - private ManagedType managedType;
82   -
83   - private ResourceBundle bundle;
84   -
85   - public DynamicMBeanProxy(ManagedType type) {
86   - if (type == null) {
87   - throw new NullPointerException(getBundle().getString("mbean-null-type-defined"));
88   - }
89   - managedType = type;
90   - }
91   -
92   - @Override
93   - public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {
94   - // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.
95   - if (delegateInfo == null) {
96   - initializeMBeanInfo();
97   - }
98   -
99   - Management manager = Beans.getReference(Management.class);
100   -
101   - try{
102   - return manager.getProperty(managedType, attribute);
103   - }
104   - catch(DemoiselleException de){
105   - if (ManagedAttributeNotFoundException.class.isInstance(de)){
106   - throw new AttributeNotFoundException(de.getMessage());
107   - }
108   - else if (ManagedInvokationException.class.isInstance(de)){
109   - throw new MBeanException(new Exception(de.getMessage()));
110   - }
111   - else{
112   - throw de;
113   - }
114   - }
115   - }
116   -
117   - @Override
118   - public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException,
119   - MBeanException, ReflectionException {
120   -
121   - // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.
122   - if (delegateInfo == null) {
123   - initializeMBeanInfo();
124   - }
125   -
126   - Management manager = Beans.getReference(Management.class);
127   -
128   - try{
129   - manager.setProperty(managedType, attribute.getName(), attribute.getValue());
130   - }
131   - catch(DemoiselleException de){
132   - if (ManagedAttributeNotFoundException.class.isInstance(de)){
133   - throw new AttributeNotFoundException(de.getMessage());
134   - }
135   - else if (ManagedInvokationException.class.isInstance(de)){
136   - throw new MBeanException(new Exception(de.getMessage()));
137   - }
138   - else{
139   - throw de;
140   - }
141   - }
142   - }
143   -
144   - @Override
145   - public AttributeList getAttributes(String[] attributes) {
146   - if (attributes != null) {
147   - AttributeList list = new AttributeList();
148   - for (String attribute : attributes) {
149   - try {
150   - Object value = getAttribute(attribute);
151   - list.add(new Attribute(attribute, value));
152   - } catch (Throwable t) {
153   - }
154   - }
155   -
156   - return list;
157   - }
158   -
159   - return null;
160   - }
161   -
162   - @Override
163   - public AttributeList setAttributes(AttributeList attributes) {
164   - AttributeList settedAttributes = new AttributeList();
165   - if (attributes != null) {
166   - for (Attribute attribute : attributes.asList()) {
167   - try {
168   - setAttribute(attribute);
169   -
170   - // A razão para separarmos a criação do atributo de sua adição na lista é que
171   - // caso a obtenção do novo valor do atributo dispare uma exceção então o atributo não será
172   - // adicionado na lista de atributos que foram afetados.
173   - Attribute attributeWithNewValue = new Attribute(attribute.getName(),
174   - getAttribute(attribute.getName()));
175   - settedAttributes.add(attributeWithNewValue);
176   - } catch (Throwable t) {
177   - }
178   - }
179   - }
180   -
181   - return settedAttributes;
182   - }
183   -
184   - @Override
185   - public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException,
186   - ReflectionException {
187   -
188   - // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.
189   - if (this.delegateInfo == null) {
190   - initializeMBeanInfo();
191   - }
192   -
193   - Management manager = Beans.getReference(Management.class);
194   -
195   - try{
196   - return manager.invoke(managedType, actionName, params);
197   - }
198   - catch(DemoiselleException de){
199   - throw new MBeanException(new Exception(de.getMessage()));
200   - }
201   - }
202   -
203   - /**
204   - * Initialize the Managed information for this instance of Managed
205   - */
206   - private void initializeMBeanInfo() {
207   - // Aqui vamos armazenar nossos atributos
208   - ArrayList<MBeanAttributeInfo> attributes = new ArrayList<MBeanAttributeInfo>();
209   -
210   - // Aqui vamos armazenar nossas operações
211   - ArrayList<MBeanOperationInfo> operations = new ArrayList<MBeanOperationInfo>();
212   -
213   - // Para cada propriedade descoberta no ManagementController, cria um attributeInfo correspondente
214   - for (Entry<String, FieldDetail> fieldEntry : managedType.getFields().entrySet()) {
215   -
216   - try {
217   -
218   - MBeanAttributeInfo attributeInfo = new MBeanAttributeInfo(fieldEntry.getKey(), fieldEntry.getValue()
219   - .getDescription(), fieldEntry.getValue().getGetterMethod(), fieldEntry.getValue()
220   - .getSetterMethod());
221   - attributes.add(attributeInfo);
222   -
223   - } catch (javax.management.IntrospectionException e) {
224   - throw new DemoiselleException(getBundle().getString("mbean-introspection-error", managedType.getType()
225   - .getSimpleName()));
226   - }
227   - }
228   -
229   - // Para cada operação descoberta no ManagementController, cria um operationInfo correspondente
230   - for (Entry<String, MethodDetail> methodEntry : managedType.getOperationMethods().entrySet()) {
231   -
232   - MethodDetail methodDetail = methodEntry.getValue();
233   -
234   - ParameterDetail[] parameterTypes = methodDetail.getParameterTypers();
235   -
236   - MBeanParameterInfo[] parameters = parameterTypes.length > 0 ? new MBeanParameterInfo[parameterTypes.length]
237   - : null;
238   -
239   - if (parameters != null) {
240   -
241   - for (int i = 0; i < parameterTypes.length; i++) {
242   -
243   - parameters[i] = new MBeanParameterInfo(parameterTypes[i].getParameterName(), parameterTypes[i]
244   - .getParameterType().getCanonicalName(), parameterTypes[i].getParameterDescription());
245   - }
246   - }
247   -
248   - // Com todas as informações, criamos nossa instância de MBeanOperationInfo e
249   - // acrescentamos na lista de todas as operações.
250   - int operationType = 0;
251   - switch(methodDetail.getType()){
252   - case ACTION:
253   - operationType = MBeanOperationInfo.ACTION;
254   - break;
255   -
256   - case INFO:
257   - operationType = MBeanOperationInfo.INFO;
258   - break;
259   -
260   - case ACTION_INFO:
261   - operationType = MBeanOperationInfo.ACTION_INFO;
262   - break;
263   -
264   - default:
265   - operationType = MBeanOperationInfo.UNKNOWN;
266   - }
267   -
268   - MBeanOperationInfo operation = new MBeanOperationInfo(methodDetail.getMethod().getName(),
269   - methodDetail.getDescription(), parameters, methodDetail.getMethod().getReturnType().getName(),
270   - operationType);
271   -
272   - operations.add(operation);
273   -
274   - }
275   -
276   - // Por fim criamos nosso bean info.
277   - delegateInfo = new MBeanInfo(managedType.getType().getCanonicalName(), managedType.getDescription(),
278   - attributes.toArray(new MBeanAttributeInfo[0]), null, operations.toArray(new MBeanOperationInfo[0]),
279   - null);
280   -
281   - }
282   -
283   - @Override
284   - public MBeanInfo getMBeanInfo() {
285   - if (delegateInfo == null) {
286   - initializeMBeanInfo();
287   - }
288   -
289   - return delegateInfo;
290   - }
291   -
292   - public ResourceBundle getBundle(){
293   - if (bundle==null){
294   - bundle = new ResourceBundle("demoiselle-jmx-bundle", Locale.getDefault());
295   - }
296   -
297   - return bundle;
298   - }
299   -
300   -}
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/JMXManagementExtension.java
... ... @@ -1,104 +0,0 @@
1   -/*
2   - * Demoiselle Framework
3   - * Copyright (C) 2010 SERPRO
4   - * ----------------------------------------------------------------------------
5   - * This file is part of Demoiselle Framework.
6   - *
7   - * Demoiselle Framework is free software; you can redistribute it and/or
8   - * modify it under the terms of the GNU Lesser General Public License version 3
9   - * as published by the Free Software Foundation.
10   - *
11   - * This program is distributed in the hope that it will be useful,
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   - * GNU General Public License for more details.
15   - *
16   - * You should have received a copy of the GNU Lesser General Public License version 3
17   - * along with this program; if not, see <http://www.gnu.org/licenses/>
18   - * or write to the Free Software Foundation, Inc., 51 Franklin Street,
19   - * Fifth Floor, Boston, MA 02110-1301, USA.
20   - * ----------------------------------------------------------------------------
21   - * Este arquivo é parte do Framework Demoiselle.
22   - *
23   - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
24   - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
25   - * do Software Livre (FSF).
26   - *
27   - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
28   - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
29   - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
30   - * para maiores detalhes.
31   - *
32   - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
33   - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
34   - * ou escreva para a Fundação do Software Livre (FSF) Inc.,
35   - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
36   - */
37   -package br.gov.frameworkdemoiselle.internal;
38   -
39   -import java.util.List;
40   -
41   -import javax.management.ObjectInstance;
42   -
43   -import br.gov.frameworkdemoiselle.annotation.Name;
44   -import br.gov.frameworkdemoiselle.configuration.JMXConfig;
45   -import br.gov.frameworkdemoiselle.internal.management.ManagedType;
46   -import br.gov.frameworkdemoiselle.lifecycle.ManagementExtension;
47   -import br.gov.frameworkdemoiselle.util.Beans;
48   -
49   -public class JMXManagementExtension implements ManagementExtension {
50   -
51   - public void registerNotificationMBean(){
52   - MBeanManager mbeanManager = Beans.getReference(MBeanManager.class);
53   - JMXConfig configuration = Beans.getReference(JMXConfig.class);
54   -
55   - StringBuffer notificationMBeanName = new StringBuffer()
56   - .append( configuration.getNotificationDomain()!=null ? configuration.getNotificationDomain() : "br.gov.frameworkdemoiselle.jmx" )
57   - .append(":name=")
58   - .append(configuration.getNotificationMBeanName());
59   -
60   - if (mbeanManager.findMBeanInstance(notificationMBeanName.toString()) == null){
61   - NotificationEventListener listener = Beans.getReference(NotificationEventListener.class);
62   -
63   - ObjectInstance instance = MBeanHelper.register(listener.createNotificationBroadcaster(), notificationMBeanName.toString());
64   - mbeanManager.storeRegisteredMBean(instance);
65   - }
66   - }
67   -
68   - @Override
69   - public void initialize(List<ManagedType> managedTypes) {
70   - MBeanManager manager = Beans.getReference(MBeanManager.class);
71   - JMXConfig configuration = Beans.getReference(JMXConfig.class);
72   -
73   - for (ManagedType type : managedTypes) {
74   - DynamicMBeanProxy beanProxy = new DynamicMBeanProxy(type);
75   -
76   - Name nameAnnotation = type.getType().getAnnotation(Name.class);
77   - String mbeanName = nameAnnotation != null ? nameAnnotation.value() : type.getType().getSimpleName();
78   -
79   - StringBuffer name = new StringBuffer()
80   - .append( configuration.getMbeanDomain()!=null ? configuration.getMbeanDomain() : type.getType().getPackage().getName() )
81   - .append(":name=")
82   - .append( mbeanName );
83   -
84   -
85   - if (manager.findMBeanInstance(name.toString()) == null){
86   - ObjectInstance instance = MBeanHelper.register(beanProxy, name.toString());
87   - manager.storeRegisteredMBean(instance);
88   - }
89   - }
90   -
91   - registerNotificationMBean();
92   - }
93   -
94   - @Override
95   - public void shutdown(List<ManagedType> managedTypes) {
96   - MBeanManager manager = Beans.getReference(MBeanManager.class);
97   - for (ObjectInstance instance : manager.listRegisteredMBeans()){
98   - MBeanHelper.unregister(instance.getObjectName());
99   - }
100   -
101   - manager.cleanRegisteredMBeans();
102   - }
103   -
104   -}
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/MBeanHelper.java
... ... @@ -1,116 +0,0 @@
1   -/*
2   - * Demoiselle Framework
3   - * Copyright (C) 2010 SERPRO
4   - * ----------------------------------------------------------------------------
5   - * This file is part of Demoiselle Framework.
6   - *
7   - * Demoiselle Framework is free software; you can redistribute it and/or
8   - * modify it under the terms of the GNU Lesser General Public License version 3
9   - * as published by the Free Software Foundation.
10   - *
11   - * This program is distributed in the hope that it will be useful,
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   - * GNU General Public License for more details.
15   - *
16   - * You should have received a copy of the GNU Lesser General Public License version 3
17   - * along with this program; if not, see <http://www.gnu.org/licenses/>
18   - * or write to the Free Software Foundation, Inc., 51 Franklin Street,
19   - * Fifth Floor, Boston, MA 02110-1301, USA.
20   - * ----------------------------------------------------------------------------
21   - * Este arquivo é parte do Framework Demoiselle.
22   - *
23   - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
24   - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
25   - * do Software Livre (FSF).
26   - *
27   - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
28   - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
29   - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
30   - * para maiores detalhes.
31   - *
32   - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
33   - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
34   - * ou escreva para a Fundação do Software Livre (FSF) Inc.,
35   - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
36   - */
37   -package br.gov.frameworkdemoiselle.internal;
38   -
39   -import java.lang.management.ManagementFactory;
40   -import java.util.Locale;
41   -
42   -import javax.management.MBeanServer;
43   -import javax.management.ObjectInstance;
44   -import javax.management.ObjectName;
45   -
46   -import org.slf4j.Logger;
47   -
48   -import br.gov.frameworkdemoiselle.DemoiselleException;
49   -import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer;
50   -import br.gov.frameworkdemoiselle.util.ResourceBundle;
51   -
52   -/**
53   - * Class with common tools for registering MBeans into an Managed server
54   - *
55   - * @author SERPRO
56   - */
57   -public class MBeanHelper {
58   -
59   - private static final Logger logger = LoggerProducer.create(MBeanHelper.class);
60   -
61   - private static ResourceBundle bundle = new ResourceBundle("demoiselle-jmx-bundle", Locale.getDefault());
62   -
63   - private static final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
64   -
65   - /**
66   - * Return the MBean Server instance.
67   - *
68   - * @return MBeanServer
69   - */
70   - public static final MBeanServer getMBeanServer() {
71   - return server;
72   - }
73   -
74   - /**
75   - * Register a given managed bean (MBean) with the specified name.
76   - *
77   - * @param mbean
78   - * the managed bean to register
79   - * @param name
80   - * the name under which to register the bean
81   - * @return the object name of the mbean, for later deregistration
82   - */
83   - public static ObjectInstance register(final Object mbean, final String name) {
84   -
85   - logger.info(bundle.getString("mbean-registration",name));
86   -
87   - ObjectInstance instance = null;
88   - try {
89   - ObjectName objectName = new ObjectName(name);
90   - instance = server.registerMBean(mbean, objectName);
91   - } catch (Exception e) {
92   - logger.error(bundle.getString("mbean-registration-error",name),e);
93   - throw new DemoiselleException(bundle.getString("mbean-registration-error",name), e);
94   - }
95   -
96   - return instance;
97   - }
98   -
99   - /**
100   - * Remove the registration of a mbean.
101   - *
102   - * @param objectName
103   - * the name of the bean to unregister
104   - */
105   - public static void unregister(final ObjectName objectName) {
106   -
107   - logger.info(bundle.getString("mbean-deregistration",objectName.getCanonicalName()));
108   -
109   - try {
110   - server.unregisterMBean(objectName);
111   - } catch (Exception e) {
112   - logger.error(bundle.getString("mbean-deregistration",objectName.getCanonicalName()),e);
113   - throw new DemoiselleException(bundle.getString("mbean-deregistration",objectName.getCanonicalName()), e);
114   - }
115   - }
116   -}
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/MBeanManager.java
... ... @@ -1,67 +0,0 @@
1   -/*
2   - * Demoiselle Framework
3   - * Copyright (C) 2010 SERPRO
4   - * ----------------------------------------------------------------------------
5   - * This file is part of Demoiselle Framework.
6   - *
7   - * Demoiselle Framework is free software; you can redistribute it and/or
8   - * modify it under the terms of the GNU Lesser General Public License version 3
9   - * as published by the Free Software Foundation.
10   - *
11   - * This program is distributed in the hope that it will be useful,
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   - * GNU General Public License for more details.
15   - *
16   - * You should have received a copy of the GNU Lesser General Public License version 3
17   - * along with this program; if not, see <http://www.gnu.org/licenses/>
18   - * or write to the Free Software Foundation, Inc., 51 Franklin Street,
19   - * Fifth Floor, Boston, MA 02110-1301, USA.
20   - * ----------------------------------------------------------------------------
21   - * Este arquivo é parte do Framework Demoiselle.
22   - *
23   - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
24   - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
25   - * do Software Livre (FSF).
26   - *
27   - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
28   - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
29   - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
30   - * para maiores detalhes.
31   - *
32   - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
33   - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
34   - * ou escreva para a Fundação do Software Livre (FSF) Inc.,
35   - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
36   - */
37   -package br.gov.frameworkdemoiselle.internal;
38   -
39   -import java.util.Collection;
40   -import java.util.HashMap;
41   -
42   -import javax.enterprise.context.ApplicationScoped;
43   -import javax.management.ObjectInstance;
44   -
45   -@ApplicationScoped
46   -public class MBeanManager {
47   -
48   - private HashMap<String,ObjectInstance> registeredMBeans = new HashMap<String,ObjectInstance>();
49   -
50   - public void storeRegisteredMBean(ObjectInstance instance){
51   - registeredMBeans.put(instance.getObjectName().getCanonicalName(),instance);
52   - }
53   -
54   - public Collection<ObjectInstance> listRegisteredMBeans(){
55   - return registeredMBeans.values();
56   - }
57   -
58   - public ObjectInstance findMBeanInstance(String name){
59   - ObjectInstance instance = registeredMBeans.get(name);
60   - return instance;
61   - }
62   -
63   - public void cleanRegisteredMBeans(){
64   - registeredMBeans.clear();
65   - }
66   -
67   -}
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/NotificationBroadcaster.java
... ... @@ -1,82 +0,0 @@
1   -/*
2   - * Demoiselle Framework
3   - * Copyright (C) 2010 SERPRO
4   - * ----------------------------------------------------------------------------
5   - * This file is part of Demoiselle Framework.
6   - *
7   - * Demoiselle Framework is free software; you can redistribute it and/or
8   - * modify it under the terms of the GNU Lesser General Public License version 3
9   - * as published by the Free Software Foundation.
10   - *
11   - * This program is distributed in the hope that it will be useful,
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   - * GNU General Public License for more details.
15   - *
16   - * You should have received a copy of the GNU Lesser General Public License version 3
17   - * along with this program; if not, see <http://www.gnu.org/licenses/>
18   - * or write to the Free Software Foundation, Inc., 51 Franklin Street,
19   - * Fifth Floor, Boston, MA 02110-1301, USA.
20   - * ----------------------------------------------------------------------------
21   - * Este arquivo é parte do Framework Demoiselle.
22   - *
23   - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
24   - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
25   - * do Software Livre (FSF).
26   - *
27   - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
28   - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
29   - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
30   - * para maiores detalhes.
31   - *
32   - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
33   - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
34   - * ou escreva para a Fundação do Software Livre (FSF) Inc.,
35   - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
36   - */
37   -package br.gov.frameworkdemoiselle.internal;
38   -
39   -import java.io.Serializable;
40   -
41   -import javax.management.AttributeChangeNotification;
42   -import javax.management.Notification;
43   -import javax.management.NotificationBroadcasterSupport;
44   -
45   -import br.gov.frameworkdemoiselle.configuration.JMXConfig;
46   -import br.gov.frameworkdemoiselle.management.ManagementNotificationEvent;
47   -import br.gov.frameworkdemoiselle.management.NotificationManager;
48   -
49   -/**
50   - * Implementation of the {@link NotificationBroadcaster} MBean.
51   - * When the {@link NotificationManager} sends an event, a {@link NotificationEventListener} captures the notification and uses
52   - * this MBean to send it as a JMX notification.
53   - *
54   - * @author serpro
55   - *
56   - */
57   -public final class NotificationBroadcaster extends NotificationBroadcasterSupport implements NotificationBroadcasterMBean,Serializable {
58   -
59   - private static final long serialVersionUID = 1L;
60   -
61   - private int sequenceNumber = 1;
62   -
63   - private static final String NOTIFICATION_TYPE_GENERIC = "jmx.message";
64   -
65   - protected void sendNotification( ManagementNotificationEvent event , JMXConfig config ) {
66   - br.gov.frameworkdemoiselle.management.GenericNotification demoiselleNotification = event.getNotification();
67   - Notification n = new Notification(NOTIFICATION_TYPE_GENERIC, config.getNotificationMBeanName(), sequenceNumber++, System.currentTimeMillis(), demoiselleNotification.getMessage().toString());
68   - sendNotification(n);
69   - }
70   -
71   - protected void sendAttributeChangedMessage( ManagementNotificationEvent event , JMXConfig config ) {
72   - br.gov.frameworkdemoiselle.management.AttributeChangeNotification demoiselleNotification = (br.gov.frameworkdemoiselle.management.AttributeChangeNotification)event.getNotification();
73   -
74   - AttributeChangeNotification n = new AttributeChangeNotification(config.getNotificationMBeanName(), sequenceNumber++
75   - , System.currentTimeMillis(), demoiselleNotification.getMessage().toString()
76   - , demoiselleNotification.getAttributeName(), demoiselleNotification.getAttributeType().getSimpleName()
77   - , demoiselleNotification.getOldValue(), demoiselleNotification.getNewValue());
78   -
79   - sendNotification(n);
80   - }
81   -
82   -}
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/NotificationBroadcasterMBean.java
... ... @@ -1,48 +0,0 @@
1   -/*
2   - * Demoiselle Framework
3   - * Copyright (C) 2010 SERPRO
4   - * ----------------------------------------------------------------------------
5   - * This file is part of Demoiselle Framework.
6   - *
7   - * Demoiselle Framework is free software; you can redistribute it and/or
8   - * modify it under the terms of the GNU Lesser General Public License version 3
9   - * as published by the Free Software Foundation.
10   - *
11   - * This program is distributed in the hope that it will be useful,
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   - * GNU General Public License for more details.
15   - *
16   - * You should have received a copy of the GNU Lesser General Public License version 3
17   - * along with this program; if not, see <http://www.gnu.org/licenses/>
18   - * or write to the Free Software Foundation, Inc., 51 Franklin Street,
19   - * Fifth Floor, Boston, MA 02110-1301, USA.
20   - * ----------------------------------------------------------------------------
21   - * Este arquivo é parte do Framework Demoiselle.
22   - *
23   - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
24   - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
25   - * do Software Livre (FSF).
26   - *
27   - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
28   - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
29   - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
30   - * para maiores detalhes.
31   - *
32   - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
33   - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
34   - * ou escreva para a Fundação do Software Livre (FSF) Inc.,
35   - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
36   - */
37   -package br.gov.frameworkdemoiselle.internal;
38   -
39   -
40   -
41   -/**
42   - * MBean interface responsible for sending MBean notifications to remote clients.
43   - *
44   - * @author serpro
45   - *
46   - */
47   -public interface NotificationBroadcasterMBean {
48   -}
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/NotificationEventListener.java
... ... @@ -1,80 +0,0 @@
1   -/*
2   - * Demoiselle Framework
3   - * Copyright (C) 2010 SERPRO
4   - * ----------------------------------------------------------------------------
5   - * This file is part of Demoiselle Framework.
6   - *
7   - * Demoiselle Framework is free software; you can redistribute it and/or
8   - * modify it under the terms of the GNU Lesser General Public License version 3
9   - * as published by the Free Software Foundation.
10   - *
11   - * This program is distributed in the hope that it will be useful,
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   - * GNU General Public License for more details.
15   - *
16   - * You should have received a copy of the GNU Lesser General Public License version 3
17   - * along with this program; if not, see <http://www.gnu.org/licenses/>
18   - * or write to the Free Software Foundation, Inc., 51 Franklin Street,
19   - * Fifth Floor, Boston, MA 02110-1301, USA.
20   - * ----------------------------------------------------------------------------
21   - * Este arquivo é parte do Framework Demoiselle.
22   - *
23   - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
24   - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
25   - * do Software Livre (FSF).
26   - *
27   - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
28   - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
29   - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
30   - * para maiores detalhes.
31   - *
32   - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
33   - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
34   - * ou escreva para a Fundação do Software Livre (FSF) Inc.,
35   - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
36   - */
37   -package br.gov.frameworkdemoiselle.internal;
38   -
39   -import java.io.Serializable;
40   -
41   -import javax.enterprise.context.ApplicationScoped;
42   -import javax.enterprise.event.Observes;
43   -
44   -import br.gov.frameworkdemoiselle.configuration.JMXConfig;
45   -import br.gov.frameworkdemoiselle.internal.management.qualifier.AttributeChange;
46   -import br.gov.frameworkdemoiselle.internal.management.qualifier.Generic;
47   -import br.gov.frameworkdemoiselle.management.ManagementNotificationEvent;
48   -import br.gov.frameworkdemoiselle.management.NotificationManager;
49   -
50   -/**
51   - * Listens to {@link NotificationManager} notification events and proxies them
52   - * to a {@link NotificationBroadcaster} MBean. This MBean will send the notification to
53   - * any JMX clients connected and listening.
54   - *
55   - * @author serpro
56   - *
57   - */
58   -@ApplicationScoped
59   -@SuppressWarnings("serial")
60   -public class NotificationEventListener implements Serializable {
61   -
62   - private NotificationBroadcaster notificationBroadcaster;
63   -
64   - public void sendNotification( @Observes @Generic ManagementNotificationEvent event , JMXConfig config ) {
65   - createNotificationBroadcaster().sendNotification(event,config);
66   - }
67   -
68   - public void sendAttributeChangedMessage( @Observes @AttributeChange ManagementNotificationEvent event , JMXConfig config ) {
69   - createNotificationBroadcaster().sendAttributeChangedMessage(event, config);
70   - }
71   -
72   - public NotificationBroadcaster createNotificationBroadcaster(){
73   - if (notificationBroadcaster==null){
74   - notificationBroadcaster = new NotificationBroadcaster();
75   - }
76   -
77   - return notificationBroadcaster;
78   - }
79   -
80   -}
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/JMXConfig.java 0 → 100644
... ... @@ -0,0 +1,142 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.configuration;
  38 +
  39 +import javax.management.NotificationBroadcaster;
  40 +
  41 +import br.gov.frameworkdemoiselle.annotation.Name;
  42 +import br.gov.frameworkdemoiselle.configuration.Configuration;
  43 +import br.gov.frameworkdemoiselle.stereotype.ManagementController;
  44 +
  45 +/**
  46 + *
  47 + * Contains configuration parameters to control how {@link Managed} classes are exposed to the MBean server.
  48 + *
  49 + * To use this class, inject it into your code using the {@link Inject} annotation.
  50 + *
  51 + * ex:<pre><code>
  52 + *
  53 + * public class BusinessClass(){
  54 + *
  55 + * //...
  56 + *
  57 + * &at;Inject
  58 + * private JMXConfig jmxConfiguration;
  59 + *
  60 + * //...
  61 + *
  62 + * }
  63 + * </code></pre>
  64 + *
  65 + * @author serpro
  66 + *
  67 + */
  68 +@Configuration(prefix = "frameworkdemoiselle.management.jmx")
  69 +public class JMXConfig {
  70 +
  71 + @Name("mbean.domain")
  72 + private String mbeanDomain;
  73 +
  74 + @Name("notification.domain")
  75 + private String notificationDomain = "br.gov.frameworkdemoiselle.jmx";
  76 +
  77 + @Name("notification.name")
  78 + private String notificationMBeanName = "NotificationBroadcaster";
  79 +
  80 + /**
  81 + * </p>The domain to register all {@link ManagementController} classes found during boot.</p>
  82 + *
  83 + * <p>The full name of a MBean has the format of <code>domain:name=MBeanName</code> (ex: <code>br.gov.frameworkdemoiselle.jmx:name=NotificationBroadcaster</code>), this
  84 + * parameter is the "domain" portion of the full name.</p>
  85 + *
  86 + * <p>The default is <code>null</code> and when is set to <code>null</code>, all {@link Managed} classes will use it's own package as the domain.</p>
  87 + *
  88 + */
  89 + public String getMbeanDomain() {
  90 + return mbeanDomain;
  91 + }
  92 +
  93 + /**
  94 + * @see #getMbeanDomain()
  95 + */
  96 + public void setMbeanDomain(String mbeanDomain) {
  97 + this.mbeanDomain = mbeanDomain;
  98 + }
  99 +
  100 + /**
  101 + * <p>The name the {@link NotificationBroadcaster} MBean will be registered to. The full name
  102 + * of a MBean has the format of <code>domain:name=MBeanName</code> (ex: <code>br.gov.frameworkdemoiselle.jmx:name=NotificationBroadcaster</code>), this
  103 + * parameter is the ":name=MBeanName" portion without the ":name=".</p>
  104 + *
  105 + * <p>The default is the value returned by {@link Class#getSimpleName()} when called from the {@link NotificationBroadcaster} class.</p>
  106 + *
  107 + * @see #getMbeanDomain()
  108 + */
  109 + public String getNotificationMBeanName() {
  110 + return notificationMBeanName;
  111 + }
  112 +
  113 + /**
  114 + * @see #getNotificationMBeanName()
  115 + */
  116 + public void setNotificationMBeanName(String notificationMBeanName) {
  117 + this.notificationMBeanName = notificationMBeanName;
  118 + }
  119 +
  120 + /**
  121 + * </p>The domain to register the {@link NotificationBroadcaster} MBean.</p>
  122 + *
  123 + * <p>The full name of a MBean has the format of <code>domain:name=MBeanName</code> (ex: <code>br.gov.frameworkdemoiselle.jmx:name=NotificationBroadcaster</code>), this
  124 + * parameter is the "domain" portion of the full name.</p>
  125 + *
  126 + * <p>The default is <code>br.gov.frameworkdemoiselle.jmx</code>.</p>
  127 + *
  128 + */
  129 + public String getNotificationDomain() {
  130 + return notificationDomain;
  131 + }
  132 +
  133 + /**
  134 + * @see #getNotificationDomain()
  135 + */
  136 + public void setNotificationDomain(String notificationDomain) {
  137 + this.notificationDomain = notificationDomain;
  138 + }
  139 +
  140 +
  141 +
  142 +}
... ...
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/JMXManagementExtension.java 0 → 100644
... ... @@ -0,0 +1,104 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.implementation;
  38 +
  39 +import java.util.List;
  40 +
  41 +import javax.management.ObjectInstance;
  42 +
  43 +import br.gov.frameworkdemoiselle.annotation.Name;
  44 +import br.gov.frameworkdemoiselle.internal.configuration.JMXConfig;
  45 +import br.gov.frameworkdemoiselle.internal.proxy.DynamicMBeanProxy;
  46 +import br.gov.frameworkdemoiselle.management.ManagementExtension;
  47 +import br.gov.frameworkdemoiselle.util.Beans;
  48 +
  49 +public class JMXManagementExtension implements ManagementExtension {
  50 +
  51 + public void registerNotificationMBean(){
  52 + MBeanManager mbeanManager = Beans.getReference(MBeanManager.class);
  53 + JMXConfig configuration = Beans.getReference(JMXConfig.class);
  54 +
  55 + StringBuffer notificationMBeanName = new StringBuffer()
  56 + .append( configuration.getNotificationDomain()!=null ? configuration.getNotificationDomain() : "br.gov.frameworkdemoiselle.jmx" )
  57 + .append(":name=")
  58 + .append(configuration.getNotificationMBeanName());
  59 +
  60 + if (mbeanManager.findMBeanInstance(notificationMBeanName.toString()) == null){
  61 + NotificationEventListener listener = Beans.getReference(NotificationEventListener.class);
  62 +
  63 + ObjectInstance instance = MBeanHelper.register(listener.createNotificationBroadcaster(), notificationMBeanName.toString());
  64 + mbeanManager.storeRegisteredMBean(instance);
  65 + }
  66 + }
  67 +
  68 + @Override
  69 + public void initialize(List<ManagedType> managedTypes) {
  70 + MBeanManager manager = Beans.getReference(MBeanManager.class);
  71 + JMXConfig configuration = Beans.getReference(JMXConfig.class);
  72 +
  73 + for (ManagedType type : managedTypes) {
  74 + DynamicMBeanProxy beanProxy = new DynamicMBeanProxy(type);
  75 +
  76 + Name nameAnnotation = type.getType().getAnnotation(Name.class);
  77 + String mbeanName = nameAnnotation != null ? nameAnnotation.value() : type.getType().getSimpleName();
  78 +
  79 + StringBuffer name = new StringBuffer()
  80 + .append( configuration.getMbeanDomain()!=null ? configuration.getMbeanDomain() : type.getType().getPackage().getName() )
  81 + .append(":name=")
  82 + .append( mbeanName );
  83 +
  84 +
  85 + if (manager.findMBeanInstance(name.toString()) == null){
  86 + ObjectInstance instance = MBeanHelper.register(beanProxy, name.toString());
  87 + manager.storeRegisteredMBean(instance);
  88 + }
  89 + }
  90 +
  91 + registerNotificationMBean();
  92 + }
  93 +
  94 + @Override
  95 + public void shutdown(List<ManagedType> managedTypes) {
  96 + MBeanManager manager = Beans.getReference(MBeanManager.class);
  97 + for (ObjectInstance instance : manager.listRegisteredMBeans()){
  98 + MBeanHelper.unregister(instance.getObjectName());
  99 + }
  100 +
  101 + manager.cleanRegisteredMBeans();
  102 + }
  103 +
  104 +}
... ...
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/MBeanHelper.java 0 → 100644
... ... @@ -0,0 +1,116 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.implementation;
  38 +
  39 +import java.lang.management.ManagementFactory;
  40 +import java.util.Locale;
  41 +
  42 +import javax.management.MBeanServer;
  43 +import javax.management.ObjectInstance;
  44 +import javax.management.ObjectName;
  45 +
  46 +import org.slf4j.Logger;
  47 +
  48 +import br.gov.frameworkdemoiselle.DemoiselleException;
  49 +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer;
  50 +import br.gov.frameworkdemoiselle.util.ResourceBundle;
  51 +
  52 +/**
  53 + * Class with common tools for registering MBeans into an Managed server
  54 + *
  55 + * @author SERPRO
  56 + */
  57 +public class MBeanHelper {
  58 +
  59 + private static final Logger logger = LoggerProducer.create(MBeanHelper.class);
  60 +
  61 + private static ResourceBundle bundle = new ResourceBundle("demoiselle-jmx-bundle", Locale.getDefault());
  62 +
  63 + private static final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
  64 +
  65 + /**
  66 + * Return the MBean Server instance.
  67 + *
  68 + * @return MBeanServer
  69 + */
  70 + public static final MBeanServer getMBeanServer() {
  71 + return server;
  72 + }
  73 +
  74 + /**
  75 + * Register a given managed bean (MBean) with the specified name.
  76 + *
  77 + * @param mbean
  78 + * the managed bean to register
  79 + * @param name
  80 + * the name under which to register the bean
  81 + * @return the object name of the mbean, for later deregistration
  82 + */
  83 + public static ObjectInstance register(final Object mbean, final String name) {
  84 +
  85 + logger.info(bundle.getString("mbean-registration",name));
  86 +
  87 + ObjectInstance instance = null;
  88 + try {
  89 + ObjectName objectName = new ObjectName(name);
  90 + instance = server.registerMBean(mbean, objectName);
  91 + } catch (Exception e) {
  92 + logger.error(bundle.getString("mbean-registration-error",name),e);
  93 + throw new DemoiselleException(bundle.getString("mbean-registration-error",name), e);
  94 + }
  95 +
  96 + return instance;
  97 + }
  98 +
  99 + /**
  100 + * Remove the registration of a mbean.
  101 + *
  102 + * @param objectName
  103 + * the name of the bean to unregister
  104 + */
  105 + public static void unregister(final ObjectName objectName) {
  106 +
  107 + logger.info(bundle.getString("mbean-deregistration",objectName.getCanonicalName()));
  108 +
  109 + try {
  110 + server.unregisterMBean(objectName);
  111 + } catch (Exception e) {
  112 + logger.error(bundle.getString("mbean-deregistration",objectName.getCanonicalName()),e);
  113 + throw new DemoiselleException(bundle.getString("mbean-deregistration",objectName.getCanonicalName()), e);
  114 + }
  115 + }
  116 +}
... ...
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/MBeanManager.java 0 → 100644
... ... @@ -0,0 +1,67 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.implementation;
  38 +
  39 +import java.util.Collection;
  40 +import java.util.HashMap;
  41 +
  42 +import javax.enterprise.context.ApplicationScoped;
  43 +import javax.management.ObjectInstance;
  44 +
  45 +@ApplicationScoped
  46 +public class MBeanManager {
  47 +
  48 + private HashMap<String,ObjectInstance> registeredMBeans = new HashMap<String,ObjectInstance>();
  49 +
  50 + public void storeRegisteredMBean(ObjectInstance instance){
  51 + registeredMBeans.put(instance.getObjectName().getCanonicalName(),instance);
  52 + }
  53 +
  54 + public Collection<ObjectInstance> listRegisteredMBeans(){
  55 + return registeredMBeans.values();
  56 + }
  57 +
  58 + public ObjectInstance findMBeanInstance(String name){
  59 + ObjectInstance instance = registeredMBeans.get(name);
  60 + return instance;
  61 + }
  62 +
  63 + public void cleanRegisteredMBeans(){
  64 + registeredMBeans.clear();
  65 + }
  66 +
  67 +}
... ...
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/NotificationBroadcaster.java 0 → 100644
... ... @@ -0,0 +1,82 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.implementation;
  38 +
  39 +import java.io.Serializable;
  40 +
  41 +import javax.management.AttributeChangeNotification;
  42 +import javax.management.Notification;
  43 +import javax.management.NotificationBroadcasterSupport;
  44 +
  45 +import br.gov.frameworkdemoiselle.internal.configuration.JMXConfig;
  46 +import br.gov.frameworkdemoiselle.management.ManagementNotificationEvent;
  47 +import br.gov.frameworkdemoiselle.management.NotificationManager;
  48 +
  49 +/**
  50 + * Implementation of the {@link NotificationBroadcaster} MBean.
  51 + * When the {@link NotificationManager} sends an event, a {@link NotificationEventListener} captures the notification and uses
  52 + * this MBean to send it as a JMX notification.
  53 + *
  54 + * @author serpro
  55 + *
  56 + */
  57 +public final class NotificationBroadcaster extends NotificationBroadcasterSupport implements NotificationBroadcasterMBean,Serializable {
  58 +
  59 + private static final long serialVersionUID = 1L;
  60 +
  61 + private int sequenceNumber = 1;
  62 +
  63 + private static final String NOTIFICATION_TYPE_GENERIC = "jmx.message";
  64 +
  65 + protected void sendNotification( ManagementNotificationEvent event , JMXConfig config ) {
  66 + br.gov.frameworkdemoiselle.management.GenericNotification demoiselleNotification = event.getNotification();
  67 + Notification n = new Notification(NOTIFICATION_TYPE_GENERIC, config.getNotificationMBeanName(), sequenceNumber++, System.currentTimeMillis(), demoiselleNotification.getMessage().toString());
  68 + sendNotification(n);
  69 + }
  70 +
  71 + protected void sendAttributeChangedMessage( ManagementNotificationEvent event , JMXConfig config ) {
  72 + br.gov.frameworkdemoiselle.management.AttributeChangeNotification demoiselleNotification = (br.gov.frameworkdemoiselle.management.AttributeChangeNotification)event.getNotification();
  73 +
  74 + AttributeChangeNotification n = new AttributeChangeNotification(config.getNotificationMBeanName(), sequenceNumber++
  75 + , System.currentTimeMillis(), demoiselleNotification.getMessage().toString()
  76 + , demoiselleNotification.getAttributeName(), demoiselleNotification.getAttributeType().getSimpleName()
  77 + , demoiselleNotification.getOldValue(), demoiselleNotification.getNewValue());
  78 +
  79 + sendNotification(n);
  80 + }
  81 +
  82 +}
... ...
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/NotificationBroadcasterMBean.java 0 → 100644
... ... @@ -0,0 +1,48 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.implementation;
  38 +
  39 +
  40 +
  41 +/**
  42 + * MBean interface responsible for sending MBean notifications to remote clients.
  43 + *
  44 + * @author serpro
  45 + *
  46 + */
  47 +public interface NotificationBroadcasterMBean {
  48 +}
... ...
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/NotificationEventListener.java 0 → 100644
... ... @@ -0,0 +1,78 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.implementation;
  38 +
  39 +import java.io.Serializable;
  40 +
  41 +import javax.enterprise.context.ApplicationScoped;
  42 +import javax.enterprise.event.Observes;
  43 +
  44 +import br.gov.frameworkdemoiselle.internal.configuration.JMXConfig;
  45 +import br.gov.frameworkdemoiselle.management.ManagementNotificationEvent;
  46 +import br.gov.frameworkdemoiselle.management.NotificationManager;
  47 +
  48 +/**
  49 + * Listens to {@link NotificationManager} notification events and proxies them
  50 + * to a {@link NotificationBroadcaster} MBean. This MBean will send the notification to
  51 + * any JMX clients connected and listening.
  52 + *
  53 + * @author serpro
  54 + *
  55 + */
  56 +@ApplicationScoped
  57 +@SuppressWarnings("serial")
  58 +public class NotificationEventListener implements Serializable {
  59 +
  60 + private NotificationBroadcaster notificationBroadcaster;
  61 +
  62 + public void sendNotification( @Observes @Generic ManagementNotificationEvent event , JMXConfig config ) {
  63 + createNotificationBroadcaster().sendNotification(event,config);
  64 + }
  65 +
  66 + public void sendAttributeChangedMessage( @Observes @AttributeChange ManagementNotificationEvent event , JMXConfig config ) {
  67 + createNotificationBroadcaster().sendAttributeChangedMessage(event, config);
  68 + }
  69 +
  70 + public NotificationBroadcaster createNotificationBroadcaster(){
  71 + if (notificationBroadcaster==null){
  72 + notificationBroadcaster = new NotificationBroadcaster();
  73 + }
  74 +
  75 + return notificationBroadcaster;
  76 + }
  77 +
  78 +}
... ...
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/DynamicMBeanProxy.java 0 → 100644
... ... @@ -0,0 +1,300 @@
  1 +/*
  2 + * Demoiselle Framework
  3 + * Copyright (C) 2010 SERPRO
  4 + * ----------------------------------------------------------------------------
  5 + * This file is part of Demoiselle Framework.
  6 + *
  7 + * Demoiselle Framework is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU Lesser General Public License version 3
  9 + * as published by the Free Software Foundation.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public License version 3
  17 + * along with this program; if not, see <http://www.gnu.org/licenses/>
  18 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
  19 + * Fifth Floor, Boston, MA 02110-1301, USA.
  20 + * ----------------------------------------------------------------------------
  21 + * Este arquivo é parte do Framework Demoiselle.
  22 + *
  23 + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  24 + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  25 + * do Software Livre (FSF).
  26 + *
  27 + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  28 + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  29 + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  30 + * para maiores detalhes.
  31 + *
  32 + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  33 + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  34 + * ou escreva para a Fundação do Software Livre (FSF) Inc.,
  35 + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  36 + */
  37 +package br.gov.frameworkdemoiselle.internal.proxy;
  38 +
  39 +import java.util.ArrayList;
  40 +import java.util.Locale;
  41 +import java.util.Map.Entry;
  42 +
  43 +import javax.management.Attribute;
  44 +import javax.management.AttributeList;
  45 +import javax.management.AttributeNotFoundException;
  46 +import javax.management.DynamicMBean;
  47 +import javax.management.InvalidAttributeValueException;
  48 +import javax.management.MBeanAttributeInfo;
  49 +import javax.management.MBeanException;
  50 +import javax.management.MBeanInfo;
  51 +import javax.management.MBeanOperationInfo;
  52 +import javax.management.MBeanParameterInfo;
  53 +import javax.management.ReflectionException;
  54 +
  55 +import br.gov.frameworkdemoiselle.DemoiselleException;
  56 +import br.gov.frameworkdemoiselle.internal.implementation.ManagedType;
  57 +import br.gov.frameworkdemoiselle.internal.implementation.ManagedType.FieldDetail;
  58 +import br.gov.frameworkdemoiselle.internal.implementation.ManagedType.MethodDetail;
  59 +import br.gov.frameworkdemoiselle.internal.implementation.ManagedType.ParameterDetail;
  60 +import br.gov.frameworkdemoiselle.internal.implementation.Management;
  61 +import br.gov.frameworkdemoiselle.management.ManagedAttributeNotFoundException;
  62 +import br.gov.frameworkdemoiselle.management.ManagedInvokationException;
  63 +import br.gov.frameworkdemoiselle.stereotype.ManagementController;
  64 +import br.gov.frameworkdemoiselle.util.Beans;
  65 +import br.gov.frameworkdemoiselle.util.ResourceBundle;
  66 +
  67 +/**
  68 + * <p>
  69 + * This class is a MBean that gets registered everytime you mark a class with {@link ManagementController}. It dynamicaly reads the
  70 + * fields and operations contained in a {@link ManagementController} class and exposes them to the MBean server. Everytime a client
  71 + * tries to call an operation or read/write a property inside a ManagementController class, this class will call the appropriate
  72 + * method and pass the result to the MBean client.
  73 + * </p>
  74 + *
  75 + * @author SERPRO
  76 + */
  77 +public class DynamicMBeanProxy implements DynamicMBean {
  78 +
  79 + private MBeanInfo delegateInfo;
  80 +
  81 + private ManagedType managedType;
  82 +
  83 + private ResourceBundle bundle;
  84 +
  85 + public DynamicMBeanProxy(ManagedType type) {
  86 + if (type == null) {
  87 + throw new NullPointerException(getBundle().getString("mbean-null-type-defined"));
  88 + }
  89 + managedType = type;
  90 + }
  91 +
  92 + @Override
  93 + public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {
  94 + // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.
  95 + if (delegateInfo == null) {
  96 + initializeMBeanInfo();
  97 + }
  98 +
  99 + Management manager = Beans.getReference(Management.class);
  100 +
  101 + try{
  102 + return manager.getProperty(managedType, attribute);
  103 + }
  104 + catch(DemoiselleException de){
  105 + if (ManagedAttributeNotFoundException.class.isInstance(de)){
  106 + throw new AttributeNotFoundException(de.getMessage());
  107 + }
  108 + else if (ManagedInvokationException.class.isInstance(de)){
  109 + throw new MBeanException(new Exception(de.getMessage()));
  110 + }
  111 + else{
  112 + throw de;
  113 + }
  114 + }
  115 + }
  116 +
  117 + @Override
  118 + public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException,
  119 + MBeanException, ReflectionException {
  120 +
  121 + // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.
  122 + if (delegateInfo == null) {
  123 + initializeMBeanInfo();
  124 + }
  125 +
  126 + Management manager = Beans.getReference(Management.class);
  127 +
  128 + try{
  129 + manager.setProperty(managedType, attribute.getName(), attribute.getValue());
  130 + }
  131 + catch(DemoiselleException de){
  132 + if (ManagedAttributeNotFoundException.class.isInstance(de)){
  133 + throw new AttributeNotFoundException(de.getMessage());
  134 + }
  135 + else if (ManagedInvokationException.class.isInstance(de)){
  136 + throw new MBeanException(new Exception(de.getMessage()));
  137 + }
  138 + else{
  139 + throw de;
  140 + }
  141 + }
  142 + }
  143 +
  144 + @Override
  145 + public AttributeList getAttributes(String[] attributes) {
  146 + if (attributes != null) {
  147 + AttributeList list = new AttributeList();
  148 + for (String attribute : attributes) {
  149 + try {
  150 + Object value = getAttribute(attribute);
  151 + list.add(new Attribute(attribute, value));
  152 + } catch (Throwable t) {
  153 + }
  154 + }
  155 +
  156 + return list;
  157 + }
  158 +
  159 + return null;
  160 + }
  161 +
  162 + @Override
  163 + public AttributeList setAttributes(AttributeList attributes) {
  164 + AttributeList settedAttributes = new AttributeList();
  165 + if (attributes != null) {
  166 + for (Attribute attribute : attributes.asList()) {
  167 + try {
  168 + setAttribute(attribute);
  169 +
  170 + // A razão para separarmos a criação do atributo de sua adição na lista é que
  171 + // caso a obtenção do novo valor do atributo dispare uma exceção então o atributo não será
  172 + // adicionado na lista de atributos que foram afetados.
  173 + Attribute attributeWithNewValue = new Attribute(attribute.getName(),
  174 + getAttribute(attribute.getName()));
  175 + settedAttributes.add(attributeWithNewValue);
  176 + } catch (Throwable t) {
  177 + }
  178 + }
  179 + }
  180 +
  181 + return settedAttributes;
  182 + }
  183 +
  184 + @Override
  185 + public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException,
  186 + ReflectionException {
  187 +
  188 + // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.
  189 + if (this.delegateInfo == null) {
  190 + initializeMBeanInfo();
  191 + }
  192 +
  193 + Management manager = Beans.getReference(Management.class);
  194 +
  195 + try{
  196 + return manager.invoke(managedType, actionName, params);
  197 + }
  198 + catch(DemoiselleException de){
  199 + throw new MBeanException(new Exception(de.getMessage()));
  200 + }
  201 + }
  202 +
  203 + /**
  204 + * Initialize the Managed information for this instance of Managed
  205 + */
  206 + private void initializeMBeanInfo() {
  207 + // Aqui vamos armazenar nossos atributos
  208 + ArrayList<MBeanAttributeInfo> attributes = new ArrayList<MBeanAttributeInfo>();
  209 +
  210 + // Aqui vamos armazenar nossas operações
  211 + ArrayList<MBeanOperationInfo> operations = new ArrayList<MBeanOperationInfo>();
  212 +
  213 + // Para cada propriedade descoberta no ManagementController, cria um attributeInfo correspondente
  214 + for (Entry<String, FieldDetail> fieldEntry : managedType.getFields().entrySet()) {
  215 +
  216 + try {
  217 +
  218 + MBeanAttributeInfo attributeInfo = new MBeanAttributeInfo(fieldEntry.getKey(), fieldEntry.getValue()
  219 + .getDescription(), fieldEntry.getValue().getGetterMethod(), fieldEntry.getValue()
  220 + .getSetterMethod());
  221 + attributes.add(attributeInfo);
  222 +
  223 + } catch (javax.management.IntrospectionException e) {
  224 + throw new DemoiselleException(getBundle().getString("mbean-introspection-error", managedType.getType()
  225 + .getSimpleName()));
  226 + }
  227 + }
  228 +
  229 + // Para cada operação descoberta no ManagementController, cria um operationInfo correspondente
  230 + for (Entry<String, MethodDetail> methodEntry : managedType.getOperationMethods().entrySet()) {
  231 +
  232 + MethodDetail methodDetail = methodEntry.getValue();
  233 +
  234 + ParameterDetail[] parameterTypes = methodDetail.getParameterTypers();
  235 +
  236 + MBeanParameterInfo[] parameters = parameterTypes.length > 0 ? new MBeanParameterInfo[parameterTypes.length]
  237 + : null;
  238 +
  239 + if (parameters != null) {
  240 +
  241 + for (int i = 0; i < parameterTypes.length; i++) {
  242 +
  243 + parameters[i] = new MBeanParameterInfo(parameterTypes[i].getParameterName(), parameterTypes[i]
  244 + .getParameterType().getCanonicalName(), parameterTypes[i].getParameterDescription());
  245 + }
  246 + }
  247 +
  248 + // Com todas as informações, criamos nossa instância de MBeanOperationInfo e
  249 + // acrescentamos na lista de todas as operações.
  250 + int operationType = 0;
  251 + switch(methodDetail.getType()){
  252 + case ACTION:
  253 + operationType = MBeanOperationInfo.ACTION;
  254 + break;
  255 +
  256 + case INFO:
  257 + operationType = MBeanOperationInfo.INFO;
  258 + break;
  259 +
  260 + case ACTION_INFO:
  261 + operationType = MBeanOperationInfo.ACTION_INFO;
  262 + break;
  263 +
  264 + default:
  265 + operationType = MBeanOperationInfo.UNKNOWN;
  266 + }
  267 +
  268 + MBeanOperationInfo operation = new MBeanOperationInfo(methodDetail.getMethod().getName(),
  269 + methodDetail.getDescription(), parameters, methodDetail.getMethod().getReturnType().getName(),
  270 + operationType);
  271 +
  272 + operations.add(operation);
  273 +
  274 + }
  275 +
  276 + // Por fim criamos nosso bean info.
  277 + delegateInfo = new MBeanInfo(managedType.getType().getCanonicalName(), managedType.getDescription(),
  278 + attributes.toArray(new MBeanAttributeInfo[0]), null, operations.toArray(new MBeanOperationInfo[0]),
  279 + null);
  280 +
  281 + }
  282 +
  283 + @Override
  284 + public MBeanInfo getMBeanInfo() {
  285 + if (delegateInfo == null) {
  286 + initializeMBeanInfo();
  287 + }
  288 +
  289 + return delegateInfo;
  290 + }
  291 +
  292 + public ResourceBundle getBundle(){
  293 + if (bundle==null){
  294 + bundle = new ResourceBundle("demoiselle-jmx-bundle", Locale.getDefault());
  295 + }
  296 +
  297 + return bundle;
  298 + }
  299 +
  300 +}
... ...
impl/extension/jmx/src/test/java/management/tests/basic/DynamicMBeanProxyTest.java
... ... @@ -55,7 +55,7 @@ import org.junit.BeforeClass;
55 55 import org.junit.Test;
56 56 import org.junit.runner.RunWith;
57 57  
58   -import br.gov.frameworkdemoiselle.internal.MBeanManager;
  58 +import br.gov.frameworkdemoiselle.internal.implementation.MBeanManager;
59 59 import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess;
60 60 import br.gov.frameworkdemoiselle.lifecycle.AfterStartupProccess;
61 61 import br.gov.frameworkdemoiselle.util.Beans;
... ...
impl/extension/jmx/src/test/java/management/tests/notification/NotificationBroadcasterTest.java
... ... @@ -57,8 +57,8 @@ import org.junit.BeforeClass;
57 57 import org.junit.Test;
58 58 import org.junit.runner.RunWith;
59 59  
60   -import br.gov.frameworkdemoiselle.configuration.JMXConfig;
61   -import br.gov.frameworkdemoiselle.internal.MBeanManager;
  60 +import br.gov.frameworkdemoiselle.internal.configuration.JMXConfig;
  61 +import br.gov.frameworkdemoiselle.internal.implementation.MBeanManager;
62 62 import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess;
63 63 import br.gov.frameworkdemoiselle.lifecycle.AfterStartupProccess;
64 64 import br.gov.frameworkdemoiselle.management.AttributeChangeNotification;
... ...