Commit fc362946338ac2f66488cbeed3a81f7789e84de5

Authored by Emerson Oliveira
2 parents ae0bc90d 9ed962da
Exists in master

Merge branch '2.4.0' of git@github.com:demoiselle/framework.git into 2.4.0

Showing 36 changed files with 1484 additions and 1076 deletions   Show diff stats
impl/extension/jdbc/pom.xml
@@ -34,8 +34,7 @@ @@ -34,8 +34,7 @@
34 ou escreva para a Fundação do Software Livre (FSF) Inc., 34 ou escreva para a Fundação do Software Livre (FSF) Inc.,
35 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. 35 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
36 --> 36 -->
37 -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
38 - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 37 +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
39 38
40 <modelVersion>4.0.0</modelVersion> 39 <modelVersion>4.0.0</modelVersion>
41 40
@@ -89,78 +88,23 @@ @@ -89,78 +88,23 @@
89 <artifactId>shrinkwrap-resolver-impl-maven</artifactId> 88 <artifactId>shrinkwrap-resolver-impl-maven</artifactId>
90 <scope>test</scope> 89 <scope>test</scope>
91 </dependency> 90 </dependency>
  91 + <dependency>
  92 + <groupId>org.jboss.arquillian.container</groupId>
  93 + <artifactId>arquillian-glassfish-embedded-3.1</artifactId>
  94 + <scope>test</scope>
  95 + </dependency>
  96 + <dependency>
  97 + <groupId>org.glassfish.main.extras</groupId>
  98 + <artifactId>glassfish-embedded-all</artifactId>
  99 + <scope>test</scope>
  100 + </dependency>
  101 + <dependency>
  102 + <groupId>hsqldb</groupId>
  103 + <artifactId>hsqldb</artifactId>
  104 + <scope>test</scope>
  105 + </dependency>
