Commit acdef6815f24637f5611925cbd2735d51a797117
1 parent
6a702c16
Exists in
master
FWK-207: Criação dos eventos AfterTransactionBegin e
BeforeTransactionComplete Task-Url: https://demoiselle.atlassian.net/browse/FWK-207
Showing
3 changed files
with
149 additions
and
18 deletions
Show diff stats
impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/AfterTransactionBegin.java
0 → 100644
| ... | ... | @@ -0,0 +1,48 @@ |
| 1 | +/* | |
| 2 | + * Demoiselle Framework | |
| 3 | + * Copyright (C) 2010 SERPRO | |
| 4 | + * ---------------------------------------------------------------------------- | |
| 5 | + * This file is part of Demoiselle Framework. | |
| 6 | + * | |
| 7 | + * Demoiselle Framework is free software; you can redistribute it and/or | |
| 8 | + * modify it under the terms of the GNU Lesser General Public License version 3 | |
| 9 | + * as published by the Free Software Foundation. | |
| 10 | + * | |
| 11 | + * This program is distributed in the hope that it will be useful, | |
| 12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | + * GNU General Public License for more details. | |
| 15 | + * | |
| 16 | + * You should have received a copy of the GNU Lesser General Public License version 3 | |
| 17 | + * along with this program; if not, see <http://www.gnu.org/licenses/> | |
| 18 | + * or write to the Free Software Foundation, Inc., 51 Franklin Street, | |
| 19 | + * Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 | + * ---------------------------------------------------------------------------- | |
| 21 | + * Este arquivo é parte do Framework Demoiselle. | |
| 22 | + * | |
| 23 | + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou | |
| 24 | + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação | |
| 25 | + * do Software Livre (FSF). | |
| 26 | + * | |
| 27 | + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA | |
| 28 | + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou | |
| 29 | + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português | |
| 30 | + * para maiores detalhes. | |
| 31 | + * | |
| 32 | + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título | |
| 33 | + * "LICENCA.txt", junto com esse programa. Se não, acesse <http://www.gnu.org/licenses/> | |
| 34 | + * ou escreva para a Fundação do Software Livre (FSF) Inc., | |
| 35 | + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. | |
| 36 | + */ | |
| 37 | +package br.gov.frameworkdemoiselle.transaction; | |
| 38 | + | |
| 39 | +import java.io.Serializable; | |
| 40 | + | |
| 41 | +/** | |
| 42 | + * Event that is fired after the transaction has began. | |
| 43 | + * | |
| 44 | + * @author SERPRO | |
| 45 | + */ | |
| 46 | +public interface AfterTransactionBegin extends Serializable { | |
| 47 | + | |
| 48 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/BeforeTransactionComplete.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 | + * Event that is fired before the transaction be committed or rolled back. | |
| 43 | + * | |
| 44 | + * @author SERPRO | |
| 45 | + */ | |
| 46 | +public interface BeforeTransactionComplete extends Serializable { | |
| 47 | + | |
| 48 | + boolean isMarkedRollback(); | |
| 49 | +} | ... | ... |
impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/TransactionalInterceptor.java
| ... | ... | @@ -110,10 +110,10 @@ public class TransactionalInterceptor implements Serializable { |
| 110 | 110 | */ |
| 111 | 111 | @AroundInvoke |
| 112 | 112 | public Object manage(final InvocationContext ic) throws Exception { |
| 113 | - initiate(); | |
| 114 | - | |
| 115 | 113 | Object result = null; |
| 114 | + | |
| 116 | 115 | try { |
| 116 | + initiate(); | |
| 117 | 117 | getLogger().finer(getBundle().getString("transactional-execution", ic.getMethod().toGenericString())); |
| 118 | 118 | result = ic.proceed(); |
| 119 | 119 | |
| ... | ... | @@ -135,6 +135,7 @@ public class TransactionalInterceptor implements Serializable { |
| 135 | 135 | transaction.begin(); |
| 136 | 136 | getTransactionInfo().markAsOwner(); |
| 137 | 137 | getLogger().fine(getBundle().getString("begin-transaction")); |
| 138 | + fireAfterTransactionBegin(); | |
| 138 | 139 | } |
| 139 | 140 | |
| 140 | 141 | getTransactionInfo().incrementCounter(); |
| ... | ... | @@ -152,31 +153,23 @@ public class TransactionalInterceptor implements Serializable { |
| 152 | 153 | } |
| 153 | 154 | |
| 154 | 155 | if (rollback) { |
| 155 | - transaction.setRollbackOnly(); | |
| 156 | - getLogger().fine(getBundle().getString("transaction-marked-rollback", cause.getMessage())); | |
| 156 | + setRollbackOnly(transaction, cause); | |
| 157 | 157 | } |
| 158 | 158 | } |
| 159 | 159 | } |
| 160 | 160 | |
| 161 | - private void complete() { | |
| 161 | + private void setRollbackOnly(Transaction transaction, Exception cause) { | |
| 162 | + transaction.setRollbackOnly(); | |
| 163 | + getLogger().fine(getBundle().getString("transaction-marked-rollback", cause.getMessage())); | |
| 164 | + } | |
| 165 | + | |
| 166 | + private void complete() throws Exception { | |
| 162 | 167 | Transaction transaction = getTransactionContext().getCurrentTransaction(); |
| 163 | 168 | getTransactionInfo().decrementCounter(); |
| 164 | 169 | |
| 165 | 170 | if (getTransactionInfo().getCounter() == 0 && transaction.isActive()) { |
| 166 | - | |
| 167 | 171 | if (getTransactionInfo().isOwner()) { |
| 168 | - if (transaction.isMarkedRollback()) { | |
| 169 | - transaction.rollback(); | |
| 170 | - getTransactionInfo().clear(); | |
| 171 | - | |
| 172 | - getLogger().fine(getBundle().getString("transaction-rolledback")); | |
| 173 | - | |
| 174 | - } else { | |
| 175 | - transaction.commit(); | |
| 176 | - getTransactionInfo().clear(); | |
| 177 | - | |
| 178 | - getLogger().fine(getBundle().getString("transaction-commited")); | |
| 179 | - } | |
| 172 | + complete(transaction); | |
| 180 | 173 | } |
| 181 | 174 | |
| 182 | 175 | } else if (getTransactionInfo().getCounter() == 0 && !transaction.isActive()) { |
| ... | ... | @@ -184,6 +177,47 @@ public class TransactionalInterceptor implements Serializable { |
| 184 | 177 | } |
| 185 | 178 | } |
| 186 | 179 | |
| 180 | + private void complete(Transaction transaction) throws Exception { | |
| 181 | + try { | |
| 182 | + fireBeforeTransactionComplete(transaction.isMarkedRollback()); | |
| 183 | + | |
| 184 | + } catch (Exception cause) { | |
| 185 | + setRollbackOnly(transaction, cause); | |
| 186 | + throw cause; | |
| 187 | + | |
| 188 | + } finally { | |
| 189 | + if (transaction.isMarkedRollback()) { | |
| 190 | + transaction.rollback(); | |
| 191 | + getTransactionInfo().clear(); | |
| 192 | + getLogger().fine(getBundle().getString("transaction-rolledback")); | |
| 193 | + | |
| 194 | + } else { | |
| 195 | + transaction.commit(); | |
| 196 | + getTransactionInfo().clear(); | |
| 197 | + getLogger().fine(getBundle().getString("transaction-commited")); | |
| 198 | + } | |
| 199 | + } | |
| 200 | + } | |
| 201 | + | |
| 202 | + private void fireAfterTransactionBegin() { | |
| 203 | + Beans.getBeanManager().fireEvent(new AfterTransactionBegin() { | |
| 204 | + | |
| 205 | + private static final long serialVersionUID = 1L; | |
| 206 | + }); | |
| 207 | + } | |
| 208 | + | |
| 209 | + private void fireBeforeTransactionComplete(final boolean markedRollback) { | |
| 210 | + Beans.getBeanManager().fireEvent(new BeforeTransactionComplete() { | |
| 211 | + | |
| 212 | + private static final long serialVersionUID = 1L; | |
| 213 | + | |
| 214 | + @Override | |
| 215 | + public boolean isMarkedRollback() { | |
| 216 | + return markedRollback; | |
| 217 | + } | |
| 218 | + }); | |
| 219 | + } | |
| 220 | + | |
| 187 | 221 | private ResourceBundle getBundle() { |
| 188 | 222 | if (bundle == null) { |
| 189 | 223 | bundle = Beans.getReference(ResourceBundle.class, new NameQualifier("demoiselle-core-bundle")); | ... | ... |