From acdef6815f24637f5611925cbd2735d51a797117 Mon Sep 17 00:00:00 2001 From: Cleverson Sacramento Date: Mon, 1 Dec 2014 14:37:02 -0200 Subject: [PATCH] FWK-207: Criação dos eventos AfterTransactionBegin e BeforeTransactionComplete --- impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/AfterTransactionBegin.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/BeforeTransactionComplete.java | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/TransactionalInterceptor.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++------------------ 3 files changed, 149 insertions(+), 18 deletions(-) create mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/AfterTransactionBegin.java create mode 100644 impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/BeforeTransactionComplete.java diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/AfterTransactionBegin.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/AfterTransactionBegin.java new file mode 100644 index 0000000..9d18dd3 --- /dev/null +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/AfterTransactionBegin.java @@ -0,0 +1,48 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package br.gov.frameworkdemoiselle.transaction; + +import java.io.Serializable; + +/** + * Event that is fired after the transaction has began. + * + * @author SERPRO + */ +public interface AfterTransactionBegin extends Serializable { + +} diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/BeforeTransactionComplete.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/BeforeTransactionComplete.java new file mode 100644 index 0000000..4bef262 --- /dev/null +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/BeforeTransactionComplete.java @@ -0,0 +1,49 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ +package br.gov.frameworkdemoiselle.transaction; + +import java.io.Serializable; + +/** + * Event that is fired before the transaction be committed or rolled back. + * + * @author SERPRO + */ +public interface BeforeTransactionComplete extends Serializable { + + boolean isMarkedRollback(); +} diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/TransactionalInterceptor.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/TransactionalInterceptor.java index 4ba2fe4..81b17ac 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/TransactionalInterceptor.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/transaction/TransactionalInterceptor.java @@ -110,10 +110,10 @@ public class TransactionalInterceptor implements Serializable { */ @AroundInvoke public Object manage(final InvocationContext ic) throws Exception { - initiate(); - Object result = null; + try { + initiate(); getLogger().finer(getBundle().getString("transactional-execution", ic.getMethod().toGenericString())); result = ic.proceed(); @@ -135,6 +135,7 @@ public class TransactionalInterceptor implements Serializable { transaction.begin(); getTransactionInfo().markAsOwner(); getLogger().fine(getBundle().getString("begin-transaction")); + fireAfterTransactionBegin(); } getTransactionInfo().incrementCounter(); @@ -152,31 +153,23 @@ public class TransactionalInterceptor implements Serializable { } if (rollback) { - transaction.setRollbackOnly(); - getLogger().fine(getBundle().getString("transaction-marked-rollback", cause.getMessage())); + setRollbackOnly(transaction, cause); } } } - private void complete() { + private void setRollbackOnly(Transaction transaction, Exception cause) { + transaction.setRollbackOnly(); + getLogger().fine(getBundle().getString("transaction-marked-rollback", cause.getMessage())); + } + + private void complete() throws Exception { Transaction transaction = getTransactionContext().getCurrentTransaction(); getTransactionInfo().decrementCounter(); if (getTransactionInfo().getCounter() == 0 && transaction.isActive()) { - if (getTransactionInfo().isOwner()) { - if (transaction.isMarkedRollback()) { - transaction.rollback(); - getTransactionInfo().clear(); - - getLogger().fine(getBundle().getString("transaction-rolledback")); - - } else { - transaction.commit(); - getTransactionInfo().clear(); - - getLogger().fine(getBundle().getString("transaction-commited")); - } + complete(transaction); } } else if (getTransactionInfo().getCounter() == 0 && !transaction.isActive()) { @@ -184,6 +177,47 @@ public class TransactionalInterceptor implements Serializable { } } + private void complete(Transaction transaction) throws Exception { + try { + fireBeforeTransactionComplete(transaction.isMarkedRollback()); + + } catch (Exception cause) { + setRollbackOnly(transaction, cause); + throw cause; + + } finally { + if (transaction.isMarkedRollback()) { + transaction.rollback(); + getTransactionInfo().clear(); + getLogger().fine(getBundle().getString("transaction-rolledback")); + + } else { + transaction.commit(); + getTransactionInfo().clear(); + getLogger().fine(getBundle().getString("transaction-commited")); + } + } + } + + private void fireAfterTransactionBegin() { + Beans.getBeanManager().fireEvent(new AfterTransactionBegin() { + + private static final long serialVersionUID = 1L; + }); + } + + private void fireBeforeTransactionComplete(final boolean markedRollback) { + Beans.getBeanManager().fireEvent(new BeforeTransactionComplete() { + + private static final long serialVersionUID = 1L; + + @Override + public boolean isMarkedRollback() { + return markedRollback; + } + }); + } + private ResourceBundle getBundle() { if (bundle == null) { bundle = Beans.getReference(ResourceBundle.class, new NameQualifier("demoiselle-core-bundle")); -- libgit2 0.21.2