92 </dependencies> 106 </dependencies>
93 107
94 - <build>  
95 - <testResources>  
96 - <testResource>  
97 - <directory>src/test/resources</directory>  
98 - <filtering>true</filtering>  
99 - </testResource>  
100 - </testResources>  
101 - <plugins>  
102 - <plugin>  
103 - <artifactId>maven-dependency-plugin</artifactId>  
104 - <executions>  
105 - <execution>  
106 - <id>unpack</id>  
107 - <phase>process-test-classes</phase>  
108 - <goals>  
109 - <goal>unpack</goal>  
110 - </goals>  
111 - <configuration>  
112 - <artifactItems>  
113 - <artifactItem>  
114 - <groupId>org.jboss.as</groupId>  
115 - <artifactId>jboss-as-dist</artifactId>  
116 - <version>${jbossas.version}</version>  
117 - <type>zip</type>  
118 - <overWrite>false</overWrite>  
119 - <outputDirectory>target</outputDirectory>  
120 - </artifactItem>  
121 - </artifactItems>  
122 - </configuration>  
123 - </execution>  
124 - </executions>  
125 - </plugin>  
126 -  
127 - <plugin>  
128 - <groupId>org.apache.maven.plugins</groupId>  
129 - <artifactId>maven-surefire-plugin</artifactId>  
130 - <version>2.16</version>  
131 - </plugin>  
132 - </plugins>  
133 - <pluginManagement>  
134 - <plugins>  
135 - <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->  
136 - <plugin>  
137 - <groupId>org.eclipse.m2e</groupId>  
138 - <artifactId>lifecycle-mapping</artifactId>  
139 - <version>1.0.0</version>  
140 - <configuration>  
141 - <lifecycleMappingMetadata>  
142 - <pluginExecutions>  
143 - <pluginExecution>  
144 - <pluginExecutionFilter>  
145 - <groupId>org.apache.maven.plugins</groupId>  
146 - <artifactId>maven-dependency-plugin</artifactId>  
147 - <versionRange>[2.1,)</versionRange>  
148 - <goals>  
149 - <goal>unpack</goal>  
150 - </goals>  
151 - </pluginExecutionFilter>  
152 - <action>  
153 - <ignore></ignore>  
154 - </action>  
155 - </pluginExecution>  
156 - </pluginExecutions>  
157 - </lifecycleMappingMetadata>  
158 - </configuration>  
159 - </plugin>  
160 - </plugins>  
161 - </pluginManagement>  
162 - </build>  
163 -  
164 <repositories> 108 <repositories>
165 <repository> 109 <repository>
166 <id>sonatype-nexus-snapshots</id> 110 <id>sonatype-nexus-snapshots</id>
@@ -185,11 +129,10 @@ @@ -185,11 +129,10 @@
185 </releases> 129 </releases>
186 </repository> 130 </repository>
187 </repositories> 131 </repositories>
188 - 132 +
189 <profiles> 133 <profiles>
190 <profile> 134 <profile>
191 <id>arquillian-test</id> 135 <id>arquillian-test</id>
192 -  
193 <dependencies> 136 <dependencies>
194 <dependency> 137 <dependency>
195 <groupId>br.gov.frameworkdemoiselle</groupId> 138 <groupId>br.gov.frameworkdemoiselle</groupId>
@@ -207,24 +150,13 @@ @@ -207,24 +150,13 @@
207 <groupId>org.slf4j</groupId> 150 <groupId>org.slf4j</groupId>
208 <artifactId>slf4j-api</artifactId> 151 <artifactId>slf4j-api</artifactId>
209 </exclusion> 152 </exclusion>
210 - <!--  
211 - -->  
212 <exclusion> 153 <exclusion>
213 <groupId>org.javassist</groupId> 154 <groupId>org.javassist</groupId>
214 <artifactId>javassist</artifactId> 155 <artifactId>javassist</artifactId>
215 </exclusion> 156 </exclusion>
216 </exclusions> 157 </exclusions>
217 </dependency> 158 </dependency>
218 - <dependency>  
219 - <groupId>org.eclipse.persistence</groupId>  
220 - <artifactId>javax.persistence</artifactId>  
221 - <scope>provided</scope>  
222 - </dependency>  
223 </dependencies> 159 </dependencies>
224 </profile> 160 </profile>
225 </profiles> 161 </profiles>
226 -  
227 - <properties>  
228 - <jbossas.version>7.1.1.Final</jbossas.version>  
229 - </properties>  
230 </project> 162 </project>
impl/extension/jdbc/src/test/java/test/Tests.java
@@ -65,7 +65,7 @@ public final class Tests { @@ -65,7 +65,7 @@ public final class Tests {
65 return createDeployment().addPackages(true, baseClass.getPackage()); 65 return createDeployment().addPackages(true, baseClass.getPackage());
66 } 66 }
67 67
68 - public static WebArchive createDeployment() { 68 + private static WebArchive createDeployment() {
69 File[] libs = Maven.resolver().offline().loadPomFromFile("pom.xml", "arquillian-test") 69 File[] libs = Maven.resolver().offline().loadPomFromFile("pom.xml", "arquillian-test")
70 .importCompileAndRuntimeDependencies().resolve().withTransitivity().asFile(); 70 .importCompileAndRuntimeDependencies().resolve().withTransitivity().asFile();
71 71
@@ -80,8 +80,7 @@ public final class Tests { @@ -80,8 +80,7 @@ public final class Tests {
80 .addClass(JDBCTransaction.class) 80 .addClass(JDBCTransaction.class)
81 .addAsResource(createFileAsset("src/main/resources/demoiselle-jdbc-bundle.properties"), 81 .addAsResource(createFileAsset("src/main/resources/demoiselle-jdbc-bundle.properties"),
82 "demoiselle-jdbc-bundle.properties") 82 "demoiselle-jdbc-bundle.properties")
83 -// .addAsResource(createFileAsset("src/test/resources/logging.properties"), "logging.properties")  
84 - .addAsWebInfResource(createFileAsset("src/test/resources/META-INF/beans.xml"), "beans.xml") 83 + .addAsWebInfResource(createFileAsset("src/test/resources/test/beans.xml"), "beans.xml")
85 .addAsLibraries(libs); 84 .addAsLibraries(libs);
86 } 85 }
87 86
impl/extension/jdbc/src/test/java/xxx/XTest.java 0 → 100644
@@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
  1 +package xxx;
  2 +
  3 +import static junit.framework.Assert.assertNotNull;
  4 +
  5 +import java.sql.Connection;
  6 +
  7 +import javax.inject.Inject;
  8 +
  9 +import org.jboss.arquillian.container.test.api.Deployment;
  10 +import org.jboss.arquillian.junit.Arquillian;
  11 +import org.jboss.shrinkwrap.api.spec.WebArchive;
  12 +import org.junit.Test;
  13 +import org.junit.runner.RunWith;
  14 +
  15 +import test.Tests;
  16 +
  17 +@RunWith(Arquillian.class)
  18 +public class XTest {
  19 +
  20 + private static final String PATH = "src/test/resources/xxx";
  21 +
  22 + @Inject
  23 + private Connection conn;
  24 +
  25 + @Deployment
  26 + public static WebArchive createDeployment() {
  27 + WebArchive deployment = Tests.createDeployment(XTest.class);
  28 + deployment.addAsResource(Tests.createFileAsset(PATH + "/demoiselle.properties"),
  29 + "demoiselle.properties");
  30 +
  31 + return deployment;
  32 + }
  33 +
  34 + @Test
  35 + public void x() {
  36 + assertNotNull(conn);
  37 + }
  38 +}
impl/extension/jdbc/src/test/resources/META-INF/beans.xml
@@ -1,40 +0,0 @@ @@ -1,40 +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 -<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
38 - xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">  
39 -  
40 -</beans>  
41 \ No newline at end of file 0 \ No newline at end of file
impl/extension/jdbc/src/test/resources/arquillian.xml
@@ -43,58 +43,11 @@ @@ -43,58 +43,11 @@
43 <property name="deploymentExportPath">target/deployments</property> 43 <property name="deploymentExportPath">target/deployments</property>
44 </engine> 44 </engine>
45 45
46 - <container qualifier="jbossas-managed" default="true">  
47 - <protocol type="Servlet 3.0" />  
48 -  
49 - <configuration>  
50 - <property name="jbossHome">target/jboss-as-7.1.1.Final</property>  
51 - <property name="javaHome">/usr/lib/jvm/java-6-sun/</property>  
52 - <!--  
53 - <property name="serverConfig">../../../../src/test/resources/standalone.xml</property>  
54 - -->  
55 - </configuration>  
56 - </container>  
57 - <!--  
58 - <container qualifier="jbossas-managed" default="true">  
59 - <configuration>  
60 - <property name="jbossHome">target/jboss-as-${jbossas.version}</property>  
61 - <property name="javaVmArguments">-Djboss.socket.binding.port-offset=10000 -Xmx512m -XX:MaxPermSize=128m</property>  
62 - </configuration>  
63 - </container>  
64 - -->  
65 - <!--  
66 - <container qualifier="jbossas-managed" default="true">  
67 - <configuration>  
68 - <property name="javaHome">/usr/lib/jvm/java-6-serpro/</property>  
69 - <property name="jbossHome">/opt/demoiselle/server/jboss-7.1/</property>  
70 - </configuration>  
71 - </container>  
72 - -->  
73 -  
74 - <!--  
75 <container qualifier="glassfish-embedded" default="true"> 46 <container qualifier="glassfish-embedded" default="true">
76 <configuration> 47 <configuration>
77 <property name="resourcesXml">src/test/resources/glassfish-resources.xml</property> 48 <property name="resourcesXml">src/test/resources/glassfish-resources.xml</property>
  49 +<!-- <property name="resourcesXml">${project.testResources}/glassfish-resources.xml</property> -->
78 </configuration> 50 </configuration>
79 </container> 51 </container>
80 - -->  
81 -  
82 - <!--  
83 - <container qualifier="tomee" default="true">  
84 - <configuration>  
85 - <property name="httpPort">-1</property>  
86 - <property name="stopPort">-1</property>  
87 - </configuration>  
88 - </container>  
89 - -->  
90 -  
91 - <!--  
92 - <container qualifier="jbossas-embedded" default="true">  
93 - <configuration>  
94 - <property name="bindaddress">127.0.0.1</property>  
95 - <property name="httpport">8081</property>  
96 - </configuration>  
97 - </container>  
98 - -->  
99 52
100 </arquillian> 53 </arquillian>
101 \ No newline at end of file 54 \ No newline at end of file
impl/extension/jdbc/src/test/resources/demoiselle.properties
impl/extension/jdbc/src/test/resources/glassfish-resources.xml 0 → 100644
@@ -0,0 +1,48 @@ @@ -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 +<!DOCTYPE resources PUBLIC
  38 + "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN"
  39 + "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
  40 +<resources>
  41 + <jdbc-resource pool-name="ArquillianEmbeddedDerbyPool" jndi-name="jdbc/arquillian" />
  42 +
  43 + <jdbc-connection-pool name="ArquillianEmbeddedDerbyPool" res-type="javax.sql.DataSource" datasource-classname="org.apache.derby.jdbc.EmbeddedDataSource"
  44 + is-isolation-level-guaranteed="false">
  45 + <property name="databaseName" value="target/databases/derby" />
  46 + <property name="createDatabase" value="create" />
  47 + </jdbc-connection-pool>
  48 +</resources>
0 \ No newline at end of file 49 \ No newline at end of file
impl/extension/jdbc/src/test/resources/test/beans.xml 0 → 100644
@@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
  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 +<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
  38 +
  39 + <interceptors>
  40 + <class>br.gov.frameworkdemoiselle.transaction.TransactionalInterceptor</class>
  41 + <class>br.gov.frameworkdemoiselle.security.RequiredPermissionInterceptor</class>
  42 + <class>br.gov.frameworkdemoiselle.security.RequiredRoleInterceptor</class>
  43 + <class>br.gov.frameworkdemoiselle.exception.ExceptionHandlerInterceptor</class>
  44 + </interceptors>
  45 +
  46 +</beans>
impl/extension/jdbc/src/test/resources/xxx/demoiselle.properties 0 → 100644
@@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
  1 +# Demoiselle Framework
  2 +# Copyright (C) 2010 SERPRO
  3 +# ----------------------------------------------------------------------------
  4 +# This file is part of Demoiselle Framework.
  5 +#
  6 +# Demoiselle Framework is free software; you can redistribute it and/or
  7 +# modify it under the terms of the GNU Lesser General Public License version 3
  8 +# as published by the Free Software Foundation.
  9 +#
  10 +# This program is distributed in the hope that it will be useful,
  11 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13 +# GNU General Public License for more details.
  14 +#
  15 +# You should have received a copy of the GNU Lesser General Public License version 3
  16 +# along with this program; if not, see <http://www.gnu.org/licenses/>
  17 +# or write to the Free Software Foundation, Inc., 51 Franklin Street,
  18 +# Fifth Floor, Boston, MA 02110-1301, USA.
  19 +# ----------------------------------------------------------------------------
  20 +# Este arquivo é parte do Framework Demoiselle.
  21 +#
  22 +# O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou
  23 +# modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação
  24 +# do Software Livre (FSF).
  25 +#
  26 +# Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA
  27 +# GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou
  28 +# APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português
  29 +# para maiores detalhes.
  30 +#
  31 +# Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título
  32 +# "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/>
  33 +# ou escreva para a Fundação do Software Livre (FSF) Inc.,
  34 +# 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA.
  35 +
  36 +frameworkdemoiselle.persistence.driver.class=org.hsqldb.jdbcDriver
  37 +frameworkdemoiselle.persistence.url=jdbc:hsqldb:mem:xxx
  38 +frameworkdemoiselle.persistence.username=sa
  39 +frameworkdemoiselle.persistence.password=
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/configuration/JMXConfig.java 0 → 100644
@@ -0,0 +1,142 @@ @@ -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.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 0 → 100644
@@ -0,0 +1,264 @@ @@ -0,0 +1,264 @@
  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.stereotype.ManagementController;
  62 +import br.gov.frameworkdemoiselle.util.Beans;
  63 +import br.gov.frameworkdemoiselle.util.ResourceBundle;
  64 +
  65 +/**
  66 + * <p>
  67 + * This class is a MBean that gets registered everytime you mark a class with {@link ManagementController}. It dynamicaly reads the
  68 + * fields and operations contained in a {@link ManagementController} class and exposes them to the MBean server. Everytime a client
  69 + * tries to call an operation or read/write a property inside a ManagementController class, this class will call the appropriate
  70 + * method and pass the result to the MBean client.
  71 + * </p>
  72 + *
  73 + * @author SERPRO
  74 + */
  75 +public class DynamicMBeanProxy implements DynamicMBean {
  76 +
  77 + private MBeanInfo delegateInfo;
  78 +
  79 + private ManagedType managedType;
  80 +
  81 + private ResourceBundle bundle;
  82 +
  83 + public DynamicMBeanProxy(ManagedType type) {
  84 + if (type == null) {
  85 + throw new NullPointerException(getBundle().getString("mbean-null-type-defined"));
  86 + }
  87 + managedType = type;
  88 + }
  89 +
  90 + @Override
  91 + public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {
  92 + // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.
  93 + if (delegateInfo == null) {
  94 + initializeMBeanInfo();
  95 + }
  96 +
  97 + Management manager = Beans.getReference(Management.class);
  98 + return manager.getProperty(managedType, attribute);
  99 + }
  100 +
  101 + @Override
  102 + public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException,
  103 + MBeanException, ReflectionException {
  104 +
  105 + // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.
  106 + if (delegateInfo == null) {
  107 + initializeMBeanInfo();
  108 + }
  109 +
  110 + Management manager = Beans.getReference(Management.class);
  111 + manager.setProperty(managedType, attribute.getName(), attribute.getValue());
  112 + }
  113 +
  114 + @Override
  115 + public AttributeList getAttributes(String[] attributes) {
  116 + if (attributes != null) {
  117 + AttributeList list = new AttributeList();
  118 + for (String attribute : attributes) {
  119 + try {
  120 + Object value = getAttribute(attribute);
  121 + list.add(new Attribute(attribute, value));
  122 + } catch (Throwable t) {
  123 + }
  124 + }
  125 +
  126 + return list;
  127 + }
  128 +
  129 + return null;
  130 + }
  131 +
  132 + @Override
  133 + public AttributeList setAttributes(AttributeList attributes) {
  134 + AttributeList settedAttributes = new AttributeList();
  135 + if (attributes != null) {
  136 + for (Attribute attribute : attributes.asList()) {
  137 + try {
  138 + setAttribute(attribute);
  139 +
  140 + // A razão para separarmos a criação do atributo de sua adição na lista é que
  141 + // caso a obtenção do novo valor do atributo dispare uma exceção então o atributo não será
  142 + // adicionado na lista de atributos que foram afetados.
  143 + Attribute attributeWithNewValue = new Attribute(attribute.getName(),
  144 + getAttribute(attribute.getName()));
  145 + settedAttributes.add(attributeWithNewValue);
  146 + } catch (Throwable t) {
  147 + }
  148 + }
  149 + }
  150 +
  151 + return settedAttributes;
  152 + }
  153 +
  154 + @Override
  155 + public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException,
  156 + ReflectionException {
  157 +
  158 + // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.
  159 + if (this.delegateInfo == null) {
  160 + initializeMBeanInfo();
  161 + }
  162 +
  163 + Management manager = Beans.getReference(Management.class);
  164 + return manager.invoke(managedType, actionName, params);
  165 + }
  166 +
  167 + /**
  168 + * Initialize the Managed information for this instance of Managed
  169 + */
  170 + private void initializeMBeanInfo() {
  171 + // Aqui vamos armazenar nossos atributos
  172 + ArrayList<MBeanAttributeInfo> attributes = new ArrayList<MBeanAttributeInfo>();
  173 +
  174 + // Aqui vamos armazenar nossas operações
  175 + ArrayList<MBeanOperationInfo> operations = new ArrayList<MBeanOperationInfo>();
  176 +
  177 + // Para cada propriedade descoberta no ManagementController, cria um attributeInfo correspondente
  178 + for (Entry<String, FieldDetail> fieldEntry : managedType.getFields().entrySet()) {
  179 +
  180 + try {
  181 +
  182 + MBeanAttributeInfo attributeInfo = new MBeanAttributeInfo(fieldEntry.getKey(), fieldEntry.getValue()
  183 + .getDescription(), fieldEntry.getValue().getGetterMethod(), fieldEntry.getValue()
  184 + .getSetterMethod());
  185 + attributes.add(attributeInfo);
  186 +
  187 + } catch (javax.management.IntrospectionException e) {
  188 + throw new DemoiselleException(getBundle().getString("mbean-introspection-error", managedType.getType()
  189 + .getSimpleName()));
  190 + }
  191 + }
  192 +
  193 + // Para cada operação descoberta no ManagementController, cria um operationInfo correspondente
  194 + for (Entry<String, MethodDetail> methodEntry : managedType.getOperationMethods().entrySet()) {
  195 +
  196 + MethodDetail methodDetail = methodEntry.getValue();
  197 +
  198 + ParameterDetail[] parameterTypes = methodDetail.getParameterTypers();
  199 +
  200 + MBeanParameterInfo[] parameters = parameterTypes.length > 0 ? new MBeanParameterInfo[parameterTypes.length]
  201 + : null;
  202 +
  203 + if (parameters != null) {
  204 +
  205 + for (int i = 0; i < parameterTypes.length; i++) {
  206 +
  207 + parameters[i] = new MBeanParameterInfo(parameterTypes[i].getParameterName(), parameterTypes[i]
  208 + .getParameterType().getCanonicalName(), parameterTypes[i].getParameterDescription());
  209 + }
  210 + }
  211 +
  212 + // Com todas as informações, criamos nossa instância de MBeanOperationInfo e
  213 + // acrescentamos na lista de todas as operações.
  214 + int operationType = 0;
  215 + switch(methodDetail.getType()){
  216 + case ACTION:
  217 + operationType = MBeanOperationInfo.ACTION;
  218 + break;
  219 +
  220 + case INFO:
  221 + operationType = MBeanOperationInfo.INFO;
  222 + break;
  223 +
  224 + case ACTION_INFO:
  225 + operationType = MBeanOperationInfo.ACTION_INFO;
  226 + break;
  227 +
  228 + default:
  229 + operationType = MBeanOperationInfo.UNKNOWN;
  230 + }
  231 +
  232 + MBeanOperationInfo operation = new MBeanOperationInfo(methodDetail.getMethod().getName(),
  233 + methodDetail.getDescription(), parameters, methodDetail.getMethod().getReturnType().getName(),
  234 + operationType);
  235 +
  236 + operations.add(operation);
  237 +
  238 + }
  239 +
  240 + // Por fim criamos nosso bean info.
  241 + delegateInfo = new MBeanInfo(managedType.getType().getCanonicalName(), managedType.getDescription(),
  242 + attributes.toArray(new MBeanAttributeInfo[0]), null, operations.toArray(new MBeanOperationInfo[0]),
  243 + null);
  244 +
  245 + }
  246 +
  247 + @Override
  248 + public MBeanInfo getMBeanInfo() {
  249 + if (delegateInfo == null) {
  250 + initializeMBeanInfo();
  251 + }
  252 +
  253 + return delegateInfo;
  254 + }
  255 +
  256 + public ResourceBundle getBundle(){
  257 + if (bundle==null){
  258 + bundle = new ResourceBundle("demoiselle-jmx-bundle", Locale.getDefault());
  259 + }
  260 +
  261 + return bundle;
  262 + }
  263 +
  264 +}
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/JMXManagementExtension.java 0 → 100644
@@ -0,0 +1,104 @@ @@ -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;
  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 0 → 100644
@@ -0,0 +1,120 @@ @@ -0,0 +1,120 @@
  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 + // @Inject
  66 + // @Name("demoiselle-monitoring-bundle")
  67 + // private ResourceBundle bundle;
  68 +
  69 + /**
  70 + * Return the MBean Server instance.
  71 + *
  72 + * @return MBeanServer
  73 + */
  74 + public static final MBeanServer getMBeanServer() {
  75 + return server;
  76 + }
  77 +
  78 + /**
  79 + * Register a given managed bean (MBean) with the specified name.
  80 + *
  81 + * @param mbean
  82 + * the managed bean to register
  83 + * @param name
  84 + * the name under which to register the bean
  85 + * @return the object name of the mbean, for later deregistration
  86 + */
  87 + public static ObjectInstance register(final Object mbean, final String name) {
  88 +
  89 + logger.info(bundle.getString("mbean-registration",name));
  90 +
  91 + ObjectInstance instance = null;
  92 + try {
  93 + ObjectName objectName = new ObjectName(name);
  94 + instance = server.registerMBean(mbean, objectName);
  95 + } catch (Exception e) {
  96 + logger.error(bundle.getString("mbean-registration-error",name),e);
  97 + throw new DemoiselleException(bundle.getString("mbean-registration-error",name), e);
  98 + }
  99 +
  100 + return instance;
  101 + }
  102 +
  103 + /**
  104 + * Remove the registration of a mbean.
  105 + *
  106 + * @param objectName
  107 + * the name of the bean to unregister
  108 + */
  109 + public static void unregister(final ObjectName objectName) {
  110 +
  111 + logger.info(bundle.getString("mbean-deregistration",objectName.getCanonicalName()));
  112 +
  113 + try {
  114 + server.unregisterMBean(objectName);
  115 + } catch (Exception e) {
  116 + logger.error(bundle.getString("mbean-deregistration",objectName.getCanonicalName()),e);
  117 + throw new DemoiselleException(bundle.getString("mbean-deregistration",objectName.getCanonicalName()), e);
  118 + }
  119 + }
  120 +}
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/MBeanManager.java 0 → 100644
@@ -0,0 +1,67 @@ @@ -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;
  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 0 → 100644
@@ -0,0 +1,86 @@ @@ -0,0 +1,86 @@
  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 + /*public static final String NOTIFICATION_DEFAULT_MBEAN_NAME = NotificationBroadcaster.class.getPackage().getName()
  64 + +":name="
  65 + +NotificationBroadcaster.class.getSimpleName();*/
  66 +
  67 + private static final String NOTIFICATION_TYPE_GENERIC = "jmx.message";
  68 +
  69 + protected void sendNotification( ManagementNotificationEvent event , JMXConfig config ) {
  70 + br.gov.frameworkdemoiselle.management.GenericNotification demoiselleNotification = event.getNotification();
  71 + Notification n = new Notification(NOTIFICATION_TYPE_GENERIC, config.getNotificationMBeanName(), sequenceNumber++, System.currentTimeMillis(), demoiselleNotification.getMessage().toString());
  72 + sendNotification(n);
  73 + }
  74 +
  75 + protected void sendAttributeChangedMessage( ManagementNotificationEvent event , JMXConfig config ) {
  76 + br.gov.frameworkdemoiselle.management.AttributeChangeNotification demoiselleNotification = (br.gov.frameworkdemoiselle.management.AttributeChangeNotification)event.getNotification();
  77 +
  78 + AttributeChangeNotification n = new AttributeChangeNotification(config.getNotificationMBeanName(), sequenceNumber++
  79 + , System.currentTimeMillis(), demoiselleNotification.getMessage().toString()
  80 + , demoiselleNotification.getAttributeName(), demoiselleNotification.getAttributeType().getSimpleName()
  81 + , demoiselleNotification.getOldValue(), demoiselleNotification.getNewValue());
  82 +
  83 + sendNotification(n);
  84 + }
  85 +
  86 +}
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/NotificationBroadcasterMBean.java 0 → 100644
@@ -0,0 +1,48 @@ @@ -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;
  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 0 → 100644
