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

Reply via email to