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();
}
}