Liran Zelkha has uploaded a new change for review. Change subject: core: CDI Transaction Interceptor ......................................................................
core: CDI Transaction Interceptor Allow developers to mark CDI beans and their methods as transactional, and make sure that methods will run in a transactional context Change-Id: I94bf3b41764b137e5456995d393f023d3564e301 Bug-Url: https://bugzilla.redhat.com/1159621 Signed-off-by: [email protected] <[email protected]> --- A backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/transaction/TransacionalInterceptor.java A backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/transaction/Transactional.java A backend/manager/modules/utils/src/main/resources/beans.xml 3 files changed, 84 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/90/39790/1 diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/transaction/TransacionalInterceptor.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/transaction/TransacionalInterceptor.java new file mode 100644 index 0000000..e1d8619 --- /dev/null +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/transaction/TransacionalInterceptor.java @@ -0,0 +1,58 @@ +package org.ovirt.engine.core.utils.transaction; + +import javax.interceptor.AroundInvoke; +import javax.interceptor.Interceptor; +import javax.interceptor.InvocationContext; +import javax.transaction.Transaction; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Interceptor +@Transactional +public class TransacionalInterceptor { + private static final Logger logger = LoggerFactory.getLogger(TransacionalInterceptor.class); + + @AroundInvoke + public Object invoke(final InvocationContext context) throws Exception + { + Transaction current = TransactionSupport.current(); + if (current == null) + { + ExceptionAwareTransactionMethod method = new ExceptionAwareTransactionMethod(context); + Object result = TransactionSupport.executeInNewTransaction(method); + if (result == null) { + throw method.getThrowable(); + } + return result; + } else { + return context.proceed(); + } + } + + private class ExceptionAwareTransactionMethod implements TransactionMethod<Object> { + private InvocationContext context; + private Exception throwable; + + public ExceptionAwareTransactionMethod(InvocationContext context) { + super(); + this.context = context; + } + + @Override + public Object runInTransaction() { + try { + return context.proceed(); + } catch (Exception e) { + logger.error("Failed to run operation in a new transaction", e); + throwable = e; + return null; + } + } + + public Exception getThrowable() { + return throwable; + } + + }; +} diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/transaction/Transactional.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/transaction/Transactional.java new file mode 100644 index 0000000..394df17 --- /dev/null +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/transaction/Transactional.java @@ -0,0 +1,18 @@ +package org.ovirt.engine.core.utils.transaction; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.interceptor.InterceptorBinding; + +import org.ovirt.engine.core.compat.TransactionScopeOption; + +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@InterceptorBinding +public @interface Transactional +{ + TransactionScopeOption propogation() default TransactionScopeOption.Required; +} diff --git a/backend/manager/modules/utils/src/main/resources/beans.xml b/backend/manager/modules/utils/src/main/resources/beans.xml new file mode 100644 index 0000000..a25c5fd --- /dev/null +++ b/backend/manager/modules/utils/src/main/resources/beans.xml @@ -0,0 +1,8 @@ +<beans xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd" > + + <interceptors> + <class>org.ovirt.engine.core.utils.transaction.TransacionalInterceptor</class> + </interceptors> +</beans> \ No newline at end of file -- To view, visit https://gerrit.ovirt.org/39790 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I94bf3b41764b137e5456995d393f023d3564e301 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liran Zelkha <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
