You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2019/12/03 13:35:05 UTC

[aries] branch trunk updated: [ARIES-1887] ComponentTxData in transaction-blueprint was not thread safe

This is an automated email from the ASF dual-hosted git repository.

cschneider pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/aries.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 3a26f7c  [ARIES-1887] ComponentTxData in transaction-blueprint was not thread safe
     new fd261f3  Merge pull request #104 from nicolas-dutertry/ARIES-1887
3a26f7c is described below

commit 3a26f7c4b813332c7bbfb10c9013f100fa84ca18
Author: Nicolas Dutertry <ni...@soprahr.com>
AuthorDate: Tue Dec 3 14:03:43 2019 +0100

    [ARIES-1887] ComponentTxData in transaction-blueprint was not thread safe
---
 .../apache/aries/transaction/ComponentTxData.java  | 35 ++++++++++++++--------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/ComponentTxData.java b/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/ComponentTxData.java
index 223b862..d4ccf97 100644
--- a/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/ComponentTxData.java
+++ b/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/ComponentTxData.java
@@ -2,8 +2,9 @@ package org.apache.aries.transaction;
 
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
 
 import javax.transaction.Transactional;
 import javax.transaction.Transactional.TxType;
@@ -15,7 +16,7 @@ public class ComponentTxData {
     private static final Logger LOG = LoggerFactory.getLogger(ComponentTxData.class);
     private static final int BANNED_MODIFIERS = Modifier.PRIVATE | Modifier.STATIC;
     
-    private Map<Method, TransactionalAnnotationAttributes> txMap = new HashMap<Method, TransactionalAnnotationAttributes>();
+    private Map<Method, Optional<TransactionalAnnotationAttributes>> txMap = new ConcurrentHashMap<Method, Optional<TransactionalAnnotationAttributes>>();
     private boolean isTransactional;
     private Class<?> beanClass;
     
@@ -35,13 +36,20 @@ public class ComponentTxData {
 
     TransactionalAnnotationAttributes getEffectiveType(Method m) {
         if (txMap.containsKey(m)) {
-                return txMap.get(m);
+            Optional<TransactionalAnnotationAttributes> optional = txMap.get(m);
+            if(optional == null || !optional.isPresent()) {
+                return null;
+            }
+            return optional.get();
         }
         try {
             Method effectiveMethod = beanClass.getDeclaredMethod(m.getName(), m.getParameterTypes());
-            TransactionalAnnotationAttributes txData = txMap.get(effectiveMethod);
-            txMap.put(m, txData);
-            return txData;
+            Optional<TransactionalAnnotationAttributes> optional = txMap.get(effectiveMethod);
+            if(optional == null) {
+                optional = Optional.empty();
+            }
+            txMap.put(m, optional);
+            return optional.isPresent() ? optional.get() : null;
         } catch (NoSuchMethodException e) { // NOSONAR
             return getFromMethod(m);
         } catch (SecurityException e) {
@@ -52,9 +60,12 @@ public class ComponentTxData {
     private TransactionalAnnotationAttributes getFromMethod(Method m) {
         try {
             Method effectiveMethod = beanClass.getMethod(m.getName(), m.getParameterTypes());
-            TransactionalAnnotationAttributes txData = txMap.get(effectiveMethod);
-            txMap.put(m, txData);
-            return txData;
+            Optional<TransactionalAnnotationAttributes> optional = txMap.get(effectiveMethod);
+            if(optional == null) {
+                optional = Optional.empty();
+            }
+            txMap.put(m, optional);
+            return optional.isPresent() ? optional.get() : null;
         } catch (NoSuchMethodException e1) {
             LOG.debug("No method found when scanning for transactions", e1);
             return null;
@@ -78,11 +89,11 @@ public class ComponentTxData {
                     TransactionalAnnotationAttributes txData = new TransactionalAnnotationAttributes(t,
                             methodAnnotation.dontRollbackOn(), methodAnnotation.rollbackOn());
                     assertAllowedModifier(m);
-                   txMap.put(m, txData);
+                   txMap.put(m, Optional.of(txData));
                    shouldAssignInterceptor = true;
                 } else if (defaultType != null){
-                    txMap.put(m, new TransactionalAnnotationAttributes(defaultType, classAnnotation.dontRollbackOn(),
-                            classAnnotation.rollbackOn()));
+                    txMap.put(m, Optional.of(new TransactionalAnnotationAttributes(defaultType, classAnnotation.dontRollbackOn(),
+                            classAnnotation.rollbackOn())));
                 }
             } catch(IllegalStateException e) {
                 LOG.warn("Invalid transaction annoation found", e);