@@ -0,0 +1,80 @@ @@ -0,0 +1,80 @@
  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/jmx/bootstrap/JMXManagementExtension.java
@@ -1,108 +0,0 @@ @@ -1,108 +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.jmx.bootstrap;  
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.management.ManagedType;  
45 -import br.gov.frameworkdemoiselle.jmx.configuration.JMXConfig;  
46 -import br.gov.frameworkdemoiselle.jmx.internal.DynamicMBeanProxy;  
47 -import br.gov.frameworkdemoiselle.jmx.internal.MBeanHelper;  
48 -import br.gov.frameworkdemoiselle.jmx.internal.MBeanManager;  
49 -import br.gov.frameworkdemoiselle.jmx.internal.NotificationEventListener;  
50 -import br.gov.frameworkdemoiselle.lifecycle.ManagementExtension;  
51 -import br.gov.frameworkdemoiselle.util.Beans;  
52 -  
53 -public class JMXManagementExtension implements ManagementExtension {  
54 -  
55 - public void registerNotificationMBean(){  
56 - MBeanManager mbeanManager = Beans.getReference(MBeanManager.class);  
57 - JMXConfig configuration = Beans.getReference(JMXConfig.class);  
58 -  
59 - StringBuffer notificationMBeanName = new StringBuffer()  
60 - .append( configuration.getNotificationDomain()!=null ? configuration.getNotificationDomain() : "br.gov.frameworkdemoiselle.jmx" )  
61 - .append(":name=")  
62 - .append(configuration.getNotificationMBeanName());  
63 -  
64 - if (mbeanManager.findMBeanInstance(notificationMBeanName.toString()) == null){  
65 - NotificationEventListener listener = Beans.getReference(NotificationEventListener.class);  
66 -  
67 - ObjectInstance instance = MBeanHelper.register(listener.createNotificationBroadcaster(), notificationMBeanName.toString());  
68 - mbeanManager.storeRegisteredMBean(instance);  
69 - }  
70 - }  
71 -  
72 - @Override  
73 - public void initialize(List<ManagedType> managedTypes) {  
74 - MBeanManager manager = Beans.getReference(MBeanManager.class);  
75 - JMXConfig configuration = Beans.getReference(JMXConfig.class);  
76 -  
77 - for (ManagedType type : managedTypes) {  
78 - DynamicMBeanProxy beanProxy = new DynamicMBeanProxy(type);  
79 -  
80 - Name nameAnnotation = type.getType().getAnnotation(Name.class);  
81 - String mbeanName = nameAnnotation != null ? nameAnnotation.value() : type.getType().getSimpleName();  
82 -  
83 - StringBuffer name = new StringBuffer()  
84 - .append( configuration.getMbeanDomain()!=null ? configuration.getMbeanDomain() : type.getType().getPackage().getName() )  
85 - .append(":name=")  
86 - .append( mbeanName );  
87 -  
88 -  
89 - if (manager.findMBeanInstance(name.toString()) == null){  
90 - ObjectInstance instance = MBeanHelper.register(beanProxy, name.toString());  
91 - manager.storeRegisteredMBean(instance);  
92 - }  
93 - }  
94 -  
95 - registerNotificationMBean();  
96 - }  
97 -  
98 - @Override  
99 - public void shutdown(List<ManagedType> managedTypes) {  
100 - MBeanManager manager = Beans.getReference(MBeanManager.class);  
101 - for (ObjectInstance instance : manager.listRegisteredMBeans()){  
102 - MBeanHelper.unregister(instance.getObjectName());  
103 - }  
104 -  
105 - manager.cleanRegisteredMBeans();  
106 - }  
107 -  
108 -}  
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/jmx/configuration/JMXConfig.java
@@ -1,119 +0,0 @@ @@ -1,119 +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.jmx.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 -@Configuration(prefix = "frameworkdemoiselle.management.jmx.")  
46 -public class JMXConfig {  
47 -  
48 - @Name("mbean.domain")  
49 - private String mbeanDomain;  
50 -  
51 - @Name("notification.domain")  
52 - private String notificationDomain = "br.gov.frameworkdemoiselle.jmx";  
53 -  
54 - @Name("notification.name")  
55 - private String notificationMBeanName = "NotificationBroadcaster";  
56 -  
57 - /**  
58 - * </p>The domain to register all {@link ManagementController} classes found during boot.</p>  
59 - *  
60 - * <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  
61 - * parameter is the "domain" portion of the full name.</p>  
62 - *  
63 - * <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>  
64 - *  
65 - */  
66 - public String getMbeanDomain() {  
67 - return mbeanDomain;  
68 - }  
69 -  
70 - /**  
71 - * @see #getMbeanDomain()  
72 - */  
73 - public void setMbeanDomain(String mbeanDomain) {  
74 - this.mbeanDomain = mbeanDomain;  
75 - }  
76 -  
77 - /**  
78 - * <p>The name the {@link NotificationBroadcaster} MBean will be registered to. The full name  
79 - * of a MBean has the format of <code>domain:name=MBeanName</code> (ex: <code>br.gov.frameworkdemoiselle.jmx:name=NotificationBroadcaster</code>), this  
80 - * parameter is the ":name=MBeanName" portion without the ":name=".</p>  
81 - *  
82 - * <p>The default is the value returned by {@link Class#getSimpleName()} when called from the {@link NotificationBroadcaster} class.</p>  
83 - *  
84 - * @see #getMbeanDomain()  
85 - */  
86 - public String getNotificationMBeanName() {  
87 - return notificationMBeanName;  
88 - }  
89 -  
90 - /**  
91 - * @see #getNotificationMBeanName()  
92 - */  
93 - public void setNotificationMBeanName(String notificationMBeanName) {  
94 - this.notificationMBeanName = notificationMBeanName;  
95 - }  
96 -  
97 - /**  
98 - * </p>The domain to register the {@link NotificationBroadcaster} MBean.</p>  
99 - *  
100 - * <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  
101 - * parameter is the "domain" portion of the full name.</p>  
102 - *  
103 - * <p>The default is <code>br.gov.frameworkdemoiselle.jmx</code>.</p>  
104 - *  
105 - */  
106 - public String getNotificationDomain() {  
107 - return notificationDomain;  
108 - }  
109 -  
110 - /**  
111 - * @see #getNotificationDomain()  
112 - */  
113 - public void setNotificationDomain(String notificationDomain) {  
114 - this.notificationDomain = notificationDomain;  
115 - }  
116 -  
117 -  
118 -  
119 -}  
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/jmx/internal/DynamicMBeanProxy.java
@@ -1,264 +0,0 @@ @@ -1,264 +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.jmx.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.stereotype.ManagementController;  
62 -import br.gov.frameworkdemoiselle.util.Beans;  
63 -import br.gov.frameworkdemoiselle.util.ResourceBundle;  
64 -  
65 -/**  
66 - * <p>  
67 - * This class is a MBean that gets registered everytime you mark a class with {@link ManagementController}. It dynamicaly reads the  
68 - * fields and operations contained in a {@link ManagementController} class and exposes them to the MBean server. Everytime a client  
69 - * tries to call an operation or read/write a property inside a ManagementController class, this class will call the appropriate  
70 - * method and pass the result to the MBean client.  
71 - * </p>  
72 - *  
73 - * @author SERPRO  
74 - */  
75 -public class DynamicMBeanProxy implements DynamicMBean {  
76 -  
77 - private MBeanInfo delegateInfo;  
78 -  
79 - private ManagedType managedType;  
80 -  
81 - private ResourceBundle bundle;  
82 -  
83 - public DynamicMBeanProxy(ManagedType type) {  
84 - if (type == null) {  
85 - throw new NullPointerException(getBundle().getString("mbean-null-type-defined"));  
86 - }  
87 - managedType = type;  
88 - }  
89 -  
90 - @Override  
91 - public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {  
92 - // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.  
93 - if (delegateInfo == null) {  
94 - initializeMBeanInfo();  
95 - }  
96 -  
97 - Management manager = Beans.getReference(Management.class);  
98 - return manager.getProperty(managedType, attribute);  
99 - }  
100 -  
101 - @Override  
102 - public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException,  
103 - MBeanException, ReflectionException {  
104 -  
105 - // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.  
106 - if (delegateInfo == null) {  
107 - initializeMBeanInfo();  
108 - }  
109 -  
110 - Management manager = Beans.getReference(Management.class);  
111 - manager.setProperty(managedType, attribute.getName(), attribute.getValue());  
112 - }  
113 -  
114 - @Override  
115 - public AttributeList getAttributes(String[] attributes) {  
116 - if (attributes != null) {  
117 - AttributeList list = new AttributeList();  
118 - for (String attribute : attributes) {  
119 - try {  
120 - Object value = getAttribute(attribute);  
121 - list.add(new Attribute(attribute, value));  
122 - } catch (Throwable t) {  
123 - }  
124 - }  
125 -  
126 - return list;  
127 - }  
128 -  
129 - return null;  
130 - }  
131 -  
132 - @Override  
133 - public AttributeList setAttributes(AttributeList attributes) {  
134 - AttributeList settedAttributes = new AttributeList();  
135 - if (attributes != null) {  
136 - for (Attribute attribute : attributes.asList()) {  
137 - try {  
138 - setAttribute(attribute);  
139 -  
140 - // A razão para separarmos a criação do atributo de sua adição na lista é que  
141 - // caso a obtenção do novo valor do atributo dispare uma exceção então o atributo não será  
142 - // adicionado na lista de atributos que foram afetados.  
143 - Attribute attributeWithNewValue = new Attribute(attribute.getName(),  
144 - getAttribute(attribute.getName()));  
145 - settedAttributes.add(attributeWithNewValue);  
146 - } catch (Throwable t) {  
147 - }  
148 - }  
149 - }  
150 -  
151 - return settedAttributes;  
152 - }  
153 -  
154 - @Override  
155 - public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException,  
156 - ReflectionException {  
157 -  
158 - // Se o bean ainda não foi lido para determinar seus atributos, o faz agora.  
159 - if (this.delegateInfo == null) {  
160 - initializeMBeanInfo();  
161 - }  
162 -  
163 - Management manager = Beans.getReference(Management.class);  
164 - return manager.invoke(managedType, actionName, params);  
165 - }  
166 -  
167 - /**  
168 - * Initialize the Managed information for this instance of Managed  
169 - */  
170 - private void initializeMBeanInfo() {  
171 - // Aqui vamos armazenar nossos atributos  
172 - ArrayList<MBeanAttributeInfo> attributes = new ArrayList<MBeanAttributeInfo>();  
173 -  
174 - // Aqui vamos armazenar nossas operações  
175 - ArrayList<MBeanOperationInfo> operations = new ArrayList<MBeanOperationInfo>();  
176 -  
177 - // Para cada propriedade descoberta no ManagementController, cria um attributeInfo correspondente  
178 - for (Entry<String, FieldDetail> fieldEntry : managedType.getFields().entrySet()) {  
179 -  
180 - try {  
181 -  
182 - MBeanAttributeInfo attributeInfo = new MBeanAttributeInfo(fieldEntry.getKey(), fieldEntry.getValue()  
183 - .getDescription(), fieldEntry.getValue().getGetterMethod(), fieldEntry.getValue()  
184 - .getSetterMethod());  
185 - attributes.add(attributeInfo);  
186 -  
187 - } catch (javax.management.IntrospectionException e) {  
188 - throw new DemoiselleException(getBundle().getString("mbean-introspection-error", managedType.getType()  
189 - .getSimpleName()));  
190 - }  
191 - }  
192 -  
193 - // Para cada operação descoberta no ManagementController, cria um operationInfo correspondente  
194 - for (Entry<String, MethodDetail> methodEntry : managedType.getOperationMethods().entrySet()) {  
195 -  
196 - MethodDetail methodDetail = methodEntry.getValue();  
197 -  
198 - ParameterDetail[] parameterTypes = methodDetail.getParameterTypers();  
199 -  
200 - MBeanParameterInfo[] parameters = parameterTypes.length > 0 ? new MBeanParameterInfo[parameterTypes.length]  
201 - : null;  
202 -  
203 - if (parameters != null) {  
204 -  
205 - for (int i = 0; i < parameterTypes.length; i++) {  
206 -  
207 - parameters[i] = new MBeanParameterInfo(parameterTypes[i].getParameterName(), parameterTypes[i]  
208 - .getParameterType().getCanonicalName(), parameterTypes[i].getParameterDescription());  
209 - }  
210 - }  
211 -  
212 - // Com todas as informações, criamos nossa instância de MBeanOperationInfo e  
213 - // acrescentamos na lista de todas as operações.  
214 - int operationType = 0;  
215 - switch(methodDetail.getType()){  
216 - case ACTION:  
217 - operationType = MBeanOperationInfo.ACTION;  
218 - break;  
219 -  
220 - case INFO:  
221 - operationType = MBeanOperationInfo.INFO;  
222 - break;  
223 -  
224 - case ACTION_INFO:  
225 - operationType = MBeanOperationInfo.ACTION_INFO;  
226 - break;  
227 -  
228 - default:  
229 - operationType = MBeanOperationInfo.UNKNOWN;  
230 - }  
231 -  
232 - MBeanOperationInfo operation = new MBeanOperationInfo(methodDetail.getMethod().getName(),  
233 - methodDetail.getDescription(), parameters, methodDetail.getMethod().getReturnType().getName(),  
234 - operationType);  
235 -  
236 - operations.add(operation);  
237 -  
238 - }  
239 -  
240 - // Por fim criamos nosso bean info.  
241 - delegateInfo = new MBeanInfo(managedType.getType().getCanonicalName(), managedType.getDescription(),  
242 - attributes.toArray(new MBeanAttributeInfo[0]), null, operations.toArray(new MBeanOperationInfo[0]),  
243 - null);  
244 -  
245 - }  
246 -  
247 - @Override  
248 - public MBeanInfo getMBeanInfo() {  
249 - if (delegateInfo == null) {  
250 - initializeMBeanInfo();  
251 - }  
252 -  
253 - return delegateInfo;  
254 - }  
255 -  
256 - public ResourceBundle getBundle(){  
257 - if (bundle==null){  
258 - bundle = new ResourceBundle("demoiselle-jmx-bundle", Locale.getDefault());  
259 - }  
260 -  
261 - return bundle;  
262 - }  
263 -  
264 -}  
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/jmx/internal/MBeanHelper.java
@@ -1,120 +0,0 @@ @@ -1,120 +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.jmx.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 - // @Inject  
66 - // @Name("demoiselle-monitoring-bundle")  
67 - // private ResourceBundle bundle;  
68 -  
69 - /**  
70 - * Return the MBean Server instance.  
71 - *  
72 - * @return MBeanServer  
73 - */  
74 - public static final MBeanServer getMBeanServer() {  
75 - return server;  
76 - }  
77 -  
78 - /**  
79 - * Register a given managed bean (MBean) with the specified name.  
80 - *  
81 - * @param mbean  
82 - * the managed bean to register  
83 - * @param name  
84 - * the name under which to register the bean  
85 - * @return the object name of the mbean, for later deregistration  
86 - */  
87 - public static ObjectInstance register(final Object mbean, final String name) {  
88 -  
89 - logger.info(bundle.getString("mbean-registration",name));  
90 -  
91 - ObjectInstance instance = null;  
92 - try {  
93 - ObjectName objectName = new ObjectName(name);  
94 - instance = server.registerMBean(mbean, objectName);  
95 - } catch (Exception e) {  
96 - logger.error(bundle.getString("mbean-registration-error",name),e);  
97 - throw new DemoiselleException(bundle.getString("mbean-registration-error",name), e);  
98 - }  
99 -  
100 - return instance;  
101 - }  
102 -  
103 - /**  
104 - * Remove the registration of a mbean.  
105 - *  
106 - * @param objectName  
107 - * the name of the bean to unregister  
108 - */  
109 - public static void unregister(final ObjectName objectName) {  
110 -  
111 - logger.info(bundle.getString("mbean-deregistration",objectName.getCanonicalName()));  
112 -  
113 - try {  
114 - server.unregisterMBean(objectName);  
115 - } catch (Exception e) {  
116 - logger.error(bundle.getString("mbean-deregistration",objectName.getCanonicalName()),e);  
117 - throw new DemoiselleException(bundle.getString("mbean-deregistration",objectName.getCanonicalName()), e);  
118 - }  
119 - }  
120 -}  
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/jmx/internal/MBeanManager.java
@@ -1,67 +0,0 @@ @@ -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.jmx.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/jmx/internal/NotificationBroadcaster.java
@@ -1,86 +0,0 @@ @@ -1,86 +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.jmx.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.jmx.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 -final class NotificationBroadcaster extends NotificationBroadcasterSupport implements NotificationBroadcasterMBean,Serializable {  
58 -  
59 - private static final long serialVersionUID = 1L;  
60 -  
61 - private int sequenceNumber = 1;  
62 -  
63 - /*public static final String NOTIFICATION_DEFAULT_MBEAN_NAME = NotificationBroadcaster.class.getPackage().getName()  
64 - +":name="  
65 - +NotificationBroadcaster.class.getSimpleName();*/  
66 -  
67 - private static final String NOTIFICATION_TYPE_GENERIC = "jmx.message";  
68 -  
69 - protected void sendNotification( ManagementNotificationEvent event , JMXConfig config ) {  
70 - br.gov.frameworkdemoiselle.management.GenericNotification demoiselleNotification = event.getNotification();  
71 - Notification n = new Notification(NOTIFICATION_TYPE_GENERIC, config.getNotificationMBeanName(), sequenceNumber++, System.currentTimeMillis(), demoiselleNotification.getMessage().toString());  
72 - sendNotification(n);  
73 - }  
74 -  
75 - protected void sendAttributeChangedMessage( ManagementNotificationEvent event , JMXConfig config ) {  
76 - br.gov.frameworkdemoiselle.management.AttributeChangeNotification demoiselleNotification = (br.gov.frameworkdemoiselle.management.AttributeChangeNotification)event.getNotification();  
77 -  
78 - AttributeChangeNotification n = new AttributeChangeNotification(config.getNotificationMBeanName(), sequenceNumber++  
79 - , System.currentTimeMillis(), demoiselleNotification.getMessage().toString()  
80 - , demoiselleNotification.getAttributeName(), demoiselleNotification.getAttributeType().getSimpleName()  
81 - , demoiselleNotification.getOldValue(), demoiselleNotification.getNewValue());  
82 -  
83 - sendNotification(n);  
84 - }  
85 -  
86 -}  
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/jmx/internal/NotificationBroadcasterMBean.java
@@ -1,48 +0,0 @@ @@ -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.jmx.internal;  
38 -  
39 -  
40 -  
41 -/**  
42 - * MBean interface responsible for sending MBean notifications to remote clients.  
43 - *  
44 - * @author serpro  
45 - *  
46 - */  
47 -interface NotificationBroadcasterMBean {  
48 -}  
impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/jmx/internal/NotificationEventListener.java
@@ -1,80 +0,0 @@ @@ -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.jmx.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.internal.management.qualifier.AttributeChange;  
45 -import br.gov.frameworkdemoiselle.internal.management.qualifier.Generic;  
46 -import br.gov.frameworkdemoiselle.jmx.configuration.JMXConfig;  
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/test/java/management/tests/basic/DynamicMBeanProxyTest.java
@@ -55,7 +55,7 @@ import org.junit.BeforeClass; @@ -55,7 +55,7 @@ import org.junit.BeforeClass;
55 import org.junit.Test; 55 import org.junit.Test;
56 import org.junit.runner.RunWith; 56 import org.junit.runner.RunWith;
57 57
58 -import br.gov.frameworkdemoiselle.jmx.internal.MBeanManager; 58 +import br.gov.frameworkdemoiselle.internal.MBeanManager;
59 import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess; 59 import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess;
60 import br.gov.frameworkdemoiselle.lifecycle.AfterStartupProccess; 60 import br.gov.frameworkdemoiselle.lifecycle.AfterStartupProccess;
61 import br.gov.frameworkdemoiselle.util.Beans; 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,8 +57,8 @@ import org.junit.BeforeClass;
57 import org.junit.Test; 57 import org.junit.Test;
58 import org.junit.runner.RunWith; 58 import org.junit.runner.RunWith;
59 59
60 -import br.gov.frameworkdemoiselle.jmx.configuration.JMXConfig;  
61 -import br.gov.frameworkdemoiselle.jmx.internal.MBeanManager; 60 +import br.gov.frameworkdemoiselle.configuration.JMXConfig;
  61 +import br.gov.frameworkdemoiselle.internal.MBeanManager;
