Commit a7df783ba26041e0fd09752ae2b2a6bc626e09e8
Exists in
master
Merge branch '2.3'
Showing
229 changed files
with
8718 additions
and
6553 deletions
Show diff stats
Too many changes.
To preserve performance only 100 of 229 files displayed.
archetype/jsf-jpa/pom.xml
| ... | ... | @@ -45,18 +45,33 @@ |
| 45 | 45 | <parent> |
| 46 | 46 | <groupId>br.gov.frameworkdemoiselle</groupId> |
| 47 | 47 | <artifactId>demoiselle-archetype-parent</artifactId> |
| 48 | - <version>2.2.3-SNAPSHOT</version> | |
| 49 | - <relativePath>../../parent/archetype/pom.xml</relativePath> | |
| 48 | + <version>2.3.0-RC2-SNAPSHOT</version> | |
| 49 | + <relativePath>../../parent/archetype</relativePath> | |
| 50 | 50 | </parent> |
| 51 | 51 | |
| 52 | - <name>JSF and JPA Archetype</name> | |
| 53 | - <description>Archetype for web applications (JSF/JPA)</description> | |
| 52 | + <name>Demoiselle Framework JSF and JPA Archetype</name> | |
| 53 | + <description> | |
| 54 | + Archetype for web applications (JSF/JPA) | |
| 55 | + </description> | |
| 56 | + <url>http://www.frameworkdemoiselle.gov.br</url> | |
| 57 | + | |
| 58 | + <licenses> | |
| 59 | + <license> | |
| 60 | + <name>GNU Lesser General Public License, Version 3</name> | |
| 61 | + <url>http://www.gnu.org/licenses/lgpl-3.0.txt</url> | |
| 62 | + </license> | |
| 63 | + </licenses> | |
| 64 | + | |
| 65 | + <organization> | |
| 66 | + <name>SERPRO - Serviço Federal de Processamento de Dados</name> | |
| 67 | + <url>http://www.serpro.gov.br</url> | |
| 68 | + </organization> | |
| 54 | 69 | |
| 55 | 70 | <repositories> |
| 56 | 71 | <repository> |
| 57 | - <id>demoiselle.sourceforge.net</id> | |
| 58 | - <name>Demoiselle Maven Repository</name> | |
| 59 | - <url>http://demoiselle.sourceforge.net/repository/release</url> | |
| 72 | + <id>sonatype-nexus-snapshots</id> | |
| 73 | + <name>Sonatype Nexus Snapshots</name> | |
| 74 | + <url>https://oss.sonatype.org/content/repositories/snapshots</url> | |
| 60 | 75 | </repository> |
| 61 | 76 | </repositories> |
| 62 | 77 | </project> | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/pom.xml
| ... | ... | @@ -25,28 +25,30 @@ |
| 25 | 25 | <artifactId>demoiselle-jpa</artifactId> |
| 26 | 26 | <scope>compile</scope> |
| 27 | 27 | </dependency> |
| 28 | + <!-- If you are using a JTA transaction then use this extension --> | |
| 29 | + <!-- | |
| 28 | 30 | <dependency> |
| 29 | 31 | <groupId>br.gov.frameworkdemoiselle</groupId> |
| 30 | 32 | <artifactId>demoiselle-jta</artifactId> |
| 31 | 33 | <scope>compile</scope> |
| 32 | 34 | </dependency> |
| 35 | + --> | |
| 33 | 36 | <dependency> |
| 34 | 37 | <groupId>org.primefaces</groupId> |
| 35 | 38 | <artifactId>primefaces</artifactId> |
| 36 | 39 | <scope>compile</scope> |
| 37 | 40 | </dependency> |
| 41 | + | |
| 38 | 42 | <dependency> |
| 39 | - <groupId>org.powermock</groupId> | |
| 40 | - <artifactId>powermock-api-easymock</artifactId> | |
| 43 | + <groupId>br.gov.frameworkdemoiselle.component</groupId> | |
| 44 | + <artifactId>demoiselle-junit</artifactId> | |
| 45 | + <version>2.3.0-RC1</version> | |
| 46 | + <scope>test</scope> | |
| 47 | + </dependency> | |
| 48 | + <dependency> | |
| 49 | + <groupId>org.slf4j</groupId> | |
| 50 | + <artifactId>slf4j-log4j12</artifactId> | |
| 41 | 51 | <scope>test</scope> |
| 42 | 52 | </dependency> |
| 43 | 53 | </dependencies> |
| 44 | - | |
| 45 | - <repositories> | |
| 46 | - <repository> | |
| 47 | - <id>demoiselle.sourceforge.net-release</id> | |
| 48 | - <url>http://demoiselle.sourceforge.net/repository/release</url> | |
| 49 | - </repository> | |
| 50 | - </repositories> | |
| 51 | - | |
| 52 | -</project> | |
| 53 | 54 | \ No newline at end of file |
| 55 | +</project> | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/src/main/java/business/BookmarkBC.java
| 1 | 1 | package ${package}.business; |
| 2 | 2 | |
| 3 | -import br.gov.frameworkdemoiselle.annotation.Startup; | |
| 3 | +import br.gov.frameworkdemoiselle.lifecycle.Startup; | |
| 4 | 4 | import br.gov.frameworkdemoiselle.stereotype.BusinessController; |
| 5 | 5 | import br.gov.frameworkdemoiselle.template.DelegateCrud; |
| 6 | 6 | import br.gov.frameworkdemoiselle.transaction.Transactional; | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/src/main/java/domain/Bookmark.java
| 1 | 1 | package ${package}.domain; |
| 2 | 2 | |
| 3 | +import static javax.persistence.GenerationType.SEQUENCE; | |
| 4 | + | |
| 3 | 5 | import java.io.Serializable; |
| 4 | 6 | |
| 5 | 7 | import javax.persistence.Column; |
| ... | ... | @@ -12,8 +14,11 @@ public class Bookmark implements Serializable { |
| 12 | 14 | |
| 13 | 15 | private static final long serialVersionUID = 1L; |
| 14 | 16 | |
| 17 | + /* | |
| 18 | + * If you are using Glassfish then remove the strategy attribute | |
| 19 | + */ | |
| 15 | 20 | @Id |
| 16 | - @GeneratedValue | |
| 21 | + @GeneratedValue(strategy = SEQUENCE) | |
| 17 | 22 | private Long id; |
| 18 | 23 | |
| 19 | 24 | @Column | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/src/main/java/persistence/BookmarkDAO.java
| 1 | 1 | package ${package}.persistence; |
| 2 | 2 | |
| 3 | -import javax.inject.Inject; | |
| 4 | - | |
| 5 | -import org.slf4j.Logger; | |
| 6 | - | |
| 7 | 3 | import br.gov.frameworkdemoiselle.stereotype.PersistenceController; |
| 8 | 4 | import br.gov.frameworkdemoiselle.template.JPACrud; |
| 9 | 5 | |
| ... | ... | @@ -14,8 +10,4 @@ public class BookmarkDAO extends JPACrud<Bookmark, Long> { |
| 14 | 10 | |
| 15 | 11 | private static final long serialVersionUID = 1L; |
| 16 | 12 | |
| 17 | - @Inject | |
| 18 | - @SuppressWarnings("unused") | |
| 19 | - private Logger logger; | |
| 20 | - | |
| 21 | 13 | } | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/src/main/resources/META-INF/beans.xml
| 1 | 1 | <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| 2 | 2 | xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> |
| 3 | 3 | |
| 4 | - <alternatives> | |
| 5 | - <class>br.gov.frameworkdemoiselle.transaction.JPATransaction</class> | |
| 6 | - | |
| 7 | - <!-- | |
| 8 | - <class>br.gov.frameworkdemoiselle.transaction.JTATransaction</class> | |
| 9 | - --> | |
| 10 | - </alternatives> | |
| 11 | 4 | </beans> | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/src/main/resources/META-INF/persistence.xml
| ... | ... | @@ -2,10 +2,40 @@ |
| 2 | 2 | <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| 3 | 3 | xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> |
| 4 | 4 | |
| 5 | - <!-- If you are using jboss6 with non JTA transaction then use this persistence-unit --> | |
| 5 | + <!-- If you are using JBoss AS7 with non JTA transaction then use this persistence-unit --> | |
| 6 | 6 | <!-- |
| 7 | 7 | --> |
| 8 | 8 | <persistence-unit name="bookmark-ds" transaction-type="RESOURCE_LOCAL"> |
| 9 | + <non-jta-data-source>java:jboss/datasources/ExampleDS</non-jta-data-source> | |
| 10 | + | |
| 11 | + <class>${package}.domain.Bookmark</class> | |
| 12 | + | |
| 13 | + <properties> | |
| 14 | + <property name="hibernate.show_sql" value="true" /> | |
| 15 | + <property name="hibernate.format_sql" value="false" /> | |
| 16 | + <property name="hibernate.hbm2ddl.auto" value="create-drop" /> | |
| 17 | + </properties> | |
| 18 | + </persistence-unit> | |
| 19 | + | |
| 20 | + <!-- If you are using JBoss AS7 with JTA transaction then use this persistence-unit --> | |
| 21 | + <!-- | |
| 22 | + <persistence-unit name="bookmark-ds" transaction-type="JTA"> | |
| 23 | + <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> | |
| 24 | + | |
| 25 | + <class>${package}.domain.Bookmark</class> | |
| 26 | + | |
| 27 | + <properties> | |
| 28 | + <property name="hibernate.show_sql" value="true" /> | |
| 29 | + <property name="hibernate.format_sql" value="false" /> | |
| 30 | + <property name="hibernate.hbm2ddl.auto" value="update" /> | |
| 31 | + <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> | |
| 32 | + </properties> | |
| 33 | + </persistence-unit> | |
| 34 | + --> | |
| 35 | + | |
| 36 | + <!-- If you are using JBoss AS6 with non JTA transaction then use this persistence-unit --> | |
| 37 | + <!-- | |
| 38 | + <persistence-unit name="bookmark-ds" transaction-type="RESOURCE_LOCAL"> | |
| 9 | 39 | <non-jta-data-source>java:/DefaultDS</non-jta-data-source> |
| 10 | 40 | |
| 11 | 41 | <class>${package}.domain.Bookmark</class> |
| ... | ... | @@ -14,11 +44,11 @@ |
| 14 | 44 | <property name="hibernate.show_sql" value="true" /> |
| 15 | 45 | <property name="hibernate.format_sql" value="false" /> |
| 16 | 46 | <property name="hibernate.hbm2ddl.auto" value="create-drop" /> |
| 17 | - <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" /> | |
| 18 | 47 | </properties> |
| 19 | 48 | </persistence-unit> |
| 20 | - | |
| 21 | - <!-- If you are using jboss6 with JTA transaction then use this persistence-unit --> | |
| 49 | + --> | |
| 50 | + | |
| 51 | + <!-- If you are using JBoss AS6 with JTA transaction then use this persistence-unit --> | |
| 22 | 52 | <!-- |
| 23 | 53 | <persistence-unit name="bookmark-ds" transaction-type="JTA"> |
| 24 | 54 | <jta-data-source>java:/DefaultDS</jta-data-source> |
| ... | ... | @@ -34,7 +64,37 @@ |
| 34 | 64 | </persistence-unit> |
| 35 | 65 | --> |
| 36 | 66 | |
| 37 | - <!-- If you are using tomcat6/tomcat7/junit then use this persistence-unit --> | |
| 67 | + <!-- If you are using GlassFish 3 with non JTA transaction then use this persistence-unit --> | |
| 68 | + <!-- | |
| 69 | + <persistence-unit name="bookmark-ds" transaction-type="RESOURCE_LOCAL"> | |
| 70 | + <non-jta-data-source>jdbc/__default</non-jta-data-source> | |
| 71 | + | |
| 72 | + <class>${package}.domain.Bookmark</class> | |
| 73 | + | |
| 74 | + <properties> | |
| 75 | + <property name="eclipselink.logging.level" value="FINE" /> | |
| 76 | + <property name="eclipselink.ddl-generation" value="create-tables" /> | |
| 77 | + <property name="eclipselink.ddl-generation.output-mode" value="database" /> | |
| 78 | + </properties> | |
| 79 | + </persistence-unit> | |
| 80 | + --> | |
| 81 | + | |
| 82 | + <!-- If you are using GlassFish 3 with JTA transaction then use this persistence-unit --> | |
| 83 | + <!-- | |
| 84 | + <persistence-unit name="bookmark-ds" transaction-type="JTA"> | |
| 85 | + <jta-data-source>jdbc/__TimerPool</jta-data-source> | |
| 86 | + | |
| 87 | + <class>${package}.domain.Bookmark</class> | |
| 88 | + | |
| 89 | + <properties> | |
| 90 | + <property name="eclipselink.logging.level" value="FINE" /> | |
| 91 | + <property name="eclipselink.ddl-generation" value="create-tables" /> | |
| 92 | + <property name="eclipselink.ddl-generation.output-mode" value="database" /> | |
| 93 | + </properties> | |
| 94 | + </persistence-unit> | |
| 95 | + --> | |
| 96 | + | |
| 97 | + <!-- If you are using Tomcat 6 / Tomcat 7 / JUnit then use this persistence-unit --> | |
| 38 | 98 | <!-- |
| 39 | 99 | <persistence-unit name="bookmark-ds" transaction-type="RESOURCE_LOCAL"> |
| 40 | 100 | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/src/main/resources/demoiselle.properties
| 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. | |
| 1 | +#Enables JPA transaction strategy, automatically detected if demoiselle-jpa component is detected. Use only if you need to overwrite the default behaviour | |
| 2 | +#frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JPATransaction | |
| 35 | 3 | |
| 4 | +#Enables JTA transaction strategy, automatically detected if demoiselle-jta component is detected. Use only if you need to overwrite the default behaviour | |
| 5 | +#frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JTATransaction | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/src/main/resources/log4j.properties
| 1 | -# Set root logger level to DEBUG and its only appender to A1. | |
| 2 | 1 | log4j.rootLogger=INFO, A1 |
| 3 | -log4j.logger.br.gov.demoiselle=DEBUG, A1 | |
| 4 | - | |
| 5 | -# A1 is set to be a ConsoleAppender. | |
| 6 | 2 | log4j.appender.A1=org.apache.log4j.ConsoleAppender |
| 7 | - | |
| 8 | -# A1 uses PatternLayout. | |
| 9 | 3 | log4j.appender.A1.layout=org.apache.log4j.PatternLayout |
| 10 | -log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %c - %m%n | |
| 11 | 4 | \ No newline at end of file |
| 5 | +log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %c - %m%n | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/beans.xml
0 → 100644
| ... | ... | @@ -0,0 +1,11 @@ |
| 1 | +<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
| 2 | + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> | |
| 3 | + | |
| 4 | + <interceptors> | |
| 5 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.ExceptionHandlerInterceptor</class> | |
| 6 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.RequiredPermissionInterceptor</class> | |
| 7 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.RequiredRoleInterceptor</class> | |
| 8 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.TransactionalInterceptor</class> | |
| 9 | + </interceptors> | |
| 10 | + | |
| 11 | +</beans> | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
| ... | ... | @@ -3,13 +3,28 @@ |
| 3 | 3 | xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" |
| 4 | 4 | version="3.0"> |
| 5 | 5 | |
| 6 | - <!-- If you are using tomcat6/tomcat7 then uncomment this listener --> | |
| 6 | + <!-- If you are using tomcat6/tomcat7/gae then uncomment this listener --> | |
| 7 | 7 | <!-- |
| 8 | 8 | <listener> |
| 9 | 9 | <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> |
| 10 | 10 | </listener> |
| 11 | 11 | --> |
| 12 | 12 | |
| 13 | + <!-- If you are using servlet 2.5 then uncomment this listener --> | |
| 14 | + <!-- | |
| 15 | + <listener> | |
| 16 | + <listener-class>br.gov.frameworkdemoiselle.util.ServletListener</listener-class> | |
| 17 | + </listener> | |
| 18 | + <filter> | |
| 19 | + <filter-name>Demoiselle Servlet Filter</filter-name> | |
| 20 | + <filter-class>br.gov.frameworkdemoiselle.util.ServletFilter</filter-class> | |
| 21 | + </filter> | |
| 22 | + <filter-mapping> | |
| 23 | + <filter-name>Demoiselle Servlet Filter</filter-name> | |
| 24 | + <url-pattern>/*</url-pattern> | |
| 25 | + </filter-mapping> | |
| 26 | + --> | |
| 27 | + | |
| 13 | 28 | <servlet> |
| 14 | 29 | <servlet-name>Faces Servlet</servlet-name> |
| 15 | 30 | <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> |
| ... | ... | @@ -29,5 +44,5 @@ |
| 29 | 44 | </web-resource-collection> |
| 30 | 45 | <auth-constraint /> |
| 31 | 46 | </security-constraint> |
| 32 | - | |
| 47 | + | |
| 33 | 48 | </web-app> | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/src/test/java/readme.txt
archetype/jsf-jpa/src/main/resources/archetype-resources/src/test/resources/META-INF/beans.xml
| 1 | 1 | <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| 2 | 2 | xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> |
| 3 | - | |
| 3 | + | |
| 4 | + <interceptors> | |
| 5 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.ExceptionHandlerInterceptor</class> | |
| 6 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.RequiredPermissionInterceptor</class> | |
| 7 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.RequiredRoleInterceptor</class> | |
| 8 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.TransactionalInterceptor</class> | |
| 9 | + </interceptors> | |
| 10 | + | |
| 4 | 11 | </beans> | ... | ... |
archetype/jsf-jpa/src/main/resources/archetype-resources/src/test/resources/META-INF/persistence.xml
| ... | ... | @@ -13,7 +13,7 @@ |
| 13 | 13 | <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" /> |
| 14 | 14 | <property name="javax.persistence.jdbc.user" value="sa" /> |
| 15 | 15 | <property name="javax.persistence.jdbc.password" value="" /> |
| 16 | - <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:hsql:." /> | |
| 16 | + <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:." /> | |
| 17 | 17 | |
| 18 | 18 | <property name="hibernate.show_sql" value="true" /> |
| 19 | 19 | <property name="hibernate.format_sql" value="false" /> | ... | ... |
archetype/minimal/pom.xml
| ... | ... | @@ -45,18 +45,33 @@ |
| 45 | 45 | <parent> |
| 46 | 46 | <groupId>br.gov.frameworkdemoiselle</groupId> |
| 47 | 47 | <artifactId>demoiselle-archetype-parent</artifactId> |
| 48 | - <version>2.2.3-SNAPSHOT</version> | |
| 49 | - <relativePath>../../parent/archetype/pom.xml</relativePath> | |
| 48 | + <version>2.3.0-RC2-SNAPSHOT</version> | |
| 49 | + <relativePath>../../parent/archetype</relativePath> | |
| 50 | 50 | </parent> |
| 51 | 51 | |
| 52 | - <name>Minimal Archetype</name> | |
| 53 | - <description>Basic archetype for generic applications</description> | |
| 52 | + <name>Demoiselle Framework Minimal Archetype</name> | |
| 53 | + <description> | |
| 54 | + Basic archetype for generic applications | |
| 55 | + </description> | |
| 56 | + <url>http://www.frameworkdemoiselle.gov.br</url> | |
| 57 | + | |
| 58 | + <licenses> | |
| 59 | + <license> | |
| 60 | + <name>GNU Lesser General Public License, Version 3</name> | |
| 61 | + <url>http://www.gnu.org/licenses/lgpl-3.0.txt</url> | |
| 62 | + </license> | |
| 63 | + </licenses> | |
| 64 | + | |
| 65 | + <organization> | |
| 66 | + <name>SERPRO - Serviço Federal de Processamento de Dados</name> | |
| 67 | + <url>http://www.serpro.gov.br</url> | |
| 68 | + </organization> | |
| 54 | 69 | |
| 55 | 70 | <repositories> |
| 56 | 71 | <repository> |
| 57 | - <id>demoiselle.sourceforge.net</id> | |
| 58 | - <name>Demoiselle Maven Repository</name> | |
| 59 | - <url>http://demoiselle.sourceforge.net/repository/release</url> | |
| 72 | + <id>sonatype-nexus-snapshots</id> | |
| 73 | + <name>Sonatype Nexus Snapshots</name> | |
| 74 | + <url>https://oss.sonatype.org/content/repositories/snapshots</url> | |
| 60 | 75 | </repository> |
| 61 | 76 | </repositories> |
| 62 | 77 | </project> | ... | ... |
archetype/minimal/src/main/resources/archetype-resources/pom.xml
| ... | ... | @@ -21,16 +21,15 @@ |
| 21 | 21 | |
| 22 | 22 | <dependencies> |
| 23 | 23 | <dependency> |
| 24 | + <groupId>br.gov.frameworkdemoiselle.component</groupId> | |
| 25 | + <artifactId>demoiselle-junit</artifactId> | |
| 26 | + <version>2.3.0-RC1</version> | |
| 27 | + <scope>test</scope> | |
| 28 | + </dependency> | |
| 29 | + <dependency> | |
| 24 | 30 | <groupId>org.slf4j</groupId> |
| 25 | 31 | <artifactId>slf4j-log4j12</artifactId> |
| 26 | 32 | <scope>test</scope> |
| 27 | 33 | </dependency> |
| 28 | 34 | </dependencies> |
| 29 | - | |
| 30 | - <repositories> | |
| 31 | - <repository> | |
| 32 | - <id>demoiselle.sourceforge.net-release</id> | |
| 33 | - <url>http://demoiselle.sourceforge.net/repository/release</url> | |
| 34 | - </repository> | |
| 35 | - </repositories> | |
| 36 | 35 | </project> |
| 37 | 36 | \ No newline at end of file | ... | ... |
archetype/minimal/src/main/resources/archetype-resources/src/main/resources/META-INF/beans.xml
archetype/minimal/src/main/resources/archetype-resources/src/test/resources/META-INF/beans.xml
| 1 | 1 | <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| 2 | 2 | xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> |
| 3 | 3 | |
| 4 | + <interceptors> | |
| 5 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.ExceptionHandlerInterceptor</class> | |
| 6 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.RequiredPermissionInterceptor</class> | |
| 7 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.RequiredRoleInterceptor</class> | |
| 8 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.TransactionalInterceptor</class> | |
| 9 | + </interceptors> | |
| 10 | + | |
| 4 | 11 | </beans> | ... | ... |
archetype/pom.xml
| ... | ... | @@ -1,89 +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 | -<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"> | |
| 38 | - | |
| 39 | - <modelVersion>4.0.0</modelVersion> | |
| 40 | - | |
| 41 | - <groupId>br.gov.frameworkdemoiselle</groupId> | |
| 42 | - <artifactId>demoiselle-framework-archetype-build</artifactId> | |
| 43 | - <version>2.2.3-SNAPSHOT</version> | |
| 44 | - <packaging>pom</packaging> | |
| 45 | - | |
| 46 | - <name>Archetypes Build Aggregator</name> | |
| 47 | - <description> | |
| 48 | - </description> | |
| 49 | - | |
| 50 | - <modules> | |
| 51 | - <module>jsf-jpa</module> | |
| 52 | - <module>minimal</module> | |
| 53 | - </modules> | |
| 54 | - | |
| 55 | - <build> | |
| 56 | - <plugins> | |
| 57 | - <plugin> | |
| 58 | - <groupId>org.codehaus.mojo</groupId> | |
| 59 | - <artifactId>wagon-maven-plugin</artifactId> | |
| 60 | - <configuration> | |
| 61 | - <url>.</url> | |
| 62 | - <skip>true</skip> | |
| 63 | - </configuration> | |
| 64 | - </plugin> | |
| 65 | - <plugin> | |
| 66 | - <groupId>org.apache.maven.plugins</groupId> | |
| 67 | - <artifactId>maven-deploy-plugin</artifactId> | |
| 68 | - <configuration> | |
| 69 | - <skip>true</skip> | |
| 70 | - </configuration> | |
| 71 | - </plugin> | |
| 72 | - </plugins> | |
| 73 | - </build> | |
| 74 | - | |
| 75 | - <distributionManagement> | |
| 76 | - <repository> | |
| 77 | - <id /> | |
| 78 | - <url /> | |
| 79 | - </repository> | |
| 80 | - <snapshotRepository> | |
| 81 | - <id /> | |
| 82 | - <url /> | |
| 83 | - </snapshotRepository> | |
| 84 | - <site> | |
| 85 | - <id /> | |
| 86 | - <url>file://${project.build.directory}/tmp</url> | |
| 87 | - </site> | |
| 88 | - </distributionManagement> | |
| 89 | -</project> |
documentation/pom.xml
| ... | ... | @@ -1,89 +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 | -<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"> | |
| 38 | - | |
| 39 | - <modelVersion>4.0.0</modelVersion> | |
| 40 | - | |
| 41 | - <groupId>br.gov.frameworkdemoiselle</groupId> | |
| 42 | - <artifactId>demoiselle-framework-documentation-build</artifactId> | |
| 43 | - <packaging>pom</packaging> | |
| 44 | - <version>2.2.3-SNAPSHOT</version> | |
| 45 | - | |
| 46 | - <name>Documentation Build Aggregator</name> | |
| 47 | - <description> | |
| 48 | - </description> | |
| 49 | - | |
| 50 | - <modules> | |
| 51 | - <module>reference</module> | |
| 52 | - <module>quickstart</module> | |
| 53 | - </modules> | |
| 54 | - | |
| 55 | - <build> | |
| 56 | - <plugins> | |
| 57 | - <plugin> | |
| 58 | - <groupId>org.codehaus.mojo</groupId> | |
| 59 | - <artifactId>wagon-maven-plugin</artifactId> | |
| 60 | - <configuration> | |
| 61 | - <url>.</url> | |
| 62 | - <skip>true</skip> | |
| 63 | - </configuration> | |
| 64 | - </plugin> | |
| 65 | - <plugin> | |
| 66 | - <groupId>org.apache.maven.plugins</groupId> | |
| 67 | - <artifactId>maven-deploy-plugin</artifactId> | |
| 68 | - <configuration> | |
| 69 | - <skip>true</skip> | |
| 70 | - </configuration> | |
| 71 | - </plugin> | |
| 72 | - </plugins> | |
| 73 | - </build> | |
| 74 | - | |
| 75 | - <distributionManagement> | |
| 76 | - <repository> | |
| 77 | - <id /> | |
| 78 | - <url /> | |
| 79 | - </repository> | |
| 80 | - <snapshotRepository> | |
| 81 | - <id /> | |
| 82 | - <url /> | |
| 83 | - </snapshotRepository> | |
| 84 | - <site> | |
| 85 | - <id /> | |
| 86 | - <url>file://${project.build.directory}/tmp</url> | |
| 87 | - </site> | |
| 88 | - </distributionManagement> | |
| 89 | -</project> |
documentation/quickstart/pom.xml
| ... | ... | @@ -40,16 +40,16 @@ |
| 40 | 40 | |
| 41 | 41 | <artifactId>demoiselle-framework-quickstart</artifactId> |
| 42 | 42 | <packaging>jdocbook</packaging> |
| 43 | - <version>2.2.3-SNAPSHOT</version> | |
| 43 | + <version>2.3.0-RC2-SNAPSHOT</version> | |
| 44 | 44 | |
| 45 | 45 | <parent> |
| 46 | 46 | <groupId>br.gov.frameworkdemoiselle</groupId> |
| 47 | 47 | <artifactId>demoiselle-documentation-parent</artifactId> |
| 48 | - <version>2</version> | |
| 49 | - <relativePath>../../../internal/parent/documentation/pom.xml</relativePath> | |
| 48 | + <version>3-SNAPSHOT</version> | |
| 49 | + <relativePath>../../../internal/parent/documentation</relativePath> | |
| 50 | 50 | </parent> |
| 51 | 51 | |
| 52 | - <name>Quickstart Documentation</name> | |
| 52 | + <name>Demoiselle Framework Quickstart Documentation</name> | |
| 53 | 53 | <description /> |
| 54 | 54 | |
| 55 | 55 | <build> |
| ... | ... | @@ -99,12 +99,12 @@ |
| 99 | 99 | </plugins> |
| 100 | 100 | </pluginManagement> |
| 101 | 101 | </build> |
| 102 | - | |
| 102 | + | |
| 103 | 103 | <repositories> |
| 104 | 104 | <repository> |
| 105 | - <id>demoiselle.sourceforge.net</id> | |
| 106 | - <name>Demoiselle Maven Repository</name> | |
| 107 | - <url>http://demoiselle.sourceforge.net/repository/release</url> | |
| 105 | + <id>sonatype-nexus-snapshots</id> | |
| 106 | + <name>Sonatype Nexus Snapshots</name> | |
| 107 | + <url>https://oss.sonatype.org/content/repositories/snapshots</url> | |
| 108 | 108 | </repository> |
| 109 | 109 | </repositories> |
| 110 | 110 | ... | ... |
documentation/quickstart/pt-BR/criacao.xml
| ... | ... | @@ -425,7 +425,7 @@ public class BookmarkListMB extends AbstractListPageBean<Bookmark, Long> { |
| 425 | 425 | <filename>bookmark_list.xhtml</filename> com o conteúdo seguinte: |
| 426 | 426 | </para> |
| 427 | 427 | <programlisting role="XML"><![CDATA[<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" |
| 428 | - xmlns:p="http://primefaces.prime.com.tr/ui" xmlns:h="http://java.sun.com/jsf/html" | |
| 428 | + xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html" | |
| 429 | 429 | xmlns:ui="http://java.sun.com/jsf/facelets" template="/template/main.xhtml"> |
| 430 | 430 | <ui:define name="body"> |
| 431 | 431 | <h:form> |
| ... | ... | @@ -470,7 +470,7 @@ public class BookmarkListMB extends AbstractListPageBean<Bookmark, Long> { |
| 470 | 470 | <filename>menu.xhtml</filename> com o conteúdo seguinte: |
| 471 | 471 | </para> |
| 472 | 472 | <programlisting role="XML"><![CDATA[<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" |
| 473 | - xmlns:p="http://primefaces.prime.com.tr/ui" xmlns:h="http://java.sun.com/jsf/html" | |
| 473 | + xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html" | |
| 474 | 474 | xmlns:ui="http://java.sun.com/jsf/facelets"> |
| 475 | 475 | <h:form> |
| 476 | 476 | <p:menubar> | ... | ... |
documentation/quickstart/pt-BR/melhoria.xml
| ... | ... | @@ -130,7 +130,7 @@ public class BookmarkListMB extends AbstractListPageBean<Bookmark, Long> { |
| 130 | 130 | <filename>bookmark_edit.xhtml</filename> com o conteúdo seguinte: |
| 131 | 131 | </para> |
| 132 | 132 | <programlisting role="XML"><![CDATA[<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" |
| 133 | - xmlns:p="http://primefaces.prime.com.tr/ui" xmlns:h="http://java.sun.com/jsf/html" | |
| 133 | + xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html" | |
| 134 | 134 | xmlns:ui="http://java.sun.com/jsf/facelets" template="/template/main.xhtml"> |
| 135 | 135 | <ui:define name="body"> |
| 136 | 136 | <h:form prependId="false"> |
| ... | ... | @@ -184,7 +184,7 @@ public class BookmarkListMB extends AbstractListPageBean<Bookmark, Long> { |
| 184 | 184 | <filename>bookmark_list.xhtml</filename> com o conteúdo seguinte: |
| 185 | 185 | </para> |
| 186 | 186 | <programlisting role="XML"><![CDATA[<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" |
| 187 | - xmlns:p="http://primefaces.prime.com.tr/ui" xmlns:h="http://java.sun.com/jsf/html" | |
| 187 | + xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html" | |
| 188 | 188 | xmlns:ui="http://java.sun.com/jsf/facelets" template="/template/main.xhtml"> |
| 189 | 189 | <ui:define name="body"> |
| 190 | 190 | <h:form> |
| ... | ... | @@ -242,7 +242,7 @@ public class BookmarkListMB extends AbstractListPageBean<Bookmark, Long> { |
| 242 | 242 | <filename>menu.xhtml</filename> conforme o conteúdo seguinte: |
| 243 | 243 | </para> |
| 244 | 244 | <programlisting role="XML"><![CDATA[<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" |
| 245 | - xmlns:p="http://primefaces.prime.com.tr/ui" xmlns:h="http://java.sun.com/jsf/html" | |
| 245 | + xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html" | |
| 246 | 246 | xmlns:ui="http://java.sun.com/jsf/facelets"> |
| 247 | 247 | <h:form> |
| 248 | 248 | <p:menubar> | ... | ... |
documentation/reference/pom.xml
| ... | ... | @@ -40,16 +40,16 @@ |
| 40 | 40 | |
| 41 | 41 | <artifactId>demoiselle-framework-reference</artifactId> |
| 42 | 42 | <packaging>jdocbook</packaging> |
| 43 | - <version>2.2.3-SNAPSHOT</version> | |
| 43 | + <version>2.3.0-RC2-SNAPSHOT</version> | |
| 44 | 44 | |
| 45 | 45 | <parent> |
| 46 | 46 | <groupId>br.gov.frameworkdemoiselle</groupId> |
| 47 | 47 | <artifactId>demoiselle-documentation-parent</artifactId> |
| 48 | - <version>2</version> | |
| 49 | - <relativePath>../../../internal/parent/documentation/pom.xml</relativePath> | |
| 48 | + <version>3-SNAPSHOT</version> | |
| 49 | + <relativePath>../../../internal/parent/documentation</relativePath> | |
| 50 | 50 | </parent> |
| 51 | 51 | |
| 52 | - <name>Reference Documentation</name> | |
| 52 | + <name>Demoiselle Framework Reference Documentation</name> | |
| 53 | 53 | <description /> |
| 54 | 54 | |
| 55 | 55 | <build> |
| ... | ... | @@ -102,12 +102,12 @@ |
| 102 | 102 | |
| 103 | 103 | <repositories> |
| 104 | 104 | <repository> |
| 105 | - <id>demoiselle.sourceforge.net</id> | |
| 106 | - <name>Demoiselle Maven Repository</name> | |
| 107 | - <url>http://demoiselle.sourceforge.net/repository/release</url> | |
| 105 | + <id>sonatype-nexus-snapshots</id> | |
| 106 | + <name>Sonatype Nexus Snapshots</name> | |
| 107 | + <url>https://oss.sonatype.org/content/repositories/snapshots</url> | |
| 108 | 108 | </repository> |
| 109 | 109 | </repositories> |
| 110 | - | |
| 110 | + | |
| 111 | 111 | <properties> |
| 112 | 112 | <project.context>framework/reference</project.context> |
| 113 | 113 | </properties> | ... | ... |
documentation/reference/pt-BR/authorgroup.xml
| ... | ... | @@ -34,4 +34,12 @@ |
| 34 | 34 | <firstname>Wilson</firstname> |
| 35 | 35 | <surname>Guimarães</surname> |
| 36 | 36 | </author> |
| 37 | + <author> | |
| 38 | + <firstname>Emerson</firstname> | |
| 39 | + <surname>Oliveira</surname> | |
| 40 | + </author> | |
| 41 | + <author> | |
| 42 | + <firstname>Luciano</firstname> | |
| 43 | + <surname>Borges</surname> | |
| 44 | + </author> | |
| 37 | 45 | </authorgroup> | ... | ... |
documentation/reference/pt-BR/configuracao.xml
| ... | ... | @@ -47,6 +47,25 @@ |
| 47 | 47 | </section> |
| 48 | 48 | |
| 49 | 49 | <section> |
| 50 | + <title>Configurando</title> | |
| 51 | + <para> | |
| 52 | + Para um correto funcionamento do Demoiselle é necessário inserir o interceptador de configuração no arquivo <filename>src/main/WEB-INF/beans.xml</filename>. | |
| 53 | + </para> | |
| 54 | + <programlisting role="XML"> | |
| 55 | + <![CDATA[ | |
| 56 | + <beans xmlns="http://java.sun.com/xml/ns/javaee" | |
| 57 | + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
| 58 | + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
| 59 | + http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> | |
| 60 | + <interceptors> | |
| 61 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.ConfigurationInterceptor</class> | |
| 62 | + </interceptors> | |
| 63 | + </beans> | |
| 64 | + ]]> | |
| 65 | + </programlisting> | |
| 66 | + </section> | |
| 67 | + | |
| 68 | + <section> | |
| 50 | 69 | <title>As classes de configuração</title> |
| 51 | 70 | <para> |
| 52 | 71 | A primeira etapa para a utilização do mecanismo de configuração em uma aplicação consiste em criar uma classe específica | ... | ... |
documentation/reference/pt-BR/excecao.xml
| ... | ... | @@ -11,6 +11,25 @@ |
| 11 | 11 | Oferecemos à você uma alternativa para resolver estes problemas, mas você estará livre para usá-la: isoladamente, |
| 12 | 12 | misturando com a forma verbosa ou até mesmo não usá-la. |
| 13 | 13 | </para> |
| 14 | + | |
| 15 | + <section> | |
| 16 | + <title>Configurando</title> | |
| 17 | + <para> | |
| 18 | + Para um correto funcionamento do Demoiselle é necessário inserir o interceptador de exceção no arquivo <filename>src/main/WEB-INF/beans.xml</filename>. | |
| 19 | + </para> | |
| 20 | + <programlisting role="XML"> | |
| 21 | + <![CDATA[ | |
| 22 | + <beans xmlns="http://java.sun.com/xml/ns/javaee" | |
| 23 | + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
| 24 | + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
| 25 | + http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> | |
| 26 | + <interceptors> | |
| 27 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.ExceptionHandlerInterceptor</class> | |
| 28 | + </interceptors> | |
| 29 | + </beans> | |
| 30 | + ]]> | |
| 31 | + </programlisting> | |
| 32 | + </section> | |
| 14 | 33 | |
| 15 | 34 | <section> |
| 16 | 35 | <title>Tratadores de exceção</title> | ... | ... |
documentation/reference/pt-BR/master.xml
| ... | ... | @@ -41,7 +41,8 @@ |
| 41 | 41 | <xi:include href="logger.xml" xmlns:xi="http://www.w3.org/2001/XInclude" /> |
| 42 | 42 | <xi:include href="templates.xml" xmlns:xi="http://www.w3.org/2001/XInclude" /> |
| 43 | 43 | <xi:include href="security.xml" xmlns:xi="http://www.w3.org/2001/XInclude" /> |
| 44 | - <!-- <xi:include href="paginacao.xml" xmlns:xi="http://www.w3.org/2001/XInclude" /> --> | |
| 44 | + <xi:include href="paginacao.xml" xmlns:xi="http://www.w3.org/2001/XInclude" /> | |
| 45 | + <xi:include href="properties.xml" xmlns:xi="http://www.w3.org/2001/XInclude" /> | |
| 45 | 46 | </part> |
| 46 | 47 | <!-- parte 2 --> |
| 47 | 48 | <!-- <part id="2">--> |
| ... | ... | @@ -52,4 +53,4 @@ |
| 52 | 53 | <!-- apêndices --> |
| 53 | 54 | <xi:include href="instalacao.xml" xmlns:xi="http://www.w3.org/2001/XInclude" /> |
| 54 | 55 | |
| 55 | -</book> | |
| 56 | 56 | \ No newline at end of file |
| 57 | +</book> | ... | ... |
documentation/reference/pt-BR/paginacao.xml
| ... | ... | @@ -3,202 +3,289 @@ |
| 3 | 3 | "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" []> |
| 4 | 4 | <chapter id="paginacao"> |
| 5 | 5 | |
| 6 | - <title>Paginação</title> | |
| 6 | + <title>Paginação</title> | |
| 7 | 7 | |
| 8 | - <para> | |
| 9 | - Neste capítulo serão considerados os seguintes assuntos: | |
| 10 | - <itemizedlist> | |
| 11 | - <listitem>motivação para o uso de um mecanismo padronizado para <emphasis>paginação</emphasis>;</listitem> | |
| 12 | - <listitem>funcionamento e uso da estrutura <literal>Pagination</literal> e do contexto de paginação (<literal>PaginationContext</literal>).</listitem> | |
| 13 | - </itemizedlist> | |
| 14 | - </para> | |
| 15 | - | |
| 16 | - <section> | |
| 17 | - <title>Introdução ao mecanismo</title> | |
| 18 | - <para> | |
| 19 | - A apresentação de conjuntos de registros de médio a grande porte em formato de tabelas em aplicações Web geralmente requer um | |
| 20 | - <emphasis>mecanismo de paginação</emphasis>, o qual permite ao cliente ver apenas um pedaço do resultado final, podendo este | |
| 21 | - navegar para frente e para trás através dos registros. A menos que o conjunto de registros seja garantidamente pequeno, qualquer | |
| 22 | - aplicação do tipo Web com funcionalidades de busca precisa ser dotada de paginação. | |
| 23 | - </para> | |
| 24 | - <para> | |
| 25 | - O mecanismo de paginação para as aplicações fornecido pelo <emphasis>Demoiselle Framework</emphasis> consiste em um algoritmo de | |
| 26 | - direcionado ao banco de dados (i.e., Database-Driven Pagination). Essa abordagem, apesar de requerer instruções SQL específicas | |
| 27 | - para obter porções determinadas de registros, é a mais utilizada por ser mais eficiente e produzir menos redundância dos dados. | |
| 28 | - </para> | |
| 29 | - <para> | |
| 30 | - É fornecido em tempo de execução um <emphasis>contexto de paginação</emphasis>, o qual tem escopo de sessão e armazena a informação | |
| 31 | - de paginação de cada entidade (i.e., bean) que necessite de tal mecanismo. Esse contexto é compartilhado entre as diversas camadas | |
| 32 | - da aplicação, especificamente entre as camadas de visão e persistência. Dessa maneira, a paginação dos dados é transparente para a | |
| 33 | - camada intermediária (i.e., negócio) e não interfere na modelagem das classes de um projeto. | |
| 34 | - </para> | |
| 35 | - </section> | |
| 36 | - | |
| 37 | - <section> | |
| 38 | - <title>Códigos de suporte</title> | |
| 39 | - <para> | |
| 40 | - // TODO: explicar Pagination e PaginationContext | |
| 41 | - </para> | |
| 42 | - <para> | |
| 43 | - Veremos na seção seguinte como implementar a paginação em uma aplicação Java. | |
| 44 | - | |
| 45 | - - Farão parte do código de suporte para paginação: | |
| 46 | - * a classe Pagination: usada para manipular a paginação dos dados resultantes, contendo os campos currentPage (página atual, selecionada na camada de visão), pageSize (tamanho da página, a quantidade de registros que ela comportará) e totalResults (a quantidade de resultados existentes na base de dados); | |
| 47 | - * a classe PaginationContext: contexto usado para armazenar e fornecer estruturas do tipo Pagination; | |
| 48 | - * a classe PaginationConfig: armazenador de configurações referentes à paginação. | |
| 49 | - | |
| 50 | -- Códigos internos de suporte no Core: | |
| 51 | - | |
| 52 | - <programlisting role="JAVA"><![CDATA[ | |
| 53 | - | |
| 54 | -public class Pagination { | |
| 55 | - | |
| 56 | - private int currentPage; | |
| 57 | - private int pageSize; | |
| 58 | - | |
| 59 | - private Long totalResults; | |
| 60 | - private Integer totalPages; | |
| 61 | - | |
| 62 | - // ... | |
| 63 | -} | |
| 64 | - | |
| 65 | -@SessionScoped | |
| 66 | -public class PaginationContext { | |
| 67 | - | |
| 68 | - private final Map<Class<?>, Pagination> map; | |
| 69 | - | |
| 70 | - public Pagination getPagination(Class<?> clazz) { ... } | |
| 71 | - | |
| 72 | - public Pagination getPagination(Class<?> clazz, boolean create) { ... } | |
| 73 | - | |
| 74 | -} | |
| 75 | - | |
| 76 | -@Configuration | |
| 77 | -public class PaginationConfig { | |
| 78 | - | |
| 79 | - @Key("default_page_size") | |
| 80 | - private int defaultPageSize = 10; | |
| 81 | - | |
| 82 | - @Key("max_page_links") | |
| 83 | - private int maxPageLinks = 5; | |
| 84 | - | |
| 85 | -} | |
| 86 | - | |
| 87 | - - Códigos internos de suporte em JPA: | |
| 88 | - | |
| 89 | -public class JPACrud<T, I> implements Crud<T, I> { | |
| 90 | - | |
| 91 | - @Inject | |
| 92 | - private PaginationContext paginationContext; | |
| 93 | - | |
| 94 | - // ... | |
| 95 | - | |
| 96 | - public List<T> findAll() { | |
| 97 | - | |
| 98 | - final String jpql = "select this from " + getBeanClass().getSimpleName() + " this"; | |
| 99 | - final Query query = getEntityManager().createQuery(jpql); | |
| 100 | - | |
| 101 | - final Pagination pagination = paginationContext.getPagination(getBeanClass()); | |
| 102 | - if (pagination != null) { | |
| 103 | - if (pagination.getTotalPages() == null) { | |
| 104 | - pagination.setTotalResults(this.countAll()); | |
| 105 | - } | |
| 106 | - query.setFirstResult(pagination.getFirstResult()); | |
| 107 | - query.setMaxResults(pagination.getPageSize()); | |
| 108 | - } | |
| 109 | - | |
| 110 | - // ... | |
| 111 | - } | |
| 112 | - | |
| 113 | -} | |
| 114 | - | |
| 115 | - - Códigos internos de suporte em JSF: | |
| 116 | - | |
| 117 | -public abstract class AbstractListPageBean<T, I> extends AbstractPage implements ListPageBean<T, I> { | |
| 118 | - | |
| 119 | - @Inject | |
| 120 | - private PaginationContext paginationContext; | |
| 121 | - | |
| 122 | - @Inject | |
| 123 | - private PaginationConfig paginationConfig; | |
| 124 | - | |
| 125 | - // ... | |
| 126 | - | |
| 127 | - public Pagination getPagination() { | |
| 128 | - return paginationContext.getPagination(getBeanClass(), true); | |
| 129 | - } | |
| 130 | - | |
| 131 | - public int getPageSize() { | |
| 132 | - return paginationConfig.getDefaultPageSize(); | |
| 133 | - } | |
| 134 | - | |
| 135 | - public int getMaxPageLinks() { | |
| 136 | - return paginationConfig.getMaxPageLinks(); | |
| 137 | - } | |
| 138 | - | |
| 139 | -} | |
| 140 | - | |
| 141 | -frameworkdemoiselle.pagination.default_page_size=50 | |
| 142 | -frameworkdemoiselle.pagination.max_page_links=10 | |
| 143 | - | |
| 144 | -]]></programlisting> | |
| 145 | - </para> | |
| 146 | - </section> | |
| 8 | + <para> | |
| 9 | + Neste capítulo serão considerados os seguintes assuntos: | |
| 10 | + <itemizedlist> | |
| 11 | + <listitem><para>Motivação para o uso de um mecanismo padronizado para <emphasis>paginação</emphasis>;</para></listitem> | |
| 12 | + <listitem><para>Funcionamento e uso da estrutura <literal>Pagination</literal> e do contexto de paginação | |
| 13 | + (<literal>PaginationContext</literal>).</para></listitem> | |
| 14 | + </itemizedlist> | |
| 15 | + </para> | |
| 16 | + | |
| 17 | + <section> | |
| 18 | + <title>Introdução ao mecanismo</title> | |
| 19 | + <para> | |
| 20 | + A apresentação de conjuntos de registros de médio a grande porte em formato de tabelas em aplicações Web geralmente requer um | |
| 21 | + <emphasis>mecanismo de paginação</emphasis>, o qual permite ao cliente ver apenas um pedaço do resultado final, podendo este | |
| 22 | + navegar para frente e para trás através dos registros. A menos que o conjunto de registros seja garantidamente pequeno, qualquer | |
| 23 | + aplicação do tipo Web com funcionalidades de busca precisa ser dotada de paginação. | |
| 24 | + </para> | |
| 25 | + <para> | |
| 26 | + O mecanismo de paginação para as aplicações fornecido pelo <emphasis>Demoiselle Framework</emphasis> consiste em um algoritmo | |
| 27 | + direcionado ao banco de dados (i.e., Database-Driven Pagination). Essa abordagem, apesar de requerer instruções SQL específicas | |
| 28 | + para obter porções determinadas de registros, é a mais utilizada por ser mais eficiente e produzir menos redundância de dados, | |
| 29 | + diminuindo assim tráfego de rede, consumo de memória e reduzindo o tempo de resposta. | |
| 30 | + </para> | |
| 31 | + <para> | |
| 32 | + É fornecido em tempo de execução um <emphasis>contexto de paginação</emphasis>, o qual tem escopo de sessão e armazena a informação | |
| 33 | + de paginação de cada entidade (i.e., bean) que necessite de tal mecanismo. Esse contexto é compartilhado entre as diversas camadas | |
| 34 | + da aplicação, especificamente entre as camadas de visão e persistência. Dessa maneira, a paginação dos dados é transparente para a | |
| 35 | + camada intermediária (i.e., negócio) e não interfere na modelagem das classes de um projeto. | |
| 36 | + </para> | |
| 37 | + </section> | |
| 38 | + | |
| 39 | + <section> | |
| 40 | + <title>Códigos de suporte</title> | |
| 41 | + <!-- | |
| 42 | + <para> | |
| 43 | + // TODO: explicar Pagination e PaginationContext | |
| 44 | + </para> | |
| 45 | + --> | |
| 46 | + <para> | |
| 47 | + O <emphasis>mecanismo de paginação</emphasis> do <emphasis>Demoiselle Framework</emphasis> permite que os parâmetros para a consulta | |
| 48 | + no banco sejam configurados de forma bastante prática. Por outro lado, a consulta paginada ao banco já é feita pela extensão | |
| 49 | + <literal>demoiselle-jpa</literal>. Dessa forma, basta ajustar os parametros da paginação, e pedir as consultas normalmente. | |
| 50 | + O resultado da consulta é então passado para algum componente de iteração de dados com suporte ao mecanismo conhecido como <emphasis>Lazy | |
| 51 | + Load</emphasis> (ou <emphasis>Lazy Loading</emphasis>). | |
| 52 | + </para> | |
| 53 | + <para> | |
| 54 | + Farão parte do código de suporte para paginação: | |
| 55 | + <itemizedlist> | |
| 56 | + <listitem> | |
| 57 | + <para> | |
| 58 | + A classe <literal>Pagination</literal>: usada para manipular a paginação dos dados resultantes, contendo os campos <literal>currentPage</literal> | |
| 59 | + (página atual, selecionada na camada de visão), <literal>pageSize</literal> (tamanho da página, a quantidade de registros que ela comportará) | |
| 60 | + e <literal>totalResults</literal> (a quantidade de resultados existentes na base de dados); | |
| 61 | + </para> | |
| 62 | + </listitem> | |
| 63 | + <listitem> | |
| 64 | + <para> | |
| 65 | + A classe <literal>PaginationContext</literal>: contexto usado para armazenar e fornecer estruturas do tipo <literal>Pagination</literal>; | |
| 66 | + </para> | |
| 67 | + </listitem> | |
| 68 | + <listitem> | |
| 69 | + <para> | |
| 70 | + A classe <literal>PaginationConfig</literal>: armazenador de configurações referentes à paginação. | |
| 71 | + </para> | |
| 72 | + </listitem> | |
| 73 | + </itemizedlist> | |
| 74 | + </para> | |
| 75 | + | |
| 76 | + <para>Códigos internos de suporte no Core:</para> | |
| 77 | + | |
| 78 | + <programlisting role="JAVA"><![CDATA[ | |
| 79 | + public class Pagination { | |
| 80 | + | |
| 81 | + private int currentPage; | |
| 82 | + private int pageSize; | |
| 83 | + | |
| 84 | + private Long totalResults; | |
| 85 | + private Integer totalPages; | |
| 86 | + | |
| 87 | + // ... | |
| 88 | + } | |
| 89 | + | |
| 90 | + @SessionScoped | |
| 91 | + public class PaginationContext { | |
| 92 | + | |
| 93 | + private final Map<Class<?>, Pagination> map; | |
| 94 | + | |
| 95 | + public Pagination getPagination(Class<?> clazz) { ... } | |
| 96 | + | |
| 97 | + public Pagination get -->Pagination(Class<?> clazz, boolean create) { ... } | |
| 98 | + | |
| 99 | + } | |
| 100 | + | |
| 101 | + @Configuration | |
| 102 | + public class PaginationConfig { | |
| 103 | + | |
| 104 | + @Key("default_page_size") | |
| 105 | + private int defaultPageSize = 10; | |
| 106 | + | |
| 107 | + @Key("max_page_links") | |
| 108 | + private int maxPageLinks = 5; | |
| 109 | + | |
| 110 | + } | |
| 111 | + ]]></programlisting> | |
| 112 | + | |
| 113 | + <para>Códigos internos de suporte em JPA:</para> | |
| 114 | + | |
| 115 | + <programlisting role="JAVA"><![CDATA[ | |
| 116 | + public class JPACrud<T, I> implements Crud<T, I> { | |
| 117 | + | |
| 118 | + @Inject | |
| 119 | + private PaginationContext paginationContext; | |
| 120 | + | |
| 121 | + // ... | |
| 122 | + | |
| 123 | + public List<T> findAll() { | |
| 124 | + | |
| 125 | + final String jpql = "select this from " + getBeanClass().getSimpleName() + " this"; | |
| 126 | + final Query query = getEntityManager().createQuery(jpql); | |
| 127 | + | |
| 128 | + final Pagination pagination = paginationContext.getPagination(getBeanClass()); | |
| 129 | + if (pagination != null) { | |
| 130 | + if (pagination.getTotalPages() == null) { | |
| 131 | + pagination.setTotalResults(this.countAll()); | |
| 132 | + } | |
| 133 | + query.setFirstResult(pagination.getFirstResult()); | |
| 134 | + query.setMaxResults(pagination.getPageSize()); | |
| 135 | + } | |
| 136 | + | |
| 137 | + // ... | |
| 138 | + } | |
| 139 | + | |
| 140 | + } | |
| 141 | + ]]></programlisting> | |
| 142 | + | |
| 143 | + <para>Códigos internos de suporte em JSF:</para> | |
| 144 | + | |
| 145 | + <programlisting role="JAVA"><![CDATA[ | |
| 146 | + public abstract class AbstractListPageBean<T, I> extends AbstractPage | |
| 147 | + implements ListPageBean<T, I> { | |
| 148 | + | |
| 149 | + @Inject | |
| 150 | + private PaginationContext paginationContext; | |
| 151 | + | |
| 152 | + @Inject | |
| 153 | + private PaginationConfig paginationConfig; | |
| 154 | + | |
| 155 | + // ... | |
| 156 | + | |
| 157 | + public Pagination getPagination() { | |
| 158 | + return paginationContext.getPagination(getBeanClass(), true); | |
| 159 | + } | |
| 160 | + | |
| 161 | + public int getPageSize() { | |
| 162 | + return paginationConfig.getDefaultPageSize(); | |
| 163 | + } | |
| 164 | + | |
| 165 | + public int getMaxPageLinks() { | |
| 166 | + return paginationConfig.getMaxPageLinks(); | |
| 167 | + } | |
| 168 | + | |
| 169 | + } | |
| 170 | + ]]></programlisting> | |
| 171 | + </section> | |
| 147 | 172 | |
| 148 | - <section> | |
| 149 | - <title>Implementação na aplicação</title> | |
| 150 | - <!-- | |
| 151 | - <para> | |
| 152 | - A fim de utilizar o mecanismo inerente do <emphasis>Demoiselle Framework</emphasis>, é preciso simplesmente anotar os métodos | |
| 153 | - contendo as instruções desejadas com <literal>@Startup</literal>, para a <emphasis>inicialização</emphasis>, ou | |
| 154 | - <literal>@Shutdown</literal>, para a <emphasis>finalização</emphasis>. | |
| 155 | - </para> | |
| 156 | - <tip> | |
| 157 | - <para> | |
| 158 | - O mecanismo de inicialização do <emphasis>Demoiselle Framework</emphasis> é independente da natureza da aplicação Java, isto é, | |
| 159 | - visa tanto aplicações do tipo Web quanto do tipo desktop (ex: Swing). | |
| 160 | - </para> | |
| 161 | - </tip> | |
| 162 | - <para> | |
| 163 | - As instruções contidas em um método anotado com <literal>@Startup</literal> serão executadas automaticamente quando a aplicação | |
| 164 | - Java for inicializada, seja ela hospedada em um contêiner Web ou executada através de um método <literal>main()</literal>. | |
| 165 | - Nenhum outro arquivo ou classe precisa ser definido. A anotação <literal>@Startup</literal> permite a indicação do argumento | |
| 166 | - <literal>priority</literal>, um número inteiro que serve para definir a prioridade de execução do respectivo método na existência | |
| 167 | - de mais de um inicializador para a aplicação. | |
| 168 | - </para> | |
| 169 | - <para> | |
| 170 | - De maneira análoga, um método anotado com <literal>@Shutdown</literal> será executado no momento de finalização de uma aplicação, | |
| 171 | - obedecendo também à ordem de prioridade definida com o argumento <literal>priority</literal>. | |
| 172 | - </para> | |
| 173 | - --> | |
| 174 | - <para> | |
| 175 | - Eis um exemplo de implementação de paginação em uma aplicação: | |
| 176 | - </para> | |
| 177 | - <programlisting role="JAVA"><![CDATA[ | |
| 178 | - @Inject | |
| 179 | - private PaginationContext paginationContext; | |
| 180 | -]]></programlisting> | |
| 181 | - <programlisting role="JAVA"><![CDATA[ | |
| 182 | - Pagination pagination = paginationContext.getPagination(Audit.class); | |
| 183 | -]]></programlisting> | |
| 184 | - <tip> | |
| 185 | - <para> | |
| 186 | - O método <literal>getPagination()</literal> do contexto <literal>PaginationContext</literal> é sobrecarregado, podendo aceitar | |
| 187 | - os seguintes argumentos: <literal>Class</literal> ou <literal>Class</literal> e <literal>boolean</literal>. | |
| 188 | - </para> | |
| 189 | - </tip> | |
| 190 | - <note> | |
| 191 | - <para> | |
| 192 | - A JPA 2.0, através da Query API, suporta controle de paginação independente de fornecedor de banco de dados. | |
| 193 | - Para controlar a paginação, a interface <literal>Query</literal> define os métodos <literal>setFirstResult()</literal> e | |
| 194 | - <literal>setMaxResults()</literal> para especificar o primeiro resultado a ser recebido e o número máximo de resultados a | |
| 195 | - serem retornados em relação àquele ponto. Internamente, são usadas instruções específicas do SGBD (ex: LIMIT e OFFSET no | |
| 196 | - PostgreSQL). | |
| 197 | - </para> | |
| 198 | - </note> | |
| 173 | + <section> | |
| 174 | + <title>Implementação na aplicação</title> | |
| 175 | + <para> | |
| 176 | + Veremos nessa seção como implementar a paginação em uma aplicação Java. Para esse exmplo tomamos como base a aplicação de Bookmarks | |
| 177 | + fornecida pelo arquétipo <emphasis>JSF com JPA</emphasis> do <emphasis>Demoiselle Framework</emphasis> (para maiores detalhes | |
| 178 | + ver <link linkend="estrutura">Arquétipos</link>). Iremos utilizar o componente <literal>DataTable</literal> do <emphasis>PrimeFaces</emphasis>, | |
| 179 | + que oferece o mecanismo de <emphasis>Lazy Loading</emphasis> conhecido como <literal>LazyDataModel</literal>, muito útil para paginação | |
| 180 | + e classificação de dados. | |
| 181 | + </para> | |
| 182 | + <para> | |
| 183 | + Primeiro é preciso configurar um objeto <literal>LazyDataModel</literal> no construtor do <emphasis>Managed Bean</emphasis> | |
| 184 | + (<emphasis>BookmarkList</emphasis> nesse exemplo): instancia-lo e sobrescrever o método abstrado <literal>load</literal>, que recebe | |
| 185 | + vários argumentos. Esses argumentos são recuperados na página <literal>jsf</literal> que carrega a instância do objeto <literal>LazyDataModel</literal>. | |
| 186 | + </para> | |
| 187 | + <para> | |
| 188 | + Dentro do método <literal>load</literal> iremos pegar do contexto de paginação uma instância da implementação da interface <literal>Pagination</literal> | |
| 189 | + e ajustar alguns dos seus parâmetros para: indicar a partir de qual item a paginação deve iniciar, e o tamanho (quantidade de itens) de cada página. | |
| 190 | + Esses dados são usados no método <literal>findAll()</literal>, da classe <literal>JPACrud</literal> (extensão JPA), que utiliza o contexto de | |
| 191 | + paginação para pegar os parametros e fazer a consulta no banco buscando apenas os itens que estão dentro da pagina que o parametro | |
| 192 | + <literal>first</literal> indicar. O resultado é passado para a instancia do <literal>LazyDataModel</literal>, que é responsável por exibir | |
| 193 | + os dados de forma apropriada. | |
| 194 | + </para> | |
| 195 | + <para> | |
| 196 | + À classe <emphasis>BookmarkList</emphasis> devem ser adicionados os seguintes trechos de código: | |
| 197 | + </para> | |
| 198 | + | |
| 199 | + <programlisting role="JAVA"><![CDATA[ | |
| 200 | + // ... | |
| 201 | + import java.util.Map; | |
| 202 | + import br.gov.frameworkdemoiselle.pagination.Pagination; | |
| 203 | + | |
| 204 | + // ... | |
| 205 | + private LazyDataModel<Bookmark> lazyModel; | |
| 206 | + | |
| 207 | + public BookmarkListMB() { | |
| 208 | + lazyModel = new LazyDataModel<Bookmark>() { | |
| 209 | + | |
| 210 | + @Override | |
| 211 | + public List<Bookmark> load (int first, int pageSize, String sortField, | |
| 212 | + SortOrder sortOrder, Map<String, String> filters){ | |
| 213 | + | |
| 214 | + Pagination pagination = getPagination(); | |
| 215 | + pagination.setPageSize(pageSize); | |
| 216 | + pagination.setFirstResult(first); | |
| 217 | + | |
| 218 | + List<Bookmark> itemsList = bc.findAll(); | |
| 219 | + | |
| 220 | + lazyModel.setRowCount(pagination.getTotalResults()); | |
| 221 | + | |
| 222 | + return itemsList; | |
| 223 | + } | |
| 224 | + }; | |
| 225 | + } | |
| 226 | + | |
| 227 | + // ... | |
| 228 | + | |
| 229 | + public LazyDataModel<Bookmark> getLazyModel() { | |
| 230 | + return lazyModel; | |
| 231 | + } | |
| 232 | + | |
| 233 | + // ... | |
| 234 | + ]]></programlisting> | |
| 235 | + | |
| 236 | + <para> | |
| 237 | + No arquivo <literal>messages.properties</literal> adicione as linhas: | |
| 238 | + </para> | |
| 239 | + | |
| 240 | + <programlisting role="JAVA"><![CDATA[ | |
| 241 | + page.first=0 | |
| 242 | + page.rows=4 | |
| 243 | + page.max.links=3 | |
| 244 | + ]]></programlisting> | |
| 245 | + | |
| 246 | + <para> | |
| 247 | + Na página JSF <literal>bookmark_list.xhtml</literal>, substitua a linha: | |
| 248 | + </para> | |
| 249 | + | |
| 250 | + <programlisting role="JAVA"><![CDATA[ | |
| 251 | + <p:dataTable id="list" var="bean" value="#{bookmarkListMB.resultList}"> | |
| 252 | + ]]></programlisting> | |
| 253 | + | |
| 254 | + <para> | |
| 255 | + por: | |
| 256 | + </para> | |
| 257 | + | |
| 258 | + <programlisting role="JAVA"><![CDATA[ | |
| 259 | + <p:dataTable id="list" var="bean" | |
| 260 | + value="#{bookmarkListMB.lazyModel}" lazy="true" paginator="true" | |
| 261 | + first="#{messages['page.first']}" rows="#{messages['page.rows']}" | |
| 262 | + pageLinks="#{messages['page.max.links']}"> | |
| 263 | + ]]></programlisting> | |
| 264 | + | |
| 265 | + <para> | |
| 266 | + Com essas alterações simples, a aplicação Bookmarks passa a utilizar o mecanismo de paginação oferecido pelo <emphasis>Demoiselle Framework</emphasis>. | |
| 267 | + </para> | |
| 268 | + | |
| 269 | + <tip> | |
| 270 | + <para> | |
| 271 | + O método <literal>getPagination()</literal> do contexto <literal>PaginationContext</literal> é sobrecarregado, podendo aceitar | |
| 272 | + os seguintes argumentos: <literal>Class</literal> ou <literal>Class</literal> e <literal>boolean</literal>. | |
| 273 | + </para> | |
| 274 | + </tip> | |
| 275 | + <note> | |
| 276 | + <para> | |
| 277 | + A JPA 2.0, através da Query API, suporta controle de paginação independente de fornecedor de banco de dados. | |
| 278 | + Para controlar a paginação, a interface <literal>Query</literal> define os métodos <literal>setFirstResult()</literal> e | |
| 279 | + <literal>setMaxResults()</literal> para especificar o primeiro resultado a ser recebido e o número máximo de resultados a | |
| 280 | + serem retornados em relação àquele ponto. Internamente, são usadas instruções específicas do SGBD (ex: LIMIT e OFFSET no | |
| 281 | + PostgreSQL). | |
| 282 | + </para> | |
| 283 | + </note> | |
| 199 | 284 | </section> |
| 200 | 285 | |
| 201 | - <section> | |
| 286 | +</chapter> | |
| 287 | + | |
| 288 | +<!--<section> | |
| 202 | 289 | <title>Um exemplo usando PrimeFaces</title> |
| 203 | 290 | <para> |
| 204 | 291 | Eis um interessante caso de uso de paginação: ????. |
| ... | ... | @@ -259,7 +346,8 @@ public class AuditMB extends AbstractListPageBean<Audit, Long> { |
| 259 | 346 | value="#{auditMB.lazyModel}" lazy="true" paginator="true" |
| 260 | 347 | rows="#{auditMB.pageSize}" pageLinks="#{auditMB.maxPageLinks}">]]></programlisting> |
| 261 | 348 | </section> |
| 262 | - | |
| 349 | + --> | |
| 350 | +<!-- | |
| 263 | 351 | <section> |
| 264 | 352 | <title>Referências</title> |
| 265 | 353 | <itemizedlist> |
| ... | ... | @@ -267,8 +355,8 @@ public class AuditMB extends AbstractListPageBean<Audit, Long> { |
| 267 | 355 | <listitem>Implementing Search Result Pagination in a Web Application (http://www.developer.com/java/other/article.php/3696226/)</listitem> |
| 268 | 356 | <listitem>A Pagination Technique Using Spring (http://www.developer.com/java/web/article.php/10935_3830886_1/)</listitem> |
| 269 | 357 | <listitem>Spring JDBC Pagination Tutorial (http://www.codefutures.com/tutorials/spring-pagination/)</listitem> |
| 270 | - <listitem>PrimeFaces DataTable - Lazy Loading (http://www.primefaces.org/showcase/ui/datatableLazy.jsf)</listitem> | |
| 358 | + <listitem>PrimeFaces DataTable - Lazy Loading (http://www.primefaces.org/showcase/ui/datatableLazy.jsf)</listitem> | |
| 271 | 359 | </itemizedlist> |
| 272 | 360 | </section> |
| 273 | - | |
| 274 | -</chapter> | |
| 361 | + --> | |
| 362 | + | ... | ... |
| ... | ... | @@ -0,0 +1,188 @@ |
| 1 | +<?xml version='1.0' encoding="utf-8"?> | |
| 2 | +<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" | |
| 3 | + "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [ ]> | |
| 4 | +<chapter id="properties"> | |
| 5 | + | |
| 6 | + <title>Demoiselle Properties</title> | |
| 7 | + | |
| 8 | + <para> | |
| 9 | + Em um projeto com o <emphasis>Demoiselle Framework</emphasis>, algumas propriedades e configurações | |
| 10 | + do <emphasis>Framework</emphasis> podem ser ajustadas no arquivo <literal>demoiselle.properties</literal>. | |
| 11 | + Além disso, a partir da versão 2.3.0 também é nesse arquivo que devem ser definidas as estratégias de | |
| 12 | + <emphasis>Transação</emphasis>, <emphasis>Autorização</emphasis> e <emphasis>Autenticação</emphasis>. | |
| 13 | + </para> | |
| 14 | + <para> | |
| 15 | + A seguir listamos as propriedades e configurações do <emphasis>Demoiselle Framework</emphasis> que o usuário pode modificar, | |
| 16 | + acompanhados de alguns exemplos ilustrativos. Também mostraremos como escolher as estratégias para | |
| 17 | + <emphasis>Transação</emphasis>, <emphasis>Autorização</emphasis> e <emphasis>Autenticação</emphasis>, oferecidas pelo | |
| 18 | + <emphasis>Demoiselle</emphasis>. | |
| 19 | + </para> | |
| 20 | + | |
| 21 | + <section> | |
| 22 | + <title>Configurações do Core</title> | |
| 23 | + <para> | |
| 24 | + <itemizedlist> | |
| 25 | + <listitem> | |
| 26 | + <para> | |
| 27 | + <literal>frameworkdemoiselle.pagination.page.size</literal> - Configura o número de linhas que será | |
| 28 | + exibido na grade de uma página. Por padrão, esse número é 10. | |
| 29 | + </para> | |
| 30 | + <para> | |
| 31 | + Exemplo de configuração: <literal>frameworkdemoiselle.pagination.page.size = 15</literal>, ajusta em 15 | |
| 32 | + a quantidade de linhas em uma grade | |
| 33 | + </para> | |
| 34 | + </listitem> | |
| 35 | + <listitem> | |
| 36 | + <para> | |
| 37 | + <literal>frameworkdemoiselle.pagination.max.page.links</literal> - Configura a quantidade de links que | |
| 38 | + será exibido em uma página. Por padrão, esse valor é 5. | |
| 39 | + </para> | |
| 40 | + <para> | |
| 41 | + Exemplo de configuração: <literal>frameworkdemoiselle.pagination.max.page.links = 20</literal>, configura em 20 | |
| 42 | + o número de links que podem ser exibidos em uma página. | |
| 43 | + </para> | |
| 44 | + </listitem> | |
| 45 | + <listitem> | |
| 46 | + <para> | |
| 47 | + <literal>frameworkdemoiselle.security.enabled</literal> - Configura a habilitação das funcionalidades do | |
| 48 | + <emphasis>Demoiselle</emphasis> relacionadas a segurança (como autenticação de usuário e verificação de | |
| 49 | + permissão de acesso à recursos). Por padrão, essas funcionalidades ficam habilitadas. | |
| 50 | + </para> | |
| 51 | + <para> | |
| 52 | + Exemplo de configuração: <literal>frameworkdemoiselle.security.enabled = false</literal>, desabilita as | |
| 53 | + funcionalidades de segurança do <emphasis>Demoiselle</emphasis>. | |
| 54 | + </para> | |
| 55 | + </listitem> | |
| 56 | + </itemizedlist> | |
| 57 | + </para> | |
| 58 | + </section> | |
| 59 | + | |
| 60 | + <section> | |
| 61 | + <title>Configurações da extensão JSF</title> | |
| 62 | + <para> | |
| 63 | + <itemizedlist> | |
| 64 | + <listitem> | |
| 65 | + <para> | |
| 66 | + <literal>frameworkdemoiselle.security.login.page</literal> - Configura a página de login. Por padrão, a página | |
| 67 | + configurada é <emphasis>“/login”</emphasis>. | |
| 68 | + </para> | |
| 69 | + <para> | |
| 70 | + Exemplo de configuração: <literal>frameworkdemoiselle.security.login.page = “/inicial”</literal>, configura a | |
| 71 | + página <emphasis>“/inicial”</emphasis> como a página de login. | |
| 72 | + </para> | |
| 73 | + </listitem> | |
| 74 | + | |
| 75 | + <listitem> | |
| 76 | + <para> | |
| 77 | + <literal>frameworkdemoiselle.security.redirect.after.login</literal> - Configura a página que será acessada após | |
| 78 | + o login. Por padrão, a página configurada é <emphasis>“/index”</emphasis>. | |
| 79 | + </para> | |
| 80 | + <para> | |
| 81 | + Exemplo de configuração: <literal>frameworkdemoiselle.security.redirect.after.login = "/menu"</literal>, configura | |
| 82 | + a página <emphasis>“/menu”</emphasis> para ser acessada no redirecionamento após o login do usuário. | |
| 83 | + </para> | |
| 84 | + </listitem> | |
| 85 | + | |
| 86 | + <listitem> | |
| 87 | + <para> | |
| 88 | + <literal>frameworkdemoiselle.security.redirect.after.logout</literal> - Configura a página para a qual a aplicação | |
| 89 | + será direcionada após o logout do usuário. Por padrão, a página configurada é <emphasis>“/login”</emphasis>. | |
| 90 | + </para> | |
| 91 | + <para> | |
| 92 | + Exemplo de configuração: <literal>frameworkdemoiselle.security.redirect.after.logout = "/index"</literal>, configura | |
| 93 | + a página "/index" para ser acessada no redirecionamento após o logout do usuário. | |
| 94 | + </para> | |
| 95 | + </listitem> | |
| 96 | + | |
| 97 | + <listitem> | |
| 98 | + <para> | |
| 99 | + <literal>frameworkdemoiselle.security.redirect.enebled</literal> - Configura a habilitação do redirecionamento da página | |
| 100 | + após <emphasis>login</emphasis> e <emphasis>logout</emphasis>. Por padrão, o valor dessa propriedade é <emphasis>true</emphasis>. | |
| 101 | + </para> | |
| 102 | + <para> | |
| 103 | + Exemplo de configuração: <literal>frameworkdemoiselle.security.redirect.enebled = false</literal>, desabilita os | |
| 104 | + redirecionamentos de páginas após <emphasis>login</emphasis> e <emphasis>logout</emphasis>. | |
| 105 | + </para> | |
| 106 | + </listitem> | |
| 107 | + | |
| 108 | + <listitem> | |
| 109 | + <para> | |
| 110 | + <literal>frameworkdemoiselle.handle.application.exception</literal> - Define se a extensão vai capturar ou não alguma exceção | |
| 111 | + lançada pela aplicação. Por padrão, essa configuração vem marcada como “true”, que diz para a extensão capturar a exceção. | |
| 112 | + </para> | |
| 113 | + <para> | |
| 114 | + Exemplo de configuração: <emphasis>frameworkdemoiselle.handle.application.exception = false</emphasis>, desabilita a captura | |
| 115 | + de exceções lançadas pela aplicação. | |
| 116 | + </para> | |
| 117 | + </listitem> | |
| 118 | + | |
| 119 | + <listitem> | |
| 120 | + <para> | |
| 121 | + <literal>frameworkdemoiselle.handle.aplication.exception.page</literal> - Configura a página para a qual a aplicação será | |
| 122 | + direcionada em caso de exceção. Por padrão, a página configurada é <emphasis>“/application_error”</emphasis>. | |
| 123 | + </para> | |
| 124 | + <para> | |
| 125 | + Exemplo de configuração: <emphasis>framework.handle.aplication.exception.page = “/exception_x_page”</emphasis>, redireciona a | |
| 126 | + aplicação para a página <emphasis>/exception_x_page</emphasis> caso ocorra alguma exceção. | |
| 127 | + </para> | |
| 128 | + </listitem> | |
| 129 | + </itemizedlist> | |
| 130 | + </para> | |
| 131 | + </section> | |
| 132 | + | |
| 133 | + <section> | |
| 134 | + <title>Configurações da Extensão JPA</title> | |
| 135 | + <para> | |
| 136 | + <itemizedlist> | |
| 137 | + <listitem> | |
| 138 | + <para> | |
| 139 | + <literal>frameworkdemoiselle.persistence.unit.name</literal> - Quando é definida mais de uma unidade de persitencia | |
| 140 | + no arquivo <literal>persistence.xml</literal>, muitas vezes é conveniente escolher uma unidade padrão, ao invés de | |
| 141 | + definir as unidades individualmente em cada <emphasis>Entity Manager</emphasis>. Esse parametro é utilizado para | |
| 142 | + indicar qual é a unidade de persistência que deve ser utilizada quando no <emphasis>Entity Manager</emphasis> não | |
| 143 | + houver essa definição. | |
| 144 | + </para> | |
| 145 | + <para> | |
| 146 | + Exemplo de configuração: <literal>frameworkdemoiselle.persistence.unit.name = database1-ds</literal>, configura a | |
| 147 | + unidade de persistencia <literal>database1-ds</literal> como padrão da aplicação. | |
| 148 | + </para> | |
| 149 | + </listitem> | |
| 150 | + </itemizedlist> | |
| 151 | + </para> | |
| 152 | + </section> | |
| 153 | + | |
| 154 | + <section> | |
| 155 | + <title>Escolhendo Estratégias</title> | |
| 156 | + <para> | |
| 157 | + Para escolher as estratégias de <emphasis>Transação</emphasis>, <emphasis>Autorização</emphasis> e <emphasis>Autenticação</emphasis> | |
| 158 | + devem ser configuradas as propriedades: <literal>frameworkdemoiselle.transaction.class</literal>, | |
| 159 | + <literal>frameworkdemoiselle.security.authorizer.class</literal> e <literal>frameworkdemoiselle.security.authenticator.class</literal> | |
| 160 | + , respectivamente. | |
| 161 | + </para> | |
| 162 | + <para> | |
| 163 | + Para utilizar as estratégias fornecidas pelo próprio <emphasis>Framework Demoiselle</emphasis>, você deve configurar essas | |
| 164 | + propriedades da seguinte forma: | |
| 165 | + <itemizedlist> | |
| 166 | + <listitem> | |
| 167 | + <para> | |
| 168 | + <literal>frameworkdemoiselle.transaction.class = br.gov.frameworkdemoiselle.transaction.JPATransaction</literal>, | |
| 169 | + para transações <emphasis>JPA</emphasis>, e <literal>frameworkdemoiselle.transaction.class = | |
| 170 | + br.gov.frameworkdemoiselle.transaction.JTATransaction</literal>, para transações <emphasis>JTA</emphasis>; | |
| 171 | + </para> | |
| 172 | + </listitem> | |
| 173 | + <listitem> | |
| 174 | + <para> | |
| 175 | + <literal>frameworkdemoiselle.security.authorizer.class = br.gov.serpro.inscricao.security.Autorizador</literal>; | |
| 176 | + </para> | |
| 177 | + </listitem> | |
| 178 | + <listitem> | |
| 179 | + <para> | |
| 180 | + <literal>frameworkdemoiselle.security.authenticator.class = br.gov.serpro.inscricao.security.Autenticador</literal>. | |
| 181 | + </para> | |
| 182 | + </listitem> | |
| 183 | + </itemizedlist> | |
| 184 | + As instruções para você construir e utilizar sua própria estratégia estãodescritas nos capítulos <link linkend="transacao">Transação</link> | |
| 185 | + e <link linkend="security">Segurança</link>. | |
| 186 | + </para> | |
| 187 | + </section> | |
| 188 | +</chapter> | ... | ... |
documentation/reference/pt-BR/security.xml
| ... | ... | @@ -18,6 +18,26 @@ |
| 18 | 18 | </para> |
| 19 | 19 | |
| 20 | 20 | <section> |
| 21 | + <title>Configurando</title> | |
| 22 | + <para> | |
| 23 | + Para um correto funcionamento do Demoiselle é necessário inserir od interceptadores de segurança no arquivo <filename>src/main/WEB-INF/beans.xml</filename>. | |
| 24 | + </para> | |
| 25 | + <programlisting role="XML"> | |
| 26 | + <![CDATA[ | |
| 27 | + <beans xmlns="http://java.sun.com/xml/ns/javaee" | |
| 28 | + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
| 29 | + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
| 30 | + http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> | |
| 31 | + <interceptors> | |
| 32 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.RequiredPermissionInterceptor</class> | |
| 33 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.RequiredRoleInterceptor</class> | |
| 34 | + </interceptors> | |
| 35 | + </beans> | |
| 36 | + ]]> | |
| 37 | + </programlisting> | |
| 38 | + </section> | |
| 39 | + | |
| 40 | + <section> | |
| 21 | 41 | <title>Autenticação</title> |
| 22 | 42 | <para> |
| 23 | 43 | O mecanismo de autenticação busca verificar a identidade do usuário de um sistema. A forma mais conhecida, e comum, |
| ... | ... | @@ -201,20 +221,12 @@ public class MeuAuthorizer implements Authorizer { |
| 201 | 221 | |
| 202 | 222 | }]]></programlisting> |
| 203 | 223 | <para> |
| 204 | - Feito isso deve-se definir no arquivo META-INF/beans.xml, as classes criadas: | |
| 224 | + Feito isso deve-se definir no arquivo <filename>demoiselle.properties</filename>, as classes criadas: | |
| 205 | 225 | </para> |
| 206 | - <programlisting role="XML"><![CDATA[<?xml version="1.0"?> | |
| 207 | -<beans xmlns="http://java.sun.com/xml/ns/javaee" | |
| 208 | - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
| 209 | - xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
| 210 | - http://java.sun.com/xml/ns/javaee/beans_1_1.xsd"> | |
| 211 | - | |
| 212 | - <alternatives> | |
| 213 | - <class>projeto.MeuAuthenticator</class> | |
| 214 | - <class>projeto.MeuAuthorizer</class> | |
| 215 | - </alternatives> | |
| 216 | - | |
| 217 | -</beans>]]></programlisting> | |
| 226 | + <programlisting> | |
| 227 | + frameworkdemoiselle.security.authenticator.class=projeto.MeuAuthenticator | |
| 228 | + frameworkdemoiselle.security.authorizer.class=projeto.MeuAuthorizer | |
| 229 | + </programlisting> | |
| 218 | 230 | <para> |
| 219 | 231 | À partir desse momento, a aplicação já possui uma implementação de segurança definida. |
| 220 | 232 | </para> | ... | ... |
documentation/reference/pt-BR/transacao.xml
| ... | ... | @@ -22,6 +22,25 @@ |
| 22 | 22 | Neste capítulo apresentaremos para você como usar a nossa solução de controle de transação, as estratégias |
| 23 | 23 | prontas que oferecemos e a criação de sua própria estratégia. |
| 24 | 24 | </para> |
| 25 | + | |
| 26 | + <section> | |
| 27 | + <title>Configurando</title> | |
| 28 | + <para> | |
| 29 | + Para um correto funcionamento do Demoiselle é necessário inserir o interceptador de transação no arquivo <filename>src/main/WEB-INF/beans.xml</filename>. | |
| 30 | + </para> | |
| 31 | + <programlisting role="XML"> | |
| 32 | + <![CDATA[ | |
| 33 | + <beans xmlns="http://java.sun.com/xml/ns/javaee" | |
| 34 | + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
| 35 | + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
| 36 | + http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> | |
| 37 | + <interceptors> | |
| 38 | + <class>br.gov.frameworkdemoiselle.internal.interceptor.TransactionalInterceptor</class> | |
| 39 | + </interceptors> | |
| 40 | + </beans> | |
| 41 | + ]]> | |
| 42 | + </programlisting> | |
| 43 | + </section> | |
| 25 | 44 | |
| 26 | 45 | <section> |
| 27 | 46 | <title>Métodos transacionais</title> |
| ... | ... | @@ -99,19 +118,11 @@ public class AbacaxiException { |
| 99 | 118 | </para> |
| 100 | 119 | <para> |
| 101 | 120 | A transação JPA é simples de configurar e não exige nenhum recurso externo à sua aplicação. |
| 102 | - Basta definir no arquivo <filename>META-INF/beans.xml</filename> a seguinte configuração: | |
| 121 | + Basta definir no arquivo <filename>demoiselle.properties</filename> a seguinte configuração: | |
| 103 | 122 | </para> |
| 104 | - <programlisting role="XML"><![CDATA[<?xml version="1.0"?> | |
| 105 | -<beans xmlns="http://java.sun.com/xml/ns/javaee" | |
| 106 | - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
| 107 | - xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
| 108 | - http://java.sun.com/xml/ns/javaee/beans_1_1.xsd"> | |
| 109 | - | |
| 110 | - <alternatives> | |
| 111 | - <class>br.gov.frameworkdemoiselle.transaction.JPATransaction</class> | |
| 112 | - </alternatives> | |
| 113 | - | |
| 114 | -</beans>]]></programlisting> | |
| 123 | + <programlisting> | |
| 124 | + frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JPATransaction | |
| 125 | + </programlisting> | |
| 115 | 126 | <tip><para> Caso não esteja utilizando o arquétipo JSF-JPA fornecidos pelo Demoiselle, confira se a dependência para a |
| 116 | 127 | extensão está indicada corretamente no arquivo POM.XML.</para> |
| 117 | 128 | <programlisting role="XML"><![CDATA[<dependency> |
| ... | ... | @@ -132,23 +143,13 @@ public class AbacaxiException { |
| 132 | 143 | <para> |
| 133 | 144 | A estratégia JTA não serve apenas para persistência em banco de dados, serve também para integrar com |
| 134 | 145 | tecnologias que façam acesso ao contexto JTA, como é o caso do EJB. Para ativar esta estratégia defina no |
| 135 | - arquivo <filename>META-INF/beans.xml</filename> a seguinte configuração: | |
| 146 | + arquivo <filename>demoiselle.properties</filename> a seguinte configuração: | |
| 136 | 147 | </para> |
| 137 | - <programlisting role="XML"><![CDATA[<?xml version="1.0"?> | |
| 138 | -<beans xmlns="http://java.sun.com/xml/ns/javaee" | |
| 139 | - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
| 140 | - xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
| 141 | - http://java.sun.com/xml/ns/javaee/beans_1_1.xsd"> | |
| 142 | - | |
| 143 | - <alternatives> | |
| 144 | - <class>br.gov.frameworkdemoiselle.transaction.JTATransaction</class> | |
| 145 | - </alternatives> | |
| 146 | - | |
| 147 | -</beans>]]></programlisting> | |
| 148 | + <programlisting>frameworkdemoiselle.transaction.class=br.gov.frameworkdemoiselle.transaction.JTATransaction</programlisting> | |
| 148 | 149 | <para> |
| 149 | 150 | Feito isto, o controle transacional será delegado para a transação acessível via JNDI com o nome |
| 150 | 151 | <literal>UserTransaction</literal>. A estratégia acessa o objeto da seguinte maneira: |
| 151 | - <literal>context.lookup("UserTransaction")</literal>. Portanto, para você utilizar esta estratégia, | |
| 152 | + <literal>Beans.getReference(UserTransaction.class)</literal>. Portanto, para você utilizar esta estratégia, | |
| 152 | 153 | você precisa de um container JEE ou de um servidor JTA qualquer. |
| 153 | 154 | </para> |
| 154 | 155 | <para> |
| ... | ... | @@ -156,18 +157,20 @@ public class AbacaxiException { |
| 156 | 157 | JTA gerenciada. Veja um exemplo utilizando o servidor de aplicações JBoss-AS6 e com o provider Hibernate (embutido no JBoss-AS) como implementação JPA: |
| 157 | 158 | </para> |
| 158 | 159 | <programlisting role="XML"><![CDATA[<?xml version="1.0" encoding="UTF-8"?> |
| 159 | -<persistence version="2.0" | |
| 160 | - xmlns="http://java.sun.com/xml/ns/persistence" | |
| 160 | +<persistence version="2.0" | |
| 161 | + xmlns="http://java.sun.com/xml/ns/persistence" | |
| 161 | 162 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| 162 | - xsi:schemaLocation="http://java.sun.com/xml/ns/persistence | |
| 163 | - http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> | |
| 163 | + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence | |
| 164 | + http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> | |
| 164 | 165 | |
| 165 | - <persistence-unit name="contactlist-ds"> | |
| 166 | - <jta-data-source>java:/DefaultDS</jta-data-source> | |
| 166 | + <persistence-unit name="bookmark-ds" transaction-type="JTA"> | |
| 167 | + <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> | |
| 167 | 168 | <properties> |
| 168 | - <property name="hibernate.transaction.factory_class" | |
| 169 | - value="org.hibernate.transaction.JTATransactionFactory" /> | |
| 170 | - <property name="jta.UserTransaction" value="UserTransaction" /> | |
| 169 | + <property name="hibernate.show_sql" value="true" /> | |
| 170 | + <property name="hibernate.format_sql" value="false" /> | |
| 171 | + <property name="hibernate.hbm2ddl.auto" value="update" /> | |
| 172 | + <property name="hibernate.transaction.jta.platform" | |
| 173 | + value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> | |
| 171 | 174 | </properties> |
| 172 | 175 | </persistence-unit> |
| 173 | 176 | </persistence>]]></programlisting> |
| ... | ... | @@ -221,19 +224,11 @@ public class MegaTransaction implements Transaction { |
| 221 | 224 | } |
| 222 | 225 | ]]></programlisting> |
| 223 | 226 | <para> |
| 224 | - Basta agora definir no arquivo <filename>META-INF/beans.xml</filename> a sua estratégia: | |
| 227 | + Basta agora definir no arquivo <filename>demoiselle.properties</filename> a sua estratégia: | |
| 225 | 228 | </para> |
| 226 | - <programlisting role="XML"><![CDATA[<?xml version="1.0"?> | |
| 227 | -<beans xmlns="http://java.sun.com/xml/ns/javaee" | |
| 228 | - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
| 229 | - xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
| 230 | - http://java.sun.com/xml/ns/javaee/beans_1_1.xsd"> | |
| 231 | - | |
| 232 | - <alternatives> | |
| 233 | - <class>projeto.MegaTransaction</class> | |
| 234 | - </alternatives> | |
| 235 | - | |
| 236 | -</beans>]]></programlisting> | |
| 229 | + <programlisting> | |
| 230 | + frameworkdemoiselle.transaction.class=projeto.MegaTransaction | |
| 231 | + </programlisting> | |
| 237 | 232 | </section> |
| 238 | 233 | |
| 239 | 234 | </chapter> | ... | ... |
impl/core/pom.xml
| ... | ... | @@ -44,20 +44,40 @@ |
| 44 | 44 | <parent> |
| 45 | 45 | <groupId>br.gov.frameworkdemoiselle</groupId> |
| 46 | 46 | <artifactId>demoiselle-framework-parent</artifactId> |
| 47 | - <version>2.2.3-SNAPSHOT</version> | |
| 48 | - <relativePath>../../parent/framework/pom.xml</relativePath> | |
| 47 | + <version>2.3.0-RC2-SNAPSHOT</version> | |
| 48 | + <relativePath>../../parent/framework</relativePath> | |
| 49 | 49 | </parent> |
| 50 | 50 | |
| 51 | - <organization> | |
| 52 | - <name>Serpro</name> | |
| 53 | - <url>http://www.serpro.gov.br</url> | |
| 54 | - </organization> | |
| 55 | - | |
| 56 | - <name>Core</name> | |
| 51 | + <name>Demoiselle Framework Core</name> | |
| 57 | 52 | <description> |
| 58 | 53 | Contém funcionalidades comuns a todos os projetos e extensões do framework de forma independente de |
| 59 | 54 | camadas de apresentação e persistência. |
| 60 | 55 | </description> |
| 56 | + <url>http://www.frameworkdemoiselle.gov.br</url> | |
| 57 | + | |
| 58 | + <licenses> | |
| 59 | + <license> | |
| 60 | + <name>GNU Lesser General Public License, Version 3</name> | |
| 61 | + <url>http://www.gnu.org/licenses/lgpl-3.0.txt</url> | |
| 62 | + </license> | |
| 63 | + </licenses> | |
| 64 | + | |
| 65 | + <organization> | |
| 66 | + <name>SERPRO - Serviço Federal de Processamento de Dados</name> | |
| 67 | + <url>http://www.serpro.gov.br</url> | |
| 68 | + </organization> | |
| 69 | + | |
| 70 | + <dependencyManagement> | |
| 71 | + <dependencies> | |
| 72 | + <dependency> | |
| 73 | + <groupId>br.gov.frameworkdemoiselle</groupId> | |
| 74 | + <artifactId>demoiselle-framework-bom</artifactId> | |
| 75 | + <version>2.3.0-RC2-SNAPSHOT</version> | |
| 76 | + <type>pom</type> | |
| 77 | + <scope>import</scope> | |
| 78 | + </dependency> | |
| 79 | + </dependencies> | |
| 80 | + </dependencyManagement> | |
| 61 | 81 | |
| 62 | 82 | <build> |
| 63 | 83 | <plugins> |
| ... | ... | @@ -94,6 +114,11 @@ |
| 94 | 114 | <artifactId>slf4j-api</artifactId> |
| 95 | 115 | </dependency> |
| 96 | 116 | <dependency> |
| 117 | + <groupId>org.javassist</groupId> | |
| 118 | + <artifactId>javassist</artifactId> | |
| 119 | + </dependency> | |
| 120 | + | |
| 121 | + <dependency> | |
| 97 | 122 | <groupId>commons-configuration</groupId> |
| 98 | 123 | <artifactId>commons-configuration</artifactId> |
| 99 | 124 | <exclusions> |
| ... | ... | @@ -155,9 +180,9 @@ |
| 155 | 180 | |
| 156 | 181 | <repositories> |
| 157 | 182 | <repository> |
| 158 | - <id>demoiselle.sourceforge.net</id> | |
| 159 | - <name>Demoiselle Maven Repository</name> | |
| 160 | - <url>http://demoiselle.sourceforge.net/repository/release</url> | |
| 183 | + <id>sonatype-nexus-snapshots</id> | |
| 184 | + <name>Sonatype Nexus Snapshots</name> | |
| 185 | + <url>https://oss.sonatype.org/content/repositories/snapshots</url> | |
| 161 | 186 | </repository> |
| 162 | 187 | </repositories> |
| 163 | 188 | </project> | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/annotation/Priority.java
0 → 100644
| ... | ... | @@ -0,0 +1,67 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * Copyright (C) 2010 SERPRO | |
| 4 | + * ---------------------------------------------------------------------------- | |
| 5 | + * This file is part of Demoiselle Framework. | |
| 6 | + * | |
| 7 | + * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | + * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | + * as published by the Free Software Foundation. | |
| 10 | + * | |
| 11 | + * This program is distributed in the hope that it will be useful, | |
| 12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | + * GNU General Public License for more details. | |
| 15 | + * | |
| 16 | + * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | + * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | + * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | + * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | + * ---------------------------------------------------------------------------- | |
| 21 | + * Este arquivo é parte do Framework Demoiselle. | |
| 22 | + * | |
| 23 | + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | + * do Software Livre (FSF). | |
| 26 | + * | |
| 27 | + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | + * para maiores detalhes. | |
| 31 | + * | |
| 32 | + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | + * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | + */ | |
| 37 | +package br.gov.frameworkdemoiselle.annotation; | |
| 38 | + | |
| 39 | +import static java.lang.annotation.ElementType.METHOD; | |
| 40 | +import static java.lang.annotation.ElementType.TYPE; | |
| 41 | +import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 42 | + | |
| 43 | +import java.lang.annotation.Retention; | |
| 44 | +import java.lang.annotation.Target; | |
| 45 | + | |
| 46 | +/** | |
| 47 | + * @author SERPRO | |
| 48 | + */ | |
| 49 | +@Target({ TYPE, METHOD }) | |
| 50 | +@Retention(RUNTIME) | |
| 51 | +public @interface Priority { | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * Most important priority value. | |
| 55 | + */ | |
| 56 | + public static int MAX_PRIORITY = Integer.MIN_VALUE; | |
| 57 | + | |
| 58 | + /** | |
| 59 | + * Less important priority value. | |
| 60 | + */ | |
| 61 | + public static int MIN_PRIORITY = Integer.MAX_VALUE; | |
| 62 | + | |
| 63 | + /** | |
| 64 | + * An integer value defines the priority order. | |
| 65 | + */ | |
| 66 | + int value(); | |
| 67 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/annotation/Shutdown.java
| ... | ... | @@ -1,91 +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.annotation; | |
| 38 | - | |
| 39 | -import static java.lang.annotation.ElementType.METHOD; | |
| 40 | -import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 41 | - | |
| 42 | -import java.lang.annotation.Retention; | |
| 43 | -import java.lang.annotation.Target; | |
| 44 | - | |
| 45 | -/** | |
| 46 | - * Identifies a method eligible to be executed automatically during <b>application finalization</b>. | |
| 47 | - * <p> | |
| 48 | - * Take a look at the following usage sample: | |
| 49 | - * <p> | |
| 50 | - * <blockquote> | |
| 51 | - * | |
| 52 | - * <pre> | |
| 53 | - * public class Finalizer { | |
| 54 | - * | |
| 55 | - * @Shutdown(priority = 5) | |
| 56 | - * public void finalize() { | |
| 57 | - * ... | |
| 58 | - * } | |
| 59 | - * } | |
| 60 | - * | |
| 61 | - * | |
| 62 | - * | |
| 63 | - * </pre> | |
| 64 | - * | |
| 65 | - * </blockquote> | |
| 66 | - * <p> | |
| 67 | - * The <code>@Shutdown</code> annotation allows an integer value to be defined, which stands for the method execution | |
| 68 | - * priority when several finalizer classes are available in the application. | |
| 69 | - * | |
| 70 | - * @author SERPRO | |
| 71 | - */ | |
| 72 | -@Target(METHOD) | |
| 73 | -@Retention(RUNTIME) | |
| 74 | -public @interface Shutdown { | |
| 75 | - | |
| 76 | - /** | |
| 77 | - * Most important priority value. | |
| 78 | - */ | |
| 79 | - public static int MAX_PRIORITY = Integer.MIN_VALUE; | |
| 80 | - | |
| 81 | - /** | |
| 82 | - * Less important priority value. | |
| 83 | - */ | |
| 84 | - public static int MIN_PRIORITY = Integer.MAX_VALUE; | |
| 85 | - | |
| 86 | - /** | |
| 87 | - * An integer value defines method execution order (i.e., priority). | |
| 88 | - */ | |
| 89 | - int priority() default MIN_PRIORITY; | |
| 90 | - | |
| 91 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/annotation/Startup.java
| ... | ... | @@ -1,90 +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.annotation; | |
| 38 | - | |
| 39 | -import static java.lang.annotation.ElementType.METHOD; | |
| 40 | -import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 41 | - | |
| 42 | -import java.lang.annotation.Retention; | |
| 43 | -import java.lang.annotation.Target; | |
| 44 | - | |
| 45 | -/** | |
| 46 | - * Identifies a method eligible to be executed automatically during <b>application initialization</b>. | |
| 47 | - * <p> | |
| 48 | - * Take a look at the following usage sample: | |
| 49 | - * <p> | |
| 50 | - * <blockquote> | |
| 51 | - * | |
| 52 | - * <pre> | |
| 53 | - * public class Initializer { | |
| 54 | - * | |
| 55 | - * @Startup(priority = 1) | |
| 56 | - * public void initialize() { | |
| 57 | - * ... | |
| 58 | - * } | |
| 59 | - * } | |
| 60 | - * | |
| 61 | - * | |
| 62 | - * </pre> | |
| 63 | - * | |
| 64 | - * </blockquote> | |
| 65 | - * <p> | |
| 66 | - * The <code>@Startup</code> annotation allows an integer value to be defined, which stands for the method execution | |
| 67 | - * priority when several initializer classes are available in the application. | |
| 68 | - * | |
| 69 | - * @author SERPRO | |
| 70 | - */ | |
| 71 | -@Target(METHOD) | |
| 72 | -@Retention(RUNTIME) | |
| 73 | -public @interface Startup { | |
| 74 | - | |
| 75 | - /** | |
| 76 | - * Most important priority value. | |
| 77 | - */ | |
| 78 | - public static int MAX_PRIORITY = Integer.MIN_VALUE; | |
| 79 | - | |
| 80 | - /** | |
| 81 | - * Less important priority value. | |
| 82 | - */ | |
| 83 | - public static int MIN_PRIORITY = Integer.MAX_VALUE; | |
| 84 | - | |
| 85 | - /** | |
| 86 | - * An integer value defines method execution order (i.e., priority). | |
| 87 | - */ | |
| 88 | - int priority() default MIN_PRIORITY; | |
| 89 | - | |
| 90 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/configuration/Configuration.java
| ... | ... | @@ -44,7 +44,7 @@ import java.lang.annotation.Retention; |
| 44 | 44 | import java.lang.annotation.Target; |
| 45 | 45 | |
| 46 | 46 | import javax.enterprise.inject.Stereotype; |
| 47 | -import javax.inject.Singleton; | |
| 47 | +import javax.enterprise.util.Nonbinding; | |
| 48 | 48 | |
| 49 | 49 | /** |
| 50 | 50 | * Identifies a <b>configuration class</b>, that is, a structure reserved to store configuration values retrieved from a |
| ... | ... | @@ -61,7 +61,7 @@ import javax.inject.Singleton; |
| 61 | 61 | * |
| 62 | 62 | * @author SERPRO |
| 63 | 63 | */ |
| 64 | -@Singleton | |
| 64 | +// @Singleton | |
| 65 | 65 | @Stereotype |
| 66 | 66 | @Inherited |
| 67 | 67 | @Target(TYPE) |
| ... | ... | @@ -80,6 +80,7 @@ public @interface Configuration { |
| 80 | 80 | * |
| 81 | 81 | * @return ConfigType |
| 82 | 82 | */ |
| 83 | + @Nonbinding | |
| 83 | 84 | ConfigType type() default ConfigType.PROPERTIES; |
| 84 | 85 | |
| 85 | 86 | /** |
| ... | ... | @@ -91,6 +92,7 @@ public @interface Configuration { |
| 91 | 92 | * |
| 92 | 93 | * @return String |
| 93 | 94 | */ |
| 95 | + @Nonbinding | |
| 94 | 96 | String prefix() default ""; |
| 95 | 97 | |
| 96 | 98 | /** |
| ... | ... | @@ -104,6 +106,7 @@ public @interface Configuration { |
| 104 | 106 | * |
| 105 | 107 | * @return String |
| 106 | 108 | */ |
| 109 | + @Nonbinding | |
| 107 | 110 | String resource() default DEFAULT_RESOURCE; |
| 108 | 111 | |
| 109 | 112 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/configuration/ConfigurationException.java
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/AbstractBootstrap.java
| ... | ... | @@ -1,79 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * Copyright (C) 2010 SERPRO | |
| 4 | - * ---------------------------------------------------------------------------- | |
| 5 | - * This file is part of Demoiselle Framework. | |
| 6 | - * | |
| 7 | - * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | - * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | - * as published by the Free Software Foundation. | |
| 10 | - * | |
| 11 | - * This program is distributed in the hope that it will be useful, | |
| 12 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | - * GNU General Public License for more details. | |
| 15 | - * | |
| 16 | - * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | - * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | - * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | - * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | - * ---------------------------------------------------------------------------- | |
| 21 | - * Este arquivo é parte do Framework Demoiselle. | |
| 22 | - * | |
| 23 | - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | - * do Software Livre (FSF). | |
| 26 | - * | |
| 27 | - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | - * para maiores detalhes. | |
| 31 | - * | |
| 32 | - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | - * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | - */ | |
| 37 | -package br.gov.frameworkdemoiselle.internal.bootstrap; | |
| 38 | - | |
| 39 | -import java.util.Locale; | |
| 40 | - | |
| 41 | -import javax.enterprise.inject.spi.AfterBeanDiscovery; | |
| 42 | -import javax.enterprise.inject.spi.Extension; | |
| 43 | - | |
| 44 | -import org.slf4j.Logger; | |
| 45 | - | |
| 46 | -import br.gov.frameworkdemoiselle.internal.context.Contexts; | |
| 47 | -import br.gov.frameworkdemoiselle.internal.context.CustomContext; | |
| 48 | -import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 49 | -import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 50 | -import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 51 | - | |
| 52 | -public abstract class AbstractBootstrap implements Extension { | |
| 53 | - | |
| 54 | - private static ResourceBundleProducer bundleFactory = new ResourceBundleProducer(); | |
| 55 | - | |
| 56 | - protected static ResourceBundle getBundle() { | |
| 57 | - return getBundle("demoiselle-core-bundle"); | |
| 58 | - } | |
| 59 | - | |
| 60 | - protected static ResourceBundle getBundle(String baseName) { | |
| 61 | - return bundleFactory.create(baseName, Locale.getDefault()); | |
| 62 | - } | |
| 63 | - | |
| 64 | - protected static Logger getLogger() { | |
| 65 | - return LoggerProducer.create(AbstractBootstrap.class); | |
| 66 | - } | |
| 67 | - | |
| 68 | - protected static void addContext(final CustomContext context, final AfterBeanDiscovery event) { | |
| 69 | - Contexts.add(context, event); | |
| 70 | - getLogger() | |
| 71 | - .trace(getBundle().getString("custom-context-was-registered", context.getScope().getCanonicalName())); | |
| 72 | - } | |
| 73 | - | |
| 74 | - protected static void disableContext(final CustomContext context) { | |
| 75 | - Contexts.remove(context); | |
| 76 | - getLogger() | |
| 77 | - .trace(getBundle().getString("custom-context-was-registered", context.getScope().getCanonicalName())); | |
| 78 | - } | |
| 79 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/AbstractLifecycleBootstrap.java
0 → 100644
| ... | ... | @@ -0,0 +1,175 @@ |
| 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.bootstrap; | |
| 38 | + | |
| 39 | +import java.lang.annotation.Annotation; | |
| 40 | +import java.util.ArrayList; | |
| 41 | +import java.util.Collections; | |
| 42 | +import java.util.Iterator; | |
| 43 | +import java.util.List; | |
| 44 | +import java.util.Locale; | |
| 45 | + | |
| 46 | +import javax.enterprise.context.ConversationScoped; | |
| 47 | +import javax.enterprise.context.RequestScoped; | |
| 48 | +import javax.enterprise.context.SessionScoped; | |
| 49 | +import javax.enterprise.event.Observes; | |
| 50 | +import javax.enterprise.inject.spi.AfterBeanDiscovery; | |
| 51 | +import javax.enterprise.inject.spi.AnnotatedMethod; | |
| 52 | +import javax.enterprise.inject.spi.AnnotatedType; | |
| 53 | +import javax.enterprise.inject.spi.Extension; | |
| 54 | +import javax.enterprise.inject.spi.ProcessAnnotatedType; | |
| 55 | + | |
| 56 | +import org.slf4j.Logger; | |
| 57 | + | |
| 58 | +import br.gov.frameworkdemoiselle.DemoiselleException; | |
| 59 | +import br.gov.frameworkdemoiselle.annotation.ViewScoped; | |
| 60 | +import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader; | |
| 61 | +import br.gov.frameworkdemoiselle.internal.context.Contexts; | |
| 62 | +import br.gov.frameworkdemoiselle.internal.context.CustomContext; | |
| 63 | +import br.gov.frameworkdemoiselle.internal.context.ThreadLocalContext; | |
| 64 | +import br.gov.frameworkdemoiselle.internal.implementation.AnnotatedMethodProcessor; | |
| 65 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 66 | +import br.gov.frameworkdemoiselle.util.Reflections; | |
| 67 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 68 | + | |
| 69 | +public abstract class AbstractLifecycleBootstrap<A extends Annotation> implements Extension { | |
| 70 | + | |
| 71 | + private Class<A> annotationClass; | |
| 72 | + | |
| 73 | + @SuppressWarnings("rawtypes") | |
| 74 | + private List<AnnotatedMethodProcessor> processors = Collections | |
| 75 | + .synchronizedList(new ArrayList<AnnotatedMethodProcessor>()); | |
| 76 | + | |
| 77 | + private List<CustomContext> tempContexts = new ArrayList<CustomContext>(); | |
| 78 | + | |
| 79 | + private AfterBeanDiscovery afterBeanDiscoveryEvent; | |
| 80 | + | |
| 81 | + private boolean registered = false; | |
| 82 | + | |
| 83 | + private ResourceBundle bundle; | |
| 84 | + | |
| 85 | + protected abstract Logger getLogger(); | |
| 86 | + | |
| 87 | + protected ResourceBundle getBundle() { | |
| 88 | + if (this.bundle == null) { | |
| 89 | + this.bundle = ResourceBundleProducer.create("demoiselle-core-bundle", Locale.getDefault()); | |
| 90 | + } | |
| 91 | + | |
| 92 | + return this.bundle; | |
| 93 | + } | |
| 94 | + | |
| 95 | + protected <T> AnnotatedMethodProcessor<T> newProcessorInstance(AnnotatedMethod<T> annotatedMethod) { | |
| 96 | + return new AnnotatedMethodProcessor<T>(annotatedMethod); | |
| 97 | + } | |
| 98 | + | |
| 99 | + protected Class<A> getAnnotationClass() { | |
| 100 | + if (this.annotationClass == null) { | |
| 101 | + this.annotationClass = Reflections.getGenericTypeArgument(this.getClass(), 0); | |
| 102 | + } | |
| 103 | + | |
| 104 | + return this.annotationClass; | |
| 105 | + } | |
| 106 | + | |
| 107 | + public <T> void processAnnotatedType(@Observes final ProcessAnnotatedType<T> event) { | |
| 108 | + final AnnotatedType<T> annotatedType = event.getAnnotatedType(); | |
| 109 | + | |
| 110 | + for (AnnotatedMethod<?> am : annotatedType.getMethods()) { | |
| 111 | + if (am.isAnnotationPresent(getAnnotationClass())) { | |
| 112 | + @SuppressWarnings("unchecked") | |
| 113 | + AnnotatedMethod<T> annotatedMethod = (AnnotatedMethod<T>) am; | |
| 114 | + processors.add(newProcessorInstance(annotatedMethod)); | |
| 115 | + } | |
| 116 | + } | |
| 117 | + } | |
| 118 | + | |
| 119 | + public void loadTempContexts(@Observes final AfterBeanDiscovery event) { | |
| 120 | + // Não registrar o contexto de aplicação pq ele já é registrado pela implementação do CDI | |
| 121 | + tempContexts.add(new ThreadLocalContext(ViewScoped.class)); | |
| 122 | + tempContexts.add(new ThreadLocalContext(SessionScoped.class)); | |
| 123 | + tempContexts.add(new ThreadLocalContext(ConversationScoped.class)); | |
| 124 | + tempContexts.add(new ThreadLocalContext(RequestScoped.class)); | |
| 125 | + | |
| 126 | + afterBeanDiscoveryEvent = event; | |
| 127 | + } | |
| 128 | + | |
| 129 | + @SuppressWarnings({ "unchecked", "rawtypes" }) | |
| 130 | + protected synchronized void proccessEvent() { | |
| 131 | + getLogger().debug(getBundle().getString("executing-all", annotationClass.getSimpleName())); | |
| 132 | + | |
| 133 | + Collections.sort(processors); | |
| 134 | + Throwable failure = null; | |
| 135 | + | |
| 136 | + if (!registered) { | |
| 137 | + for (CustomContext tempContext : tempContexts) { | |
| 138 | + Contexts.add(tempContext, afterBeanDiscoveryEvent); | |
| 139 | + } | |
| 140 | + | |
| 141 | + registered = true; | |
| 142 | + } | |
| 143 | + | |
| 144 | + for (Iterator<AnnotatedMethodProcessor> iter = processors.iterator(); iter.hasNext();) { | |
| 145 | + AnnotatedMethodProcessor<?> processor = iter.next(); | |
| 146 | + | |
| 147 | + try { | |
| 148 | + ClassLoader classLoader = ConfigurationLoader.getClassLoaderForClass(processor.getAnnotatedMethod() | |
| 149 | + .getDeclaringType().getJavaClass().getCanonicalName()); | |
| 150 | + | |
| 151 | + if (Thread.currentThread().getContextClassLoader().equals(classLoader)) { | |
| 152 | + processor.process(); | |
| 153 | + iter.remove(); | |
| 154 | + } | |
| 155 | + | |
| 156 | + } catch (Throwable cause) { | |
| 157 | + failure = cause; | |
| 158 | + } | |
| 159 | + } | |
| 160 | + | |
| 161 | + if (processors.isEmpty()) { | |
| 162 | + unloadTempContexts(); | |
| 163 | + } | |
| 164 | + | |
| 165 | + if (failure != null) { | |
| 166 | + throw new DemoiselleException(failure); | |
| 167 | + } | |
| 168 | + } | |
| 169 | + | |
| 170 | + private void unloadTempContexts() { | |
| 171 | + for (CustomContext tempContext : tempContexts) { | |
| 172 | + Contexts.remove(tempContext); | |
| 173 | + } | |
| 174 | + } | |
| 175 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/AbstractStrategyBootstrap.java
0 → 100644
| ... | ... | @@ -0,0 +1,48 @@ |
| 1 | +package br.gov.frameworkdemoiselle.internal.bootstrap; | |
| 2 | + | |
| 3 | +import java.util.ArrayList; | |
| 4 | +import java.util.Collections; | |
| 5 | +import java.util.List; | |
| 6 | + | |
| 7 | +import javax.enterprise.event.Observes; | |
| 8 | +import javax.enterprise.inject.spi.AnnotatedType; | |
| 9 | +import javax.enterprise.inject.spi.Extension; | |
| 10 | +import javax.enterprise.inject.spi.ProcessAnnotatedType; | |
| 11 | + | |
| 12 | +import org.slf4j.Logger; | |
| 13 | + | |
| 14 | +import br.gov.frameworkdemoiselle.util.Reflections; | |
| 15 | + | |
| 16 | +public abstract class AbstractStrategyBootstrap<I> implements Extension { | |
| 17 | + | |
| 18 | + private Class<? extends I> strategyClass; | |
| 19 | + | |
| 20 | + private List<Class<? extends I>> cache; | |
| 21 | + | |
| 22 | + protected abstract Logger getLogger(); | |
| 23 | + | |
| 24 | + protected Class<? extends I> getStrategyClass() { | |
| 25 | + if (this.strategyClass == null) { | |
| 26 | + this.strategyClass = Reflections.getGenericTypeArgument(this.getClass(), 0); | |
| 27 | + } | |
| 28 | + | |
| 29 | + return this.strategyClass; | |
| 30 | + } | |
| 31 | + | |
| 32 | + public List<Class<? extends I>> getCache() { | |
| 33 | + if (this.cache == null) { | |
| 34 | + this.cache = Collections.synchronizedList(new ArrayList<Class<? extends I>>()); | |
| 35 | + } | |
| 36 | + | |
| 37 | + return this.cache; | |
| 38 | + } | |
| 39 | + | |
| 40 | + @SuppressWarnings("unchecked") | |
| 41 | + public <T> void processAnnotatedType(@Observes final ProcessAnnotatedType<T> event) { | |
| 42 | + final AnnotatedType<T> annotatedType = event.getAnnotatedType(); | |
| 43 | + | |
| 44 | + if (Reflections.isOfType(annotatedType.getJavaClass(), this.getStrategyClass())) { | |
| 45 | + this.getCache().add((Class<I>) annotatedType.getJavaClass()); | |
| 46 | + } | |
| 47 | + } | |
| 48 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/AuthenticatorBootstrap.java
0 → 100644
| ... | ... | @@ -0,0 +1,56 @@ |
| 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.bootstrap; | |
| 38 | + | |
| 39 | +import org.slf4j.Logger; | |
| 40 | + | |
| 41 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 42 | +import br.gov.frameworkdemoiselle.security.Authenticator; | |
| 43 | + | |
| 44 | +public class AuthenticatorBootstrap extends AbstractStrategyBootstrap<Authenticator> { | |
| 45 | + | |
| 46 | + private Logger logger; | |
| 47 | + | |
| 48 | + @Override | |
| 49 | + protected Logger getLogger() { | |
| 50 | + if (logger == null) { | |
| 51 | + logger = LoggerProducer.create(AuthenticatorBootstrap.class); | |
| 52 | + } | |
| 53 | + | |
| 54 | + return logger; | |
| 55 | + } | |
| 56 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/AuthorizerBootstrap.java
0 → 100644
| ... | ... | @@ -0,0 +1,56 @@ |
| 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.bootstrap; | |
| 38 | + | |
| 39 | +import org.slf4j.Logger; | |
| 40 | + | |
| 41 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 42 | +import br.gov.frameworkdemoiselle.security.Authorizer; | |
| 43 | + | |
| 44 | +public class AuthorizerBootstrap extends AbstractStrategyBootstrap<Authorizer> { | |
| 45 | + | |
| 46 | + private Logger logger; | |
| 47 | + | |
| 48 | + @Override | |
| 49 | + protected Logger getLogger() { | |
| 50 | + if (logger == null) { | |
| 51 | + logger = LoggerProducer.create(AuthorizerBootstrap.class); | |
| 52 | + } | |
| 53 | + | |
| 54 | + return logger; | |
| 55 | + } | |
| 56 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ConfigurationBootstrap.java
| ... | ... | @@ -40,56 +40,69 @@ import java.util.ArrayList; |
| 40 | 40 | import java.util.Collections; |
| 41 | 41 | import java.util.List; |
| 42 | 42 | |
| 43 | -import javax.enterprise.context.RequestScoped; | |
| 44 | -import javax.enterprise.context.SessionScoped; | |
| 43 | +import javassist.ClassPool; | |
| 44 | +import javassist.CtClass; | |
| 45 | +import javassist.CtMethod; | |
| 46 | +import javassist.CtNewMethod; | |
| 47 | +import javassist.LoaderClassPath; | |
| 48 | + | |
| 45 | 49 | import javax.enterprise.event.Observes; |
| 46 | 50 | import javax.enterprise.inject.spi.AfterBeanDiscovery; |
| 47 | -import javax.enterprise.inject.spi.AfterDeploymentValidation; | |
| 48 | 51 | import javax.enterprise.inject.spi.AnnotatedType; |
| 49 | 52 | import javax.enterprise.inject.spi.BeanManager; |
| 53 | +import javax.enterprise.inject.spi.Extension; | |
| 50 | 54 | import javax.enterprise.inject.spi.ProcessAnnotatedType; |
| 51 | 55 | |
| 52 | 56 | import br.gov.frameworkdemoiselle.configuration.Configuration; |
| 53 | -import br.gov.frameworkdemoiselle.configuration.ConfigurationException; | |
| 54 | -import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader; | |
| 55 | -import br.gov.frameworkdemoiselle.internal.context.ThreadLocalContext; | |
| 56 | -import br.gov.frameworkdemoiselle.util.Beans; | |
| 57 | +import br.gov.frameworkdemoiselle.internal.implementation.ConfigurationImpl; | |
| 57 | 58 | |
| 58 | -/** | |
| 59 | - * @author SERPRO | |
| 60 | - */ | |
| 61 | -public class ConfigurationBootstrap extends AbstractBootstrap { | |
| 59 | +public class ConfigurationBootstrap implements Extension { | |
| 62 | 60 | |
| 63 | - private static List<AnnotatedType<?>> types = Collections.synchronizedList(new ArrayList<AnnotatedType<?>>()); | |
| 61 | + private final List<Class<Object>> cache = Collections.synchronizedList(new ArrayList<Class<Object>>()); | |
| 64 | 62 | |
| 65 | - private static final String MSG_PROCESSING = "bootstrap.configuration.processing"; | |
| 63 | + public void processAnnotatedType(@Observes final ProcessAnnotatedType<Object> event) { | |
| 64 | + final AnnotatedType<Object> annotatedType = event.getAnnotatedType(); | |
| 66 | 65 | |
| 67 | - private ThreadLocalContext c1; | |
| 66 | + if (annotatedType.getJavaClass().isAnnotationPresent(Configuration.class)) { | |
| 67 | + cache.add(annotatedType.getJavaClass()); | |
| 68 | + event.veto(); | |
| 69 | + } | |
| 70 | + } | |
| 68 | 71 | |
| 69 | - private ThreadLocalContext c2; | |
| 72 | + public void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager beanManager) throws Exception { | |
| 73 | + Class<Object> proxy; | |
| 70 | 74 | |
| 71 | - public <T> void detectAnnotation(@Observes final ProcessAnnotatedType<T> event, final BeanManager beanManager) { | |
| 72 | - if (event.getAnnotatedType().isAnnotationPresent(Configuration.class)) { | |
| 73 | - types.add(event.getAnnotatedType()); | |
| 75 | + for (Class<Object> config : cache) { | |
| 76 | + proxy = createProxy(config); | |
| 77 | + event.addBean(new CustomBean(proxy, beanManager)); | |
| 74 | 78 | } |
| 75 | 79 | } |
| 76 | 80 | |
| 77 | - public void loadTempContexts(@Observes final AfterBeanDiscovery event) { | |
| 78 | - c1 = new ThreadLocalContext(RequestScoped.class); | |
| 79 | - addContext(c1, event); | |
| 80 | - c2 = new ThreadLocalContext(SessionScoped.class); | |
| 81 | - addContext(c2, event); | |
| 82 | - } | |
| 81 | + @SuppressWarnings("unchecked") | |
| 82 | + private Class<Object> createProxy(Class<Object> type) throws Exception { | |
| 83 | + String superClassName = type.getCanonicalName(); | |
| 84 | + String chieldClassName = superClassName + "__DemoiselleProxy"; | |
| 85 | + | |
| 86 | + ClassPool pool = ClassPool.getDefault(); | |
| 87 | + CtClass ctChieldClass = pool.getOrNull(chieldClassName); | |
| 83 | 88 | |
| 84 | - public void processLoader(@Observes final AfterDeploymentValidation event) | |
| 85 | - throws ConfigurationException { | |
| 86 | - ConfigurationLoader configurationLoader = Beans.getReference(ConfigurationLoader.class); | |
| 87 | - for (AnnotatedType<?> type : types) { | |
| 88 | - getLogger().debug(getBundle().getString(MSG_PROCESSING, type.toString())); | |
| 89 | - configurationLoader.load(Beans.getReference(type.getJavaClass())); | |
| 89 | + ClassLoader classLoader = type.getClassLoader(); | |
| 90 | + if (ctChieldClass == null) { | |
| 91 | + pool.appendClassPath(new LoaderClassPath(classLoader)); | |
| 92 | + CtClass ctSuperClass = pool.get(superClassName); | |
| 93 | + | |
| 94 | + ctChieldClass = pool.getAndRename(ConfigurationImpl.class.getCanonicalName(), chieldClassName); | |
| 95 | + ctChieldClass.setSuperclass(ctSuperClass); | |
| 96 | + | |
| 97 | + CtMethod ctChieldMethod; | |
| 98 | + for (CtMethod ctSuperMethod : ctSuperClass.getDeclaredMethods()) { | |
| 99 | + ctChieldMethod = CtNewMethod.delegator(ctSuperMethod, ctChieldClass); | |
| 100 | + ctChieldMethod.insertBefore("load(this);"); | |
| 101 | + | |
| 102 | + ctChieldClass.addMethod(ctChieldMethod); | |
| 103 | + } | |
| 90 | 104 | } |
| 91 | - disableContext(c1); | |
| 92 | - disableContext(c2); | |
| 93 | - } | |
| 94 | 105 | |
| 106 | + return ctChieldClass.toClass(classLoader, type.getProtectionDomain()); | |
| 107 | + } | |
| 95 | 108 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/CoreBootstrap.java
| ... | ... | @@ -37,6 +37,7 @@ |
| 37 | 37 | package br.gov.frameworkdemoiselle.internal.bootstrap; |
| 38 | 38 | |
| 39 | 39 | import java.util.HashMap; |
| 40 | +import java.util.Locale; | |
| 40 | 41 | import java.util.Map; |
| 41 | 42 | |
| 42 | 43 | import javax.enterprise.event.Observes; |
| ... | ... | @@ -45,18 +46,41 @@ import javax.enterprise.inject.spi.AnnotatedType; |
| 45 | 46 | import javax.enterprise.inject.spi.BeanManager; |
| 46 | 47 | import javax.enterprise.inject.spi.BeforeBeanDiscovery; |
| 47 | 48 | import javax.enterprise.inject.spi.BeforeShutdown; |
| 49 | +import javax.enterprise.inject.spi.Extension; | |
| 48 | 50 | import javax.enterprise.inject.spi.ProcessAnnotatedType; |
| 49 | 51 | |
| 50 | 52 | import org.slf4j.Logger; |
| 51 | 53 | |
| 54 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 55 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 52 | 56 | import br.gov.frameworkdemoiselle.util.Beans; |
| 57 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 53 | 58 | |
| 54 | -//TODO Inter [NQ]: verificar o melhor nome para todas as classes desta natureza. | |
| 55 | -public class CoreBootstrap extends AbstractBootstrap { | |
| 59 | +public class CoreBootstrap implements Extension { | |
| 56 | 60 | |
| 57 | - private static final Map<Class<?>, AnnotatedType<?>> beans = new HashMap<Class<?>, AnnotatedType<?>>(); | |
| 61 | + private final Map<Class<?>, AnnotatedType<?>> beans = new HashMap<Class<?>, AnnotatedType<?>>(); | |
| 58 | 62 | |
| 59 | - public static boolean isAnnotatedType(Class<?> type) { | |
| 63 | + private Logger logger; | |
| 64 | + | |
| 65 | + private ResourceBundle bundle; | |
| 66 | + | |
| 67 | + private Logger getLogger() { | |
| 68 | + if (this.logger == null) { | |
| 69 | + this.logger = LoggerProducer.create(CoreBootstrap.class); | |
| 70 | + } | |
| 71 | + | |
| 72 | + return this.logger; | |
| 73 | + } | |
| 74 | + | |
| 75 | + private ResourceBundle getBundle() { | |
| 76 | + if (this.bundle == null) { | |
| 77 | + this.bundle = ResourceBundleProducer.create("demoiselle-core-bundle", Locale.getDefault()); | |
| 78 | + } | |
| 79 | + | |
| 80 | + return this.bundle; | |
| 81 | + } | |
| 82 | + | |
| 83 | + public boolean isAnnotatedType(Class<?> type) { | |
| 60 | 84 | return beans.containsKey(type); |
| 61 | 85 | } |
| 62 | 86 | |
| ... | ... | @@ -64,13 +88,12 @@ public class CoreBootstrap extends AbstractBootstrap { |
| 64 | 88 | String description; |
| 65 | 89 | Logger log = getLogger(); |
| 66 | 90 | |
| 67 | - description = getBundle("demoiselle-core-bundle").getString("engine-on"); | |
| 91 | + description = getBundle().getString("engine-on"); | |
| 68 | 92 | log.info(description); |
| 69 | 93 | |
| 70 | 94 | Beans.setBeanManager(beanManager); |
| 71 | 95 | |
| 72 | - description = getBundle("demoiselle-core-bundle").getString("setting-up-bean-manager", | |
| 73 | - Beans.class.getCanonicalName()); | |
| 96 | + description = getBundle().getString("setting-up-bean-manager", Beans.class.getCanonicalName()); | |
| 74 | 97 | log.info(description); |
| 75 | 98 | } |
| 76 | 99 | |
| ... | ... | @@ -78,15 +101,15 @@ public class CoreBootstrap extends AbstractBootstrap { |
| 78 | 101 | beans.put(event.getAnnotatedType().getJavaClass(), event.getAnnotatedType()); |
| 79 | 102 | } |
| 80 | 103 | |
| 81 | - public static void takeOff(@Observes final AfterDeploymentValidation event) { | |
| 82 | - String description = getBundle("demoiselle-core-bundle").getString("taking-off"); | |
| 104 | + public void takeOff(@Observes final AfterDeploymentValidation event) { | |
| 105 | + String description = getBundle().getString("taking-off"); | |
| 83 | 106 | |
| 84 | 107 | Logger log = getLogger(); |
| 85 | 108 | log.info(description); |
| 86 | 109 | } |
| 87 | 110 | |
| 88 | - public static void engineOff(@Observes final BeforeShutdown event) { | |
| 89 | - String description = getBundle("demoiselle-core-bundle").getString("engine-off"); | |
| 111 | + public void engineOff(@Observes final BeforeShutdown event) { | |
| 112 | + String description = getBundle().getString("engine-off"); | |
| 90 | 113 | |
| 91 | 114 | Logger log = getLogger(); |
| 92 | 115 | log.info(description); | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/CustomBean.java
0 → 100644
| ... | ... | @@ -0,0 +1,193 @@ |
| 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.bootstrap; | |
| 38 | + | |
| 39 | +import java.io.Serializable; | |
| 40 | +import java.lang.annotation.Annotation; | |
| 41 | +import java.lang.reflect.Type; | |
| 42 | +import java.util.HashSet; | |
| 43 | +import java.util.Set; | |
| 44 | + | |
| 45 | +import javax.enterprise.context.Dependent; | |
| 46 | +import javax.enterprise.context.NormalScope; | |
| 47 | +import javax.enterprise.context.spi.CreationalContext; | |
| 48 | +import javax.enterprise.inject.Alternative; | |
| 49 | +import javax.enterprise.inject.Any; | |
| 50 | +import javax.enterprise.inject.Default; | |
| 51 | +import javax.enterprise.inject.Stereotype; | |
| 52 | +import javax.enterprise.inject.spi.AnnotatedType; | |
| 53 | +import javax.enterprise.inject.spi.Bean; | |
| 54 | +import javax.enterprise.inject.spi.BeanManager; | |
| 55 | +import javax.enterprise.inject.spi.InjectionPoint; | |
| 56 | +import javax.enterprise.inject.spi.InjectionTarget; | |
| 57 | +import javax.enterprise.util.AnnotationLiteral; | |
| 58 | +import javax.inject.Named; | |
| 59 | +import javax.inject.Qualifier; | |
| 60 | +import javax.inject.Scope; | |
| 61 | + | |
| 62 | +import br.gov.frameworkdemoiselle.util.Beans; | |
| 63 | + | |
| 64 | +/** | |
| 65 | + * @see http://docs.jboss.org/weld/reference/latest/en-US/html_single/#d0e5035 | |
| 66 | + */ | |
| 67 | +public class CustomBean implements Bean<Object>, Serializable { | |
| 68 | + | |
| 69 | + private static final long serialVersionUID = 1L; | |
| 70 | + | |
| 71 | + private Class<Object> beanClass; | |
| 72 | + | |
| 73 | + private transient InjectionTarget<Object> injectionTarget; | |
| 74 | + | |
| 75 | + private transient BeanManager beanManager; | |
| 76 | + | |
| 77 | + private InjectionTarget<Object> getInjectionTarget() { | |
| 78 | + if (this.injectionTarget == null) { | |
| 79 | + AnnotatedType<Object> annotatedType = getBeanManager().createAnnotatedType(beanClass); | |
| 80 | + this.injectionTarget = getBeanManager().createInjectionTarget(annotatedType); | |
| 81 | + } | |
| 82 | + | |
| 83 | + return this.injectionTarget; | |
| 84 | + } | |
| 85 | + | |
| 86 | + private BeanManager getBeanManager() { | |
| 87 | + if (this.beanManager == null) { | |
| 88 | + this.beanManager = Beans.getBeanManager(); | |
| 89 | + } | |
| 90 | + | |
| 91 | + return this.beanManager; | |
| 92 | + } | |
| 93 | + | |
| 94 | + public CustomBean(Class<Object> beanClass, BeanManager beanManager) { | |
| 95 | + this.beanClass = beanClass; | |
| 96 | + this.beanManager = beanManager; | |
| 97 | + } | |
| 98 | + | |
| 99 | + public Object create(CreationalContext<Object> creationalContext) { | |
| 100 | + Object instance = getInjectionTarget().produce(creationalContext); | |
| 101 | + getInjectionTarget().inject(instance, creationalContext); | |
| 102 | + getInjectionTarget().postConstruct(instance); | |
| 103 | + | |
| 104 | + return instance; | |
| 105 | + } | |
| 106 | + | |
| 107 | + public void destroy(Object instance, CreationalContext<Object> creationalContext) { | |
| 108 | + getInjectionTarget().preDestroy(instance); | |
| 109 | + getInjectionTarget().dispose(instance); | |
| 110 | + creationalContext.release(); | |
| 111 | + } | |
| 112 | + | |
| 113 | + public Set<Type> getTypes() { | |
| 114 | + Set<Type> types = new HashSet<Type>(); | |
| 115 | + types.add(beanClass.getSuperclass()); | |
| 116 | + types.add(Object.class); | |
| 117 | + | |
| 118 | + return types; | |
| 119 | + } | |
| 120 | + | |
| 121 | + @SuppressWarnings("serial") | |
| 122 | + public Set<Annotation> getQualifiers() { | |
| 123 | + Set<Annotation> result = new HashSet<Annotation>(); | |
| 124 | + | |
| 125 | + result.add(new AnnotationLiteral<Default>() { | |
| 126 | + }); | |
| 127 | + result.add(new AnnotationLiteral<Any>() { | |
| 128 | + }); | |
| 129 | + | |
| 130 | + for (Annotation annotation : beanClass.getAnnotations()) { | |
| 131 | + if (annotation.getClass().isAnnotationPresent(Qualifier.class)) { | |
| 132 | + result.add(annotation); | |
| 133 | + } | |
| 134 | + } | |
| 135 | + | |
| 136 | + return result; | |
| 137 | + } | |
| 138 | + | |
| 139 | + public Class<? extends Annotation> getScope() { | |
| 140 | + Class<? extends Annotation> result = Dependent.class; | |
| 141 | + | |
| 142 | + Class<? extends Annotation> annotationClass; | |
| 143 | + for (Annotation annotation : beanClass.getAnnotations()) { | |
| 144 | + annotationClass = annotation.getClass(); | |
| 145 | + | |
| 146 | + if (annotationClass.isAnnotationPresent(Scope.class) | |
| 147 | + || annotationClass.isAnnotationPresent(NormalScope.class)) { | |
| 148 | + result = annotationClass; | |
| 149 | + break; | |
| 150 | + } | |
| 151 | + } | |
| 152 | + | |
| 153 | + return result; | |
| 154 | + } | |
| 155 | + | |
| 156 | + public String getName() { | |
| 157 | + String result = null; | |
| 158 | + | |
| 159 | + if (beanClass.isAnnotationPresent(Named.class)) { | |
| 160 | + result = beanClass.getAnnotation(Named.class).value(); | |
| 161 | + } | |
| 162 | + | |
| 163 | + return result; | |
| 164 | + } | |
| 165 | + | |
| 166 | + public Set<Class<? extends Annotation>> getStereotypes() { | |
| 167 | + Set<Class<? extends Annotation>> result = new HashSet<Class<? extends Annotation>>(); | |
| 168 | + | |
| 169 | + for (Annotation annotation : beanClass.getAnnotations()) { | |
| 170 | + if (annotation.getClass().isAnnotationPresent(Stereotype.class)) { | |
| 171 | + result.add(annotation.getClass()); | |
| 172 | + } | |
| 173 | + } | |
| 174 | + | |
| 175 | + return result; | |
| 176 | + } | |
| 177 | + | |
| 178 | + public Class<Object> getBeanClass() { | |
| 179 | + return beanClass; | |
| 180 | + } | |
| 181 | + | |
| 182 | + public boolean isAlternative() { | |
| 183 | + return beanClass.isAnnotationPresent(Alternative.class); | |
| 184 | + } | |
| 185 | + | |
| 186 | + public boolean isNullable() { | |
| 187 | + return false; | |
| 188 | + } | |
| 189 | + | |
| 190 | + public Set<InjectionPoint> getInjectionPoints() { | |
| 191 | + return getInjectionTarget().getInjectionPoints(); | |
| 192 | + } | |
| 193 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/ShutdownBootstrap.java
| ... | ... | @@ -36,103 +36,31 @@ |
| 36 | 36 | */ |
| 37 | 37 | package br.gov.frameworkdemoiselle.internal.bootstrap; |
| 38 | 38 | |
| 39 | -import java.lang.annotation.Annotation; | |
| 40 | -import java.util.ArrayList; | |
| 41 | -import java.util.Collections; | |
| 42 | -import java.util.List; | |
| 43 | - | |
| 44 | -import javax.enterprise.context.ConversationScoped; | |
| 45 | -import javax.enterprise.context.RequestScoped; | |
| 46 | -import javax.enterprise.context.SessionScoped; | |
| 47 | 39 | import javax.enterprise.event.Observes; |
| 48 | -import javax.enterprise.inject.spi.AfterBeanDiscovery; | |
| 49 | -import javax.enterprise.inject.spi.AnnotatedMethod; | |
| 50 | -import javax.enterprise.inject.spi.AnnotatedType; | |
| 51 | -import javax.enterprise.inject.spi.BeanManager; | |
| 52 | -import javax.enterprise.inject.spi.BeforeShutdown; | |
| 53 | -import javax.enterprise.inject.spi.ProcessAnnotatedType; | |
| 54 | 40 | |
| 55 | -import br.gov.frameworkdemoiselle.annotation.Shutdown; | |
| 56 | -import br.gov.frameworkdemoiselle.annotation.ViewScoped; | |
| 57 | -import br.gov.frameworkdemoiselle.internal.context.CustomContext; | |
| 58 | -import br.gov.frameworkdemoiselle.internal.context.ThreadLocalContext; | |
| 59 | -import br.gov.frameworkdemoiselle.internal.processor.ShutdownProcessor; | |
| 41 | +import org.slf4j.Logger; | |
| 42 | + | |
| 43 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 44 | +import br.gov.frameworkdemoiselle.lifecycle.AfterShutdownProccess; | |
| 45 | +import br.gov.frameworkdemoiselle.lifecycle.Shutdown; | |
| 60 | 46 | |
| 61 | 47 | /** |
| 62 | 48 | * This class run at application shutdown |
| 63 | 49 | */ |
| 64 | -public class ShutdownBootstrap extends AbstractBootstrap { | |
| 65 | - | |
| 66 | - private static final Class<? extends Annotation> annotationClass = Shutdown.class; | |
| 67 | - | |
| 68 | - private static final List<CustomContext> tempContexts = new ArrayList<CustomContext>(); | |
| 69 | - | |
| 70 | - @SuppressWarnings("rawtypes") | |
| 71 | - private static final List<ShutdownProcessor> processors = Collections | |
| 72 | - .synchronizedList(new ArrayList<ShutdownProcessor>()); | |
| 50 | +public class ShutdownBootstrap extends AbstractLifecycleBootstrap<Shutdown> { | |
| 73 | 51 | |
| 74 | - private static AfterBeanDiscovery event; | |
| 52 | + private Logger logger; | |
| 75 | 53 | |
| 76 | - /** | |
| 77 | - * Observes all methods annotated with @Shutdown and create an instance of ShutdownProcessor for them | |
| 78 | - * | |
| 79 | - * @param <T> | |
| 80 | - * @param event | |
| 81 | - * @param beanManager | |
| 82 | - */ | |
| 83 | - public <T> void processAnnotatedType(@Observes final ProcessAnnotatedType<T> event, final BeanManager beanManager) { | |
| 84 | - final AnnotatedType<T> annotatedType = event.getAnnotatedType(); | |
| 85 | - for (AnnotatedMethod<?> am : annotatedType.getMethods()) { | |
| 86 | - if (am.isAnnotationPresent(annotationClass)) { | |
| 87 | - @SuppressWarnings("unchecked") | |
| 88 | - AnnotatedMethod<T> annotatedMethod = (AnnotatedMethod<T>) am; | |
| 89 | - processors.add(new ShutdownProcessor<T>(annotatedMethod, beanManager)); | |
| 90 | - } | |
| 54 | + @Override | |
| 55 | + protected Logger getLogger() { | |
| 56 | + if (logger == null) { | |
| 57 | + logger = LoggerProducer.create(ShutdownBootstrap.class); | |
| 91 | 58 | } |
| 92 | - } | |
| 93 | 59 | |
| 94 | - public void saveEvent(@Observes final AfterBeanDiscovery event) { | |
| 95 | - ShutdownBootstrap.event = event; | |
| 60 | + return logger; | |
| 96 | 61 | } |
| 97 | 62 | |
| 98 | - public static void loadTempContexts(final AfterBeanDiscovery event) { | |
| 99 | - // Não registrar o contexto de aplicação pq ele já é registrado pela | |
| 100 | - // implementação do CDI | |
| 101 | - tempContexts.add(new ThreadLocalContext(ViewScoped.class)); | |
| 102 | - tempContexts.add(new ThreadLocalContext(SessionScoped.class, false)); | |
| 103 | - tempContexts.add(new ThreadLocalContext(ConversationScoped.class)); | |
| 104 | - tempContexts.add(new ThreadLocalContext(RequestScoped.class)); | |
| 105 | - | |
| 106 | - for (CustomContext tempContext : tempContexts) { | |
| 107 | - addContext(tempContext, event); | |
| 108 | - } | |
| 109 | - } | |
| 110 | - | |
| 111 | - /** | |
| 112 | - * Before Shutdown it execute the methods annotateds with @Shutdown considering the priority order; | |
| 113 | - * | |
| 114 | - * @param event | |
| 115 | - * @throws Exception | |
| 116 | - */ | |
| 117 | - @SuppressWarnings("unchecked") | |
| 118 | - public static void shuttingDown(@Observes final BeforeShutdown event) throws Throwable { | |
| 119 | - loadTempContexts(ShutdownBootstrap.event); | |
| 120 | - | |
| 121 | - getLogger().debug( | |
| 122 | - getBundle("demoiselle-core-bundle").getString("executing-all", annotationClass.getSimpleName())); | |
| 123 | - Collections.sort(processors); | |
| 124 | - | |
| 125 | - for (ShutdownProcessor<?> processor : processors) { | |
| 126 | - processor.process(); | |
| 127 | - } | |
| 128 | - | |
| 129 | - processors.clear(); | |
| 130 | - unloadTempContexts(); | |
| 131 | - } | |
| 132 | - | |
| 133 | - private static void unloadTempContexts() { | |
| 134 | - for (CustomContext tempContext : tempContexts) { | |
| 135 | - disableContext(tempContext); | |
| 136 | - } | |
| 63 | + public void shutdown(@Observes AfterShutdownProccess event) { | |
| 64 | + proccessEvent(); | |
| 137 | 65 | } |
| 138 | 66 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/StartupBootstrap.java
| ... | ... | @@ -36,93 +36,31 @@ |
| 36 | 36 | */ |
| 37 | 37 | package br.gov.frameworkdemoiselle.internal.bootstrap; |
| 38 | 38 | |
| 39 | -import java.lang.annotation.Annotation; | |
| 40 | -import java.util.ArrayList; | |
| 41 | -import java.util.Collections; | |
| 42 | -import java.util.List; | |
| 43 | - | |
| 44 | -import javax.enterprise.context.ConversationScoped; | |
| 45 | -import javax.enterprise.context.RequestScoped; | |
| 46 | -import javax.enterprise.context.SessionScoped; | |
| 47 | 39 | import javax.enterprise.event.Observes; |
| 48 | -import javax.enterprise.inject.spi.AfterBeanDiscovery; | |
| 49 | -import javax.enterprise.inject.spi.AfterDeploymentValidation; | |
| 50 | -import javax.enterprise.inject.spi.AnnotatedMethod; | |
| 51 | -import javax.enterprise.inject.spi.AnnotatedType; | |
| 52 | -import javax.enterprise.inject.spi.BeanManager; | |
| 53 | -import javax.enterprise.inject.spi.ProcessAnnotatedType; | |
| 54 | 40 | |
| 55 | -import br.gov.frameworkdemoiselle.annotation.Startup; | |
| 56 | -import br.gov.frameworkdemoiselle.annotation.ViewScoped; | |
| 57 | -import br.gov.frameworkdemoiselle.internal.context.ThreadLocalContext; | |
| 58 | -import br.gov.frameworkdemoiselle.internal.processor.StartupProcessor; | |
| 41 | +import org.slf4j.Logger; | |
| 42 | + | |
| 43 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 44 | +import br.gov.frameworkdemoiselle.lifecycle.AfterStartupProccess; | |
| 45 | +import br.gov.frameworkdemoiselle.lifecycle.Startup; | |
| 59 | 46 | |
| 60 | 47 | /** |
| 61 | 48 | * This class is the bootstrap to execute the processes at load time. |
| 62 | 49 | */ |
| 63 | -public class StartupBootstrap extends AbstractBootstrap { | |
| 64 | - | |
| 65 | - private static final Class<? extends Annotation> annotationClass = Startup.class; | |
| 66 | - | |
| 67 | - private final List<ThreadLocalContext> tempContexts = new ArrayList<ThreadLocalContext>(); | |
| 68 | - | |
| 69 | - @SuppressWarnings("rawtypes") | |
| 70 | - private static final List<StartupProcessor> processors = Collections | |
| 71 | - .synchronizedList(new ArrayList<StartupProcessor>()); | |
| 72 | - | |
| 73 | - /** | |
| 74 | - * Observes all methods annotated with @Startup and create an instance of StartupAction for them | |
| 75 | - * | |
| 76 | - * @param <T> | |
| 77 | - * @param event | |
| 78 | - * @param beanManager | |
| 79 | - */ | |
| 80 | - public <T> void processAnnotatedType(@Observes final ProcessAnnotatedType<T> event, final BeanManager beanManager) { | |
| 81 | - final AnnotatedType<T> annotatedType = event.getAnnotatedType(); | |
| 82 | - for (AnnotatedMethod<?> am : annotatedType.getMethods()) { | |
| 83 | - if (am.isAnnotationPresent(annotationClass)) { | |
| 84 | - @SuppressWarnings("unchecked") | |
| 85 | - AnnotatedMethod<T> annotatedMethod = (AnnotatedMethod<T>) am; | |
| 86 | - processors.add(new StartupProcessor<T>(annotatedMethod, beanManager)); | |
| 87 | - } | |
| 88 | - } | |
| 89 | - } | |
| 50 | +public class StartupBootstrap extends AbstractLifecycleBootstrap<Startup> { | |
| 90 | 51 | |
| 91 | - public void loadTempContexts(@Observes final AfterBeanDiscovery event) { | |
| 92 | - //Não registrar o contexto de aplicação pq ele já é registrado pela implementação do CDI | |
| 93 | - this.tempContexts.add(new ThreadLocalContext(ViewScoped.class)); | |
| 94 | - this.tempContexts.add(new ThreadLocalContext(SessionScoped.class)); | |
| 95 | - this.tempContexts.add(new ThreadLocalContext(ConversationScoped.class)); | |
| 96 | - this.tempContexts.add(new ThreadLocalContext(RequestScoped.class)); | |
| 52 | + private Logger logger; | |
| 97 | 53 | |
| 98 | - for (ThreadLocalContext tempContext : this.tempContexts) { | |
| 99 | - addContext(tempContext, event); | |
| 54 | + @Override | |
| 55 | + protected Logger getLogger() { | |
| 56 | + if (logger == null) { | |
| 57 | + logger = LoggerProducer.create(StartupBootstrap.class); | |
| 100 | 58 | } |
| 101 | - } | |
| 102 | 59 | |
| 103 | - /** | |
| 104 | - * After the deployment validation it execute the methods annotateds with @Startup considering the priority order; | |
| 105 | - * | |
| 106 | - * @param event | |
| 107 | - * @throws Exception | |
| 108 | - * @throws StartupException | |
| 109 | - */ | |
| 110 | - @SuppressWarnings("unchecked") | |
| 111 | - public void startup(@Observes final AfterDeploymentValidation event) throws Throwable { | |
| 112 | - getLogger().debug( | |
| 113 | - getBundle("demoiselle-core-bundle").getString("executing-all", annotationClass.getSimpleName())); | |
| 114 | - Collections.sort(processors); | |
| 115 | - | |
| 116 | - for (StartupProcessor<?> action : processors) { | |
| 117 | - action.process(); | |
| 118 | - } | |
| 119 | - processors.clear(); | |
| 120 | - unloadTempContexts(); | |
| 60 | + return logger; | |
| 121 | 61 | } |
| 122 | 62 | |
| 123 | - private void unloadTempContexts() { | |
| 124 | - for (ThreadLocalContext tempContext : this.tempContexts) { | |
| 125 | - disableContext(tempContext); | |
| 126 | - } | |
| 63 | + public void startup(@Observes AfterStartupProccess event) { | |
| 64 | + proccessEvent(); | |
| 127 | 65 | } |
| 128 | 66 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/TransactionBootstrap.java
0 → 100644
| ... | ... | @@ -0,0 +1,56 @@ |
| 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.bootstrap; | |
| 38 | + | |
| 39 | +import org.slf4j.Logger; | |
| 40 | + | |
| 41 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 42 | +import br.gov.frameworkdemoiselle.transaction.Transaction; | |
| 43 | + | |
| 44 | +public class TransactionBootstrap extends AbstractStrategyBootstrap<Transaction> { | |
| 45 | + | |
| 46 | + private Logger logger; | |
| 47 | + | |
| 48 | + @Override | |
| 49 | + protected Logger getLogger() { | |
| 50 | + if (logger == null) { | |
| 51 | + logger = LoggerProducer.create(TransactionBootstrap.class); | |
| 52 | + } | |
| 53 | + | |
| 54 | + return logger; | |
| 55 | + } | |
| 56 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/ConfigurationLoader.java
| ... | ... | @@ -36,16 +36,18 @@ |
| 36 | 36 | */ |
| 37 | 37 | package br.gov.frameworkdemoiselle.internal.configuration; |
| 38 | 38 | |
| 39 | +import java.io.FileNotFoundException; | |
| 40 | +import java.io.Serializable; | |
| 39 | 41 | import java.lang.reflect.Field; |
| 40 | 42 | import java.lang.reflect.Method; |
| 41 | 43 | import java.lang.reflect.ParameterizedType; |
| 42 | 44 | import java.lang.reflect.Type; |
| 45 | +import java.net.URL; | |
| 43 | 46 | import java.util.HashSet; |
| 44 | 47 | import java.util.Iterator; |
| 45 | 48 | import java.util.Properties; |
| 46 | 49 | import java.util.Set; |
| 47 | 50 | |
| 48 | -import javax.inject.Inject; | |
| 49 | 51 | import javax.validation.constraints.NotNull; |
| 50 | 52 | |
| 51 | 53 | import org.apache.commons.configuration.DataConfiguration; |
| ... | ... | @@ -60,6 +62,9 @@ import br.gov.frameworkdemoiselle.configuration.ConfigType; |
| 60 | 62 | import br.gov.frameworkdemoiselle.configuration.Configuration; |
| 61 | 63 | import br.gov.frameworkdemoiselle.configuration.ConfigurationException; |
| 62 | 64 | import br.gov.frameworkdemoiselle.internal.bootstrap.CoreBootstrap; |
| 65 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 66 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 67 | +import br.gov.frameworkdemoiselle.util.Beans; | |
| 63 | 68 | import br.gov.frameworkdemoiselle.util.Reflections; |
| 64 | 69 | import br.gov.frameworkdemoiselle.util.ResourceBundle; |
| 65 | 70 | import br.gov.frameworkdemoiselle.util.Strings; |
| ... | ... | @@ -70,15 +75,14 @@ import br.gov.frameworkdemoiselle.util.Strings; |
| 70 | 75 | * |
| 71 | 76 | * @author SERPRO |
| 72 | 77 | */ |
| 73 | -public class ConfigurationLoader { | |
| 78 | +public class ConfigurationLoader implements Serializable { | |
| 74 | 79 | |
| 75 | - @Inject | |
| 76 | - @Name("demoiselle-core-bundle") | |
| 77 | - private ResourceBundle bundle; | |
| 80 | + private static final long serialVersionUID = 1L; | |
| 78 | 81 | |
| 79 | - @Inject | |
| 80 | - private Logger logger; | |
| 82 | + private static ResourceBundle bundle; | |
| 81 | 83 | |
| 84 | + private static Logger logger; | |
| 85 | + | |
| 82 | 86 | /** |
| 83 | 87 | * Loads a config class filling it with the corresponding values. |
| 84 | 88 | * |
| ... | ... | @@ -88,13 +92,14 @@ public class ConfigurationLoader { |
| 88 | 92 | */ |
| 89 | 93 | public void load(Object object) throws ConfigurationException { |
| 90 | 94 | Class<?> config = object.getClass(); |
| 95 | + CoreBootstrap bootstrap = Beans.getReference(CoreBootstrap.class); | |
| 91 | 96 | |
| 92 | - if (!CoreBootstrap.isAnnotatedType(config)) { | |
| 97 | + if (!bootstrap.isAnnotatedType(config)) { | |
| 93 | 98 | config = config.getSuperclass(); |
| 94 | - logger.debug(bundle.getString("proxy-detected", config, config.getClass().getSuperclass())); | |
| 99 | + getLogger().debug(getBundle().getString("proxy-detected", config, config.getClass().getSuperclass())); | |
| 95 | 100 | } |
| 96 | 101 | |
| 97 | - logger.debug(bundle.getString("loading-configuration-class", config.getName())); | |
| 102 | + getLogger().debug(getBundle().getString("loading-configuration-class", config.getName())); | |
| 98 | 103 | |
| 99 | 104 | for (Field field : Reflections.getNonStaticDeclaredFields(config)) { |
| 100 | 105 | loadField(field, object, config); |
| ... | ... | @@ -107,24 +112,27 @@ public class ConfigurationLoader { |
| 107 | 112 | ConfigType type = clazz.getAnnotation(Configuration.class).type(); |
| 108 | 113 | org.apache.commons.configuration.Configuration config = getConfiguration(resource, type); |
| 109 | 114 | |
| 110 | - String key = getKey(field, clazz, config); | |
| 111 | - Object value = getValue(key, field, config); | |
| 115 | + if (config != null) { | |
| 116 | + String key = getKey(field, clazz, config); | |
| 117 | + Object value = getValue(key, field, config); | |
| 112 | 118 | |
| 113 | - validate(field, key, value, resource); | |
| 114 | - setValue(field, key, object, value); | |
| 119 | + validate(field, key, value, resource); | |
| 120 | + setValue(field, key, object, value); | |
| 121 | + } | |
| 115 | 122 | } |
| 116 | 123 | } |
| 117 | 124 | |
| 118 | 125 | private void setValue(Field field, String key, Object object, Object value) { |
| 119 | 126 | if (value != null) { |
| 120 | 127 | Reflections.setFieldValue(field, object, value); |
| 121 | - logger.debug(bundle.getString("configuration-field-loaded", key, field.getName(), value)); | |
| 128 | + getLogger().debug(getBundle().getString("configuration-field-loaded", key, field.getName(), value)); | |
| 122 | 129 | } |
| 123 | 130 | } |
| 124 | 131 | |
| 125 | 132 | private void validate(Field field, String key, Object value, String resource) { |
| 126 | 133 | if (field.isAnnotationPresent(NotNull.class) && value == null) { |
| 127 | - throw new ConfigurationException(bundle.getString("configuration-attribute-is-mandatory", key, resource)); | |
| 134 | + throw new ConfigurationException(getBundle().getString("configuration-attribute-is-mandatory", key, | |
| 135 | + resource)); | |
| 128 | 136 | } |
| 129 | 137 | } |
| 130 | 138 | |
| ... | ... | @@ -161,7 +169,7 @@ public class ConfigurationLoader { |
| 161 | 169 | |
| 162 | 170 | Name nameAnnotation = field.getAnnotation(Name.class); |
| 163 | 171 | if (Strings.isEmpty(nameAnnotation.value())) { |
| 164 | - throw new ConfigurationException(bundle.getString("configuration-name-attribute-cant-be-empty")); | |
| 172 | + throw new ConfigurationException(getBundle().getString("configuration-name-attribute-cant-be-empty")); | |
| 165 | 173 | } else { |
| 166 | 174 | key = nameAnnotation.value(); |
| 167 | 175 | } |
| ... | ... | @@ -188,9 +196,9 @@ public class ConfigurationLoader { |
| 188 | 196 | } |
| 189 | 197 | |
| 190 | 198 | if (matches == 0) { |
| 191 | - logger.debug(bundle.getString("configuration-key-not-found", key, conventions)); | |
| 199 | + getLogger().debug(getBundle().getString("configuration-key-not-found", key, conventions)); | |
| 192 | 200 | } else if (matches > 1) { |
| 193 | - throw new ConfigurationException(bundle.getString("ambiguous-key", field.getName(), | |
| 201 | + throw new ConfigurationException(getBundle().getString("ambiguous-key", field.getName(), | |
| 194 | 202 | field.getDeclaringClass())); |
| 195 | 203 | } |
| 196 | 204 | |
| ... | ... | @@ -205,33 +213,45 @@ public class ConfigurationLoader { |
| 205 | 213 | * @return a configuration |
| 206 | 214 | */ |
| 207 | 215 | private org.apache.commons.configuration.Configuration getConfiguration(String resource, ConfigType type) { |
| 208 | - org.apache.commons.configuration.Configuration config = null; | |
| 216 | + org.apache.commons.configuration.Configuration result = null; | |
| 209 | 217 | |
| 210 | 218 | try { |
| 219 | + URL url; | |
| 220 | + | |
| 211 | 221 | switch (type) { |
| 212 | 222 | case SYSTEM: |
| 213 | - config = new SystemConfiguration(); | |
| 223 | + result = new SystemConfiguration(); | |
| 214 | 224 | break; |
| 215 | 225 | |
| 216 | 226 | case PROPERTIES: |
| 217 | - config = new DataConfiguration(new PropertiesConfiguration(resource + ".properties")); | |
| 227 | + url = getResourceAsURL(resource + ".properties"); | |
| 228 | + | |
| 229 | + if (url != null) { | |
| 230 | + result = new DataConfiguration(new PropertiesConfiguration(url)); | |
| 231 | + } | |
| 232 | + | |
| 218 | 233 | break; |
| 219 | 234 | |
| 220 | 235 | case XML: |
| 221 | - config = new DataConfiguration(new XMLConfiguration(resource + ".xml")); | |
| 236 | + url = getResourceAsURL(resource + ".xml"); | |
| 237 | + | |
| 238 | + if (url != null) { | |
| 239 | + result = new DataConfiguration(new XMLConfiguration(url)); | |
| 240 | + } | |
| 241 | + | |
| 222 | 242 | break; |
| 223 | 243 | |
| 224 | 244 | default: |
| 225 | - throw new ConfigurationException(bundle.getString("configuration-type-not-implemented-yet", | |
| 245 | + throw new ConfigurationException(getBundle().getString("configuration-type-not-implemented-yet", | |
| 226 | 246 | type.name())); |
| 227 | 247 | } |
| 228 | 248 | |
| 229 | 249 | } catch (Exception cause) { |
| 230 | - throw new ConfigurationException(bundle.getString("error-creating-configuration-from-resource", resource), | |
| 231 | - cause); | |
| 250 | + throw new ConfigurationException(getBundle().getString("error-creating-configuration-from-resource", | |
| 251 | + resource), cause); | |
| 232 | 252 | } |
| 233 | 253 | |
| 234 | - return config; | |
| 254 | + return result; | |
| 235 | 255 | } |
| 236 | 256 | |
| 237 | 257 | @SuppressWarnings("unchecked") |
| ... | ... | @@ -239,39 +259,43 @@ public class ConfigurationLoader { |
| 239 | 259 | Object value; |
| 240 | 260 | |
| 241 | 261 | Class<?> fieldClass = (Class<?>) field.getType(); |
| 242 | - | |
| 262 | + | |
| 243 | 263 | if (fieldClass.isArray()) { |
| 244 | 264 | value = getArray(key, field, config); |
| 265 | + | |
| 245 | 266 | } else if (fieldClass.equals(Properties.class)) { |
| 246 | 267 | value = getProperty(key, config); |
| 247 | 268 | |
| 269 | + } else if (fieldClass.equals(Class.class)) { | |
| 270 | + value = getClass(key, field, config); | |
| 271 | + | |
| 248 | 272 | } else { |
| 249 | 273 | value = getBasic(key, field, config); |
| 250 | 274 | } |
| 251 | 275 | |
| 252 | 276 | return (T) value; |
| 253 | 277 | } |
| 254 | - | |
| 278 | + | |
| 255 | 279 | private <T> Object getArray(String key, Field field, org.apache.commons.configuration.Configuration config) { |
| 256 | 280 | Object value = null; |
| 257 | 281 | |
| 258 | 282 | Class<?> fieldClass = (Class<?>) field.getType(); |
| 259 | - | |
| 283 | + | |
| 260 | 284 | try { |
| 261 | 285 | Method method; |
| 262 | - | |
| 263 | 286 | String methodName = "get"; |
| 264 | - | |
| 287 | + | |
| 265 | 288 | methodName += Strings.firstToUpper(fieldClass.getSimpleName()); |
| 266 | 289 | methodName = Strings.removeChars(methodName, '[', ']'); |
| 267 | - | |
| 290 | + | |
| 268 | 291 | methodName += "Array"; |
| 269 | 292 | |
| 270 | 293 | method = config.getClass().getMethod(methodName, String.class); |
| 271 | 294 | value = method.invoke(config, key); |
| 272 | 295 | |
| 273 | 296 | } catch (Throwable cause) { |
| 274 | - throw new ConfigurationException(bundle.getString("error-converting-to-type", fieldClass.getName()), cause); | |
| 297 | + throw new ConfigurationException(getBundle().getString("error-converting-to-type", fieldClass.getName()), | |
| 298 | + cause); | |
| 275 | 299 | } |
| 276 | 300 | |
| 277 | 301 | return value; |
| ... | ... | @@ -281,62 +305,78 @@ public class ConfigurationLoader { |
| 281 | 305 | Object value = null; |
| 282 | 306 | |
| 283 | 307 | Class<?> fieldClass = (Class<?>) field.getType(); |
| 284 | - | |
| 308 | + | |
| 285 | 309 | try { |
| 286 | 310 | Method method; |
| 287 | - | |
| 288 | 311 | String methodName = "get"; |
| 289 | - | |
| 312 | + | |
| 290 | 313 | methodName += discoveryGenericType(field); |
| 291 | - | |
| 292 | 314 | methodName += Strings.firstToUpper(fieldClass.getSimpleName()); |
| 293 | 315 | |
| 294 | 316 | if (!fieldClass.isPrimitive()) { |
| 295 | 317 | method = config.getClass().getMethod(methodName, String.class, fieldClass); |
| 296 | 318 | value = method.invoke(config, key, null); |
| 297 | - | |
| 319 | + | |
| 298 | 320 | } else if (config.containsKey(key)) { |
| 299 | 321 | method = config.getClass().getMethod(methodName, String.class); |
| 300 | 322 | value = method.invoke(config, key); |
| 301 | 323 | } |
| 302 | 324 | |
| 303 | 325 | } catch (Throwable cause) { |
| 304 | - throw new ConfigurationException(bundle.getString("error-converting-to-type", fieldClass.getName()), cause); | |
| 326 | + throw new ConfigurationException(getBundle().getString("error-converting-to-type", fieldClass.getName()), | |
| 327 | + cause); | |
| 328 | + } | |
| 329 | + | |
| 330 | + return value; | |
| 331 | + } | |
| 332 | + | |
| 333 | + private <T> Object getClass(String key, Field field, org.apache.commons.configuration.Configuration config) { | |
| 334 | + Object value = null; | |
| 335 | + | |
| 336 | + try { | |
| 337 | + String canonicalName = config.getString(key); | |
| 338 | + | |
| 339 | + if (canonicalName != null) { | |
| 340 | + ClassLoader classLoader = getClassLoaderForClass(canonicalName); | |
| 341 | + value = Class.forName(canonicalName, true, classLoader); | |
| 342 | + } | |
| 343 | + | |
| 344 | + } catch (Exception cause) { | |
| 345 | + // TODO Lançar a mensagem correta | |
| 346 | + throw new ConfigurationException(null, cause); | |
| 305 | 347 | } |
| 306 | 348 | |
| 307 | 349 | return value; |
| 308 | 350 | } |
| 309 | 351 | |
| 310 | 352 | /** |
| 311 | - * Discovery the Generic's type. | |
| 312 | - * | |
| 313 | - * for example: the generic's type of List<Integer> list is an Integer type | |
| 353 | + * Discovery the Generic's type. for example: the generic's type of List<Integer> list is an Integer type | |
| 314 | 354 | * |
| 315 | 355 | * @param field |
| 316 | 356 | * @return |
| 317 | 357 | */ |
| 318 | 358 | private String discoveryGenericType(Field field) { |
| 319 | - | |
| 359 | + | |
| 320 | 360 | Type genericFieldType = field.getGenericType(); |
| 321 | - | |
| 322 | - if(genericFieldType instanceof ParameterizedType){ | |
| 323 | - ParameterizedType type = (ParameterizedType) genericFieldType; | |
| 324 | - Type[] fieldArgumentTypes = type.getActualTypeArguments(); | |
| 325 | - for(Type fieldArgumentType : fieldArgumentTypes){ | |
| 326 | - @SuppressWarnings("rawtypes") | |
| 361 | + | |
| 362 | + if (genericFieldType instanceof ParameterizedType) { | |
| 363 | + ParameterizedType type = (ParameterizedType) genericFieldType; | |
| 364 | + Type[] fieldArgumentTypes = type.getActualTypeArguments(); | |
| 365 | + for (Type fieldArgumentType : fieldArgumentTypes) { | |
| 366 | + @SuppressWarnings("rawtypes") | |
| 327 | 367 | Class fieldArgumentClass = (Class) fieldArgumentType; |
| 328 | - | |
| 329 | - if("String".equals(fieldArgumentClass.getSimpleName())) { | |
| 330 | - return ""; | |
| 331 | - } | |
| 332 | - | |
| 333 | - return fieldArgumentClass.getSimpleName(); | |
| 334 | - } | |
| 368 | + | |
| 369 | + if ("String".equals(fieldArgumentClass.getSimpleName())) { | |
| 370 | + return ""; | |
| 371 | + } | |
| 372 | + | |
| 373 | + return fieldArgumentClass.getSimpleName(); | |
| 374 | + } | |
| 335 | 375 | } |
| 336 | - | |
| 376 | + | |
| 337 | 377 | return ""; |
| 338 | 378 | } |
| 339 | - | |
| 379 | + | |
| 340 | 380 | private Object getProperty(String key, org.apache.commons.configuration.Configuration config) { |
| 341 | 381 | Object value = null; |
| 342 | 382 | |
| ... | ... | @@ -357,4 +397,51 @@ public class ConfigurationLoader { |
| 357 | 397 | |
| 358 | 398 | return value; |
| 359 | 399 | } |
| 400 | + | |
| 401 | + public static ClassLoader getClassLoaderForClass(final String canonicalName) throws FileNotFoundException { | |
| 402 | + return getClassLoaderForResource(canonicalName.replaceAll("\\.", "/") + ".class"); | |
| 403 | + } | |
| 404 | + | |
| 405 | + public static ClassLoader getClassLoaderForResource(final String resource) throws FileNotFoundException { | |
| 406 | + final String stripped = resource.startsWith("/") ? resource.substring(1) : resource; | |
| 407 | + | |
| 408 | + URL url = null; | |
| 409 | + ClassLoader result = Thread.currentThread().getContextClassLoader(); | |
| 410 | + | |
| 411 | + if (result != null) { | |
| 412 | + url = result.getResource(stripped); | |
| 413 | + } | |
| 414 | + | |
| 415 | + if (url == null) { | |
| 416 | + result = ConfigurationLoader.class.getClassLoader(); | |
| 417 | + url = ConfigurationLoader.class.getClassLoader().getResource(stripped); | |
| 418 | + } | |
| 419 | + | |
| 420 | + if (url == null) { | |
| 421 | + result = null; | |
| 422 | + } | |
| 423 | + | |
| 424 | + return result; | |
| 425 | + } | |
| 426 | + | |
| 427 | + public static URL getResourceAsURL(final String resource) throws FileNotFoundException { | |
| 428 | + ClassLoader classLoader = getClassLoaderForResource(resource); | |
| 429 | + return classLoader != null ? classLoader.getResource(resource) : null; | |
| 430 | + } | |
| 431 | + | |
| 432 | + private static ResourceBundle getBundle() { | |
| 433 | + if (bundle == null) { | |
| 434 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 435 | + } | |
| 436 | + | |
| 437 | + return bundle; | |
| 438 | + } | |
| 439 | + | |
| 440 | + private static Logger getLogger() { | |
| 441 | + if (logger == null) { | |
| 442 | + logger = LoggerProducer.create(ConfigurationLoader.class); | |
| 443 | + } | |
| 444 | + | |
| 445 | + return logger; | |
| 446 | + } | |
| 360 | 447 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/PaginationConfig.java
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/SecurityConfig.java
| 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 | 1 | package br.gov.frameworkdemoiselle.internal.configuration; |
| 38 | 2 | |
| 39 | -import java.io.Serializable; | |
| 40 | - | |
| 41 | -import br.gov.frameworkdemoiselle.annotation.Name; | |
| 42 | -import br.gov.frameworkdemoiselle.configuration.Configuration; | |
| 3 | +import br.gov.frameworkdemoiselle.security.Authenticator; | |
| 4 | +import br.gov.frameworkdemoiselle.security.Authorizer; | |
| 43 | 5 | |
| 44 | 6 | /** |
| 45 | 7 | * A <code>SecurityConfig</code> object is responsible for specifying which security configurations should be used for a |
| ... | ... | @@ -47,13 +9,7 @@ import br.gov.frameworkdemoiselle.configuration.Configuration; |
| 47 | 9 | * |
| 48 | 10 | * @author SERPRO |
| 49 | 11 | */ |
| 50 | -@Configuration(prefix = "frameworkdemoiselle.security") | |
| 51 | -public class SecurityConfig implements Serializable { | |
| 52 | - | |
| 53 | - private static final long serialVersionUID = 1L; | |
| 54 | - | |
| 55 | - @Name("enabled") | |
| 56 | - private boolean enabled = true; | |
| 12 | +public interface SecurityConfig { | |
| 57 | 13 | |
| 58 | 14 | /** |
| 59 | 15 | * Tells whether or not the security is enabled for the current application. This value could be defined in the |
| ... | ... | @@ -62,7 +18,15 @@ public class SecurityConfig implements Serializable { |
| 62 | 18 | * @return the value defined for the key <i>frameworkdemoiselle.security.enabled</i> in the |
| 63 | 19 | * <b>demoiselle.properties</b> file. If there is no value defined, returns the default value <tt>true</tt> |
| 64 | 20 | */ |
| 65 | - public boolean isEnabled() { | |
| 66 | - return enabled; | |
| 67 | - } | |
| 21 | + boolean isEnabled(); | |
| 22 | + | |
| 23 | + void setEnabled(boolean enabled); | |
| 24 | + | |
| 25 | + Class<? extends Authenticator> getAuthenticatorClass(); | |
| 26 | + | |
| 27 | + void setAuthenticatorClass(Class<? extends Authenticator> authenticatorClass); | |
| 28 | + | |
| 29 | + Class<? extends Authorizer> getAuthorizerClass(); | |
| 30 | + | |
| 31 | + void setAuthorizerClass(Class<? extends Authorizer> authorizerClass); | |
| 68 | 32 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/SecurityConfigImpl.java
0 → 100644
| ... | ... | @@ -0,0 +1,109 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * Copyright (C) 2010 SERPRO | |
| 4 | + * ---------------------------------------------------------------------------- | |
| 5 | + * This file is part of Demoiselle Framework. | |
| 6 | + * | |
| 7 | + * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | + * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | + * as published by the Free Software Foundation. | |
| 10 | + * | |
| 11 | + * This program is distributed in the hope that it will be useful, | |
| 12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | + * GNU General Public License for more details. | |
| 15 | + * | |
| 16 | + * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | + * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | + * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | + * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | + * ---------------------------------------------------------------------------- | |
| 21 | + * Este arquivo é parte do Framework Demoiselle. | |
| 22 | + * | |
| 23 | + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | + * do Software Livre (FSF). | |
| 26 | + * | |
| 27 | + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | + * para maiores detalhes. | |
| 31 | + * | |
| 32 | + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | + * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | + */ | |
| 37 | +package br.gov.frameworkdemoiselle.internal.configuration; | |
| 38 | + | |
| 39 | +import java.io.Serializable; | |
| 40 | + | |
| 41 | +import br.gov.frameworkdemoiselle.configuration.Configuration; | |
| 42 | +import br.gov.frameworkdemoiselle.security.Authenticator; | |
| 43 | +import br.gov.frameworkdemoiselle.security.Authorizer; | |
| 44 | + | |
| 45 | +@Configuration(prefix = "frameworkdemoiselle.security") | |
| 46 | +public class SecurityConfigImpl implements Serializable, SecurityConfig { | |
| 47 | + | |
| 48 | + private static final long serialVersionUID = 1L; | |
| 49 | + | |
| 50 | + private boolean enabled = true; | |
| 51 | + | |
| 52 | + private Class<? extends Authenticator> authenticatorClass; | |
| 53 | + | |
| 54 | + private Class<? extends Authorizer> authorizerClass; | |
| 55 | + | |
| 56 | + /* | |
| 57 | + * (non-Javadoc) | |
| 58 | + * @see br.gov.frameworkdemoiselle.security.SecurityConfig#isEnabled() | |
| 59 | + */ | |
| 60 | + @Override | |
| 61 | + public boolean isEnabled() { | |
| 62 | + return this.enabled; | |
| 63 | + } | |
| 64 | + | |
| 65 | + /* | |
| 66 | + * (non-Javadoc) | |
| 67 | + * @see br.gov.frameworkdemoiselle.security.SecurityConfig#setEnabled(boolean) | |
| 68 | + */ | |
| 69 | + @Override | |
| 70 | + public void setEnabled(boolean enabled) { | |
| 71 | + this.enabled = enabled; | |
| 72 | + } | |
| 73 | + | |
| 74 | + /* | |
| 75 | + * (non-Javadoc) | |
| 76 | + * @see br.gov.frameworkdemoiselle.security.SecurityConfig#getAuthenticatorClass() | |
| 77 | + */ | |
| 78 | + @Override | |
| 79 | + public Class<? extends Authenticator> getAuthenticatorClass() { | |
| 80 | + return this.authenticatorClass; | |
| 81 | + } | |
| 82 | + | |
| 83 | + /* | |
| 84 | + * (non-Javadoc) | |
| 85 | + * @see br.gov.frameworkdemoiselle.security.SecurityConfig#setAuthenticatorClass(java.lang.Class) | |
| 86 | + */ | |
| 87 | + @Override | |
| 88 | + public void setAuthenticatorClass(Class<? extends Authenticator> authenticatorClass) { | |
| 89 | + this.authenticatorClass = authenticatorClass; | |
| 90 | + } | |
| 91 | + | |
| 92 | + /* | |
| 93 | + * (non-Javadoc) | |
| 94 | + * @see br.gov.frameworkdemoiselle.security.SecurityConfig#getAuthorizerClass() | |
| 95 | + */ | |
| 96 | + @Override | |
| 97 | + public Class<? extends Authorizer> getAuthorizerClass() { | |
| 98 | + return this.authorizerClass; | |
| 99 | + } | |
| 100 | + | |
| 101 | + /* | |
| 102 | + * (non-Javadoc) | |
| 103 | + * @see br.gov.frameworkdemoiselle.security.SecurityConfig#setAuthorizerClass(java.lang.Class) | |
| 104 | + */ | |
| 105 | + @Override | |
| 106 | + public void setAuthorizerClass(Class<? extends Authorizer> authorizerClass) { | |
| 107 | + this.authorizerClass = authorizerClass; | |
| 108 | + } | |
| 109 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/configuration/TransactionConfig.java
0 → 100644
| ... | ... | @@ -0,0 +1,56 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * Copyright (C) 2010 SERPRO | |
| 4 | + * ---------------------------------------------------------------------------- | |
| 5 | + * This file is part of Demoiselle Framework. | |
| 6 | + * | |
| 7 | + * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | + * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | + * as published by the Free Software Foundation. | |
| 10 | + * | |
| 11 | + * This program is distributed in the hope that it will be useful, | |
| 12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | + * GNU General Public License for more details. | |
| 15 | + * | |
| 16 | + * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | + * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | + * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | + * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | + * ---------------------------------------------------------------------------- | |
| 21 | + * Este arquivo é parte do Framework Demoiselle. | |
| 22 | + * | |
| 23 | + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | + * do Software Livre (FSF). | |
| 26 | + * | |
| 27 | + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | + * para maiores detalhes. | |
| 31 | + * | |
| 32 | + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | + * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | + */ | |
| 37 | +package br.gov.frameworkdemoiselle.internal.configuration; | |
| 38 | + | |
| 39 | +import java.io.Serializable; | |
| 40 | + | |
| 41 | +import br.gov.frameworkdemoiselle.annotation.Name; | |
| 42 | +import br.gov.frameworkdemoiselle.configuration.Configuration; | |
| 43 | +import br.gov.frameworkdemoiselle.transaction.Transaction; | |
| 44 | + | |
| 45 | +@Configuration(prefix = "frameworkdemoiselle.transaction") | |
| 46 | +public class TransactionConfig implements Serializable { | |
| 47 | + | |
| 48 | + private static final long serialVersionUID = 1L; | |
| 49 | + | |
| 50 | + @Name("class") | |
| 51 | + private Class<? extends Transaction> transactionClass; | |
| 52 | + | |
| 53 | + public Class<? extends Transaction> getTransactionClass() { | |
| 54 | + return transactionClass; | |
| 55 | + } | |
| 56 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/context/ContextStore.java
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/context/Contexts.java
| ... | ... | @@ -39,25 +39,58 @@ package br.gov.frameworkdemoiselle.internal.context; |
| 39 | 39 | import java.lang.annotation.Annotation; |
| 40 | 40 | import java.util.ArrayList; |
| 41 | 41 | import java.util.Collections; |
| 42 | +import java.util.Iterator; | |
| 42 | 43 | import java.util.List; |
| 43 | 44 | |
| 44 | 45 | import javax.enterprise.inject.spi.AfterBeanDiscovery; |
| 45 | 46 | |
| 47 | +import org.slf4j.Logger; | |
| 48 | + | |
| 49 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 50 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 51 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 52 | + | |
| 46 | 53 | public class Contexts { |
| 47 | 54 | |
| 48 | - private static List<CustomContext> activeContexts; | |
| 55 | + private static List<CustomContext> activeContexts = Collections.synchronizedList(new ArrayList<CustomContext>()); | |
| 56 | + | |
| 57 | + private static List<CustomContext> inactiveContexts = Collections.synchronizedList(new ArrayList<CustomContext>()); | |
| 58 | + | |
| 59 | + private static Logger logger; | |
| 60 | + | |
| 61 | + private static ResourceBundle bundle; | |
| 62 | + | |
| 63 | + private static Logger getLogger() { | |
| 64 | + if (logger == null) { | |
| 65 | + logger = LoggerProducer.create(Contexts.class); | |
| 66 | + } | |
| 67 | + | |
| 68 | + return logger; | |
| 69 | + } | |
| 70 | + | |
| 71 | + private static ResourceBundle getBundle() { | |
| 72 | + if (bundle == null) { | |
| 73 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 74 | + } | |
| 49 | 75 | |
| 50 | - private static List<CustomContext> inactiveContexts; | |
| 76 | + return bundle; | |
| 77 | + } | |
| 51 | 78 | |
| 52 | - public static void add(CustomContext context, AfterBeanDiscovery event) { | |
| 79 | + private Contexts() { | |
| 80 | + } | |
| 81 | + | |
| 82 | + public static synchronized void add(CustomContext context, AfterBeanDiscovery event) { | |
| 53 | 83 | Class<? extends Annotation> scope = context.getScope(); |
| 54 | 84 | |
| 55 | - if (get(scope, getActiveContexts()) != null) { | |
| 56 | - getInactiveContexts().add(context); | |
| 85 | + getLogger() | |
| 86 | + .trace(getBundle().getString("custom-context-was-registered", context.getScope().getCanonicalName())); | |
| 87 | + | |
| 88 | + if (get(scope, activeContexts) != null) { | |
| 89 | + inactiveContexts.add(context); | |
| 57 | 90 | context.setActive(false); |
| 58 | 91 | |
| 59 | 92 | } else { |
| 60 | - getActiveContexts().add(context); | |
| 93 | + activeContexts.add(context); | |
| 61 | 94 | context.setActive(true); |
| 62 | 95 | } |
| 63 | 96 | |
| ... | ... | @@ -79,45 +112,43 @@ public class Contexts { |
| 79 | 112 | return result; |
| 80 | 113 | } |
| 81 | 114 | |
| 82 | - public static void remove(CustomContext context) { | |
| 83 | - if (getActiveContexts().contains(context)) { | |
| 84 | - getActiveContexts().remove(context); | |
| 115 | + public static synchronized void remove(CustomContext context) { | |
| 116 | + getLogger().trace( | |
| 117 | + getBundle().getString("custom-context-was-unregistered", context.getScope().getCanonicalName())); | |
| 118 | + | |
| 119 | + if (activeContexts.contains(context)) { | |
| 120 | + activeContexts.remove(context); | |
| 85 | 121 | context.setActive(false); |
| 86 | 122 | |
| 87 | - CustomContext inactive = get(context.getScope(), getInactiveContexts()); | |
| 123 | + CustomContext inactive = get(context.getScope(), inactiveContexts); | |
| 88 | 124 | if (inactive != null) { |
| 89 | - getActiveContexts().add(inactive); | |
| 125 | + activeContexts.add(inactive); | |
| 90 | 126 | inactive.setActive(true); |
| 91 | - getInactiveContexts().remove(inactive); | |
| 127 | + inactiveContexts.remove(inactive); | |
| 92 | 128 | } |
| 93 | 129 | |
| 94 | - } else if (getInactiveContexts().contains(context)) { | |
| 95 | - getInactiveContexts().remove(context); | |
| 130 | + } else if (inactiveContexts.contains(context)) { | |
| 131 | + inactiveContexts.remove(context); | |
| 96 | 132 | } |
| 97 | 133 | } |
| 98 | 134 | |
| 99 | - public static void clear() { | |
| 100 | - for (CustomContext context : getActiveContexts()) { | |
| 135 | + public static synchronized void clear() { | |
| 136 | + CustomContext context; | |
| 137 | + for (Iterator<CustomContext> iter = activeContexts.iterator(); iter.hasNext();) { | |
| 138 | + context = iter.next(); | |
| 101 | 139 | context.setActive(false); |
| 140 | + iter.remove(); | |
| 102 | 141 | } |
| 103 | 142 | |
| 104 | - activeContexts = null; | |
| 105 | - inactiveContexts = null; | |
| 143 | + activeContexts.clear(); | |
| 144 | + inactiveContexts.clear(); | |
| 106 | 145 | } |
| 107 | 146 | |
| 108 | - public static List<CustomContext> getActiveContexts() { | |
| 109 | - if (activeContexts == null) { | |
| 110 | - activeContexts = Collections.synchronizedList(new ArrayList<CustomContext>()); | |
| 111 | - } | |
| 112 | - | |
| 147 | + public static synchronized List<CustomContext> getActiveContexts() { | |
| 113 | 148 | return activeContexts; |
| 114 | 149 | } |
| 115 | 150 | |
| 116 | - public static List<CustomContext> getInactiveContexts() { | |
| 117 | - if (inactiveContexts == null) { | |
| 118 | - inactiveContexts = Collections.synchronizedList(new ArrayList<CustomContext>()); | |
| 119 | - } | |
| 120 | - | |
| 151 | + public static synchronized List<CustomContext> getInactiveContexts() { | |
| 121 | 152 | return inactiveContexts; |
| 122 | 153 | } |
| 123 | 154 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/AnnotatedMethodProcessor.java
0 → 100644
| ... | ... | @@ -0,0 +1,152 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * Copyright (C) 2010 SERPRO | |
| 4 | + * ---------------------------------------------------------------------------- | |
| 5 | + * This file is part of Demoiselle Framework. | |
| 6 | + * | |
| 7 | + * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | + * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | + * as published by the Free Software Foundation. | |
| 10 | + * | |
| 11 | + * This program is distributed in the hope that it will be useful, | |
| 12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | + * GNU General Public License for more details. | |
| 15 | + * | |
| 16 | + * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | + * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | + * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | + * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | + * ---------------------------------------------------------------------------- | |
| 21 | + * Este arquivo é parte do Framework Demoiselle. | |
| 22 | + * | |
| 23 | + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | + * do Software Livre (FSF). | |
| 26 | + * | |
| 27 | + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | + * para maiores detalhes. | |
| 31 | + * | |
| 32 | + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | + * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | + */ | |
| 37 | +package br.gov.frameworkdemoiselle.internal.implementation; | |
| 38 | + | |
| 39 | +import java.lang.reflect.InvocationTargetException; | |
| 40 | +import java.util.Locale; | |
| 41 | + | |
| 42 | +import javax.enterprise.inject.spi.AnnotatedMethod; | |
| 43 | + | |
| 44 | +import org.slf4j.Logger; | |
| 45 | + | |
| 46 | +import br.gov.frameworkdemoiselle.annotation.Priority; | |
| 47 | +import br.gov.frameworkdemoiselle.exception.ApplicationException; | |
| 48 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 49 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 50 | +import br.gov.frameworkdemoiselle.message.SeverityType; | |
| 51 | +import br.gov.frameworkdemoiselle.util.Beans; | |
| 52 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 53 | + | |
| 54 | +/** | |
| 55 | + * Represents an annotated method to be processed; | |
| 56 | + * | |
| 57 | + * @param <T> | |
| 58 | + * declaring class owner of the method | |
| 59 | + */ | |
| 60 | +public class AnnotatedMethodProcessor<T> implements Comparable<AnnotatedMethodProcessor<T>> { | |
| 61 | + | |
| 62 | + private AnnotatedMethod<T> annotatedMethod; | |
| 63 | + | |
| 64 | + private ResourceBundle bundle; | |
| 65 | + | |
| 66 | + public AnnotatedMethodProcessor(final AnnotatedMethod<T> annotatedMethod) { | |
| 67 | + this.annotatedMethod = annotatedMethod; | |
| 68 | + } | |
| 69 | + | |
| 70 | + public AnnotatedMethod<T> getAnnotatedMethod() { | |
| 71 | + return this.annotatedMethod; | |
| 72 | + } | |
| 73 | + | |
| 74 | + @SuppressWarnings("unchecked") | |
| 75 | + protected T getReferencedBean() { | |
| 76 | + Class<T> classType = (Class<T>) getAnnotatedMethod().getJavaMember().getDeclaringClass(); | |
| 77 | + | |
| 78 | + return Beans.getReference(classType); | |
| 79 | + } | |
| 80 | + | |
| 81 | + public int compareTo(final AnnotatedMethodProcessor<T> other) { | |
| 82 | + Integer orderThis = getPriority(getAnnotatedMethod()); | |
| 83 | + Integer orderOther = getPriority(other.getAnnotatedMethod()); | |
| 84 | + | |
| 85 | + return orderThis.compareTo(orderOther); | |
| 86 | + } | |
| 87 | + | |
| 88 | + public boolean process(Object... args) throws Throwable { | |
| 89 | + getLogger().info(getBundle().getString("processing", getAnnotatedMethod().getJavaMember().toGenericString())); | |
| 90 | + | |
| 91 | + try { | |
| 92 | + getAnnotatedMethod().getJavaMember().invoke(getReferencedBean(), args); | |
| 93 | + | |
| 94 | + } catch (InvocationTargetException cause) { | |
| 95 | + handleException(cause.getCause()); | |
| 96 | + } | |
| 97 | + | |
| 98 | + return true; | |
| 99 | + } | |
| 100 | + | |
| 101 | + private void handleException(Throwable cause) throws Throwable { | |
| 102 | + ApplicationException ann = cause.getClass().getAnnotation(ApplicationException.class); | |
| 103 | + | |
| 104 | + if (ann == null || SeverityType.FATAL == ann.severity()) { | |
| 105 | + throw cause; | |
| 106 | + | |
| 107 | + } else { | |
| 108 | + switch (ann.severity()) { | |
| 109 | + case INFO: | |
| 110 | + getLogger().info(cause.getMessage()); | |
| 111 | + break; | |
| 112 | + | |
| 113 | + case WARN: | |
| 114 | + getLogger().warn(cause.getMessage()); | |
| 115 | + break; | |
| 116 | + | |
| 117 | + default: | |
| 118 | + getLogger().error(getBundle().getString("processing-fail"), cause); | |
| 119 | + break; | |
| 120 | + } | |
| 121 | + } | |
| 122 | + } | |
| 123 | + | |
| 124 | + private static <T> Integer getPriority(AnnotatedMethod<T> annotatedMethod) { | |
| 125 | + Integer priority = Priority.MIN_PRIORITY; | |
| 126 | + | |
| 127 | + Priority annotation = annotatedMethod.getAnnotation(Priority.class); | |
| 128 | + if (annotation != null) { | |
| 129 | + priority = annotation.value(); | |
| 130 | + } | |
| 131 | + | |
| 132 | + return priority; | |
| 133 | + } | |
| 134 | + | |
| 135 | + // @Override | |
| 136 | + // public String toString() { | |
| 137 | + // return getBundle().getString("for", getClass().getSimpleName(), | |
| 138 | + // getAnnotatedMethod().getJavaMember().toGenericString()); | |
| 139 | + // } | |
| 140 | + | |
| 141 | + protected ResourceBundle getBundle() { | |
| 142 | + if (this.bundle == null) { | |
| 143 | + this.bundle = ResourceBundleProducer.create("demoiselle-core-bundle", Locale.getDefault()); | |
| 144 | + } | |
| 145 | + | |
| 146 | + return bundle; | |
| 147 | + } | |
| 148 | + | |
| 149 | + protected Logger getLogger() { | |
| 150 | + return LoggerProducer.create(this.getClass()); | |
| 151 | + } | |
| 152 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/ConfigurationImpl.java
0 → 100644
| ... | ... | @@ -0,0 +1,17 @@ |
| 1 | +package br.gov.frameworkdemoiselle.internal.implementation; | |
| 2 | + | |
| 3 | +import br.gov.frameworkdemoiselle.internal.configuration.ConfigurationLoader; | |
| 4 | +import br.gov.frameworkdemoiselle.util.Beans; | |
| 5 | + | |
| 6 | +public class ConfigurationImpl { | |
| 7 | + | |
| 8 | + private boolean loaded = false; | |
| 9 | + | |
| 10 | + @SuppressWarnings("unused") | |
| 11 | + private synchronized void load(Object instance) { | |
| 12 | + if (!loaded) { | |
| 13 | + Beans.getReference(ConfigurationLoader.class).load(instance); | |
| 14 | + loaded = true; | |
| 15 | + } | |
| 16 | + } | |
| 17 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/CoreBundle.java
| ... | ... | @@ -1,28 +0,0 @@ |
| 1 | -package br.gov.frameworkdemoiselle.internal.implementation; | |
| 2 | - | |
| 3 | -import javax.inject.Inject; | |
| 4 | - | |
| 5 | -import br.gov.frameworkdemoiselle.annotation.Name; | |
| 6 | -import br.gov.frameworkdemoiselle.util.Beans; | |
| 7 | -import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 8 | - | |
| 9 | -public class CoreBundle { | |
| 10 | - | |
| 11 | - @Inject | |
| 12 | - @Name("demoiselle-core-bundle") | |
| 13 | - private ResourceBundle bundle; | |
| 14 | - | |
| 15 | - private static CoreBundle instance; | |
| 16 | - | |
| 17 | - private static synchronized CoreBundle getInstance() { | |
| 18 | - if (instance == null) { | |
| 19 | - instance = Beans.getReference(CoreBundle.class); | |
| 20 | - } | |
| 21 | - | |
| 22 | - return instance; | |
| 23 | - } | |
| 24 | - | |
| 25 | - public static ResourceBundle get() { | |
| 26 | - return getInstance().bundle; | |
| 27 | - } | |
| 28 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/DefaultAuthenticator.java
| ... | ... | @@ -36,10 +36,14 @@ |
| 36 | 36 | */ |
| 37 | 37 | package br.gov.frameworkdemoiselle.internal.implementation; |
| 38 | 38 | |
| 39 | +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.CORE_PRIORITY; | |
| 39 | 40 | import br.gov.frameworkdemoiselle.DemoiselleException; |
| 41 | +import br.gov.frameworkdemoiselle.annotation.Priority; | |
| 42 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 40 | 43 | import br.gov.frameworkdemoiselle.security.Authenticator; |
| 41 | 44 | import br.gov.frameworkdemoiselle.security.SecurityContext; |
| 42 | 45 | import br.gov.frameworkdemoiselle.security.User; |
| 46 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 43 | 47 | |
| 44 | 48 | /** |
| 45 | 49 | * Authenticator that actually does nothing but raise exceptions. |
| ... | ... | @@ -47,10 +51,13 @@ import br.gov.frameworkdemoiselle.security.User; |
| 47 | 51 | * @author SERPRO |
| 48 | 52 | * @see Authenticator |
| 49 | 53 | */ |
| 54 | +@Priority(CORE_PRIORITY) | |
| 50 | 55 | public class DefaultAuthenticator implements Authenticator { |
| 51 | 56 | |
| 52 | 57 | private static final long serialVersionUID = 1L; |
| 53 | 58 | |
| 59 | + private static ResourceBundle bundle; | |
| 60 | + | |
| 54 | 61 | /** |
| 55 | 62 | * @see br.gov.frameworkdemoiselle.security.Authenticator#authenticate() |
| 56 | 63 | */ |
| ... | ... | @@ -76,8 +83,15 @@ public class DefaultAuthenticator implements Authenticator { |
| 76 | 83 | } |
| 77 | 84 | |
| 78 | 85 | private DemoiselleException getException() { |
| 79 | - return new DemoiselleException(CoreBundle.get().getString("authenticator-not-defined", | |
| 86 | + return new DemoiselleException(getBundle().getString("authenticator-not-defined", | |
| 80 | 87 | SecurityContext.class.getSimpleName())); |
| 81 | 88 | } |
| 82 | 89 | |
| 90 | + private static ResourceBundle getBundle() { | |
| 91 | + if (bundle == null) { | |
| 92 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 93 | + } | |
| 94 | + | |
| 95 | + return bundle; | |
| 96 | + } | |
| 83 | 97 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/DefaultAuthorizer.java
| ... | ... | @@ -36,10 +36,13 @@ |
| 36 | 36 | */ |
| 37 | 37 | package br.gov.frameworkdemoiselle.internal.implementation; |
| 38 | 38 | |
| 39 | +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.CORE_PRIORITY; | |
| 39 | 40 | import br.gov.frameworkdemoiselle.DemoiselleException; |
| 41 | +import br.gov.frameworkdemoiselle.annotation.Priority; | |
| 42 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 40 | 43 | import br.gov.frameworkdemoiselle.security.Authorizer; |
| 41 | -import br.gov.frameworkdemoiselle.security.RequiredPermission; | |
| 42 | -import br.gov.frameworkdemoiselle.security.RequiredRole; | |
| 44 | +import br.gov.frameworkdemoiselle.security.SecurityContext; | |
| 45 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 43 | 46 | |
| 44 | 47 | /** |
| 45 | 48 | * Authorizator that actually does nothing but raise exceptions. |
| ... | ... | @@ -47,20 +50,33 @@ import br.gov.frameworkdemoiselle.security.RequiredRole; |
| 47 | 50 | * @author SERPRO |
| 48 | 51 | * @see Authorizer |
| 49 | 52 | */ |
| 53 | +@Priority(CORE_PRIORITY) | |
| 50 | 54 | public class DefaultAuthorizer implements Authorizer { |
| 51 | 55 | |
| 52 | 56 | private static final long serialVersionUID = 1L; |
| 53 | 57 | |
| 58 | + private static ResourceBundle bundle; | |
| 59 | + | |
| 54 | 60 | @Override |
| 55 | 61 | public boolean hasRole(String role) { |
| 56 | - throw new DemoiselleException(CoreBundle.get().getString("authorizer-not-defined", | |
| 57 | - RequiredRole.class.getSimpleName())); | |
| 62 | + throw getException(); | |
| 58 | 63 | } |
| 59 | 64 | |
| 60 | 65 | @Override |
| 61 | 66 | public boolean hasPermission(String resource, String operation) { |
| 62 | - throw new DemoiselleException(CoreBundle.get().getString("authorizer-not-defined", | |
| 63 | - RequiredPermission.class.getSimpleName())); | |
| 67 | + throw getException(); | |
| 68 | + } | |
| 69 | + | |
| 70 | + private DemoiselleException getException() { | |
| 71 | + return new DemoiselleException(getBundle().getString("authorizer-not-defined", | |
| 72 | + SecurityContext.class.getSimpleName())); | |
| 64 | 73 | } |
| 65 | 74 | |
| 75 | + private static ResourceBundle getBundle() { | |
| 76 | + if (bundle == null) { | |
| 77 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 78 | + } | |
| 79 | + | |
| 80 | + return bundle; | |
| 81 | + } | |
| 66 | 82 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/DefaultTransaction.java
| ... | ... | @@ -36,11 +36,13 @@ |
| 36 | 36 | */ |
| 37 | 37 | package br.gov.frameworkdemoiselle.internal.implementation; |
| 38 | 38 | |
| 39 | -import javax.enterprise.context.RequestScoped; | |
| 40 | - | |
| 39 | +import static br.gov.frameworkdemoiselle.internal.implementation.StrategySelector.CORE_PRIORITY; | |
| 41 | 40 | import br.gov.frameworkdemoiselle.DemoiselleException; |
| 41 | +import br.gov.frameworkdemoiselle.annotation.Priority; | |
| 42 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 42 | 43 | import br.gov.frameworkdemoiselle.transaction.Transaction; |
| 43 | 44 | import br.gov.frameworkdemoiselle.transaction.Transactional; |
| 45 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 44 | 46 | |
| 45 | 47 | /** |
| 46 | 48 | * Transaction strategy that actually does nothing but raise exceptions. |
| ... | ... | @@ -48,11 +50,13 @@ import br.gov.frameworkdemoiselle.transaction.Transactional; |
| 48 | 50 | * @author SERPRO |
| 49 | 51 | * @see Transaction |
| 50 | 52 | */ |
| 51 | -@RequestScoped | |
| 53 | +@Priority(CORE_PRIORITY) | |
| 52 | 54 | public class DefaultTransaction implements Transaction { |
| 53 | 55 | |
| 54 | 56 | private static final long serialVersionUID = 1L; |
| 55 | 57 | |
| 58 | + private static ResourceBundle bundle; | |
| 59 | + | |
| 56 | 60 | @Override |
| 57 | 61 | public void begin() { |
| 58 | 62 | throw getException(); |
| ... | ... | @@ -84,7 +88,15 @@ public class DefaultTransaction implements Transaction { |
| 84 | 88 | } |
| 85 | 89 | |
| 86 | 90 | private DemoiselleException getException() { |
| 87 | - return new DemoiselleException(CoreBundle.get().getString("transaction-not-defined", | |
| 91 | + return new DemoiselleException(getBundle().getString("transaction-not-defined", | |
| 88 | 92 | Transactional.class.getSimpleName())); |
| 89 | 93 | } |
| 94 | + | |
| 95 | + private static ResourceBundle getBundle() { | |
| 96 | + if (bundle == null) { | |
| 97 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 98 | + } | |
| 99 | + | |
| 100 | + return bundle; | |
| 101 | + } | |
| 90 | 102 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/MessageContextImpl.java
| ... | ... | @@ -41,14 +41,17 @@ import java.util.ArrayList; |
| 41 | 41 | import java.util.List; |
| 42 | 42 | |
| 43 | 43 | import javax.enterprise.context.RequestScoped; |
| 44 | -import javax.inject.Inject; | |
| 45 | 44 | |
| 46 | 45 | import org.slf4j.Logger; |
| 47 | 46 | |
| 47 | +import br.gov.frameworkdemoiselle.internal.interceptor.ExceptionHandlerInterceptor; | |
| 48 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 49 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 48 | 50 | import br.gov.frameworkdemoiselle.message.DefaultMessage; |
| 49 | 51 | import br.gov.frameworkdemoiselle.message.Message; |
| 50 | 52 | import br.gov.frameworkdemoiselle.message.MessageContext; |
| 51 | 53 | import br.gov.frameworkdemoiselle.message.SeverityType; |
| 54 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 52 | 55 | |
| 53 | 56 | /** |
| 54 | 57 | * The message store is designed to provide access to messages. It is shared by every application layer. |
| ... | ... | @@ -60,11 +63,12 @@ public class MessageContextImpl implements Serializable, MessageContext { |
| 60 | 63 | |
| 61 | 64 | private static final long serialVersionUID = 1L; |
| 62 | 65 | |
| 63 | - @Inject | |
| 64 | - private Logger logger; | |
| 65 | - | |
| 66 | 66 | private final List<Message> messages = new ArrayList<Message>(); |
| 67 | 67 | |
| 68 | + private static ResourceBundle bundle; | |
| 69 | + | |
| 70 | + private static Logger logger; | |
| 71 | + | |
| 68 | 72 | @Override |
| 69 | 73 | public void add(final Message message, Object... params) { |
| 70 | 74 | Message aux; |
| ... | ... | @@ -75,7 +79,7 @@ public class MessageContextImpl implements Serializable, MessageContext { |
| 75 | 79 | aux = message; |
| 76 | 80 | } |
| 77 | 81 | |
| 78 | - logger.debug(CoreBundle.get().getString("adding-message-to-context", message.toString())); | |
| 82 | + getLogger().debug(getBundle().getString("adding-message-to-context", message.toString())); | |
| 79 | 83 | messages.add(aux); |
| 80 | 84 | } |
| 81 | 85 | |
| ... | ... | @@ -96,7 +100,23 @@ public class MessageContextImpl implements Serializable, MessageContext { |
| 96 | 100 | |
| 97 | 101 | @Override |
| 98 | 102 | public void clear() { |
| 99 | - logger.debug(CoreBundle.get().getString("cleaning-message-context")); | |
| 103 | + getLogger().debug(getBundle().getString("cleaning-message-context")); | |
| 100 | 104 | messages.clear(); |
| 101 | 105 | } |
| 106 | + | |
| 107 | + private static ResourceBundle getBundle() { | |
| 108 | + if (bundle == null) { | |
| 109 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 110 | + } | |
| 111 | + | |
| 112 | + return bundle; | |
| 113 | + } | |
| 114 | + | |
| 115 | + private static Logger getLogger() { | |
| 116 | + if (logger == null) { | |
| 117 | + logger = LoggerProducer.create(ExceptionHandlerInterceptor.class); | |
| 118 | + } | |
| 119 | + | |
| 120 | + return logger; | |
| 121 | + } | |
| 102 | 122 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/PaginationContextImpl.java
| ... | ... | @@ -41,11 +41,11 @@ import java.util.HashMap; |
| 41 | 41 | import java.util.Map; |
| 42 | 42 | |
| 43 | 43 | import javax.enterprise.context.SessionScoped; |
| 44 | -import javax.inject.Inject; | |
| 45 | 44 | |
| 46 | 45 | import br.gov.frameworkdemoiselle.internal.configuration.PaginationConfig; |
| 47 | 46 | import br.gov.frameworkdemoiselle.pagination.Pagination; |
| 48 | 47 | import br.gov.frameworkdemoiselle.pagination.PaginationContext; |
| 48 | +import br.gov.frameworkdemoiselle.util.Beans; | |
| 49 | 49 | |
| 50 | 50 | /** |
| 51 | 51 | * Context implementation reserved for pagination purposes. Internally a hash map is used to store pagination data for |
| ... | ... | @@ -59,7 +59,6 @@ public class PaginationContextImpl implements Serializable, PaginationContext { |
| 59 | 59 | |
| 60 | 60 | private static final long serialVersionUID = 1L; |
| 61 | 61 | |
| 62 | - @Inject | |
| 63 | 62 | private PaginationConfig config; |
| 64 | 63 | |
| 65 | 64 | private final Map<Class<?>, Pagination> cache = new HashMap<Class<?>, Pagination>(); |
| ... | ... | @@ -73,7 +72,7 @@ public class PaginationContextImpl implements Serializable, PaginationContext { |
| 73 | 72 | |
| 74 | 73 | if (pagination == null && create) { |
| 75 | 74 | pagination = new PaginationImpl(); |
| 76 | - pagination.setPageSize(config.getPageSize()); | |
| 75 | + pagination.setPageSize(getConfig().getPageSize()); | |
| 77 | 76 | |
| 78 | 77 | cache.put(clazz, pagination); |
| 79 | 78 | } |
| ... | ... | @@ -81,4 +80,11 @@ public class PaginationContextImpl implements Serializable, PaginationContext { |
| 81 | 80 | return pagination; |
| 82 | 81 | } |
| 83 | 82 | |
| 83 | + private PaginationConfig getConfig() { | |
| 84 | + if (config == null) { | |
| 85 | + config = Beans.getReference(PaginationConfig.class); | |
| 86 | + } | |
| 87 | + | |
| 88 | + return config; | |
| 89 | + } | |
| 84 | 90 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/PaginationImpl.java
| ... | ... | @@ -38,8 +38,6 @@ package br.gov.frameworkdemoiselle.internal.implementation; |
| 38 | 38 | |
| 39 | 39 | import java.io.Serializable; |
| 40 | 40 | |
| 41 | -import javax.enterprise.inject.Alternative; | |
| 42 | - | |
| 43 | 41 | import br.gov.frameworkdemoiselle.pagination.Pagination; |
| 44 | 42 | import br.gov.frameworkdemoiselle.util.Strings; |
| 45 | 43 | |
| ... | ... | @@ -53,7 +51,6 @@ import br.gov.frameworkdemoiselle.util.Strings; |
| 53 | 51 | * @author SERPRO |
| 54 | 52 | * @see Pagination |
| 55 | 53 | */ |
| 56 | -@Alternative | |
| 57 | 54 | public class PaginationImpl implements Serializable, Pagination { |
| 58 | 55 | |
| 59 | 56 | private static final long serialVersionUID = 1L; | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/SecurityContextImpl.java
| ... | ... | @@ -36,12 +36,13 @@ |
| 36 | 36 | */ |
| 37 | 37 | package br.gov.frameworkdemoiselle.internal.implementation; |
| 38 | 38 | |
| 39 | -import javax.enterprise.context.SessionScoped; | |
| 40 | -import javax.inject.Inject; | |
| 41 | 39 | import javax.inject.Named; |
| 42 | 40 | |
| 43 | -import br.gov.frameworkdemoiselle.annotation.Name; | |
| 41 | +import br.gov.frameworkdemoiselle.internal.bootstrap.AuthenticatorBootstrap; | |
| 42 | +import br.gov.frameworkdemoiselle.internal.bootstrap.AuthorizerBootstrap; | |
| 44 | 43 | import br.gov.frameworkdemoiselle.internal.configuration.SecurityConfig; |
| 44 | +import br.gov.frameworkdemoiselle.internal.configuration.SecurityConfigImpl; | |
| 45 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 45 | 46 | import br.gov.frameworkdemoiselle.security.AfterLoginSuccessful; |
| 46 | 47 | import br.gov.frameworkdemoiselle.security.AfterLogoutSuccessful; |
| 47 | 48 | import br.gov.frameworkdemoiselle.security.Authenticator; |
| ... | ... | @@ -57,33 +58,53 @@ import br.gov.frameworkdemoiselle.util.ResourceBundle; |
| 57 | 58 | * |
| 58 | 59 | * @author SERPRO |
| 59 | 60 | */ |
| 60 | -@SessionScoped | |
| 61 | 61 | @Named("securityContext") |
| 62 | 62 | public class SecurityContextImpl implements SecurityContext { |
| 63 | 63 | |
| 64 | 64 | private static final long serialVersionUID = 1L; |
| 65 | 65 | |
| 66 | - @Inject | |
| 67 | - @Name("demoiselle-core-bundle") | |
| 68 | - private ResourceBundle bundle; | |
| 69 | - | |
| 70 | - @Inject | |
| 71 | 66 | private Authenticator authenticator; |
| 72 | 67 | |
| 73 | - @Inject | |
| 74 | 68 | private Authorizer authorizer; |
| 75 | 69 | |
| 76 | - @Inject | |
| 77 | - private SecurityConfig config; | |
| 70 | + private Authenticator getAuthenticator() { | |
| 71 | + if (this.authenticator == null) { | |
| 72 | + AuthenticatorBootstrap bootstrap = Beans.getReference(AuthenticatorBootstrap.class); | |
| 73 | + Class<? extends Authenticator> clazz = getConfig().getAuthenticatorClass(); | |
| 74 | + | |
| 75 | + if (clazz == null) { | |
| 76 | + clazz = StrategySelector.getClass(Authenticator.class, bootstrap.getCache()); | |
| 77 | + } | |
| 78 | + | |
| 79 | + this.authenticator = Beans.getReference(clazz); | |
| 80 | + } | |
| 81 | + | |
| 82 | + return this.authenticator; | |
| 83 | + } | |
| 84 | + | |
| 85 | + private Authorizer getAuthorizer() { | |
| 86 | + if (this.authorizer == null) { | |
| 87 | + AuthorizerBootstrap bootstrap = Beans.getReference(AuthorizerBootstrap.class); | |
| 88 | + Class<? extends Authorizer> clazz = getConfig().getAuthorizerClass(); | |
| 89 | + | |
| 90 | + if (clazz == null) { | |
| 91 | + clazz = StrategySelector.getClass(Authorizer.class, bootstrap.getCache()); | |
| 92 | + } | |
| 93 | + | |
| 94 | + this.authorizer = Beans.getReference(clazz); | |
| 95 | + } | |
| 96 | + | |
| 97 | + return this.authorizer; | |
| 98 | + } | |
| 78 | 99 | |
| 79 | 100 | /** |
| 80 | 101 | * @see br.gov.frameworkdemoiselle.security.SecurityContext#hasPermission(java.lang.String, java.lang.String) |
| 81 | 102 | */ |
| 82 | 103 | @Override |
| 83 | 104 | public boolean hasPermission(String resource, String operation) throws NotLoggedInException { |
| 84 | - if (config.isEnabled()) { | |
| 105 | + if (getConfig().isEnabled()) { | |
| 85 | 106 | checkLoggedIn(); |
| 86 | - return authorizer.hasPermission(resource, operation); | |
| 107 | + return getAuthorizer().hasPermission(resource, operation); | |
| 87 | 108 | |
| 88 | 109 | } else { |
| 89 | 110 | return true; |
| ... | ... | @@ -95,9 +116,9 @@ public class SecurityContextImpl implements SecurityContext { |
| 95 | 116 | */ |
| 96 | 117 | @Override |
| 97 | 118 | public boolean hasRole(String role) throws NotLoggedInException { |
| 98 | - if (config.isEnabled()) { | |
| 119 | + if (getConfig().isEnabled()) { | |
| 99 | 120 | checkLoggedIn(); |
| 100 | - return authorizer.hasRole(role); | |
| 121 | + return getAuthorizer().hasRole(role); | |
| 101 | 122 | |
| 102 | 123 | } else { |
| 103 | 124 | return true; |
| ... | ... | @@ -109,7 +130,7 @@ public class SecurityContextImpl implements SecurityContext { |
| 109 | 130 | */ |
| 110 | 131 | @Override |
| 111 | 132 | public boolean isLoggedIn() { |
| 112 | - if (config.isEnabled()) { | |
| 133 | + if (getConfig().isEnabled()) { | |
| 113 | 134 | return getUser() != null; |
| 114 | 135 | } else { |
| 115 | 136 | return true; |
| ... | ... | @@ -121,7 +142,7 @@ public class SecurityContextImpl implements SecurityContext { |
| 121 | 142 | */ |
| 122 | 143 | @Override |
| 123 | 144 | public void login() { |
| 124 | - if (config.isEnabled() && authenticator.authenticate()) { | |
| 145 | + if (getConfig().isEnabled() && getAuthenticator().authenticate()) { | |
| 125 | 146 | Beans.getBeanManager().fireEvent(new AfterLoginSuccessful() { |
| 126 | 147 | |
| 127 | 148 | private static final long serialVersionUID = 1L; |
| ... | ... | @@ -135,9 +156,9 @@ public class SecurityContextImpl implements SecurityContext { |
| 135 | 156 | */ |
| 136 | 157 | @Override |
| 137 | 158 | public void logout() throws NotLoggedInException { |
| 138 | - if (config.isEnabled()) { | |
| 159 | + if (getConfig().isEnabled()) { | |
| 139 | 160 | checkLoggedIn(); |
| 140 | - authenticator.unAuthenticate(); | |
| 161 | + getAuthenticator().unAuthenticate(); | |
| 141 | 162 | |
| 142 | 163 | Beans.getBeanManager().fireEvent(new AfterLogoutSuccessful() { |
| 143 | 164 | |
| ... | ... | @@ -151,9 +172,9 @@ public class SecurityContextImpl implements SecurityContext { |
| 151 | 172 | */ |
| 152 | 173 | @Override |
| 153 | 174 | public User getUser() { |
| 154 | - User user = authenticator.getUser(); | |
| 175 | + User user = getAuthenticator().getUser(); | |
| 155 | 176 | |
| 156 | - if (!config.isEnabled() && user == null) { | |
| 177 | + if (!getConfig().isEnabled() && user == null) { | |
| 157 | 178 | user = new User() { |
| 158 | 179 | |
| 159 | 180 | private static final long serialVersionUID = 1L; |
| ... | ... | @@ -177,8 +198,13 @@ public class SecurityContextImpl implements SecurityContext { |
| 177 | 198 | return user; |
| 178 | 199 | } |
| 179 | 200 | |
| 201 | + private SecurityConfig getConfig() { | |
| 202 | + return Beans.getReference(SecurityConfigImpl.class); | |
| 203 | + } | |
| 204 | + | |
| 180 | 205 | private void checkLoggedIn() throws NotLoggedInException { |
| 181 | 206 | if (!isLoggedIn()) { |
| 207 | + ResourceBundle bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 182 | 208 | throw new NotLoggedInException(bundle.getString("user-not-authenticated")); |
| 183 | 209 | } |
| 184 | 210 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/StrategySelector.java
0 → 100644
| ... | ... | @@ -0,0 +1,172 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * Copyright (C) 2010 SERPRO | |
| 4 | + * ---------------------------------------------------------------------------- | |
| 5 | + * This file is part of Demoiselle Framework. | |
| 6 | + * | |
| 7 | + * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | + * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | + * as published by the Free Software Foundation. | |
| 10 | + * | |
| 11 | + * This program is distributed in the hope that it will be useful, | |
| 12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | + * GNU General Public License for more details. | |
| 15 | + * | |
| 16 | + * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | + * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | + * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | + * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | + * ---------------------------------------------------------------------------- | |
| 21 | + * Este arquivo é parte do Framework Demoiselle. | |
| 22 | + * | |
| 23 | + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | + * do Software Livre (FSF). | |
| 26 | + * | |
| 27 | + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | + * para maiores detalhes. | |
| 31 | + * | |
| 32 | + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | + * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | + */ | |
| 37 | +package br.gov.frameworkdemoiselle.internal.implementation; | |
| 38 | + | |
| 39 | +import static br.gov.frameworkdemoiselle.annotation.Priority.MIN_PRIORITY; | |
| 40 | + | |
| 41 | +import java.io.Serializable; | |
| 42 | +import java.util.ArrayList; | |
| 43 | +import java.util.List; | |
| 44 | + | |
| 45 | +import br.gov.frameworkdemoiselle.annotation.Priority; | |
| 46 | +import br.gov.frameworkdemoiselle.configuration.ConfigurationException; | |
| 47 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 48 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 49 | + | |
| 50 | +public final class StrategySelector implements Serializable { | |
| 51 | + | |
| 52 | + public static final int CORE_PRIORITY = MIN_PRIORITY; | |
| 53 | + | |
| 54 | + public static final int EXTENSIONS_L1_PRIORITY = CORE_PRIORITY - 100; | |
| 55 | + | |
| 56 | + public static final int EXTENSIONS_L2_PRIORITY = EXTENSIONS_L1_PRIORITY - 100; | |
| 57 | + | |
| 58 | + public static final int COMPONENTS_PRIORITY = EXTENSIONS_L2_PRIORITY - 100; | |
| 59 | + | |
| 60 | + private static final long serialVersionUID = 1L; | |
| 61 | + | |
| 62 | + private static ResourceBundle bundle; | |
| 63 | + | |
| 64 | + private StrategySelector() { | |
| 65 | + } | |
| 66 | + | |
| 67 | + private static ResourceBundle getBundle() { | |
| 68 | + if (bundle == null) { | |
| 69 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 70 | + } | |
| 71 | + | |
| 72 | + return bundle; | |
| 73 | + } | |
| 74 | + | |
| 75 | + public static <T> Class<? extends T> getClass(Class<T> type, List<Class<? extends T>> options) | |
| 76 | + throws ConfigurationException { | |
| 77 | + Class<? extends T> selected = null; | |
| 78 | + | |
| 79 | + for (Class<? extends T> option : options) { | |
| 80 | + if (selected == null || getPriority(option) < getPriority(selected)) { | |
| 81 | + selected = option; | |
| 82 | + } | |
| 83 | + } | |
| 84 | + | |
| 85 | + checkForAmbiguity(type, selected, options); | |
| 86 | + | |
| 87 | + return selected; | |
| 88 | + } | |
| 89 | + | |
| 90 | + private static <T> void checkForAmbiguity(Class<T> type, Class<? extends T> selected, | |
| 91 | + List<Class<? extends T>> options) throws ConfigurationException { | |
| 92 | + int selectedPriority = getPriority(selected); | |
| 93 | + | |
| 94 | + List<Class<? extends T>> ambiguous = new ArrayList<Class<? extends T>>(); | |
| 95 | + | |
| 96 | + for (Class<? extends T> option : options) { | |
| 97 | + if (selected != option && selectedPriority == getPriority(option)) { | |
| 98 | + ambiguous.add(option); | |
| 99 | + } | |
| 100 | + } | |
| 101 | + | |
| 102 | + if (!ambiguous.isEmpty()) { | |
| 103 | + ambiguous.add(selected); | |
| 104 | + | |
| 105 | + String message = getExceptionMessage(type, ambiguous); | |
| 106 | + throw new ConfigurationException(message); | |
| 107 | + } | |
| 108 | + } | |
| 109 | + | |
| 110 | + private static <T> String getExceptionMessage(Class<T> type, List<Class<? extends T>> ambiguous) { | |
| 111 | + StringBuffer classes = new StringBuffer(); | |
| 112 | + | |
| 113 | + int i = 0; | |
| 114 | + for (Class<? extends T> clazz : ambiguous) { | |
| 115 | + if (i++ != 0) { | |
| 116 | + classes.append(", "); | |
| 117 | + } | |
| 118 | + | |
| 119 | + classes.append(clazz.getCanonicalName()); | |
| 120 | + } | |
| 121 | + | |
| 122 | + return getBundle().getString("ambiguous-strategy-resolution", type.getCanonicalName(), classes.toString()); | |
| 123 | + } | |
| 124 | + | |
| 125 | + private static <T> int getPriority(Class<T> type) { | |
| 126 | + int result = Priority.MAX_PRIORITY; | |
| 127 | + Priority priority = type.getAnnotation(Priority.class); | |
| 128 | + | |
| 129 | + if (priority != null) { | |
| 130 | + result = priority.value(); | |
| 131 | + } | |
| 132 | + | |
| 133 | + return result; | |
| 134 | + } | |
| 135 | + | |
| 136 | + // public static <T> T getExplicitReference(String configKey, Class<T> strategyType, Class<T> defaultType) { | |
| 137 | + // Class<T> selectedType = loadSelected(configKey, strategyType, defaultType); | |
| 138 | + // return Beans.getReference(selectedType); | |
| 139 | + // } | |
| 140 | + // | |
| 141 | + // @SuppressWarnings("unchecked") | |
| 142 | + // private static <T> Class<T> loadSelected(String configKey, Class<T> strategyType, Class<T> defaultType) { | |
| 143 | + // ResourceBundle bundle = ResourceBundleProducer.create("demoiselle-core-bundle", | |
| 144 | + // Beans.getReference(Locale.class)); | |
| 145 | + // Class<T> result = null; | |
| 146 | + // String canonicalName = null; | |
| 147 | + // String typeName = strategyType.getSimpleName().toLowerCase(); | |
| 148 | + // String key = null; | |
| 149 | + // try { | |
| 150 | + // URL url = ConfigurationLoader.getResourceAsURL("demoiselle.properties"); | |
| 151 | + // Configuration config = new PropertiesConfiguration(url); | |
| 152 | + // canonicalName = config.getString(configKey, defaultType.getCanonicalName()); | |
| 153 | + // ClassLoader classLoader = ConfigurationLoader.getClassLoaderForClass(canonicalName); | |
| 154 | + // if (classLoader == null) { | |
| 155 | + // classLoader = Thread.currentThread().getContextClassLoader(); | |
| 156 | + // } | |
| 157 | + // result = (Class<T>) Class.forName(canonicalName, false, classLoader); | |
| 158 | + // result.asSubclass(strategyType); | |
| 159 | + // } catch (org.apache.commons.configuration.ConfigurationException cause) { | |
| 160 | + // throw new ConfigurationException(bundle.getString("file-not-found", "demoiselle.properties")); | |
| 161 | + // } catch (ClassNotFoundException cause) { | |
| 162 | + // key = Strings.getString("{0}-class-not-found", typeName); | |
| 163 | + // throw new ConfigurationException(bundle.getString(key, canonicalName)); | |
| 164 | + // } catch (FileNotFoundException e) { | |
| 165 | + // throw new ConfigurationException(bundle.getString("file-not-found", "demoiselle.properties")); | |
| 166 | + // } catch (ClassCastException cause) { | |
| 167 | + // key = Strings.getString("{0}-class-must-be-of-type", typeName); | |
| 168 | + // throw new ConfigurationException(bundle.getString(key, canonicalName, strategyType)); | |
| 169 | + // } | |
| 170 | + // return result; | |
| 171 | + // } | |
| 172 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/TransactionContextImpl.java
0 → 100644
| ... | ... | @@ -0,0 +1,82 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * Copyright (C) 2010 SERPRO | |
| 4 | + * ---------------------------------------------------------------------------- | |
| 5 | + * This file is part of Demoiselle Framework. | |
| 6 | + * | |
| 7 | + * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | + * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | + * as published by the Free Software Foundation. | |
| 10 | + * | |
| 11 | + * This program is distributed in the hope that it will be useful, | |
| 12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | + * GNU General Public License for more details. | |
| 15 | + * | |
| 16 | + * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | + * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | + * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | + * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | + * ---------------------------------------------------------------------------- | |
| 21 | + * Este arquivo é parte do Framework Demoiselle. | |
| 22 | + * | |
| 23 | + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | + * do Software Livre (FSF). | |
| 26 | + * | |
| 27 | + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | + * para maiores detalhes. | |
| 31 | + * | |
| 32 | + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | + * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | + */ | |
| 37 | +package br.gov.frameworkdemoiselle.internal.implementation; | |
| 38 | + | |
| 39 | +import javax.inject.Named; | |
| 40 | + | |
| 41 | +import br.gov.frameworkdemoiselle.internal.bootstrap.TransactionBootstrap; | |
| 42 | +import br.gov.frameworkdemoiselle.internal.configuration.TransactionConfig; | |
| 43 | +import br.gov.frameworkdemoiselle.transaction.Transaction; | |
| 44 | +import br.gov.frameworkdemoiselle.transaction.TransactionContext; | |
| 45 | +import br.gov.frameworkdemoiselle.util.Beans; | |
| 46 | + | |
| 47 | +/** | |
| 48 | + * This is the default implementation of {@link TransactionContext} interface. | |
| 49 | + * | |
| 50 | + * @author SERPRO | |
| 51 | + */ | |
| 52 | +@Named("transactionContext") | |
| 53 | +public class TransactionContextImpl implements TransactionContext { | |
| 54 | + | |
| 55 | + private static final long serialVersionUID = 1L; | |
| 56 | + | |
| 57 | + private Transaction transaction; | |
| 58 | + | |
| 59 | + private Transaction getTransaction() { | |
| 60 | + if (this.transaction == null) { | |
| 61 | + TransactionBootstrap bootstrap = Beans.getReference(TransactionBootstrap.class); | |
| 62 | + Class<? extends Transaction> clazz = getConfig().getTransactionClass(); | |
| 63 | + | |
| 64 | + if (clazz == null) { | |
| 65 | + clazz = StrategySelector.getClass(Transaction.class, bootstrap.getCache()); | |
| 66 | + } | |
| 67 | + | |
| 68 | + this.transaction = Beans.getReference(clazz); | |
| 69 | + } | |
| 70 | + | |
| 71 | + return this.transaction; | |
| 72 | + } | |
| 73 | + | |
| 74 | + @Override | |
| 75 | + public Transaction getCurrentTransaction() { | |
| 76 | + return getTransaction(); | |
| 77 | + } | |
| 78 | + | |
| 79 | + private TransactionConfig getConfig() { | |
| 80 | + return Beans.getReference(TransactionConfig.class); | |
| 81 | + } | |
| 82 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/TransactionInfo.java
| 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 | + */ | |
| 1 | 37 | package br.gov.frameworkdemoiselle.internal.implementation; |
| 2 | 38 | |
| 3 | 39 | import java.io.Serializable; |
| 4 | 40 | |
| 5 | 41 | import javax.enterprise.context.RequestScoped; |
| 6 | 42 | |
| 7 | -//TODO Inter [NQ]: considerar a necessidade da criação de um contexto de transação para manter a coerência com as demais funcionalidades que possuem um contexto. | |
| 8 | -//Resposta: não foi feito porque só foi identificado uma funcionalidade (getCurrentTransaction). Aguardar novas ideias. | |
| 9 | 43 | @RequestScoped |
| 10 | 44 | public class TransactionInfo implements Serializable { |
| 11 | 45 | |
| ... | ... | @@ -13,7 +47,16 @@ public class TransactionInfo implements Serializable { |
| 13 | 47 | |
| 14 | 48 | private int counter = 0; |
| 15 | 49 | |
| 16 | - private boolean owner = false; | |
| 50 | + private boolean owner; | |
| 51 | + | |
| 52 | + public TransactionInfo() { | |
| 53 | + clear(); | |
| 54 | + } | |
| 55 | + | |
| 56 | + public void clear() { | |
| 57 | + this.owner = false; | |
| 58 | + this.counter = 0; | |
| 59 | + } | |
| 17 | 60 | |
| 18 | 61 | public int getCounter() { |
| 19 | 62 | return counter; | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/interceptor/ExceptionHandlerInterceptor.java
| ... | ... | @@ -42,7 +42,6 @@ import java.lang.reflect.Method; |
| 42 | 42 | import java.util.HashMap; |
| 43 | 43 | import java.util.Map; |
| 44 | 44 | |
| 45 | -import javax.inject.Inject; | |
| 46 | 45 | import javax.interceptor.AroundInvoke; |
| 47 | 46 | import javax.interceptor.Interceptor; |
| 48 | 47 | import javax.interceptor.InvocationContext; |
| ... | ... | @@ -50,10 +49,12 @@ import javax.interceptor.InvocationContext; |
| 50 | 49 | import org.slf4j.Logger; |
| 51 | 50 | |
| 52 | 51 | import br.gov.frameworkdemoiselle.DemoiselleException; |
| 53 | -import br.gov.frameworkdemoiselle.annotation.Name; | |
| 54 | 52 | import br.gov.frameworkdemoiselle.exception.ExceptionHandler; |
| 55 | 53 | import br.gov.frameworkdemoiselle.internal.bootstrap.CoreBootstrap; |
| 54 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 55 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 56 | 56 | import br.gov.frameworkdemoiselle.stereotype.Controller; |
| 57 | +import br.gov.frameworkdemoiselle.util.Beans; | |
| 57 | 58 | import br.gov.frameworkdemoiselle.util.ResourceBundle; |
| 58 | 59 | |
| 59 | 60 | @Interceptor |
| ... | ... | @@ -62,20 +63,14 @@ public class ExceptionHandlerInterceptor implements Serializable { |
| 62 | 63 | |
| 63 | 64 | private static final long serialVersionUID = 1L; |
| 64 | 65 | |
| 65 | - private final ResourceBundle bundle; | |
| 66 | + private static ResourceBundle bundle; | |
| 66 | 67 | |
| 67 | - private final Logger logger; | |
| 68 | - | |
| 69 | - @Inject | |
| 70 | - public ExceptionHandlerInterceptor(Logger logger, @Name("demoiselle-core-bundle") ResourceBundle bundle) { | |
| 71 | - this.logger = logger; | |
| 72 | - this.bundle = bundle; | |
| 73 | - } | |
| 68 | + private static Logger logger; | |
| 74 | 69 | |
| 75 | 70 | private final Map<Class<?>, Map<Class<?>, Method>> cache = new HashMap<Class<?>, Map<Class<?>, Method>>(); |
| 76 | 71 | |
| 77 | 72 | private final boolean handleException(final Exception cause, final InvocationContext ic) throws Exception { |
| 78 | - logger.info(bundle.getString("handling-exception", cause.getClass().getCanonicalName())); | |
| 73 | + getLogger().info(getBundle().getString("handling-exception", cause.getClass().getCanonicalName())); | |
| 79 | 74 | |
| 80 | 75 | boolean handled = false; |
| 81 | 76 | Class<?> type = getType(ic); |
| ... | ... | @@ -95,11 +90,13 @@ public class ExceptionHandlerInterceptor implements Serializable { |
| 95 | 90 | |
| 96 | 91 | private final Class<?> getType(final InvocationContext ic) { |
| 97 | 92 | Class<?> type = ic.getTarget().getClass(); |
| 93 | + CoreBootstrap bootstrap = Beans.getReference(CoreBootstrap.class); | |
| 98 | 94 | |
| 99 | - if (!CoreBootstrap.isAnnotatedType(type)) { | |
| 95 | + if (!bootstrap.isAnnotatedType(type)) { | |
| 100 | 96 | type = type.getSuperclass(); |
| 101 | - logger.debug(bundle.getString("proxy-detected", ic.getTarget().getClass(), ic.getTarget().getClass() | |
| 102 | - .getSuperclass())); | |
| 97 | + getLogger().debug( | |
| 98 | + getBundle().getString("proxy-detected", ic.getTarget().getClass(), | |
| 99 | + ic.getTarget().getClass().getSuperclass())); | |
| 103 | 100 | } |
| 104 | 101 | |
| 105 | 102 | return type; |
| ... | ... | @@ -149,7 +146,7 @@ public class ExceptionHandlerInterceptor implements Serializable { |
| 149 | 146 | */ |
| 150 | 147 | private final void validateHandler(final Method method) { |
| 151 | 148 | if (method.getParameterTypes().length != 1) { |
| 152 | - throw new DemoiselleException(bundle.getString("must-declare-one-single-parameter", | |
| 149 | + throw new DemoiselleException(getBundle().getString("must-declare-one-single-parameter", | |
| 153 | 150 | method.toGenericString())); |
| 154 | 151 | } |
| 155 | 152 | } |
| ... | ... | @@ -170,8 +167,10 @@ public class ExceptionHandlerInterceptor implements Serializable { |
| 170 | 167 | |
| 171 | 168 | try { |
| 172 | 169 | method.invoke(object, param); |
| 170 | + | |
| 173 | 171 | } catch (InvocationTargetException cause) { |
| 174 | 172 | Throwable targetTrowable = cause.getTargetException(); |
| 173 | + | |
| 175 | 174 | if (targetTrowable instanceof Exception) { |
| 176 | 175 | throw (Exception) targetTrowable; |
| 177 | 176 | } else { |
| ... | ... | @@ -181,13 +180,14 @@ public class ExceptionHandlerInterceptor implements Serializable { |
| 181 | 180 | |
| 182 | 181 | method.setAccessible(accessible); |
| 183 | 182 | } |
| 184 | - | |
| 183 | + | |
| 185 | 184 | @AroundInvoke |
| 186 | 185 | public Object manage(final InvocationContext ic) throws Exception { |
| 187 | 186 | Object result = null; |
| 188 | 187 | |
| 189 | 188 | try { |
| 190 | 189 | result = ic.proceed(); |
| 190 | + | |
| 191 | 191 | } catch (Exception cause) { |
| 192 | 192 | if (!handleException(cause, ic)) { |
| 193 | 193 | throw cause; |
| ... | ... | @@ -197,4 +197,19 @@ public class ExceptionHandlerInterceptor implements Serializable { |
| 197 | 197 | return result; |
| 198 | 198 | } |
| 199 | 199 | |
| 200 | + private static ResourceBundle getBundle() { | |
| 201 | + if (bundle == null) { | |
| 202 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 203 | + } | |
| 204 | + | |
| 205 | + return bundle; | |
| 206 | + } | |
| 207 | + | |
| 208 | + private static Logger getLogger() { | |
| 209 | + if (logger == null) { | |
| 210 | + logger = LoggerProducer.create(ExceptionHandlerInterceptor.class); | |
| 211 | + } | |
| 212 | + | |
| 213 | + return logger; | |
| 214 | + } | |
| 200 | 215 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/interceptor/RequiredPermissionInterceptor.java
| ... | ... | @@ -38,8 +38,6 @@ package br.gov.frameworkdemoiselle.internal.interceptor; |
| 38 | 38 | |
| 39 | 39 | import java.io.Serializable; |
| 40 | 40 | |
| 41 | -import javax.enterprise.inject.Instance; | |
| 42 | -import javax.inject.Inject; | |
| 43 | 41 | import javax.interceptor.AroundInvoke; |
| 44 | 42 | import javax.interceptor.Interceptor; |
| 45 | 43 | import javax.interceptor.InvocationContext; |
| ... | ... | @@ -47,10 +45,13 @@ import javax.interceptor.InvocationContext; |
| 47 | 45 | import org.slf4j.Logger; |
| 48 | 46 | |
| 49 | 47 | import br.gov.frameworkdemoiselle.annotation.Name; |
| 48 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 49 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 50 | 50 | import br.gov.frameworkdemoiselle.security.AuthorizationException; |
| 51 | 51 | import br.gov.frameworkdemoiselle.security.RequiredPermission; |
| 52 | 52 | import br.gov.frameworkdemoiselle.security.SecurityContext; |
| 53 | 53 | import br.gov.frameworkdemoiselle.security.User; |
| 54 | +import br.gov.frameworkdemoiselle.util.Beans; | |
| 54 | 55 | import br.gov.frameworkdemoiselle.util.ResourceBundle; |
| 55 | 56 | import br.gov.frameworkdemoiselle.util.Strings; |
| 56 | 57 | |
| ... | ... | @@ -65,19 +66,11 @@ public class RequiredPermissionInterceptor implements Serializable { |
| 65 | 66 | |
| 66 | 67 | private static final long serialVersionUID = 1L; |
| 67 | 68 | |
| 68 | - private final Instance<SecurityContext> securityContext; | |
| 69 | + private SecurityContext securityContext; | |
| 69 | 70 | |
| 70 | - private final ResourceBundle bundle; | |
| 71 | + private static ResourceBundle bundle; | |
| 71 | 72 | |
| 72 | - private final Logger logger; | |
| 73 | - | |
| 74 | - @Inject | |
| 75 | - public RequiredPermissionInterceptor(Instance<SecurityContext> securityContext, | |
| 76 | - @Name("demoiselle-core-bundle") ResourceBundle bundle, Logger logger) { | |
| 77 | - this.securityContext = securityContext; | |
| 78 | - this.bundle = bundle; | |
| 79 | - this.logger = logger; | |
| 80 | - } | |
| 73 | + private static Logger logger; | |
| 81 | 74 | |
| 82 | 75 | /** |
| 83 | 76 | * Gets the values for both resource and operation properties of {@code @RequiredPermission}. Delegates to |
| ... | ... | @@ -98,17 +91,17 @@ public class RequiredPermissionInterceptor implements Serializable { |
| 98 | 91 | String operation = getOperation(ic); |
| 99 | 92 | String username = null; |
| 100 | 93 | |
| 101 | - if (securityContext.get().isLoggedIn()) { | |
| 94 | + if (getSecurityContext().isLoggedIn()) { | |
| 102 | 95 | username = getUsername(); |
| 103 | - logger.trace(bundle.getString("access-checking", username, operation, resource)); | |
| 96 | + getLogger().trace(getBundle().getString("access-checking", username, operation, resource)); | |
| 104 | 97 | } |
| 105 | 98 | |
| 106 | - if (!securityContext.get().hasPermission(resource, operation)) { | |
| 107 | - logger.error(bundle.getString("access-denied", username, operation, resource)); | |
| 108 | - throw new AuthorizationException(bundle.getString("access-denied-ui", resource, operation)); | |
| 99 | + if (!getSecurityContext().hasPermission(resource, operation)) { | |
| 100 | + getLogger().error(getBundle().getString("access-denied", username, operation, resource)); | |
| 101 | + throw new AuthorizationException(getBundle().getString("access-denied-ui", resource, operation)); | |
| 109 | 102 | } |
| 110 | 103 | |
| 111 | - logger.debug(bundle.getString("access-allowed", username, operation, resource)); | |
| 104 | + getLogger().debug(getBundle().getString("access-allowed", username, operation, resource)); | |
| 112 | 105 | return ic.proceed(); |
| 113 | 106 | } |
| 114 | 107 | |
| ... | ... | @@ -119,7 +112,7 @@ public class RequiredPermissionInterceptor implements Serializable { |
| 119 | 112 | */ |
| 120 | 113 | private String getUsername() { |
| 121 | 114 | String username = ""; |
| 122 | - User user = securityContext.get().getUser(); | |
| 115 | + User user = getSecurityContext().getUser(); | |
| 123 | 116 | |
| 124 | 117 | if (user != null && user.getId() != null) { |
| 125 | 118 | username = user.getId(); |
| ... | ... | @@ -173,4 +166,28 @@ public class RequiredPermissionInterceptor implements Serializable { |
| 173 | 166 | return requiredPermission.operation(); |
| 174 | 167 | } |
| 175 | 168 | } |
| 169 | + | |
| 170 | + private SecurityContext getSecurityContext() { | |
| 171 | + if (securityContext == null) { | |
| 172 | + securityContext = Beans.getReference(SecurityContext.class); | |
| 173 | + } | |
| 174 | + | |
| 175 | + return securityContext; | |
| 176 | + } | |
| 177 | + | |
| 178 | + private static ResourceBundle getBundle() { | |
| 179 | + if (bundle == null) { | |
| 180 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 181 | + } | |
| 182 | + | |
| 183 | + return bundle; | |
| 184 | + } | |
| 185 | + | |
| 186 | + private static Logger getLogger() { | |
| 187 | + if (logger == null) { | |
| 188 | + logger = LoggerProducer.create(RequiredPermissionInterceptor.class); | |
| 189 | + } | |
| 190 | + | |
| 191 | + return logger; | |
| 192 | + } | |
| 176 | 193 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/interceptor/RequiredRoleInterceptor.java
| ... | ... | @@ -41,18 +41,18 @@ import java.util.ArrayList; |
| 41 | 41 | import java.util.Arrays; |
| 42 | 42 | import java.util.List; |
| 43 | 43 | |
| 44 | -import javax.enterprise.inject.Instance; | |
| 45 | -import javax.inject.Inject; | |
| 46 | 44 | import javax.interceptor.AroundInvoke; |
| 47 | 45 | import javax.interceptor.Interceptor; |
| 48 | 46 | import javax.interceptor.InvocationContext; |
| 49 | 47 | |
| 50 | 48 | import org.slf4j.Logger; |
| 51 | 49 | |
| 52 | -import br.gov.frameworkdemoiselle.annotation.Name; | |
| 50 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 51 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 53 | 52 | import br.gov.frameworkdemoiselle.security.AuthorizationException; |
| 54 | 53 | import br.gov.frameworkdemoiselle.security.RequiredRole; |
| 55 | 54 | import br.gov.frameworkdemoiselle.security.SecurityContext; |
| 55 | +import br.gov.frameworkdemoiselle.util.Beans; | |
| 56 | 56 | import br.gov.frameworkdemoiselle.util.ResourceBundle; |
| 57 | 57 | |
| 58 | 58 | /** |
| ... | ... | @@ -66,19 +66,11 @@ public class RequiredRoleInterceptor implements Serializable { |
| 66 | 66 | |
| 67 | 67 | private static final long serialVersionUID = 1L; |
| 68 | 68 | |
| 69 | - private final Instance<SecurityContext> securityContext; | |
| 69 | + private SecurityContext securityContext; | |
| 70 | 70 | |
| 71 | - private final ResourceBundle bundle; | |
| 71 | + private static ResourceBundle bundle; | |
| 72 | 72 | |
| 73 | - private final Logger logger; | |
| 74 | - | |
| 75 | - @Inject | |
| 76 | - public RequiredRoleInterceptor(Instance<SecurityContext> securityContext, | |
| 77 | - @Name("demoiselle-core-bundle") ResourceBundle bundle, Logger logger) { | |
| 78 | - this.securityContext = securityContext; | |
| 79 | - this.bundle = bundle; | |
| 80 | - this.logger = logger; | |
| 81 | - } | |
| 73 | + private static Logger logger; | |
| 82 | 74 | |
| 83 | 75 | /** |
| 84 | 76 | * Gets the value property of {@code @RequiredRole}. Delegates to {@code SecurityContext} check role. If the user |
| ... | ... | @@ -96,27 +88,29 @@ public class RequiredRoleInterceptor implements Serializable { |
| 96 | 88 | public Object manage(final InvocationContext ic) throws Exception { |
| 97 | 89 | List<String> roles = getRoles(ic); |
| 98 | 90 | |
| 99 | - if (securityContext.get().isLoggedIn()) { | |
| 100 | - logger.info(bundle.getString("has-role-verification", securityContext.get().getUser().getId(), roles)); | |
| 91 | + if (getSecurityContext().isLoggedIn()) { | |
| 92 | + getLogger().info( | |
| 93 | + getBundle().getString("has-role-verification", getSecurityContext().getUser().getId(), roles)); | |
| 101 | 94 | } |
| 102 | 95 | |
| 103 | 96 | List<String> userRoles = new ArrayList<String>(); |
| 104 | 97 | |
| 105 | 98 | for (String role : roles) { |
| 106 | - if (securityContext.get().hasRole(role)) { | |
| 99 | + if (getSecurityContext().hasRole(role)) { | |
| 107 | 100 | userRoles.add(role); |
| 108 | 101 | } |
| 109 | 102 | } |
| 110 | 103 | |
| 111 | 104 | if (userRoles.isEmpty()) { |
| 112 | - logger.error(bundle.getString("does-not-have-role", securityContext.get().getUser().getId(), roles)); | |
| 105 | + getLogger().error( | |
| 106 | + getBundle().getString("does-not-have-role", getSecurityContext().getUser().getId(), roles)); | |
| 113 | 107 | |
| 114 | 108 | @SuppressWarnings("unused") |
| 115 | 109 | AuthorizationException a = new AuthorizationException(null); |
| 116 | - throw new AuthorizationException(bundle.getString("does-not-have-role-ui", roles)); | |
| 110 | + throw new AuthorizationException(getBundle().getString("does-not-have-role-ui", roles)); | |
| 117 | 111 | } |
| 118 | 112 | |
| 119 | - logger.debug(bundle.getString("user-has-role", securityContext.get().getUser().getId(), userRoles)); | |
| 113 | + getLogger().debug(getBundle().getString("user-has-role", getSecurityContext().getUser().getId(), userRoles)); | |
| 120 | 114 | |
| 121 | 115 | return ic.proceed(); |
| 122 | 116 | } |
| ... | ... | @@ -141,5 +135,28 @@ public class RequiredRoleInterceptor implements Serializable { |
| 141 | 135 | |
| 142 | 136 | return Arrays.asList(roles); |
| 143 | 137 | } |
| 144 | - | |
| 138 | + | |
| 139 | + private SecurityContext getSecurityContext() { | |
| 140 | + if (securityContext == null) { | |
| 141 | + securityContext = Beans.getReference(SecurityContext.class); | |
| 142 | + } | |
| 143 | + | |
| 144 | + return securityContext; | |
| 145 | + } | |
| 146 | + | |
| 147 | + private static ResourceBundle getBundle() { | |
| 148 | + if (bundle == null) { | |
| 149 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 150 | + } | |
| 151 | + | |
| 152 | + return bundle; | |
| 153 | + } | |
| 154 | + | |
| 155 | + private static Logger getLogger() { | |
| 156 | + if (logger == null) { | |
| 157 | + logger = LoggerProducer.create(RequiredRoleInterceptor.class); | |
| 158 | + } | |
| 159 | + | |
| 160 | + return logger; | |
| 161 | + } | |
| 145 | 162 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/interceptor/TransactionalInterceptor.java
| ... | ... | @@ -38,19 +38,21 @@ package br.gov.frameworkdemoiselle.internal.interceptor; |
| 38 | 38 | |
| 39 | 39 | import java.io.Serializable; |
| 40 | 40 | |
| 41 | -import javax.enterprise.inject.Instance; | |
| 42 | -import javax.inject.Inject; | |
| 41 | +import javax.enterprise.context.ContextNotActiveException; | |
| 43 | 42 | import javax.interceptor.AroundInvoke; |
| 44 | 43 | import javax.interceptor.Interceptor; |
| 45 | 44 | import javax.interceptor.InvocationContext; |
| 46 | 45 | |
| 47 | 46 | import org.slf4j.Logger; |
| 48 | 47 | |
| 49 | -import br.gov.frameworkdemoiselle.annotation.Name; | |
| 50 | 48 | import br.gov.frameworkdemoiselle.exception.ApplicationException; |
| 51 | 49 | import br.gov.frameworkdemoiselle.internal.implementation.TransactionInfo; |
| 50 | +import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 51 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 52 | 52 | import br.gov.frameworkdemoiselle.transaction.Transaction; |
| 53 | +import br.gov.frameworkdemoiselle.transaction.TransactionContext; | |
| 53 | 54 | import br.gov.frameworkdemoiselle.transaction.Transactional; |
| 55 | +import br.gov.frameworkdemoiselle.util.Beans; | |
| 54 | 56 | import br.gov.frameworkdemoiselle.util.ResourceBundle; |
| 55 | 57 | |
| 56 | 58 | @Interceptor |
| ... | ... | @@ -59,22 +61,49 @@ public class TransactionalInterceptor implements Serializable { |
| 59 | 61 | |
| 60 | 62 | private static final long serialVersionUID = 1L; |
| 61 | 63 | |
| 62 | - private final Instance<Transaction> transaction; | |
| 64 | + private TransactionContext transactionContext; | |
| 63 | 65 | |
| 64 | - private final Logger logger; | |
| 66 | + private TransactionInfo transactionInfo; | |
| 65 | 67 | |
| 66 | - private final ResourceBundle bundle; | |
| 68 | + private static ResourceBundle bundle; | |
| 67 | 69 | |
| 68 | - private final Instance<TransactionInfo> transactionInfo; | |
| 70 | + private static Logger logger; | |
| 69 | 71 | |
| 70 | - @Inject | |
| 71 | - public TransactionalInterceptor(Instance<Transaction> transaction, Instance<TransactionInfo> transactionInfo, | |
| 72 | - Logger logger, @Name("demoiselle-core-bundle") ResourceBundle bundle) { | |
| 73 | - this.transaction = transaction; | |
| 74 | - this.transactionInfo = transactionInfo; | |
| 75 | - this.logger = logger; | |
| 76 | - this.bundle = bundle; | |
| 72 | + private TransactionContext getTransactionContext() { | |
| 73 | + if (this.transactionContext == null) { | |
| 74 | + this.transactionContext = Beans.getReference(TransactionContext.class); | |
| 75 | + } | |
| 76 | + | |
| 77 | + return this.transactionContext; | |
| 78 | + } | |
| 79 | + | |
| 80 | + private TransactionInfo newTransactionInfo() { | |
| 81 | + TransactionInfo instance; | |
| 82 | + | |
| 83 | + try { | |
| 84 | + instance = Beans.getReference(TransactionInfo.class); | |
| 85 | + | |
| 86 | + } catch (ContextNotActiveException cause) { | |
| 87 | + instance = new TransactionInfo() { | |
| 88 | + | |
| 89 | + private static final long serialVersionUID = 1L; | |
| 90 | + | |
| 91 | + @Override | |
| 92 | + public boolean isOwner() { | |
| 93 | + return false; | |
| 94 | + } | |
| 95 | + }; | |
| 96 | + } | |
| 97 | + | |
| 98 | + return instance; | |
| 99 | + } | |
| 100 | + | |
| 101 | + private TransactionInfo getTransactionInfo() { | |
| 102 | + if (this.transactionInfo == null) { | |
| 103 | + this.transactionInfo = newTransactionInfo(); | |
| 104 | + } | |
| 77 | 105 | |
| 106 | + return this.transactionInfo; | |
| 78 | 107 | } |
| 79 | 108 | |
| 80 | 109 | @AroundInvoke |
| ... | ... | @@ -83,9 +112,7 @@ public class TransactionalInterceptor implements Serializable { |
| 83 | 112 | |
| 84 | 113 | Object result = null; |
| 85 | 114 | try { |
| 86 | - this.logger.debug(bundle.getString("transactional-execution", ic.getMethod().toGenericString())); | |
| 87 | - transactionInfo.get().incrementCounter(); | |
| 88 | - | |
| 115 | + getLogger().debug(getBundle().getString("transactional-execution", ic.getMethod().toGenericString())); | |
| 89 | 116 | result = ic.proceed(); |
| 90 | 117 | |
| 91 | 118 | } catch (Exception cause) { |
| ... | ... | @@ -93,7 +120,6 @@ public class TransactionalInterceptor implements Serializable { |
| 93 | 120 | throw cause; |
| 94 | 121 | |
| 95 | 122 | } finally { |
| 96 | - transactionInfo.get().decrementCounter(); | |
| 97 | 123 | complete(ic); |
| 98 | 124 | } |
| 99 | 125 | |
| ... | ... | @@ -101,20 +127,22 @@ public class TransactionalInterceptor implements Serializable { |
| 101 | 127 | } |
| 102 | 128 | |
| 103 | 129 | private void initiate(final InvocationContext ic) { |
| 104 | - Transaction tx = this.transaction.get(); | |
| 105 | - TransactionInfo ctx = this.transactionInfo.get(); | |
| 130 | + Transaction transaction = getTransactionContext().getCurrentTransaction(); | |
| 131 | + TransactionInfo transactionInfo = getTransactionInfo(); | |
| 106 | 132 | |
| 107 | - if (!tx.isActive()) { | |
| 108 | - tx.begin(); | |
| 109 | - ctx.markAsOwner(); | |
| 110 | - this.logger.info(bundle.getString("begin-transaction")); | |
| 133 | + if (!transaction.isActive()) { | |
| 134 | + transaction.begin(); | |
| 135 | + transactionInfo.markAsOwner(); | |
| 136 | + getLogger().info(getBundle().getString("begin-transaction")); | |
| 111 | 137 | } |
| 138 | + | |
| 139 | + transactionInfo.incrementCounter(); | |
| 112 | 140 | } |
| 113 | 141 | |
| 114 | 142 | private void handleException(final Exception cause) { |
| 115 | - Transaction tx = this.transaction.get(); | |
| 143 | + Transaction transaction = getTransactionContext().getCurrentTransaction(); | |
| 116 | 144 | |
| 117 | - if (!tx.isMarkedRollback()) { | |
| 145 | + if (!transaction.isMarkedRollback()) { | |
| 118 | 146 | boolean rollback = false; |
| 119 | 147 | ApplicationException annotation = cause.getClass().getAnnotation(ApplicationException.class); |
| 120 | 148 | |
| ... | ... | @@ -123,30 +151,52 @@ public class TransactionalInterceptor implements Serializable { |
| 123 | 151 | } |
| 124 | 152 | |
| 125 | 153 | if (rollback) { |
| 126 | - tx.setRollbackOnly(); | |
| 127 | - this.logger.info(bundle.getString("transaction-marked-rollback", cause.getMessage())); | |
| 154 | + transaction.setRollbackOnly(); | |
| 155 | + getLogger().info(getBundle().getString("transaction-marked-rollback", cause.getMessage())); | |
| 128 | 156 | } |
| 129 | 157 | } |
| 130 | 158 | } |
| 131 | 159 | |
| 132 | 160 | private void complete(final InvocationContext ic) { |
| 133 | - Transaction tx = this.transaction.get(); | |
| 134 | - TransactionInfo ctx = this.transactionInfo.get(); | |
| 161 | + Transaction transaction = getTransactionContext().getCurrentTransaction(); | |
| 162 | + TransactionInfo transactionInfo = getTransactionInfo(); | |
| 163 | + transactionInfo.decrementCounter(); | |
| 164 | + | |
| 165 | + if (transactionInfo.getCounter() == 0 && transaction.isActive()) { | |
| 135 | 166 | |
| 136 | - if (ctx.getCounter() == 0 && tx.isActive()) { | |
| 167 | + if (transactionInfo.isOwner()) { | |
| 168 | + if (transaction.isMarkedRollback()) { | |
| 169 | + transaction.rollback(); | |
| 170 | + transactionInfo.clear(); | |
| 171 | + | |
| 172 | + getLogger().info(getBundle().getString("transaction-rolledback")); | |
| 137 | 173 | |
| 138 | - if (ctx.isOwner()) { | |
| 139 | - if (tx.isMarkedRollback()) { | |
| 140 | - tx.rollback(); | |
| 141 | - this.logger.info(bundle.getString("transaction-rolledback")); | |
| 142 | 174 | } else { |
| 143 | - tx.commit(); | |
| 144 | - this.logger.info(bundle.getString("transaction-commited")); | |
| 175 | + transaction.commit(); | |
| 176 | + transactionInfo.clear(); | |
| 177 | + | |
| 178 | + getLogger().info(getBundle().getString("transaction-commited")); | |
| 145 | 179 | } |
| 146 | 180 | } |
| 147 | 181 | |
| 148 | - } else if (ctx.getCounter() == 0 && !tx.isActive()) { | |
| 149 | - this.logger.info(bundle.getString("transaction-already-finalized")); | |
| 182 | + } else if (transactionInfo.getCounter() == 0 && !transaction.isActive()) { | |
| 183 | + getLogger().info(getBundle().getString("transaction-already-finalized")); | |
| 184 | + } | |
| 185 | + } | |
| 186 | + | |
| 187 | + private static ResourceBundle getBundle() { | |
| 188 | + if (bundle == null) { | |
| 189 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 150 | 190 | } |
| 191 | + | |
| 192 | + return bundle; | |
| 193 | + } | |
| 194 | + | |
| 195 | + private static Logger getLogger() { | |
| 196 | + if (logger == null) { | |
| 197 | + logger = LoggerProducer.create(TransactionalInterceptor.class); | |
| 198 | + } | |
| 199 | + | |
| 200 | + return logger; | |
| 151 | 201 | } |
| 152 | 202 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/processor/AbstractProcessor.java
| ... | ... | @@ -1,121 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * Copyright (C) 2010 SERPRO | |
| 4 | - * ---------------------------------------------------------------------------- | |
| 5 | - * This file is part of Demoiselle Framework. | |
| 6 | - * | |
| 7 | - * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | - * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | - * as published by the Free Software Foundation. | |
| 10 | - * | |
| 11 | - * This program is distributed in the hope that it will be useful, | |
| 12 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | - * GNU General Public License for more details. | |
| 15 | - * | |
| 16 | - * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | - * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | - * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | - * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | - * ---------------------------------------------------------------------------- | |
| 21 | - * Este arquivo é parte do Framework Demoiselle. | |
| 22 | - * | |
| 23 | - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | - * do Software Livre (FSF). | |
| 26 | - * | |
| 27 | - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | - * para maiores detalhes. | |
| 31 | - * | |
| 32 | - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | - * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | - */ | |
| 37 | -package br.gov.frameworkdemoiselle.internal.processor; | |
| 38 | - | |
| 39 | -import java.util.Locale; | |
| 40 | - | |
| 41 | -import javax.enterprise.inject.spi.AnnotatedCallable; | |
| 42 | -import javax.enterprise.inject.spi.Bean; | |
| 43 | -import javax.enterprise.inject.spi.BeanManager; | |
| 44 | - | |
| 45 | -import org.slf4j.Logger; | |
| 46 | - | |
| 47 | -import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 48 | -import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 49 | -import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 50 | - | |
| 51 | -/** | |
| 52 | - * It abstract the integration between Processor and the context; | |
| 53 | - * | |
| 54 | - * @param <DC> | |
| 55 | - * the declaring class | |
| 56 | - */ | |
| 57 | -public abstract class AbstractProcessor<DC> implements Processor { | |
| 58 | - | |
| 59 | - private BeanManager beanManager; | |
| 60 | - | |
| 61 | - private AnnotatedCallable<DC> annotatedCallable; | |
| 62 | - | |
| 63 | - private ResourceBundleProducer bundleFactory = new ResourceBundleProducer(); | |
| 64 | - | |
| 65 | - private ResourceBundle bundle; | |
| 66 | - | |
| 67 | - protected static final String BUNDLE_BASE_NAME = "demoiselle-core-bundle"; | |
| 68 | - | |
| 69 | - public AbstractProcessor(final BeanManager beanManager) { | |
| 70 | - this.beanManager = beanManager; | |
| 71 | - } | |
| 72 | - | |
| 73 | - public AbstractProcessor(final AnnotatedCallable<DC> annotatedCallable, final BeanManager beanManager) { | |
| 74 | - this.annotatedCallable = annotatedCallable; | |
| 75 | - this.beanManager = beanManager; | |
| 76 | - } | |
| 77 | - | |
| 78 | - protected AnnotatedCallable<DC> getAnnotatedCallable() { | |
| 79 | - return this.annotatedCallable; | |
| 80 | - } | |
| 81 | - | |
| 82 | - protected BeanManager getBeanManager() { | |
| 83 | - return this.beanManager; | |
| 84 | - } | |
| 85 | - | |
| 86 | - /** | |
| 87 | - * Ask the bean manager for the firt instance of the declaring classe for this java member, then returns the current | |
| 88 | - * reference; | |
| 89 | - * | |
| 90 | - * @param <T> | |
| 91 | - * DeclaringClass | |
| 92 | - * @return | |
| 93 | - */ | |
| 94 | - @SuppressWarnings("unchecked") | |
| 95 | - protected DC getReferencedBean() { | |
| 96 | - Class<DC> classType = (Class<DC>) getAnnotatedCallable().getJavaMember().getDeclaringClass(); | |
| 97 | - return getReferencedBean(classType); | |
| 98 | - } | |
| 99 | - | |
| 100 | - @SuppressWarnings("unchecked") | |
| 101 | - protected DC getReferencedBean(final Class<DC> type) { | |
| 102 | - Bean<DC> bean = (Bean<DC>) beanManager.getBeans(type).iterator().next(); | |
| 103 | - return (DC) beanManager.getReference(bean, type, beanManager.createCreationalContext(bean)); | |
| 104 | - } | |
| 105 | - | |
| 106 | - protected ResourceBundle getBundle() { | |
| 107 | - return getBundle(BUNDLE_BASE_NAME); | |
| 108 | - } | |
| 109 | - | |
| 110 | - protected ResourceBundle getBundle(String baseName) { | |
| 111 | - if (bundle == null) { | |
| 112 | - bundle = bundleFactory.create(baseName, Locale.getDefault()); | |
| 113 | - } | |
| 114 | - | |
| 115 | - return bundle; | |
| 116 | - } | |
| 117 | - | |
| 118 | - protected Logger getLogger() { | |
| 119 | - return LoggerProducer.create(this.getClass()); | |
| 120 | - } | |
| 121 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/processor/AnnotatedMethodProcessor.java
| ... | ... | @@ -1,105 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * Copyright (C) 2010 SERPRO | |
| 4 | - * ---------------------------------------------------------------------------- | |
| 5 | - * This file is part of Demoiselle Framework. | |
| 6 | - * | |
| 7 | - * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | - * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | - * as published by the Free Software Foundation. | |
| 10 | - * | |
| 11 | - * This program is distributed in the hope that it will be useful, | |
| 12 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | - * GNU General Public License for more details. | |
| 15 | - * | |
| 16 | - * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | - * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | - * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | - * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | - * ---------------------------------------------------------------------------- | |
| 21 | - * Este arquivo é parte do Framework Demoiselle. | |
| 22 | - * | |
| 23 | - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | - * do Software Livre (FSF). | |
| 26 | - * | |
| 27 | - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | - * para maiores detalhes. | |
| 31 | - * | |
| 32 | - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | - * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | - */ | |
| 37 | -package br.gov.frameworkdemoiselle.internal.processor; | |
| 38 | - | |
| 39 | -import java.lang.reflect.InvocationTargetException; | |
| 40 | - | |
| 41 | -import javax.enterprise.inject.spi.AnnotatedMethod; | |
| 42 | -import javax.enterprise.inject.spi.BeanManager; | |
| 43 | - | |
| 44 | -import br.gov.frameworkdemoiselle.exception.ApplicationException; | |
| 45 | -import br.gov.frameworkdemoiselle.message.SeverityType; | |
| 46 | - | |
| 47 | -/** | |
| 48 | - * Represents an annotated method to be processed; | |
| 49 | - * | |
| 50 | - * @param <DC> | |
| 51 | - * declaring class owner of the method | |
| 52 | - */ | |
| 53 | -public class AnnotatedMethodProcessor<DC> extends AbstractProcessor<DC> { | |
| 54 | - | |
| 55 | - public AnnotatedMethodProcessor(final AnnotatedMethod<DC> annotatedMethod, final BeanManager beanManager) { | |
| 56 | - super(annotatedMethod, beanManager); | |
| 57 | - } | |
| 58 | - | |
| 59 | - protected AnnotatedMethod<DC> getAnnotatedMethod() { | |
| 60 | - return (AnnotatedMethod<DC>) getAnnotatedCallable(); | |
| 61 | - } | |
| 62 | - | |
| 63 | - public boolean process(Object... args) throws Throwable { | |
| 64 | - getLogger().info(getBundle().getString("processing", getAnnotatedMethod().getJavaMember().toGenericString())); | |
| 65 | - | |
| 66 | - try { | |
| 67 | - getAnnotatedMethod().getJavaMember().invoke(getReferencedBean(), args); | |
| 68 | - | |
| 69 | - } catch (InvocationTargetException cause) { | |
| 70 | - handleException(cause.getCause()); | |
| 71 | - } | |
| 72 | - | |
| 73 | - return true; | |
| 74 | - } | |
| 75 | - | |
| 76 | - private void handleException(Throwable cause) throws Throwable { | |
| 77 | - ApplicationException ann = cause.getClass().getAnnotation(ApplicationException.class); | |
| 78 | - | |
| 79 | - if (ann == null || SeverityType.FATAL == ann.severity()) { | |
| 80 | - throw cause; | |
| 81 | - | |
| 82 | - } else { | |
| 83 | - switch (ann.severity()) { | |
| 84 | - case INFO: | |
| 85 | - getLogger().info(cause.getMessage()); | |
| 86 | - break; | |
| 87 | - | |
| 88 | - case WARN: | |
| 89 | - getLogger().warn(cause.getMessage()); | |
| 90 | - break; | |
| 91 | - | |
| 92 | - default: | |
| 93 | - getLogger().error(getBundle().getString("processing-fail"), cause); | |
| 94 | - break; | |
| 95 | - } | |
| 96 | - } | |
| 97 | - } | |
| 98 | - | |
| 99 | - @Override | |
| 100 | - public String toString() { | |
| 101 | - return getBundle().getString("for", getClass().getSimpleName(), | |
| 102 | - getAnnotatedMethod().getJavaMember().toGenericString()); | |
| 103 | - } | |
| 104 | - | |
| 105 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/processor/Processor.java
| ... | ... | @@ -1,45 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * Copyright (C) 2010 SERPRO | |
| 4 | - * ---------------------------------------------------------------------------- | |
| 5 | - * This file is part of Demoiselle Framework. | |
| 6 | - * | |
| 7 | - * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | - * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | - * as published by the Free Software Foundation. | |
| 10 | - * | |
| 11 | - * This program is distributed in the hope that it will be useful, | |
| 12 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | - * GNU General Public License for more details. | |
| 15 | - * | |
| 16 | - * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | - * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | - * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | - * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | - * ---------------------------------------------------------------------------- | |
| 21 | - * Este arquivo é parte do Framework Demoiselle. | |
| 22 | - * | |
| 23 | - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | - * do Software Livre (FSF). | |
| 26 | - * | |
| 27 | - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | - * para maiores detalhes. | |
| 31 | - * | |
| 32 | - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | - * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | - */ | |
| 37 | -package br.gov.frameworkdemoiselle.internal.processor; | |
| 38 | - | |
| 39 | -/** | |
| 40 | - * Represents an classe that can be processed. | |
| 41 | - */ | |
| 42 | -public interface Processor { | |
| 43 | - | |
| 44 | - public boolean process(Object... args) throws Throwable; | |
| 45 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/processor/ShutdownProcessor.java
| ... | ... | @@ -1,63 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * Copyright (C) 2010 SERPRO | |
| 4 | - * ---------------------------------------------------------------------------- | |
| 5 | - * This file is part of Demoiselle Framework. | |
| 6 | - * | |
| 7 | - * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | - * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | - * as published by the Free Software Foundation. | |
| 10 | - * | |
| 11 | - * This program is distributed in the hope that it will be useful, | |
| 12 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | - * GNU General Public License for more details. | |
| 15 | - * | |
| 16 | - * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | - * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | - * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | - * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | - * ---------------------------------------------------------------------------- | |
| 21 | - * Este arquivo é parte do Framework Demoiselle. | |
| 22 | - * | |
| 23 | - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | - * do Software Livre (FSF). | |
| 26 | - * | |
| 27 | - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | - * para maiores detalhes. | |
| 31 | - * | |
| 32 | - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | - * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | - */ | |
| 37 | -package br.gov.frameworkdemoiselle.internal.processor; | |
| 38 | - | |
| 39 | -import javax.enterprise.inject.spi.AnnotatedMethod; | |
| 40 | -import javax.enterprise.inject.spi.BeanManager; | |
| 41 | - | |
| 42 | -import br.gov.frameworkdemoiselle.annotation.Shutdown; | |
| 43 | - | |
| 44 | -public class ShutdownProcessor<T> extends AnnotatedMethodProcessor<T> implements Comparable<ShutdownProcessor<T>> { | |
| 45 | - | |
| 46 | - public ShutdownProcessor(AnnotatedMethod<T> annotatedMethod, BeanManager beanManager) { | |
| 47 | - super(annotatedMethod, beanManager); | |
| 48 | - } | |
| 49 | - | |
| 50 | - @Override | |
| 51 | - public int compareTo(final ShutdownProcessor<T> other) { | |
| 52 | - int result = 0; | |
| 53 | - Shutdown annotationThis = getAnnotatedMethod().getAnnotation(Shutdown.class); | |
| 54 | - Shutdown annotationOther = other.getAnnotatedMethod().getAnnotation(Shutdown.class); | |
| 55 | - if (annotationThis != null && annotationThis != null) { | |
| 56 | - Integer orderThis = annotationThis.priority(); | |
| 57 | - Integer orderOther = annotationOther.priority(); | |
| 58 | - result = orderThis.compareTo(orderOther); | |
| 59 | - } | |
| 60 | - return result; | |
| 61 | - } | |
| 62 | - | |
| 63 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/processor/StartupProcessor.java
| ... | ... | @@ -1,68 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * Copyright (C) 2010 SERPRO | |
| 4 | - * ---------------------------------------------------------------------------- | |
| 5 | - * This file is part of Demoiselle Framework. | |
| 6 | - * | |
| 7 | - * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | - * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | - * as published by the Free Software Foundation. | |
| 10 | - * | |
| 11 | - * This program is distributed in the hope that it will be useful, | |
| 12 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | - * GNU General Public License for more details. | |
| 15 | - * | |
| 16 | - * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | - * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | - * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | - * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | - * ---------------------------------------------------------------------------- | |
| 21 | - * Este arquivo é parte do Framework Demoiselle. | |
| 22 | - * | |
| 23 | - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | - * do Software Livre (FSF). | |
| 26 | - * | |
| 27 | - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | - * para maiores detalhes. | |
| 31 | - * | |
| 32 | - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | - * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | - */ | |
| 37 | -package br.gov.frameworkdemoiselle.internal.processor; | |
| 38 | - | |
| 39 | -import javax.enterprise.inject.spi.AnnotatedMethod; | |
| 40 | -import javax.enterprise.inject.spi.BeanManager; | |
| 41 | - | |
| 42 | -import br.gov.frameworkdemoiselle.annotation.Startup; | |
| 43 | - | |
| 44 | -/** | |
| 45 | - * Processor for a {@code @Startup} annotated method, making it comparable. | |
| 46 | - * | |
| 47 | - * @param <T> | |
| 48 | - */ | |
| 49 | -public class StartupProcessor<T> extends AnnotatedMethodProcessor<T> implements Comparable<StartupProcessor<T>> { | |
| 50 | - | |
| 51 | - public StartupProcessor(final AnnotatedMethod<T> annotatedMethod, final BeanManager beanManager) { | |
| 52 | - super(annotatedMethod, beanManager); | |
| 53 | - } | |
| 54 | - | |
| 55 | - @Override | |
| 56 | - public int compareTo(final StartupProcessor<T> other) { | |
| 57 | - int result = 0; | |
| 58 | - Startup annotationThis = getAnnotatedMethod().getAnnotation(Startup.class); | |
| 59 | - Startup annotationOther = other.getAnnotatedMethod().getAnnotation(Startup.class); | |
| 60 | - if (annotationThis != null && annotationOther != null) { | |
| 61 | - Integer orderThis = annotationThis.priority(); | |
| 62 | - Integer orderOther = annotationOther.priority(); | |
| 63 | - result = orderThis.compareTo(orderOther); | |
| 64 | - } | |
| 65 | - return result; | |
| 66 | - } | |
| 67 | - | |
| 68 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ContextProducer.java
| ... | ... | @@ -1,84 +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 | -/* | |
| 38 | - * Demoiselle Framework Copyright (c) 2010 Serpro and other contributors as indicated by the @author tag. See the | |
| 39 | - * copyright.txt in the distribution for a full listing of contributors. Demoiselle Framework is an open source Java EE | |
| 40 | - * library designed to accelerate the development of transactional database Web applications. Demoiselle Framework is | |
| 41 | - * released under the terms of the LGPL license 3 http://www.gnu.org/licenses/lgpl.html LGPL License 3 This file is part | |
| 42 | - * of Demoiselle Framework. Demoiselle Framework is free software: you can redistribute it and/or modify it under the | |
| 43 | - * terms of the GNU Lesser General Public License 3 as published by the Free Software Foundation. Demoiselle Framework | |
| 44 | - * is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 45 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You | |
| 46 | - * should have received a copy of the GNU Lesser General Public License along with Demoiselle Framework. If not, see | |
| 47 | - * <http://www.gnu.org/licenses/>. | |
| 48 | - */ | |
| 49 | -package br.gov.frameworkdemoiselle.internal.producer; | |
| 50 | - | |
| 51 | -import java.io.Serializable; | |
| 52 | - | |
| 53 | -import javax.enterprise.inject.Default; | |
| 54 | -import javax.enterprise.inject.Produces; | |
| 55 | -import javax.naming.Context; | |
| 56 | -import javax.naming.InitialContext; | |
| 57 | -import javax.naming.NamingException; | |
| 58 | - | |
| 59 | -import br.gov.frameworkdemoiselle.DemoiselleException; | |
| 60 | -import br.gov.frameworkdemoiselle.internal.proxy.ContextProxy; | |
| 61 | - | |
| 62 | -public class ContextProducer implements Serializable { | |
| 63 | - | |
| 64 | - private static final long serialVersionUID = 1L; | |
| 65 | - | |
| 66 | - // @Inject | |
| 67 | - // @Name("demoiselle-core-bundle") | |
| 68 | - // private ResourceBundle bundle; | |
| 69 | - | |
| 70 | - @Produces | |
| 71 | - @Default | |
| 72 | - public static Context create() { | |
| 73 | - Context context = null; | |
| 74 | - | |
| 75 | - try { | |
| 76 | - context = new ContextProxy(new InitialContext()); | |
| 77 | - | |
| 78 | - } catch (NamingException cause) { | |
| 79 | - throw new DemoiselleException("Erro ao criar InitialContext", cause); | |
| 80 | - } | |
| 81 | - | |
| 82 | - return context; | |
| 83 | - } | |
| 84 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/producer/LocaleProducer.java
| ... | ... | @@ -1,16 +0,0 @@ |
| 1 | -package br.gov.frameworkdemoiselle.internal.producer; | |
| 2 | - | |
| 3 | -import java.util.Locale; | |
| 4 | - | |
| 5 | -import javax.enterprise.inject.Default; | |
| 6 | -import javax.enterprise.inject.Produces; | |
| 7 | - | |
| 8 | -public class LocaleProducer { | |
| 9 | - | |
| 10 | - @Produces | |
| 11 | - @Default | |
| 12 | - public Locale create() { | |
| 13 | - return Locale.getDefault(); | |
| 14 | - } | |
| 15 | - | |
| 16 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/producer/LoggerProducer.java
| ... | ... | @@ -55,7 +55,6 @@ import javax.enterprise.inject.Produces; |
| 55 | 55 | import javax.enterprise.inject.spi.InjectionPoint; |
| 56 | 56 | |
| 57 | 57 | import org.slf4j.Logger; |
| 58 | -import org.slf4j.LoggerFactory; | |
| 59 | 58 | |
| 60 | 59 | import br.gov.frameworkdemoiselle.internal.proxy.Slf4jLoggerProxy; |
| 61 | 60 | |
| ... | ... | @@ -78,6 +77,6 @@ public class LoggerProducer implements Serializable { |
| 78 | 77 | } |
| 79 | 78 | |
| 80 | 79 | public static <T> Logger create(Class<T> type) { |
| 81 | - return new Slf4jLoggerProxy(LoggerFactory.getLogger(type)); | |
| 80 | + return new Slf4jLoggerProxy(type); | |
| 82 | 81 | } |
| 83 | 82 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ResourceBundleProducer.java
| ... | ... | @@ -38,14 +38,13 @@ package br.gov.frameworkdemoiselle.internal.producer; |
| 38 | 38 | |
| 39 | 39 | import java.io.Serializable; |
| 40 | 40 | import java.util.Locale; |
| 41 | -import java.util.MissingResourceException; | |
| 42 | 41 | |
| 43 | 42 | import javax.enterprise.inject.Default; |
| 44 | 43 | import javax.enterprise.inject.Produces; |
| 45 | 44 | import javax.enterprise.inject.spi.InjectionPoint; |
| 46 | 45 | |
| 47 | -import br.gov.frameworkdemoiselle.DemoiselleException; | |
| 48 | 46 | import br.gov.frameworkdemoiselle.annotation.Name; |
| 47 | +import br.gov.frameworkdemoiselle.util.Beans; | |
| 49 | 48 | import br.gov.frameworkdemoiselle.util.ResourceBundle; |
| 50 | 49 | |
| 51 | 50 | /** |
| ... | ... | @@ -63,17 +62,19 @@ public class ResourceBundleProducer implements Serializable { |
| 63 | 62 | * @param String |
| 64 | 63 | * baseName |
| 65 | 64 | */ |
| 66 | - public ResourceBundle create(String baseName, Locale locale) { | |
| 67 | - ResourceBundle bundle = null; | |
| 68 | - | |
| 69 | - try { | |
| 70 | - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); | |
| 71 | - bundle = new ResourceBundle(ResourceBundle.getBundle(baseName, locale, classLoader)); | |
| 72 | - | |
| 73 | - } catch (MissingResourceException e) { | |
| 74 | - throw new DemoiselleException("File " + baseName + " not found!"); | |
| 75 | - } | |
| 65 | + public static ResourceBundle create(String baseName) { | |
| 66 | + return create(baseName, Beans.getReference(Locale.class)); | |
| 67 | + } | |
| 76 | 68 | |
| 69 | + /** | |
| 70 | + * This method should be used by classes that can not inject ResourceBundle, to create the ResourceBundle. | |
| 71 | + * | |
| 72 | + * @param String | |
| 73 | + * baseName | |
| 74 | + */ | |
| 75 | + public static ResourceBundle create(String baseName, Locale locale) { | |
| 76 | + ResourceBundle bundle = null; | |
| 77 | + bundle = new ResourceBundle(baseName, locale); | |
| 77 | 78 | return bundle; |
| 78 | 79 | } |
| 79 | 80 | |
| ... | ... | @@ -83,7 +84,7 @@ public class ResourceBundleProducer implements Serializable { |
| 83 | 84 | */ |
| 84 | 85 | @Produces |
| 85 | 86 | @Default |
| 86 | - public ResourceBundle create(InjectionPoint ip, Locale locale) { | |
| 87 | + public ResourceBundle create(InjectionPoint ip) { | |
| 87 | 88 | String baseName; |
| 88 | 89 | |
| 89 | 90 | if (ip != null && ip.getAnnotated().isAnnotationPresent(Name.class)) { |
| ... | ... | @@ -92,6 +93,6 @@ public class ResourceBundleProducer implements Serializable { |
| 92 | 93 | baseName = "messages"; |
| 93 | 94 | } |
| 94 | 95 | |
| 95 | - return create(baseName, locale); | |
| 96 | + return create(baseName, Beans.getReference(Locale.class)); | |
| 96 | 97 | } |
| 97 | 98 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/ContextProxy.java
| ... | ... | @@ -1,168 +0,0 @@ |
| 1 | -package br.gov.frameworkdemoiselle.internal.proxy; | |
| 2 | - | |
| 3 | -import java.io.Serializable; | |
| 4 | -import java.util.Hashtable; | |
| 5 | - | |
| 6 | -import javax.naming.Binding; | |
| 7 | -import javax.naming.Context; | |
| 8 | -import javax.naming.Name; | |
| 9 | -import javax.naming.NameClassPair; | |
| 10 | -import javax.naming.NameParser; | |
| 11 | -import javax.naming.NamingEnumeration; | |
| 12 | -import javax.naming.NamingException; | |
| 13 | - | |
| 14 | -public class ContextProxy implements Context, Serializable { | |
| 15 | - | |
| 16 | - private static final long serialVersionUID = 1L; | |
| 17 | - | |
| 18 | - private final Context delegate; | |
| 19 | - | |
| 20 | - public ContextProxy(Context delegate) { | |
| 21 | - this.delegate = delegate; | |
| 22 | - } | |
| 23 | - | |
| 24 | - @Override | |
| 25 | - public Object addToEnvironment(String propName, Object propVal) throws NamingException { | |
| 26 | - return delegate.addToEnvironment(propName, propVal); | |
| 27 | - } | |
| 28 | - | |
| 29 | - @Override | |
| 30 | - public void bind(Name name, Object obj) throws NamingException { | |
| 31 | - delegate.bind(name, obj); | |
| 32 | - } | |
| 33 | - | |
| 34 | - @Override | |
| 35 | - public void bind(String name, Object obj) throws NamingException { | |
| 36 | - delegate.bind(name, obj); | |
| 37 | - } | |
| 38 | - | |
| 39 | - @Override | |
| 40 | - public void close() throws NamingException { | |
| 41 | - delegate.close(); | |
| 42 | - } | |
| 43 | - | |
| 44 | - @Override | |
| 45 | - public Name composeName(Name name, Name prefix) throws NamingException { | |
| 46 | - return delegate.composeName(name, prefix); | |
| 47 | - } | |
| 48 | - | |
| 49 | - @Override | |
| 50 | - public String composeName(String name, String prefix) throws NamingException { | |
| 51 | - return delegate.composeName(name, prefix); | |
| 52 | - } | |
| 53 | - | |
| 54 | - @Override | |
| 55 | - public Context createSubcontext(Name name) throws NamingException { | |
| 56 | - return delegate.createSubcontext(name); | |
| 57 | - } | |
| 58 | - | |
| 59 | - @Override | |
| 60 | - public Context createSubcontext(String name) throws NamingException { | |
| 61 | - return delegate.createSubcontext(name); | |
| 62 | - } | |
| 63 | - | |
| 64 | - @Override | |
| 65 | - public void destroySubcontext(Name name) throws NamingException { | |
| 66 | - delegate.destroySubcontext(name); | |
| 67 | - } | |
| 68 | - | |
| 69 | - @Override | |
| 70 | - public void destroySubcontext(String name) throws NamingException { | |
| 71 | - delegate.destroySubcontext(name); | |
| 72 | - } | |
| 73 | - | |
| 74 | - @Override | |
| 75 | - public Hashtable<?, ?> getEnvironment() throws NamingException { | |
| 76 | - return delegate.getEnvironment(); | |
| 77 | - } | |
| 78 | - | |
| 79 | - @Override | |
| 80 | - public String getNameInNamespace() throws NamingException { | |
| 81 | - return delegate.getNameInNamespace(); | |
| 82 | - } | |
| 83 | - | |
| 84 | - @Override | |
| 85 | - public NameParser getNameParser(Name name) throws NamingException { | |
| 86 | - return delegate.getNameParser(name); | |
| 87 | - } | |
| 88 | - | |
| 89 | - @Override | |
| 90 | - public NameParser getNameParser(String name) throws NamingException { | |
| 91 | - return delegate.getNameParser(name); | |
| 92 | - } | |
| 93 | - | |
| 94 | - @Override | |
| 95 | - public NamingEnumeration<NameClassPair> list(Name name) throws NamingException { | |
| 96 | - return delegate.list(name); | |
| 97 | - } | |
| 98 | - | |
| 99 | - @Override | |
| 100 | - public NamingEnumeration<NameClassPair> list(String name) throws NamingException { | |
| 101 | - return delegate.list(name); | |
| 102 | - } | |
| 103 | - | |
| 104 | - @Override | |
| 105 | - public NamingEnumeration<Binding> listBindings(Name name) throws NamingException { | |
| 106 | - return delegate.listBindings(name); | |
| 107 | - } | |
| 108 | - | |
| 109 | - @Override | |
| 110 | - public NamingEnumeration<Binding> listBindings(String name) throws NamingException { | |
| 111 | - return delegate.listBindings(name); | |
| 112 | - } | |
| 113 | - | |
| 114 | - @Override | |
| 115 | - public Object lookup(Name name) throws NamingException { | |
| 116 | - return delegate.lookup(name); | |
| 117 | - } | |
| 118 | - | |
| 119 | - @Override | |
| 120 | - public Object lookup(String name) throws NamingException { | |
| 121 | - return delegate.lookup(name); | |
| 122 | - } | |
| 123 | - | |
| 124 | - @Override | |
| 125 | - public Object lookupLink(Name name) throws NamingException { | |
| 126 | - return delegate.lookupLink(name); | |
| 127 | - } | |
| 128 | - | |
| 129 | - @Override | |
| 130 | - public Object lookupLink(String name) throws NamingException { | |
| 131 | - return delegate.lookupLink(name); | |
| 132 | - } | |
| 133 | - | |
| 134 | - @Override | |
| 135 | - public void rebind(Name name, Object obj) throws NamingException { | |
| 136 | - delegate.rebind(name, obj); | |
| 137 | - } | |
| 138 | - | |
| 139 | - @Override | |
| 140 | - public void rebind(String name, Object obj) throws NamingException { | |
| 141 | - delegate.rebind(name, obj); | |
| 142 | - } | |
| 143 | - | |
| 144 | - @Override | |
| 145 | - public Object removeFromEnvironment(String propName) throws NamingException { | |
| 146 | - return delegate.removeFromEnvironment(propName); | |
| 147 | - } | |
| 148 | - | |
| 149 | - @Override | |
| 150 | - public void rename(Name oldName, Name newName) throws NamingException { | |
| 151 | - delegate.rename(oldName, newName); | |
| 152 | - } | |
| 153 | - | |
| 154 | - @Override | |
| 155 | - public void rename(String oldName, String newName) throws NamingException { | |
| 156 | - delegate.rename(oldName, newName); | |
| 157 | - } | |
| 158 | - | |
| 159 | - @Override | |
| 160 | - public void unbind(Name name) throws NamingException { | |
| 161 | - delegate.unbind(name); | |
| 162 | - } | |
| 163 | - | |
| 164 | - @Override | |
| 165 | - public void unbind(String name) throws NamingException { | |
| 166 | - delegate.unbind(name); | |
| 167 | - } | |
| 168 | -} |
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/Slf4jLoggerProxy.java
| ... | ... | @@ -51,321 +51,332 @@ package br.gov.frameworkdemoiselle.internal.proxy; |
| 51 | 51 | import java.io.Serializable; |
| 52 | 52 | |
| 53 | 53 | import org.slf4j.Logger; |
| 54 | +import org.slf4j.LoggerFactory; | |
| 54 | 55 | import org.slf4j.Marker; |
| 55 | 56 | |
| 56 | 57 | public class Slf4jLoggerProxy implements Logger, Serializable { |
| 57 | 58 | |
| 58 | 59 | private static final long serialVersionUID = 1L; |
| 59 | 60 | |
| 60 | - private transient final Logger delegate; | |
| 61 | + private transient Logger delegate; | |
| 61 | 62 | |
| 62 | - public Slf4jLoggerProxy(final Logger logger) { | |
| 63 | - this.delegate = logger; | |
| 63 | + private final Class<?> type; | |
| 64 | + | |
| 65 | + private Logger getDelegate() { | |
| 66 | + if(delegate == null) { | |
| 67 | + delegate = LoggerFactory.getLogger(type); | |
| 68 | + } | |
| 69 | + | |
| 70 | + return delegate; | |
| 71 | + } | |
| 72 | + | |
| 73 | + public Slf4jLoggerProxy(final Class<?> type) { | |
| 74 | + this.type = type; | |
| 64 | 75 | } |
| 65 | 76 | |
| 66 | 77 | @Override |
| 67 | 78 | public void debug(final Marker marker, final String msg) { |
| 68 | - this.delegate.debug(marker, msg); | |
| 79 | + getDelegate().debug(marker, msg); | |
| 69 | 80 | } |
| 70 | 81 | |
| 71 | 82 | @Override |
| 72 | 83 | public void debug(final Marker marker, final String format, final Object arg) { |
| 73 | - this.delegate.debug(marker, format, arg); | |
| 84 | + getDelegate().debug(marker, format, arg); | |
| 74 | 85 | } |
| 75 | 86 | |
| 76 | 87 | @Override |
| 77 | 88 | public void debug(final Marker marker, final String format, final Object arg1, final Object arg2) { |
| 78 | - this.delegate.debug(marker, format, arg1, arg2); | |
| 89 | + getDelegate().debug(marker, format, arg1, arg2); | |
| 79 | 90 | } |
| 80 | 91 | |
| 81 | 92 | @Override |
| 82 | 93 | public void debug(final Marker marker, final String format, final Object[] argArray) { |
| 83 | - this.delegate.debug(marker, format, argArray); | |
| 94 | + getDelegate().debug(marker, format, argArray); | |
| 84 | 95 | } |
| 85 | 96 | |
| 86 | 97 | @Override |
| 87 | 98 | public void debug(final Marker marker, final String msg, final Throwable t) { |
| 88 | - this.delegate.debug(marker, msg, t); | |
| 99 | + getDelegate().debug(marker, msg, t); | |
| 89 | 100 | } |
| 90 | 101 | |
| 91 | 102 | @Override |
| 92 | 103 | public void debug(final String msg) { |
| 93 | - this.delegate.debug(msg); | |
| 104 | + getDelegate().debug(msg); | |
| 94 | 105 | } |
| 95 | 106 | |
| 96 | 107 | @Override |
| 97 | 108 | public void debug(final String format, final Object arg) { |
| 98 | - this.delegate.debug(format, arg); | |
| 109 | + getDelegate().debug(format, arg); | |
| 99 | 110 | } |
| 100 | 111 | |
| 101 | 112 | @Override |
| 102 | 113 | public void debug(final String format, final Object arg1, final Object arg2) { |
| 103 | - this.delegate.debug(format, arg1, arg2); | |
| 114 | + getDelegate().debug(format, arg1, arg2); | |
| 104 | 115 | } |
| 105 | 116 | |
| 106 | 117 | @Override |
| 107 | 118 | public void debug(final String format, final Object[] argArray) { |
| 108 | - this.delegate.debug(format, argArray); | |
| 119 | + getDelegate().debug(format, argArray); | |
| 109 | 120 | } |
| 110 | 121 | |
| 111 | 122 | @Override |
| 112 | 123 | public void debug(final String msg, final Throwable t) { |
| 113 | - this.delegate.debug(msg, t); | |
| 124 | + getDelegate().debug(msg, t); | |
| 114 | 125 | } |
| 115 | 126 | |
| 116 | 127 | @Override |
| 117 | 128 | public void error(final Marker marker, final String msg) { |
| 118 | - this.delegate.error(marker, msg); | |
| 129 | + getDelegate().error(marker, msg); | |
| 119 | 130 | } |
| 120 | 131 | |
| 121 | 132 | @Override |
| 122 | 133 | public void error(final Marker marker, final String format, final Object arg) { |
| 123 | - this.delegate.error(marker, format, arg); | |
| 134 | + getDelegate().error(marker, format, arg); | |
| 124 | 135 | } |
| 125 | 136 | |
| 126 | 137 | @Override |
| 127 | 138 | public void error(final Marker marker, final String format, final Object arg1, final Object arg2) { |
| 128 | - this.delegate.error(marker, format, arg1, arg2); | |
| 139 | + getDelegate().error(marker, format, arg1, arg2); | |
| 129 | 140 | } |
| 130 | 141 | |
| 131 | 142 | @Override |
| 132 | 143 | public void error(final Marker marker, final String format, final Object[] argArray) { |
| 133 | - this.delegate.error(marker, format, argArray); | |
| 144 | + getDelegate().error(marker, format, argArray); | |
| 134 | 145 | } |
| 135 | 146 | |
| 136 | 147 | @Override |
| 137 | 148 | public void error(final Marker marker, final String msg, final Throwable t) { |
| 138 | - this.delegate.error(marker, msg, t); | |
| 149 | + getDelegate().error(marker, msg, t); | |
| 139 | 150 | } |
| 140 | 151 | |
| 141 | 152 | @Override |
| 142 | 153 | public void error(final String msg) { |
| 143 | - this.delegate.error(msg); | |
| 154 | + getDelegate().error(msg); | |
| 144 | 155 | } |
| 145 | 156 | |
| 146 | 157 | @Override |
| 147 | 158 | public void error(final String format, final Object arg) { |
| 148 | - this.delegate.error(format, arg); | |
| 159 | + getDelegate().error(format, arg); | |
| 149 | 160 | } |
| 150 | 161 | |
| 151 | 162 | @Override |
| 152 | 163 | public void error(final String format, final Object arg1, final Object arg2) { |
| 153 | - this.delegate.error(format, arg1, arg2); | |
| 164 | + getDelegate().error(format, arg1, arg2); | |
| 154 | 165 | } |
| 155 | 166 | |
| 156 | 167 | @Override |
| 157 | 168 | public void error(final String format, final Object[] argArray) { |
| 158 | - this.delegate.error(format, argArray); | |
| 169 | + getDelegate().error(format, argArray); | |
| 159 | 170 | } |
| 160 | 171 | |
| 161 | 172 | @Override |
| 162 | 173 | public void error(final String msg, final Throwable t) { |
| 163 | - this.delegate.error(msg, t); | |
| 174 | + getDelegate().error(msg, t); | |
| 164 | 175 | } |
| 165 | 176 | |
| 166 | 177 | @Override |
| 167 | 178 | public String getName() { |
| 168 | - return this.delegate.getName(); | |
| 179 | + return getDelegate().getName(); | |
| 169 | 180 | } |
| 170 | 181 | |
| 171 | 182 | @Override |
| 172 | 183 | public void info(final Marker marker, final String msg) { |
| 173 | - this.delegate.info(marker, msg); | |
| 184 | + getDelegate().info(marker, msg); | |
| 174 | 185 | } |
| 175 | 186 | |
| 176 | 187 | @Override |
| 177 | 188 | public void info(final Marker marker, final String format, final Object arg) { |
| 178 | - this.delegate.info(marker, format, arg); | |
| 189 | + getDelegate().info(marker, format, arg); | |
| 179 | 190 | } |
| 180 | 191 | |
| 181 | 192 | @Override |
| 182 | 193 | public void info(final Marker marker, final String format, final Object arg1, final Object arg2) { |
| 183 | - this.delegate.info(marker, format, arg1, arg2); | |
| 194 | + getDelegate().info(marker, format, arg1, arg2); | |
| 184 | 195 | } |
| 185 | 196 | |
| 186 | 197 | @Override |
| 187 | 198 | public void info(final Marker marker, final String format, final Object[] argArray) { |
| 188 | - this.delegate.info(marker, format, argArray); | |
| 199 | + getDelegate().info(marker, format, argArray); | |
| 189 | 200 | } |
| 190 | 201 | |
| 191 | 202 | @Override |
| 192 | 203 | public void info(final Marker marker, final String msg, final Throwable t) { |
| 193 | - this.delegate.info(marker, msg, t); | |
| 204 | + getDelegate().info(marker, msg, t); | |
| 194 | 205 | } |
| 195 | 206 | |
| 196 | 207 | @Override |
| 197 | 208 | public void info(final String msg) { |
| 198 | - this.delegate.info(msg); | |
| 209 | + getDelegate().info(msg); | |
| 199 | 210 | } |
| 200 | 211 | |
| 201 | 212 | @Override |
| 202 | 213 | public void info(final String format, final Object arg) { |
| 203 | - this.delegate.info(format, arg); | |
| 214 | + getDelegate().info(format, arg); | |
| 204 | 215 | } |
| 205 | 216 | |
| 206 | 217 | @Override |
| 207 | 218 | public void info(final String format, final Object arg1, final Object arg2) { |
| 208 | - this.delegate.info(format, arg1, arg2); | |
| 219 | + getDelegate().info(format, arg1, arg2); | |
| 209 | 220 | } |
| 210 | 221 | |
| 211 | 222 | @Override |
| 212 | 223 | public void info(final String format, final Object[] argArray) { |
| 213 | - this.delegate.info(format, argArray); | |
| 224 | + getDelegate().info(format, argArray); | |
| 214 | 225 | } |
| 215 | 226 | |
| 216 | 227 | @Override |
| 217 | 228 | public void info(final String msg, final Throwable t) { |
| 218 | - this.delegate.info(msg, t); | |
| 229 | + getDelegate().info(msg, t); | |
| 219 | 230 | } |
| 220 | 231 | |
| 221 | 232 | @Override |
| 222 | 233 | public boolean isDebugEnabled() { |
| 223 | - return this.delegate.isDebugEnabled(); | |
| 234 | + return getDelegate().isDebugEnabled(); | |
| 224 | 235 | } |
| 225 | 236 | |
| 226 | 237 | @Override |
| 227 | 238 | public boolean isDebugEnabled(final Marker marker) { |
| 228 | - return this.delegate.isDebugEnabled(marker); | |
| 239 | + return getDelegate().isDebugEnabled(marker); | |
| 229 | 240 | } |
| 230 | 241 | |
| 231 | 242 | @Override |
| 232 | 243 | public boolean isErrorEnabled() { |
| 233 | - return this.delegate.isErrorEnabled(); | |
| 244 | + return getDelegate().isErrorEnabled(); | |
| 234 | 245 | } |
| 235 | 246 | |
| 236 | 247 | @Override |
| 237 | 248 | public boolean isErrorEnabled(final Marker marker) { |
| 238 | - return this.delegate.isErrorEnabled(marker); | |
| 249 | + return getDelegate().isErrorEnabled(marker); | |
| 239 | 250 | } |
| 240 | 251 | |
| 241 | 252 | @Override |
| 242 | 253 | public boolean isInfoEnabled() { |
| 243 | - return this.delegate.isInfoEnabled(); | |
| 254 | + return getDelegate().isInfoEnabled(); | |
| 244 | 255 | } |
| 245 | 256 | |
| 246 | 257 | @Override |
| 247 | 258 | public boolean isInfoEnabled(final Marker marker) { |
| 248 | - return this.delegate.isInfoEnabled(marker); | |
| 259 | + return getDelegate().isInfoEnabled(marker); | |
| 249 | 260 | } |
| 250 | 261 | |
| 251 | 262 | @Override |
| 252 | 263 | public boolean isTraceEnabled() { |
| 253 | - return this.delegate.isTraceEnabled(); | |
| 264 | + return getDelegate().isTraceEnabled(); | |
| 254 | 265 | } |
| 255 | 266 | |
| 256 | 267 | @Override |
| 257 | 268 | public boolean isTraceEnabled(final Marker marker) { |
| 258 | - return this.delegate.isTraceEnabled(marker); | |
| 269 | + return getDelegate().isTraceEnabled(marker); | |
| 259 | 270 | } |
| 260 | 271 | |
| 261 | 272 | @Override |
| 262 | 273 | public boolean isWarnEnabled() { |
| 263 | - return this.delegate.isWarnEnabled(); | |
| 274 | + return getDelegate().isWarnEnabled(); | |
| 264 | 275 | } |
| 265 | 276 | |
| 266 | 277 | @Override |
| 267 | 278 | public boolean isWarnEnabled(final Marker marker) { |
| 268 | - return this.delegate.isWarnEnabled(marker); | |
| 279 | + return getDelegate().isWarnEnabled(marker); | |
| 269 | 280 | } |
| 270 | 281 | |
| 271 | 282 | @Override |
| 272 | 283 | public void trace(final Marker marker, final String msg) { |
| 273 | - this.delegate.trace(marker, msg); | |
| 284 | + getDelegate().trace(marker, msg); | |
| 274 | 285 | } |
| 275 | 286 | |
| 276 | 287 | @Override |
| 277 | 288 | public void trace(final Marker marker, final String format, final Object arg) { |
| 278 | - this.delegate.trace(marker, format, arg); | |
| 289 | + getDelegate().trace(marker, format, arg); | |
| 279 | 290 | } |
| 280 | 291 | |
| 281 | 292 | @Override |
| 282 | 293 | public void trace(final Marker marker, final String format, final Object arg1, final Object arg2) { |
| 283 | - this.delegate.trace(marker, format, arg1, arg2); | |
| 294 | + getDelegate().trace(marker, format, arg1, arg2); | |
| 284 | 295 | } |
| 285 | 296 | |
| 286 | 297 | @Override |
| 287 | 298 | public void trace(final Marker marker, final String format, final Object[] argArray) { |
| 288 | - this.delegate.trace(marker, format, argArray); | |
| 299 | + getDelegate().trace(marker, format, argArray); | |
| 289 | 300 | } |
| 290 | 301 | |
| 291 | 302 | @Override |
| 292 | 303 | public void trace(final Marker marker, final String msg, final Throwable t) { |
| 293 | - this.delegate.trace(marker, msg, t); | |
| 304 | + getDelegate().trace(marker, msg, t); | |
| 294 | 305 | } |
| 295 | 306 | |
| 296 | 307 | @Override |
| 297 | 308 | public void trace(final String msg) { |
| 298 | - this.delegate.trace(msg); | |
| 309 | + getDelegate().trace(msg); | |
| 299 | 310 | } |
| 300 | 311 | |
| 301 | 312 | @Override |
| 302 | 313 | public void trace(final String format, final Object arg) { |
| 303 | - this.delegate.trace(format, arg); | |
| 314 | + getDelegate().trace(format, arg); | |
| 304 | 315 | } |
| 305 | 316 | |
| 306 | 317 | @Override |
| 307 | 318 | public void trace(final String format, final Object arg1, final Object arg2) { |
| 308 | - this.delegate.trace(format, arg1, arg2); | |
| 319 | + getDelegate().trace(format, arg1, arg2); | |
| 309 | 320 | } |
| 310 | 321 | |
| 311 | 322 | @Override |
| 312 | 323 | public void trace(final String format, final Object[] argArray) { |
| 313 | - this.delegate.trace(format, argArray); | |
| 324 | + getDelegate().trace(format, argArray); | |
| 314 | 325 | } |
| 315 | 326 | |
| 316 | 327 | @Override |
| 317 | 328 | public void trace(final String msg, final Throwable t) { |
| 318 | - this.delegate.trace(msg, t); | |
| 329 | + getDelegate().trace(msg, t); | |
| 319 | 330 | } |
| 320 | 331 | |
| 321 | 332 | @Override |
| 322 | 333 | public void warn(final Marker marker, final String msg) { |
| 323 | - this.delegate.warn(marker, msg); | |
| 334 | + getDelegate().warn(marker, msg); | |
| 324 | 335 | } |
| 325 | 336 | |
| 326 | 337 | @Override |
| 327 | 338 | public void warn(final Marker marker, final String format, final Object arg) { |
| 328 | - this.delegate.warn(marker, format, arg); | |
| 339 | + getDelegate().warn(marker, format, arg); | |
| 329 | 340 | } |
| 330 | 341 | |
| 331 | 342 | @Override |
| 332 | 343 | public void warn(final Marker marker, final String format, final Object arg1, final Object arg2) { |
| 333 | - this.delegate.warn(marker, format, arg1, arg2); | |
| 344 | + getDelegate().warn(marker, format, arg1, arg2); | |
| 334 | 345 | } |
| 335 | 346 | |
| 336 | 347 | @Override |
| 337 | 348 | public void warn(final Marker marker, final String format, final Object[] argArray) { |
| 338 | - this.delegate.warn(marker, format, argArray); | |
| 349 | + getDelegate().warn(marker, format, argArray); | |
| 339 | 350 | } |
| 340 | 351 | |
| 341 | 352 | @Override |
| 342 | 353 | public void warn(final Marker marker, final String msg, final Throwable t) { |
| 343 | - this.delegate.warn(marker, msg, t); | |
| 354 | + getDelegate().warn(marker, msg, t); | |
| 344 | 355 | } |
| 345 | 356 | |
| 346 | 357 | @Override |
| 347 | 358 | public void warn(final String msg) { |
| 348 | - this.delegate.warn(msg); | |
| 359 | + getDelegate().warn(msg); | |
| 349 | 360 | } |
| 350 | 361 | |
| 351 | 362 | @Override |
| 352 | 363 | public void warn(final String format, final Object arg) { |
| 353 | - this.delegate.warn(format, arg); | |
| 364 | + getDelegate().warn(format, arg); | |
| 354 | 365 | } |
| 355 | 366 | |
| 356 | 367 | @Override |
| 357 | 368 | public void warn(final String format, final Object arg1, final Object arg2) { |
| 358 | - this.delegate.warn(format, arg1, arg2); | |
| 369 | + getDelegate().warn(format, arg1, arg2); | |
| 359 | 370 | } |
| 360 | 371 | |
| 361 | 372 | @Override |
| 362 | 373 | public void warn(final String format, final Object[] argArray) { |
| 363 | - this.delegate.warn(format, argArray); | |
| 374 | + getDelegate().warn(format, argArray); | |
| 364 | 375 | } |
| 365 | 376 | |
| 366 | 377 | @Override |
| 367 | 378 | public void warn(final String msg, final Throwable t) { |
| 368 | - this.delegate.warn(msg, t); | |
| 379 | + getDelegate().warn(msg, t); | |
| 369 | 380 | } |
| 370 | 381 | |
| 371 | 382 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/lifecycle/AfterShutdownProccess.java
0 → 100644
| ... | ... | @@ -0,0 +1,41 @@ |
| 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.lifecycle; | |
| 38 | + | |
| 39 | +public interface AfterShutdownProccess { | |
| 40 | + | |
| 41 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/lifecycle/AfterStartupProccess.java
0 → 100644
| ... | ... | @@ -0,0 +1,41 @@ |
| 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.lifecycle; | |
| 38 | + | |
| 39 | +public interface AfterStartupProccess { | |
| 40 | + | |
| 41 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/lifecycle/Shutdown.java
0 → 100644
| ... | ... | @@ -0,0 +1,70 @@ |
| 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.lifecycle; | |
| 38 | + | |
| 39 | +import static java.lang.annotation.ElementType.METHOD; | |
| 40 | +import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 41 | + | |
| 42 | +import java.lang.annotation.Retention; | |
| 43 | +import java.lang.annotation.Target; | |
| 44 | + | |
| 45 | +/** | |
| 46 | + * Identifies a method eligible to be executed automatically during <b>application finalization</b>. | |
| 47 | + * <p> | |
| 48 | + * Take a look at the following usage sample: | |
| 49 | + * <p> | |
| 50 | + * <blockquote> | |
| 51 | + * <pre> | |
| 52 | + * public class Finalizer { | |
| 53 | + * | |
| 54 | + * @Shutdown | |
| 55 | + * @Priority(5) | |
| 56 | + * public void finalize() { | |
| 57 | + * ... | |
| 58 | + * } | |
| 59 | + * } | |
| 60 | + * | |
| 61 | + * </pre> | |
| 62 | + * </blockquote> | |
| 63 | + * <p> | |
| 64 | + * | |
| 65 | + * @author SERPRO | |
| 66 | + */ | |
| 67 | +@Target(METHOD) | |
| 68 | +@Retention(RUNTIME) | |
| 69 | +public @interface Shutdown { | |
| 70 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/lifecycle/Startup.java
0 → 100644
| ... | ... | @@ -0,0 +1,70 @@ |
| 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.lifecycle; | |
| 38 | + | |
| 39 | +import static java.lang.annotation.ElementType.METHOD; | |
| 40 | +import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
| 41 | + | |
| 42 | +import java.lang.annotation.Retention; | |
| 43 | +import java.lang.annotation.Target; | |
| 44 | + | |
| 45 | +/** | |
| 46 | + * Identifies a method eligible to be executed automatically during <b>application initialization</b>. | |
| 47 | + * <p> | |
| 48 | + * Take a look at the following usage sample: | |
| 49 | + * <p> | |
| 50 | + * <blockquote> | |
| 51 | + * <pre> | |
| 52 | + * public class Finalizer { | |
| 53 | + * | |
| 54 | + * @Startup | |
| 55 | + * @Priority(1) | |
| 56 | + * public void init() { | |
| 57 | + * ... | |
| 58 | + * } | |
| 59 | + * } | |
| 60 | + * | |
| 61 | + * </pre> | |
| 62 | + * </blockquote> | |
| 63 | + * <p> | |
| 64 | + * | |
| 65 | + * @author SERPRO | |
| 66 | + */ | |
| 67 | +@Target(METHOD) | |
| 68 | +@Retention(RUNTIME) | |
| 69 | +public @interface Startup { | |
| 70 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/security/AuthorizationException.java
| ... | ... | @@ -36,7 +36,8 @@ |
| 36 | 36 | */ |
| 37 | 37 | package br.gov.frameworkdemoiselle.security; |
| 38 | 38 | |
| 39 | -import br.gov.frameworkdemoiselle.internal.implementation.CoreBundle; | |
| 39 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 40 | +import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 40 | 41 | |
| 41 | 42 | /** |
| 42 | 43 | * Thrown when trying to access some resource and/or execute an operation without the proper authorization. |
| ... | ... | @@ -47,6 +48,8 @@ public class AuthorizationException extends SecurityException { |
| 47 | 48 | |
| 48 | 49 | private static final long serialVersionUID = 1L; |
| 49 | 50 | |
| 51 | + private static ResourceBundle bundle; | |
| 52 | + | |
| 50 | 53 | /** |
| 51 | 54 | * Constructor with message. |
| 52 | 55 | * |
| ... | ... | @@ -58,8 +61,14 @@ public class AuthorizationException extends SecurityException { |
| 58 | 61 | } |
| 59 | 62 | |
| 60 | 63 | public AuthorizationException(String resource, String operation) { |
| 61 | - // TODO: remove the CoreBundle call | |
| 62 | - super(CoreBundle.get().getString("access-denied-ui", resource, operation)); | |
| 64 | + super(getBundle().getString("access-denied-ui", resource, operation)); | |
| 63 | 65 | } |
| 64 | 66 | |
| 67 | + private static ResourceBundle getBundle() { | |
| 68 | + if (bundle == null) { | |
| 69 | + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); | |
| 70 | + } | |
| 71 | + | |
| 72 | + return bundle; | |
| 73 | + } | |
| 65 | 74 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/template/DelegateCrud.java
| ... | ... | @@ -39,6 +39,8 @@ package br.gov.frameworkdemoiselle.template; |
| 39 | 39 | import java.util.List; |
| 40 | 40 | import java.util.ListIterator; |
| 41 | 41 | |
| 42 | +import br.gov.frameworkdemoiselle.internal.implementation.DefaultTransaction; | |
| 43 | +import br.gov.frameworkdemoiselle.transaction.Transaction; | |
| 42 | 44 | import br.gov.frameworkdemoiselle.transaction.Transactional; |
| 43 | 45 | import br.gov.frameworkdemoiselle.util.Beans; |
| 44 | 46 | import br.gov.frameworkdemoiselle.util.Reflections; |
| ... | ... | @@ -49,38 +51,62 @@ public class DelegateCrud<T, I, C extends Crud<T, I>> implements Crud<T, I> { |
| 49 | 51 | |
| 50 | 52 | private Class<C> delegateClass; |
| 51 | 53 | |
| 52 | - private C delegate; | |
| 54 | + private transient C delegate; | |
| 53 | 55 | |
| 54 | 56 | /** |
| 55 | - * Remove a persistent instance from the database. | |
| 57 | + * Removes a instance from delegate. | |
| 56 | 58 | * |
| 57 | 59 | * @param id |
| 58 | - * entity class with the given identifier | |
| 60 | + * Entity with the given identifier | |
| 59 | 61 | */ |
| 60 | 62 | @Override |
| 61 | - @Transactional | |
| 62 | 63 | public void delete(final I id) { |
| 63 | - this.getDelegate().delete(id); | |
| 64 | + if (isRunningTransactionalOperations()) { | |
| 65 | + transactionalDelete(id); | |
| 66 | + } else { | |
| 67 | + nonTransactionalDelete(id); | |
| 68 | + } | |
| 69 | + } | |
| 70 | + | |
| 71 | + @Transactional | |
| 72 | + private void transactionalDelete(final I id) { | |
| 73 | + nonTransactionalDelete(id); | |
| 74 | + } | |
| 75 | + | |
| 76 | + private void nonTransactionalDelete(final I id) { | |
| 77 | + getDelegate().delete(id); | |
| 64 | 78 | } |
| 65 | 79 | |
| 66 | 80 | /** |
| 67 | - * Remove a list of persistent instances from the database. | |
| 81 | + * Removes a list of instances from delegate. | |
| 68 | 82 | * |
| 69 | - * @param idList | |
| 70 | - * list of entity class with the given identifier | |
| 83 | + * @param ids | |
| 84 | + * List of entities identifiers | |
| 71 | 85 | */ |
| 86 | + public void delete(final List<I> ids) { | |
| 87 | + if (isRunningTransactionalOperations()) { | |
| 88 | + transactionalDelete(ids); | |
| 89 | + } else { | |
| 90 | + nonTransactionalDelete(ids); | |
| 91 | + } | |
| 92 | + } | |
| 93 | + | |
| 72 | 94 | @Transactional |
| 73 | - public void delete(final List<I> idList) { | |
| 74 | - ListIterator<I> iter = idList.listIterator(); | |
| 95 | + private void transactionalDelete(final List<I> ids) { | |
| 96 | + nonTransactionalDelete(ids); | |
| 97 | + } | |
| 98 | + | |
| 99 | + private void nonTransactionalDelete(final List<I> ids) { | |
| 100 | + ListIterator<I> iter = ids.listIterator(); | |
| 75 | 101 | while (iter.hasNext()) { |
| 76 | 102 | this.delete(iter.next()); |
| 77 | 103 | } |
| 78 | 104 | } |
| 79 | 105 | |
| 80 | 106 | /** |
| 81 | - * Get the results. | |
| 107 | + * Gets the results from delegate. | |
| 82 | 108 | * |
| 83 | - * @return the list of matched query results. | |
| 109 | + * @return The list of matched query results. | |
| 84 | 110 | */ |
| 85 | 111 | @Override |
| 86 | 112 | public List<T> findAll() { |
| ... | ... | @@ -91,34 +117,46 @@ public class DelegateCrud<T, I, C extends Crud<T, I>> implements Crud<T, I> { |
| 91 | 117 | if (this.delegate == null) { |
| 92 | 118 | this.delegate = Beans.getReference(getDelegateClass()); |
| 93 | 119 | } |
| 120 | + | |
| 94 | 121 | return this.delegate; |
| 95 | 122 | } |
| 96 | 123 | |
| 97 | 124 | protected Class<C> getDelegateClass() { |
| 98 | 125 | if (this.delegateClass == null) { |
| 99 | - this.delegateClass = Reflections.getGenericTypeArgument( | |
| 100 | - this.getClass(), 2); | |
| 126 | + this.delegateClass = Reflections.getGenericTypeArgument(this.getClass(), 2); | |
| 101 | 127 | } |
| 128 | + | |
| 102 | 129 | return this.delegateClass; |
| 103 | 130 | } |
| 104 | 131 | |
| 105 | 132 | /** |
| 106 | - * Persist the given transient instance. | |
| 133 | + * Delegates the insert operation of the given instance. | |
| 107 | 134 | * |
| 108 | 135 | * @param bean |
| 109 | - * a transient instance of a persistent class | |
| 136 | + * A entity to be inserted by the delegate | |
| 110 | 137 | */ |
| 111 | 138 | @Override |
| 112 | - @Transactional | |
| 113 | 139 | public void insert(final T bean) { |
| 140 | + if (isRunningTransactionalOperations()) { | |
| 141 | + transactionalInsert(bean); | |
| 142 | + } else { | |
| 143 | + nonTransactionalInsert(bean); | |
| 144 | + } | |
| 145 | + } | |
| 146 | + | |
| 147 | + @Transactional | |
| 148 | + private void transactionalInsert(final T bean) { | |
| 149 | + nonTransactionalInsert(bean); | |
| 150 | + } | |
| 151 | + | |
| 152 | + private void nonTransactionalInsert(final T bean) { | |
| 114 | 153 | getDelegate().insert(bean); |
| 115 | 154 | } |
| 116 | 155 | |
| 117 | 156 | /** |
| 118 | - * Return the persistent instance of the given entity class with the given | |
| 119 | - * identifier | |
| 157 | + * Returns the instance of the given entity with the given identifier | |
| 120 | 158 | * |
| 121 | - * @return the persistent instance | |
| 159 | + * @return The instance | |
| 122 | 160 | */ |
| 123 | 161 | @Override |
| 124 | 162 | public T load(final I id) { |
| ... | ... | @@ -126,16 +164,30 @@ public class DelegateCrud<T, I, C extends Crud<T, I>> implements Crud<T, I> { |
| 126 | 164 | } |
| 127 | 165 | |
| 128 | 166 | /** |
| 129 | - * | |
| 130 | - * Update the persistent instance with the identifier of the given detached | |
| 131 | - * instance. | |
| 167 | + * Delegates the update operation of the given instance. | |
| 132 | 168 | * |
| 133 | 169 | * @param bean |
| 134 | - * a detached instance containing updated state. | |
| 170 | + * The instance containing the updated state. | |
| 135 | 171 | */ |
| 136 | 172 | @Override |
| 137 | - @Transactional | |
| 138 | 173 | public void update(final T bean) { |
| 174 | + if (isRunningTransactionalOperations()) { | |
| 175 | + transactionalUpdate(bean); | |
| 176 | + } else { | |
| 177 | + nonTransactionalUpdate(bean); | |
| 178 | + } | |
| 179 | + } | |
| 180 | + | |
| 181 | + @Transactional | |
| 182 | + private void transactionalUpdate(final T bean) { | |
| 183 | + nonTransactionalUpdate(bean); | |
| 184 | + } | |
| 185 | + | |
| 186 | + private void nonTransactionalUpdate(final T bean) { | |
| 139 | 187 | getDelegate().update(bean); |
| 140 | 188 | } |
| 189 | + | |
| 190 | + private boolean isRunningTransactionalOperations() { | |
| 191 | + return !(Beans.getReference(Transaction.class) instanceof DefaultTransaction); | |
| 192 | + } | |
| 141 | 193 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/TransactionContext.java
0 → 100644
| ... | ... | @@ -0,0 +1,49 @@ |
| 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.transaction; | |
| 38 | + | |
| 39 | +import java.io.Serializable; | |
| 40 | + | |
| 41 | +/** | |
| 42 | + * Structure used to handle transaction mechanisms. | |
| 43 | + * | |
| 44 | + * @author SERPRO | |
| 45 | + */ | |
| 46 | +public interface TransactionContext extends Serializable { | |
| 47 | + | |
| 48 | + Transaction getCurrentTransaction(); | |
| 49 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Beans.java
| ... | ... | @@ -49,14 +49,23 @@ |
| 49 | 49 | package br.gov.frameworkdemoiselle.util; |
| 50 | 50 | |
| 51 | 51 | import java.lang.annotation.Annotation; |
| 52 | +import java.util.Locale; | |
| 53 | +import java.util.NoSuchElementException; | |
| 54 | +import java.util.Set; | |
| 52 | 55 | |
| 53 | 56 | import javax.enterprise.inject.spi.Bean; |
| 54 | 57 | import javax.enterprise.inject.spi.BeanManager; |
| 55 | 58 | |
| 56 | -public class Beans { | |
| 59 | +import br.gov.frameworkdemoiselle.DemoiselleException; | |
| 60 | +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 61 | + | |
| 62 | +public final class Beans { | |
| 57 | 63 | |
| 58 | 64 | private static BeanManager manager; |
| 59 | 65 | |
| 66 | + private Beans() { | |
| 67 | + } | |
| 68 | + | |
| 60 | 69 | public static void setBeanManager(BeanManager beanManager) { |
| 61 | 70 | manager = beanManager; |
| 62 | 71 | } |
| ... | ... | @@ -65,24 +74,66 @@ public class Beans { |
| 65 | 74 | return manager; |
| 66 | 75 | } |
| 67 | 76 | |
| 77 | + @SuppressWarnings("unchecked") | |
| 68 | 78 | public static <T> T getReference(final Class<T> beanClass, Annotation... qualifiers) { |
| 69 | - Bean<?> bean = manager.getBeans(beanClass, qualifiers).iterator().next(); | |
| 70 | - return (T) getReference(bean, beanClass); | |
| 79 | + T instance; | |
| 80 | + | |
| 81 | + try { | |
| 82 | + instance = (T) getReference(manager.getBeans(beanClass, qualifiers)); | |
| 83 | + | |
| 84 | + } catch (NoSuchElementException cause) { | |
| 85 | + StringBuffer buffer = new StringBuffer(); | |
| 86 | + buffer.append(beanClass.getCanonicalName()); | |
| 87 | + | |
| 88 | + for (Annotation qualifier : qualifiers) { | |
| 89 | + buffer.append(", "); | |
| 90 | + buffer.append(qualifier.getClass().getCanonicalName()); | |
| 91 | + } | |
| 92 | + | |
| 93 | + String message = getBundle().getString("bean-not-found", buffer.toString()); | |
| 94 | + throw new DemoiselleException(message, cause); | |
| 95 | + } | |
| 96 | + | |
| 97 | + return instance; | |
| 71 | 98 | } |
| 72 | 99 | |
| 100 | + @SuppressWarnings("unchecked") | |
| 73 | 101 | public static <T> T getReference(final Class<T> beanClass) { |
| 74 | - Bean<?> bean = manager.getBeans(beanClass).iterator().next(); | |
| 75 | - return (T) getReference(bean, beanClass); | |
| 102 | + T instance; | |
| 103 | + | |
| 104 | + try { | |
| 105 | + instance = (T) getReference(manager.getBeans(beanClass)); | |
| 106 | + | |
| 107 | + } catch (NoSuchElementException cause) { | |
| 108 | + String message = getBundle().getString("bean-not-found", beanClass.getCanonicalName()); | |
| 109 | + throw new DemoiselleException(message, cause); | |
| 110 | + } | |
| 111 | + | |
| 112 | + return instance; | |
| 76 | 113 | } |
| 77 | 114 | |
| 78 | 115 | @SuppressWarnings("unchecked") |
| 79 | 116 | public static <T> T getReference(String beanName) { |
| 80 | - Bean<?> bean = manager.getBeans(beanName).iterator().next(); | |
| 81 | - return (T) getReference(bean, bean.getBeanClass()); | |
| 117 | + T instance; | |
| 118 | + | |
| 119 | + try { | |
| 120 | + instance = (T) getReference(manager.getBeans(beanName)); | |
| 121 | + | |
| 122 | + } catch (NoSuchElementException cause) { | |
| 123 | + String message = getBundle().getString("bean-not-found", beanName); | |
| 124 | + throw new DemoiselleException(message, cause); | |
| 125 | + } | |
| 126 | + | |
| 127 | + return instance; | |
| 82 | 128 | } |
| 83 | 129 | |
| 84 | 130 | @SuppressWarnings("unchecked") |
| 85 | - private static <T> T getReference(Bean<?> bean, final Class<T> beanClass) { | |
| 86 | - return (T) manager.getReference(bean, beanClass, manager.createCreationalContext(bean)); | |
| 131 | + private static <T> T getReference(Set<Bean<?>> beans) { | |
| 132 | + Bean<?> bean = beans.iterator().next(); | |
| 133 | + return (T) manager.getReference(bean, bean.getBeanClass(), manager.createCreationalContext(bean)); | |
| 134 | + } | |
| 135 | + | |
| 136 | + private static ResourceBundle getBundle() { | |
| 137 | + return ResourceBundleProducer.create("demoiselle-core-bundle", Locale.getDefault()); | |
| 87 | 138 | } |
| 88 | 139 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Exceptions.java
| ... | ... | @@ -20,7 +20,10 @@ package br.gov.frameworkdemoiselle.util; |
| 20 | 20 | |
| 21 | 21 | import br.gov.frameworkdemoiselle.exception.ApplicationException; |
| 22 | 22 | |
| 23 | -public class Exceptions { | |
| 23 | +public final class Exceptions { | |
| 24 | + | |
| 25 | + private Exceptions() { | |
| 26 | + } | |
| 24 | 27 | |
| 25 | 28 | public static boolean isApplicationException(final Throwable throwable) { |
| 26 | 29 | return throwable.getClass().isAnnotationPresent(ApplicationException.class); | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Reflections.java
| ... | ... | @@ -45,7 +45,10 @@ import java.lang.reflect.Type; |
| 45 | 45 | import java.util.ArrayList; |
| 46 | 46 | import java.util.List; |
| 47 | 47 | |
| 48 | -public class Reflections { | |
| 48 | +public final class Reflections { | |
| 49 | + | |
| 50 | + private Reflections() { | |
| 51 | + } | |
| 49 | 52 | |
| 50 | 53 | @SuppressWarnings("unchecked") |
| 51 | 54 | public static <T> Class<T> getGenericTypeArgument(final Class<?> clazz, final int idx) { |
| ... | ... | @@ -127,11 +130,11 @@ public class Reflections { |
| 127 | 130 | |
| 128 | 131 | return fields.toArray(new Field[0]); |
| 129 | 132 | } |
| 130 | - | |
| 133 | + | |
| 131 | 134 | public static <T> T instantiate(Class<T> clasz) { |
| 132 | 135 | T object = null; |
| 133 | 136 | try { |
| 134 | - object = clasz.newInstance(); | |
| 137 | + object = clasz.newInstance(); | |
| 135 | 138 | } catch (InstantiationException e) { |
| 136 | 139 | Exceptions.handleToRuntimeException(e); |
| 137 | 140 | } catch (IllegalAccessException e) { |
| ... | ... | @@ -140,4 +143,7 @@ public class Reflections { |
| 140 | 143 | return object; |
| 141 | 144 | } |
| 142 | 145 | |
| 146 | + public static boolean isOfType(Class<?> clazz, Class<?> type) { | |
| 147 | + return type.isAssignableFrom(clazz) && clazz != type; | |
| 148 | + } | |
| 143 | 149 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/util/ResourceBundle.java
| ... | ... | @@ -40,36 +40,56 @@ import java.io.Serializable; |
| 40 | 40 | import java.lang.reflect.Method; |
| 41 | 41 | import java.util.Enumeration; |
| 42 | 42 | import java.util.Locale; |
| 43 | +import java.util.MissingResourceException; | |
| 43 | 44 | import java.util.Set; |
| 44 | 45 | |
| 45 | 46 | public class ResourceBundle extends java.util.ResourceBundle implements Serializable { |
| 46 | 47 | |
| 47 | 48 | private static final long serialVersionUID = 1L; |
| 48 | 49 | |
| 50 | + private String baseName; | |
| 51 | + | |
| 49 | 52 | private transient java.util.ResourceBundle delegate; |
| 50 | 53 | |
| 51 | - public ResourceBundle(java.util.ResourceBundle resourceBundle) { | |
| 52 | - this.delegate = resourceBundle; | |
| 54 | + private final Locale locale; | |
| 55 | + | |
| 56 | + private java.util.ResourceBundle getDelegate() { | |
| 57 | + if (delegate == null) { | |
| 58 | + try { | |
| 59 | + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); | |
| 60 | + delegate = ResourceBundle.getBundle(baseName, locale, classLoader); | |
| 61 | + | |
| 62 | + } catch (MissingResourceException mre) { | |
| 63 | + delegate = ResourceBundle.getBundle(baseName, locale); | |
| 64 | + } | |
| 65 | + } | |
| 66 | + | |
| 67 | + return delegate; | |
| 68 | + } | |
| 69 | + | |
| 70 | + public ResourceBundle(String baseName, Locale locale) { | |
| 71 | + this.baseName = baseName; | |
| 72 | + this.locale = locale; | |
| 53 | 73 | } |
| 54 | 74 | |
| 55 | 75 | @Override |
| 56 | 76 | public boolean containsKey(String key) { |
| 57 | - return delegate.containsKey(key); | |
| 77 | + return getDelegate().containsKey(key); | |
| 58 | 78 | } |
| 59 | 79 | |
| 60 | 80 | @Override |
| 61 | 81 | public Enumeration<String> getKeys() { |
| 62 | - return delegate.getKeys(); | |
| 82 | + return getDelegate().getKeys(); | |
| 63 | 83 | } |
| 64 | 84 | |
| 65 | 85 | @Override |
| 66 | 86 | public Locale getLocale() { |
| 67 | - return delegate.getLocale(); | |
| 87 | + return getDelegate().getLocale(); | |
| 68 | 88 | } |
| 69 | 89 | |
| 70 | 90 | @Override |
| 71 | 91 | public Set<String> keySet() { |
| 72 | - return delegate.keySet(); | |
| 92 | + return getDelegate().keySet(); | |
| 73 | 93 | } |
| 74 | 94 | |
| 75 | 95 | public String getString(String key, Object... params) { |
| ... | ... | @@ -81,7 +101,7 @@ public class ResourceBundle extends java.util.ResourceBundle implements Serializ |
| 81 | 101 | Object result; |
| 82 | 102 | |
| 83 | 103 | try { |
| 84 | - Method method = delegate.getClass().getMethod("handleGetObject", String.class); | |
| 104 | + Method method = getDelegate().getClass().getMethod("handleGetObject", String.class); | |
| 85 | 105 | |
| 86 | 106 | method.setAccessible(true); |
| 87 | 107 | result = method.invoke(delegate, key); |
| ... | ... | @@ -90,6 +110,7 @@ public class ResourceBundle extends java.util.ResourceBundle implements Serializ |
| 90 | 110 | } catch (Exception cause) { |
| 91 | 111 | throw new RuntimeException(cause); |
| 92 | 112 | } |
| 113 | + | |
| 93 | 114 | return result; |
| 94 | 115 | } |
| 95 | 116 | } | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/util/Strings.java
| ... | ... | @@ -43,7 +43,10 @@ import java.util.regex.Pattern; |
| 43 | 43 | |
| 44 | 44 | import br.gov.frameworkdemoiselle.annotation.Ignore; |
| 45 | 45 | |
| 46 | -public class Strings { | |
| 46 | +public final class Strings { | |
| 47 | + | |
| 48 | + private Strings() { | |
| 49 | + } | |
| 47 | 50 | |
| 48 | 51 | public static boolean isResourceBundleKeyFormat(final String key) { |
| 49 | 52 | return Pattern.matches("^\\{(.+)\\}$", key == null ? "" : key); | ... | ... |
impl/core/src/main/resources/META-INF/beans.xml
| ... | ... | @@ -37,11 +37,4 @@ |
| 37 | 37 | <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| 38 | 38 | xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> |
| 39 | 39 | |
| 40 | - <interceptors> | |
| 41 | - <class>br.gov.frameworkdemoiselle.internal.interceptor.ExceptionHandlerInterceptor</class> | |
| 42 | - <class>br.gov.frameworkdemoiselle.internal.interceptor.RequiredPermissionInterceptor</class> | |
| 43 | - <class>br.gov.frameworkdemoiselle.internal.interceptor.RequiredRoleInterceptor</class> | |
| 44 | - <class>br.gov.frameworkdemoiselle.internal.interceptor.TransactionalInterceptor</class> | |
| 45 | - </interceptors> | |
| 46 | - | |
| 47 | 40 | </beans> |
| 48 | 41 | \ No newline at end of file | ... | ... |
impl/core/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
| 1 | 1 | br.gov.frameworkdemoiselle.internal.bootstrap.CoreBootstrap |
| 2 | 2 | br.gov.frameworkdemoiselle.internal.bootstrap.ConfigurationBootstrap |
| 3 | - | |
| 3 | +br.gov.frameworkdemoiselle.internal.bootstrap.TransactionBootstrap | |
| 4 | +br.gov.frameworkdemoiselle.internal.bootstrap.AuthenticatorBootstrap | |
| 5 | +br.gov.frameworkdemoiselle.internal.bootstrap.AuthorizerBootstrap | |
| 4 | 6 | br.gov.frameworkdemoiselle.internal.bootstrap.StartupBootstrap |
| 5 | 7 | br.gov.frameworkdemoiselle.internal.bootstrap.ShutdownBootstrap | ... | ... |
impl/core/src/main/resources/demoiselle-core-bundle.properties
| ... | ... | @@ -34,6 +34,8 @@ |
| 34 | 34 | # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. |
| 35 | 35 | |
| 36 | 36 | engine-on=Ligando os motores do Demoiselle ${project.version} |
| 37 | +ambiguous-strategy-resolution=Foi detectada ambiguidade da interface "{0}" com as seguintes implementa\u00E7\u00F5es\: "{1}". Para resolver o conflito, defina explicitamente a implementa\u00E7\u00E3o no demoiselle.properties. | |
| 38 | +bean-not-found=Voc\u00EA est\u00E1 tentando obter um objeto n\u00E3o reconhecido pelo CDI via Beans.getReference({0}) | |
| 37 | 39 | more-than-one-exceptionhandler-defined-for-same-class=Foi definido mais de um m\u00E9todo na classe {0} para tratar a exce\u00E7\u00E3o {1} |
| 38 | 40 | handling-exception=Tratando a exce\u00E7\u00E3o {0} |
| 39 | 41 | proxy-detected=Detectado o proxy {0} da classe {1} |
| ... | ... | @@ -58,7 +60,7 @@ configuration-attribute-is-mandatory=A configura\u00E7\u00E3o {0} \u00E9 obrigat |
| 58 | 60 | configuration-name-attribute-cant-be-empty=A nota\u00E7\u00E3o Name n\u00E3o pode estar em branco |
| 59 | 61 | configuration-key-not-found=Chave de configura\u00E7\u00E3o "{0}" n\u00E3o encontrada. Conven\u00E7\u00F5es verificadas\: "{1}" |
| 60 | 62 | |
| 61 | -transaction-not-defined=Nenhuma transa\u00E7\u00E3o foi definida. Para utilizar @{0} \u00E9 preciso definir a estrat\u00E9gia de transa\u00E7\u00E3o desejada no arquivo beans.xml | |
| 63 | +transaction-not-defined=Nenhuma transa\u00E7\u00E3o foi definida. Para utilizar @{0} \u00E9 preciso definir a propriedade frameworkdemoiselle.transaction.class com a estrat\u00E9gia de transa\u00E7\u00E3o desejada no arquivo demoiselle.properties | |
| 62 | 64 | executing-all=Executando todos os \: {0} |
| 63 | 65 | custom-context-was-registered=O contexto {0} foi registrado |
| 64 | 66 | custom-context-was-unregistered=O contexto {0} foi removido |
| ... | ... | @@ -70,8 +72,6 @@ error-creating-new-instance-for=Error creating a new instance for "{0}" |
| 70 | 72 | executed-successfully=\ {0} execultado com sucesso |
| 71 | 73 | must-declare-one-single-parameter=Voc\u00EA deve declarar um par\u00E2metro \u00FAnico em {0} |
| 72 | 74 | loading-default-transaction-manager=Carregando o gerenciador de transa\u00E7\u00E3o padr\u00E3o {0} |
| 73 | -transaction-class-not-found=A classe de transa\u00E7\u00E3o "{0}" informada n\u00E3o foi encontrada. | |
| 74 | -transaction-class-must-be-of-type=A classe de transa\u00E7\u00E3o "{0}" informada deve ser do tipo {1} | |
| 75 | 75 | results-count-greater-page-size=Quantidade de resultados {0} \u00E9 maior que o tamanho da p\u00E1gina {1} |
| 76 | 76 | page-result=Resultado paginado [p\u00E1gina\={0}, total de resultados\={1}] |
| 77 | 77 | page=P\u00E1gina [n\u00FAmero\={0}, tamanho\={1}] |
| ... | ... | @@ -86,10 +86,11 @@ access-checking=Verificando permiss\u00E3o do usu\u00E1rio "{0}" para executar a |
| 86 | 86 | access-allowed=O usu\u00E1rio "{0}" acessou o recurso "{2}" com a a\u00E7\u00E3o "{1}" |
| 87 | 87 | access-denied=O usu\u00E1rio "{0}" n\u00E3o possui permiss\u00E3o para executar a a\u00E7\u00E3o "{1}" no recurso "{2}" |
| 88 | 88 | access-denied-ui=Voc\u00EA n\u00E3o est\u00E1 autorizado a executar a a\u00E7\u00E3o {1} no recurso {0} |
| 89 | -authorizer-not-defined=Nenhuma regra de resolu\u00E7\u00E3o de permiss\u00F5es foi definida. Para utilizar @{0} \u00E9 preciso definir a estrat\u00E9gia de resolu\u00E7\u00E3o de permiss\u00F5es desejada no arquivo beans.xml | |
| 89 | +authorizer-not-defined=Nenhuma regra de resolu\u00E7\u00E3o de permiss\u00F5es foi definida. Para utilizar @{0} \u00E9 preciso definir a propriedade frameworkdemoiselle.security.authorizer.class como regra de resolu\u00E7\u00E3o de permiss\u00F5es desejada no arquivo demoiselle.properties. | |
| 90 | 90 | user-not-authenticated=Usu\u00E1rio n\u00E3o autenticado |
| 91 | 91 | has-role-verification=Verificando se o usu\u00E1rio {0} possui a(s) role(s)\: {1} |
| 92 | 92 | does-not-have-role=Usu\u00E1rio {0} n\u00E3o possui a(s) role(s)\: {1} |
| 93 | 93 | does-not-have-role-ui=Para acessar este recurso \u00E9 necess\u00E1rio ser {0} |
| 94 | 94 | user-has-role=Usu\u00E1rio {0} possui a(s) role(s)\: {1} |
| 95 | -authenticator-not-defined=Nenhum mecanismo de autentica\u00E7\u00E3o foi definido. Para utilizar {0} \u00E9 preciso definir o mecanismo de autentica\u00E7\u00E3o desejado no arquivo beans.xml | |
| 96 | 95 | \ No newline at end of file |
| 96 | + | |
| 97 | +authenticator-not-defined=Nenhum mecanismo de autentica\u00E7\u00E3o foi definido. Para utilizar {0} \u00E9 preciso definir a propriedade frameworkdemoiselle.security.authenticator.class como mecanismo de autentica\u00E7\u00E3o desejado no arquivo demoiselle.properties. | ... | ... |
impl/core/src/test/java/br/gov/frameworkdemoiselle/internal/bootstrap/AbstractBootstrapTest.java
| ... | ... | @@ -1,126 +0,0 @@ |
| 1 | -/* | |
| 2 | - * Demoiselle Framework | |
| 3 | - * Copyright (C) 2010 SERPRO | |
| 4 | - * ---------------------------------------------------------------------------- | |
| 5 | - * This file is part of Demoiselle Framework. | |
| 6 | - * | |
| 7 | - * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | - * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | - * as published by the Free Software Foundation. | |
| 10 | - * | |
| 11 | - * This program is distributed in the hope that it will be useful, | |
| 12 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | - * GNU General Public License for more details. | |
| 15 | - * | |
| 16 | - * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | - * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | - * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | - * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | - * ---------------------------------------------------------------------------- | |
| 21 | - * Este arquivo é parte do Framework Demoiselle. | |
| 22 | - * | |
| 23 | - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | - * do Software Livre (FSF). | |
| 26 | - * | |
| 27 | - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | - * para maiores detalhes. | |
| 31 | - * | |
| 32 | - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | - * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | - * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | - */ | |
| 37 | -package br.gov.frameworkdemoiselle.internal.bootstrap; | |
| 38 | - | |
| 39 | -import static org.easymock.EasyMock.expect; | |
| 40 | -import static org.powermock.api.easymock.PowerMock.mockStatic; | |
| 41 | -import static org.powermock.api.easymock.PowerMock.replayAll; | |
| 42 | -import static org.powermock.api.easymock.PowerMock.verifyAll; | |
| 43 | - | |
| 44 | -import java.util.Locale; | |
| 45 | - | |
| 46 | -import javax.enterprise.inject.spi.AfterBeanDiscovery; | |
| 47 | -import javax.inject.Scope; | |
| 48 | - | |
| 49 | -import org.easymock.EasyMock; | |
| 50 | -import org.junit.Test; | |
| 51 | -import org.junit.runner.RunWith; | |
| 52 | -import org.powermock.api.easymock.PowerMock; | |
| 53 | -import org.powermock.core.classloader.annotations.PrepareForTest; | |
| 54 | -import org.powermock.modules.junit4.PowerMockRunner; | |
| 55 | -import org.powermock.reflect.Whitebox; | |
| 56 | -import org.slf4j.Logger; | |
| 57 | - | |
| 58 | -import br.gov.frameworkdemoiselle.internal.context.Contexts; | |
| 59 | -import br.gov.frameworkdemoiselle.internal.context.ThreadLocalContext; | |
| 60 | -import br.gov.frameworkdemoiselle.internal.producer.LoggerProducer; | |
| 61 | -import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; | |
| 62 | -import br.gov.frameworkdemoiselle.util.ResourceBundle; | |
| 63 | - | |
| 64 | -@RunWith(PowerMockRunner.class) | |
| 65 | -@PrepareForTest({ LoggerProducer.class, Contexts.class }) | |
| 66 | -public class AbstractBootstrapTest { | |
| 67 | - | |
| 68 | - @Test | |
| 69 | - @SuppressWarnings("unchecked") | |
| 70 | - public void testAddContext() { | |
| 71 | - mockStatic(LoggerProducer.class); | |
| 72 | - mockStatic(Contexts.class); | |
| 73 | - | |
| 74 | - Logger logger = PowerMock.createMock(Logger.class); | |
| 75 | - logger.trace(EasyMock.anyObject(String.class)); | |
| 76 | - | |
| 77 | - expect(LoggerProducer.create(EasyMock.anyObject(Class.class))).andReturn(logger); | |
| 78 | - | |
| 79 | - ResourceBundle bundle = PowerMock.createMock(ResourceBundle.class); | |
| 80 | - expect(bundle.getString(EasyMock.anyObject(String.class), EasyMock.anyObject(String.class))).andReturn(null); | |
| 81 | - | |
| 82 | - ResourceBundleProducer bundleFactory = PowerMock.createMock(ResourceBundleProducer.class); | |
| 83 | - expect(bundleFactory.create(EasyMock.anyObject(String.class), EasyMock.anyObject(Locale.class))).andReturn( | |
| 84 | - bundle); | |
| 85 | - | |
| 86 | - Whitebox.setInternalState(AbstractBootstrap.class, "bundleFactory", bundleFactory); | |
| 87 | - | |
| 88 | - ThreadLocalContext context = new ThreadLocalContext(Scope.class); | |
| 89 | - Contexts.add(EasyMock.anyObject(ThreadLocalContext.class), EasyMock.anyObject(AfterBeanDiscovery.class)); | |
| 90 | - replayAll(bundle, bundleFactory, logger, LoggerProducer.class, Contexts.class); | |
| 91 | - | |
| 92 | - AbstractBootstrap.addContext(context, null); | |
| 93 | - | |
| 94 | - verifyAll(); | |
| 95 | - } | |
| 96 | - | |
| 97 | - @Test | |
| 98 | - @SuppressWarnings("unchecked") | |
| 99 | - public void testDisableContext() { | |
| 100 | - mockStatic(LoggerProducer.class); | |
| 101 | - mockStatic(Contexts.class); | |
| 102 | - | |
| 103 | - Logger logger = PowerMock.createMock(Logger.class); | |
| 104 | - logger.trace(EasyMock.anyObject(String.class)); | |
| 105 | - expect(LoggerProducer.create(EasyMock.anyObject(Class.class))).andReturn(logger); | |
| 106 | - | |
| 107 | - ResourceBundle bundle = PowerMock.createMock(ResourceBundle.class); | |
| 108 | - expect(bundle.getString(EasyMock.anyObject(String.class), EasyMock.anyObject(String.class))).andReturn(null); | |
| 109 | - | |
| 110 | - ResourceBundleProducer bundleFactory = PowerMock.createMock(ResourceBundleProducer.class); | |
| 111 | - expect(bundleFactory.create(EasyMock.anyObject(String.class), EasyMock.anyObject(Locale.class))).andReturn( | |
| 112 | - bundle); | |
| 113 | - | |
| 114 | - Whitebox.setInternalState(AbstractBootstrap.class, "bundleFactory", bundleFactory); | |
| 115 | - | |
| 116 | - ThreadLocalContext context = new ThreadLocalContext(Scope.class); | |
| 117 | - | |
| 118 | - Contexts.remove(context); | |
| 119 | - replayAll(bundle, bundleFactory, logger, LoggerProducer.class, Contexts.class); | |
| 120 | - | |
| 121 | - AbstractBootstrap.disableContext(context); | |
| 122 | - | |
| 123 | - verifyAll(); | |
| 124 | - } | |
| 125 | - | |
| 126 | -} |