ARIES-1887 - Improve handling of optional
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 d4ccf97..d7499bc 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
@@ -34,22 +34,15 @@
         }
     }
 
-    TransactionalAnnotationAttributes getEffectiveType(Method m) {
+    Optional<TransactionalAnnotationAttributes> getEffectiveType(Method m) {
         if (txMap.containsKey(m)) {
-            Optional<TransactionalAnnotationAttributes> optional = txMap.get(m);
-            if(optional == null || !optional.isPresent()) {
-                return null;
-            }
-            return optional.get();
+            return getTxAttr(m);
         }
         try {
             Method effectiveMethod = beanClass.getDeclaredMethod(m.getName(), m.getParameterTypes());
-            Optional<TransactionalAnnotationAttributes> optional = txMap.get(effectiveMethod);
-            if(optional == null) {
-                optional = Optional.empty();
-            }
-            txMap.put(m, optional);
-            return optional.isPresent() ? optional.get() : null;
+            Optional<TransactionalAnnotationAttributes> txAttr = getTxAttr(effectiveMethod);
+            txMap.put(m, txAttr);
+            return txAttr;
         } catch (NoSuchMethodException e) { // NOSONAR
             return getFromMethod(m);
         } catch (SecurityException e) {
@@ -57,22 +50,28 @@
         }
     }
 
-    private TransactionalAnnotationAttributes getFromMethod(Method m) {
+    private Optional<TransactionalAnnotationAttributes> getFromMethod(Method m) {
         try {
             Method effectiveMethod = beanClass.getMethod(m.getName(), m.getParameterTypes());
-            Optional<TransactionalAnnotationAttributes> optional = txMap.get(effectiveMethod);
-            if(optional == null) {
-                optional = Optional.empty();
-            }
-            txMap.put(m, optional);
-            return optional.isPresent() ? optional.get() : null;
+            Optional<TransactionalAnnotationAttributes> txAttr = getTxAttr(effectiveMethod);
+            txMap.put(m, txAttr);
+            return txAttr;
         } catch (NoSuchMethodException e1) {
             LOG.debug("No method found when scanning for transactions", e1);
-            return null;
+            return Optional.empty();
         } catch (SecurityException e1) {
             throw new RuntimeException("Security exception when determining effective method", e1); // NOSONAR
         }
     }
+    
+    private Optional<TransactionalAnnotationAttributes> getTxAttr(Method method) {
+        Optional<TransactionalAnnotationAttributes> txAttr = txMap.get(method);
+        if (txAttr == null) {
+            return Optional.empty();
+        } else {
+            return txAttr;
+        }
+    }
 
     private boolean parseTxData(Class<?> c) {
         boolean shouldAssignInterceptor = false;
@@ -86,9 +85,9 @@
                 Transactional methodAnnotation = m.getAnnotation(Transactional.class);
                 TxType t = getType(methodAnnotation);
                 if (t != null) {
-                    TransactionalAnnotationAttributes txData = new TransactionalAnnotationAttributes(t,
+                   TransactionalAnnotationAttributes txData = new TransactionalAnnotationAttributes(t,
                             methodAnnotation.dontRollbackOn(), methodAnnotation.rollbackOn());
-                    assertAllowedModifier(m);
+                   assertAllowedModifier(m);
                    txMap.put(m, Optional.of(txData));
                    shouldAssignInterceptor = true;
                 } else if (defaultType != null){
diff --git a/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TxInterceptorImpl.java b/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TxInterceptorImpl.java
index a61d42c..8974a40 100644
--- a/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TxInterceptorImpl.java
+++ b/transaction/transaction-blueprint/src/main/java/org/apache/aries/transaction/TxInterceptorImpl.java
@@ -19,6 +19,7 @@
 package org.apache.aries.transaction;
 
 import java.lang.reflect.Method;
+import java.util.Optional;
 
 import javax.transaction.RollbackException;
 import javax.transaction.Transaction;
@@ -51,12 +52,12 @@
 
     @Override
     public Object preCall(ComponentMetadata cm, Method m, Object... parameters) throws Throwable {
-        final TransactionalAnnotationAttributes type = txData.getEffectiveType(m);
-        if (type == null) {
+        final Optional<TransactionalAnnotationAttributes> type = txData.getEffectiveType(m);
+        if (!type.isPresent()) {
             // No transaction
             return null;
         }
-        TransactionAttribute txAttribute = TransactionAttribute.fromValue(type.getTxType());
+        TransactionAttribute txAttribute = TransactionAttribute.fromValue(type.get().getTxType());
 
         LOGGER.debug("PreCall for bean {}, method {} with tx strategy {}.", getCmId(cm), m.getName(), txAttribute);
         TransactionToken token = txAttribute.begin(tm);
@@ -127,12 +128,12 @@
 
     private boolean isRollBackException(Throwable ex, Method m) {
         if (m != null) {
-            TransactionalAnnotationAttributes effectiveType = txData.getEffectiveType(m);
-            if (effectiveType == null) {
+            Optional<TransactionalAnnotationAttributes> effectiveType = txData.getEffectiveType(m);
+            if (!effectiveType.isPresent()) {
                 return isUncheckedException(ex);
             } else {
                 //check dontRollbackOn first, since according to spec it has precedence
-                for (Class dontRollbackClass : effectiveType.getDontRollbackOn()) {
+                for (Class dontRollbackClass : effectiveType.get().getDontRollbackOn()) {
                     if (dontRollbackClass.isInstance(ex)) {
                         LOGGER.debug("Current exception {} found in element dontRollbackOn.", ex.getClass());
                         return false;
@@ -142,7 +143,7 @@
                 if (isUncheckedException(ex)) {
                     return true;
                 }
-                for (Class rollbackExceptionClass : effectiveType.getRollbackOn()) {
+                for (Class rollbackExceptionClass : effectiveType.get().getRollbackOn()) {
                     if (rollbackExceptionClass.isInstance(ex)) {
                         LOGGER.debug("Current exception {} found in element rollbackOn.", ex.getClass());
                         return true;
diff --git a/transaction/transaction-blueprint/src/test/java/org/apache/aries/transaction/ComponentTxDataTest.java b/transaction/transaction-blueprint/src/test/java/org/apache/aries/transaction/ComponentTxDataTest.java
index c794a6b..9223790 100644
--- a/transaction/transaction-blueprint/src/test/java/org/apache/aries/transaction/ComponentTxDataTest.java
+++ b/transaction/transaction-blueprint/src/test/java/org/apache/aries/transaction/ComponentTxDataTest.java
@@ -102,7 +102,7 @@
                 throw new IllegalArgumentException(e1);

             }

         }

-        return txData.getEffectiveType(m);

+        return txData.getEffectiveType(m).get();

     }

 

 }