62 import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess; 62 import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess;
63 import br.gov.frameworkdemoiselle.lifecycle.AfterStartupProccess; 63 import br.gov.frameworkdemoiselle.lifecycle.AfterStartupProccess;
64 import br.gov.frameworkdemoiselle.management.AttributeChangeNotification; 64 import br.gov.frameworkdemoiselle.management.AttributeChangeNotification;
impl/extension/jpa/src/test/java/transaction/interceptor/JPATransactionTest.java 0 → 100644
@@ -0,0 +1,93 @@ @@ -0,0 +1,93 @@
  1 +package transaction.interceptor;
  2 +
  3 +import javax.inject.Inject;
  4 +import javax.persistence.EntityManager;
  5 +
  6 +import junit.framework.Assert;
  7 +
  8 +import org.jboss.arquillian.container.test.api.Deployment;
  9 +import org.jboss.arquillian.junit.Arquillian;
  10 +import org.jboss.shrinkwrap.api.spec.WebArchive;
  11 +import org.junit.Before;
  12 +import org.junit.Test;
  13 +import org.junit.runner.RunWith;
  14 +
  15 +import test.Tests;
  16 +import br.gov.frameworkdemoiselle.annotation.Name;
  17 +import br.gov.frameworkdemoiselle.transaction.TransactionContext;
  18 +
  19 +@RunWith(Arquillian.class)
  20 +public class JPATransactionTest {
  21 +
  22 + private static final String PATH = "src/test/resources/transaction/interceptor";
  23 +
  24 + @Inject
  25 + private TransactionalBusiness tb;
  26 +
  27 + @Inject
  28 + @Name("pu1")
  29 + private EntityManager em1;
  30 +
  31 + @Inject
  32 + @Name("pu2")
  33 + private EntityManager em2;
  34 +
  35 + @Inject
  36 + private TransactionContext transactionContext;
  37 +
  38 + @Deployment
  39 + public static WebArchive createDeployment() {
  40 + WebArchive deployment = Tests.createDeployment(JPATransactionTest.class);
  41 + deployment.addAsResource(Tests.createFileAsset(PATH + "/persistence.xml"), "META-INF/persistence.xml");
  42 +
  43 + return deployment;
  44 + }
  45 +
  46 + @Before
  47 + public void eraseDatabases(){
  48 + transactionContext.getCurrentTransaction().begin();
  49 + em1.createQuery("DELETE FROM MyEntity1").executeUpdate();
  50 + em2.createQuery("DELETE FROM MyEntity2").executeUpdate();
  51 + transactionContext.getCurrentTransaction().commit();
  52 + }
  53 +
  54 + @Test
  55 + public void isTransactionActiveWithInterceptor(){
  56 + Assert.assertTrue(tb.isTransactionActiveWithInterceptor());
  57 + }
  58 +
  59 + @Test
  60 + public void isTransactionActiveWithoutInterceptor(){
  61 + Assert.assertFalse(tb.isTransactionActiveWithoutInterceptor());
  62 + }
  63 +
  64 + @Test
  65 + public void commitWithSuccess() {
  66 +
  67 + tb.commitWithSuccess();
  68 +
  69 + MyEntity1 entity1 = em1.find(MyEntity1.class, tb.createId("id-1"));
  70 + MyEntity2 entity2 = em2.find(MyEntity2.class, tb.createId("id-2"));
  71 +
  72 + Assert.assertEquals("desc-1", entity1.getDescription());
  73 + Assert.assertEquals("desc-2", entity2.getDescription());
  74 + }
  75 +
  76 + @Test
  77 + public void rollbackWithSuccess() {
  78 +
  79 + try{
  80 + tb.rollbackWithSuccess();
  81 + } catch (Exception e) {
  82 + Assert.assertEquals("Exceção criada para marcar transação para rollback", e.getMessage());
  83 + }
  84 + finally{
  85 + MyEntity1 entity1 = em1.find(MyEntity1.class, tb.createId("id-1"));
  86 + MyEntity2 entity2 = em2.find(MyEntity2.class, tb.createId("id-2"));
  87 +
  88 + Assert.assertNull(entity1);
  89 + Assert.assertNull(entity2);
  90 + }
  91 + }
  92 +
  93 +}
