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