0 \ No newline at end of file 94 \ No newline at end of file
impl/extension/jpa/src/test/java/transaction/interceptor/MyEntity1.java 0 → 100644
@@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
  1 +package transaction.interceptor;
  2 +
  3 +import javax.persistence.Entity;
  4 +import javax.persistence.Id;
  5 +
  6 +@Entity
  7 +public class MyEntity1 {
  8 +
  9 + @Id
  10 + private String id;
  11 +
  12 + private String description;
  13 +
  14 + public String getId() {
  15 + return id;
  16 + }
  17 +
  18 + public void setId(String id) {
  19 + this.id = id;
  20 + }
  21 +
  22 + public String getDescription() {
  23 + return description;
  24 + }
  25 +
  26 + public void setDescription(String description) {
  27 + this.description = description;
  28 + }
  29 +}
impl/extension/jpa/src/test/java/transaction/interceptor/MyEntity2.java 0 → 100644
@@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
  1 +package transaction.interceptor;
  2 +
  3 +import javax.persistence.Entity;
  4 +import javax.persistence.Id;
  5 +
  6 +@Entity
  7 +public class MyEntity2 {
  8 +
  9 + @Id
  10 + private String id;
  11 +
  12 + private String description;
  13 +
  14 + public String getId() {
  15 + return id;
  16 + }
  17 +
  18 + public void setId(String id) {
  19 + this.id = id;
  20 + }
  21 +
  22 + public String getDescription() {
  23 + return description;
  24 + }
  25 +
  26 + public void setDescription(String description) {
  27 + this.description = description;
  28 + }
  29 +}
impl/extension/jpa/src/test/java/transaction/interceptor/TransactionalBusiness.java 0 → 100644
@@ -0,0 +1,64 @@ @@ -0,0 +1,64 @@
  1 +package transaction.interceptor;
  2 +
  3 +import javax.inject.Inject;
  4 +import javax.persistence.EntityManager;
  5 +
  6 +import br.gov.frameworkdemoiselle.annotation.Name;
  7 +import br.gov.frameworkdemoiselle.transaction.TransactionContext;
  8 +import br.gov.frameworkdemoiselle.transaction.Transactional;
  9 +
  10 +public class TransactionalBusiness {
  11 +
  12 + @Inject
  13 + @Name("pu1")
  14 + private EntityManager em1;
  15 +
  16 + @Inject
  17 + @Name("pu2")
  18 + private EntityManager em2;
  19 +
  20 + @Inject
  21 + private TransactionContext transactionContext;
  22 +
  23 + @Transactional
  24 + public boolean isTransactionActiveWithInterceptor(){
  25 + return transactionContext.getCurrentTransaction().isActive();
  26 + }
  27 +
  28 + public boolean isTransactionActiveWithoutInterceptor(){
  29 + return transactionContext.getCurrentTransaction().isActive();
  30 + }
  31 +
  32 + @Transactional
  33 + public void commitWithSuccess() {
  34 + MyEntity1 entity1 = new MyEntity1();
  35 + entity1.setId(createId("id-1"));
  36 + entity1.setDescription("desc-1");
  37 +
  38 + MyEntity2 entity2 = new MyEntity2();
  39 + entity2.setId(createId("id-2"));
  40 + entity2.setDescription("desc-2");
  41 +
  42 + em1.persist(entity1);
  43 + em2.persist(entity2);
  44 + }
  45 +
  46 + @Transactional
  47 + public void rollbackWithSuccess() throws Exception {
  48 + MyEntity1 entity1 = new MyEntity1();
  49 + entity1.setId(createId("id-3"));
  50 +
  51 + MyEntity2 entity2 = new MyEntity2();
  52 + entity2.setId(createId("id-4"));
  53 +
  54 + em1.persist(entity1);
  55 + em2.persist(entity2);
  56 +
  57 + throw new Exception("Exceção criada para marcar transação para rollback");
  58 + }
  59 +
  60 + String createId(String id) {
  61 + return this.getClass().getName() + "_" + id;
  62 + }
  63 +
  64 +}
impl/extension/jpa/src/test/java/transaction/manual/JPATransactionTest.java
@@ -9,6 +9,8 @@ import javax.inject.Inject; @@ -9,6 +9,8 @@ import javax.inject.Inject;
9 import javax.persistence.EntityManager; 9 import javax.persistence.EntityManager;
10 import javax.persistence.TransactionRequiredException; 10 import javax.persistence.TransactionRequiredException;
11 11
  12 +import junit.framework.Assert;
  13 +
12 import org.jboss.arquillian.container.test.api.Deployment; 14 import org.jboss.arquillian.container.test.api.Deployment;
13 import org.jboss.arquillian.junit.Arquillian; 15 import org.jboss.arquillian.junit.Arquillian;
14 import org.jboss.shrinkwrap.api.spec.WebArchive; 16 import org.jboss.shrinkwrap.api.spec.WebArchive;
@@ -20,6 +22,8 @@ import br.gov.frameworkdemoiselle.annotation.Name; @@ -20,6 +22,8 @@ import br.gov.frameworkdemoiselle.annotation.Name;
20 import br.gov.frameworkdemoiselle.transaction.JPATransaction; 22 import br.gov.frameworkdemoiselle.transaction.JPATransaction;
21 import br.gov.frameworkdemoiselle.transaction.Transaction; 23 import br.gov.frameworkdemoiselle.transaction.Transaction;
22 import br.gov.frameworkdemoiselle.transaction.TransactionContext; 24 import br.gov.frameworkdemoiselle.transaction.TransactionContext;
  25 +import br.gov.frameworkdemoiselle.util.Beans;
  26 +import br.gov.frameworkdemoiselle.util.NameQualifier;
23 27
24 @RunWith(Arquillian.class) 28 @RunWith(Arquillian.class)
25 public class JPATransactionTest { 29 public class JPATransactionTest {
@@ -37,7 +41,7 @@ public class JPATransactionTest { @@ -37,7 +41,7 @@ public class JPATransactionTest {
37 @Name("pu2") 41 @Name("pu2")
38 private EntityManager em2; 42 private EntityManager em2;
39 43
40 - @Deployment(name = "2") 44 + @Deployment
41 public static WebArchive createDeployment() { 45 public static WebArchive createDeployment() {
42 WebArchive deployment = Tests.createDeployment(JPATransactionTest.class); 46 WebArchive deployment = Tests.createDeployment(JPATransactionTest.class);
43 deployment.addAsResource(Tests.createFileAsset(PATH + "/persistence.xml"), "META-INF/persistence.xml"); 47 deployment.addAsResource(Tests.createFileAsset(PATH + "/persistence.xml"), "META-INF/persistence.xml");
@@ -120,6 +124,33 @@ public class JPATransactionTest { @@ -120,6 +124,33 @@ public class JPATransactionTest {
120 assertNull(persisted1); 124 assertNull(persisted1);
121 assertNull(persisted2); 125 assertNull(persisted2);
122 } 126 }
  127 +
  128 + @Test
  129 + public void checkEntityManagerCreatedAfterTransaction(){
  130 + Transaction transaction = transactionContext.getCurrentTransaction();
  131 +
  132 + String id = createId("id-5");
  133 + MyEntity1 entity1 = new MyEntity1();
  134 + entity1.setId(id);
  135 + entity1.setDescription("Test description");
  136 +
  137 + Assert.assertFalse(transaction.isActive());
  138 + transaction.begin();
  139 + Assert.assertTrue(transaction.isActive());
  140 +
  141 + EntityManager em1 = Beans.getReference(EntityManager.class, new NameQualifier("pu3"));
  142 +
  143 + try{
  144 + em1.persist(entity1);
  145 + transaction.commit();
  146 + }
  147 + catch(TransactionRequiredException te){
  148 + Assert.fail("Entity Manager não ingressou em transação já em curso: "+te.getMessage());
  149 + }
  150 +
  151 + entity1 = em1.find(MyEntity1.class, id);
  152 + Assert.assertEquals("Test description", entity1.getDescription());
  153 + }
123 154
124 private String createId(String id) { 155 private String createId(String id) {
125 return this.getClass().getName() + "_" + id; 156 return this.getClass().getName() + "_" + id;
impl/extension/jpa/src/test/resources/transaction/interceptor/persistence.xml 0 → 100644
@@ -0,0 +1,96 @@ @@ -0,0 +1,96 @@
  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 +<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  38 + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  39 +
  40 + <!--
  41 + <persistence-unit name="pu1" transaction-type="RESOURCE_LOCAL">
  42 + <non-jta-data-source>jdbc/arquillian1</non-jta-data-source>
  43 +
  44 + <class>transaction.manual.MyEntity1</class>
  45 + <class>transaction.manual.MyEntity2</class>
  46 +
  47 + <properties>
  48 + <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
  49 + <property name="eclipselink.logging.level.sql" value="FINE" />
  50 + <property name="eclipselink.logging.parameters" value="true" />
  51 + </properties>
  52 + </persistence-unit>
  53 +
  54 + <persistence-unit name="pu2" transaction-type="RESOURCE_LOCAL">
  55 + <non-jta-data-source>jdbc/arquillian2</non-jta-data-source>
  56 +
  57 + <class>transaction.manual.MyEntity1</class>
  58 + <class>transaction.manual.MyEntity2</class>
  59 +
  60 + <properties>
  61 + <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
  62 + <property name="eclipselink.logging.level.sql" value="FINE" />
  63 + <property name="eclipselink.logging.parameters" value="true" />
  64 + </properties>
  65 + </persistence-unit>
  66 + -->
  67 +
  68 + <!--
  69 + -->
  70 + <persistence-unit name="pu1" transaction-type="RESOURCE_LOCAL">
  71 + <non-jta-data-source>java:jboss/datasources/ExampleDS</non-jta-data-source>
  72 +
  73 + <class>transaction.interceptor.MyEntity1</class>
  74 + <class>transaction.interceptor.MyEntity2</class>
  75 +
  76 + <properties>
  77 + <property name="hibernate.show_sql" value="true" />
  78 + <property name="hibernate.format_sql" value="false" />
  79 + <property name="hibernate.hbm2ddl.auto" value="create-drop" />
  80 + </properties>
  81 + </persistence-unit>
  82 +
  83 + <persistence-unit name="pu2" transaction-type="RESOURCE_LOCAL">
  84 + <non-jta-data-source>java:jboss/datasources/ExampleDS</non-jta-data-source>
  85 +
  86 + <class>transaction.interceptor.MyEntity1</class>
  87 + <class>transaction.interceptor.MyEntity2</class>
  88 +
  89 + <properties>
  90 + <property name="hibernate.show_sql" value="true" />
  91 + <property name="hibernate.format_sql" value="false" />
  92 + <property name="hibernate.hbm2ddl.auto" value="create-drop" />
  93 + </properties>
  94 + </persistence-unit>
  95 +
  96 +</persistence>
0 \ No newline at end of file 97 \ No newline at end of file
impl/extension/jpa/src/test/resources/transaction/manual/persistence.xml
@@ -92,5 +92,18 @@ @@ -92,5 +92,18 @@
92 <property name="hibernate.hbm2ddl.auto" value="create-drop" /> 92 <property name="hibernate.hbm2ddl.auto" value="create-drop" />
93 </properties> 93 </properties>
94 </persistence-unit> 94 </persistence-unit>
  95 +
  96 + <persistence-unit name="pu3" transaction-type="RESOURCE_LOCAL">
  97 + <non-jta-data-source>java:jboss/datasources/ExampleDS</non-jta-data-source>
  98 +
  99 + <class>transaction.manual.MyEntity1</class>
  100 + <class>transaction.manual.MyEntity2</class>
  101 +
  102 + <properties>
  103 + <property name="hibernate.show_sql" value="true" />
  104 + <property name="hibernate.format_sql" value="false" />
  105 + <property name="hibernate.hbm2ddl.auto" value="create-drop" />
  106 + </properties>
  107 + </persistence-unit>
95 108
96 </persistence> 109 </persistence>
97 \ No newline at end of file 110 \ No newline at end of file
parent/bom/pom.xml
@@ -311,7 +311,7 @@ @@ -311,7 +311,7 @@
311 <!-- embedded containners --> 311 <!-- embedded containners -->
312 <dependency> 312 <dependency>
313 <groupId>org.glassfish.main.extras</groupId> 313 <groupId>org.glassfish.main.extras</groupId>
314 - <artifactId>glassfish-embedded-web</artifactId> 314 + <artifactId>glassfish-embedded-all</artifactId>
315 <version>${glassfish.embedded.version}</version> 315 <version>${glassfish.embedded.version}</version>
316 </dependency> 316 </dependency>
317 317
@@ -379,6 +379,13 @@ @@ -379,6 +379,13 @@
379 <artifactId>easymock</artifactId> 379 <artifactId>easymock</artifactId>
380 <version>${easymock.version}</version> 380 <version>${easymock.version}</version>
381 </dependency> 381 </dependency>
  382 +
  383 + <!-- Plug-ins -->
  384 + <dependency>
  385 + <groupId>org.apache.maven.plugins</groupId>
  386 + <artifactId>maven-surefire-plugin</artifactId>
  387 + <version>${maven.surefire.plugin.version}</version>
  388 + </dependency>
382 </dependencies> 389 </dependencies>
383 </dependencyManagement> 390 </dependencyManagement>
384 391
@@ -422,7 +429,7 @@ @@ -422,7 +429,7 @@
422 429
423 <junit.version>4.8.1</junit.version> 430 <junit.version>4.8.1</junit.version>
424 <easymock.version>3.0</easymock.version> 431 <easymock.version>3.0</easymock.version>
425 - 432 +
426 <arquillian.version>1.1.1.Final</arquillian.version> 433 <arquillian.version>1.1.1.Final</arquillian.version>
427 <!-- 434 <!--
428 <arquillian.version>1.0.4.Final</arquillian.version> 435 <arquillian.version>1.0.4.Final</arquillian.version>
@@ -430,8 +437,10 @@ @@ -430,8 +437,10 @@
430 <arquillian.weld.se.embedded.version>1.0.0.CR7</arquillian.weld.se.embedded.version> 437 <arquillian.weld.se.embedded.version>1.0.0.CR7</arquillian.weld.se.embedded.version>
431 <arquillian.persistence.version>1.0.0.Alpha6</arquillian.persistence.version> 438 <arquillian.persistence.version>1.0.0.Alpha6</arquillian.persistence.version>
432 <arquillian.glassfish.embedded.version>1.0.0.CR4</arquillian.glassfish.embedded.version> 439 <arquillian.glassfish.embedded.version>1.0.0.CR4</arquillian.glassfish.embedded.version>
433 -  
434 - <glassfish.embedded.version>3.1.2</glassfish.embedded.version> 440 +
  441 + <glassfish.embedded.version>3.1.2.2</glassfish.embedded.version>
  442 +
  443 + <maven.surefire.plugin.version>2.16</maven.surefire.plugin.version>
435 444
436 <powermock.version>1.4.6</powermock.version> 445 <powermock.version>1.4.6</powermock.version>
437 <primefaces.version>3.4</primefaces.version> 446 <primefaces.version>3.4</primefaces.version>
parent/extension/pom.xml
@@ -79,6 +79,12 @@ @@ -79,6 +79,12 @@
79 </dependencyManagement> 79 </dependencyManagement>
80 80
81 <build> 81 <build>
  82 + <testResources>
  83 + <testResource>
  84 + <directory>src/test/resources</directory>
  85 + <filtering>true</filtering>
  86 + </testResource>
  87 + </testResources>
82 <plugins> 88 <plugins>
83 <plugin> 89 <plugin>
84 <groupId>org.apache.maven.plugins</groupId> 90 <groupId>org.apache.maven.plugins</groupId>
@@ -96,6 +102,10 @@ @@ -96,6 +102,10 @@
96 <groupId>org.codehaus.mojo</groupId> 102 <groupId>org.codehaus.mojo</groupId>
97 <artifactId>cobertura-maven-plugin</artifactId> 103 <artifactId>cobertura-maven-plugin</artifactId>
98 </plugin> 104 </plugin>
  105 + <plugin>
  106 + <groupId>org.apache.maven.plugins</groupId>
  107 + <artifactId>maven-surefire-plugin</artifactId>
  108 + </plugin>
99 </plugins> 109 </plugins>
100 </build> 110 </build>
101 111