killbill-aplcache

config: avoid introspection by hardcoding method names Signed-off-by:

8/24/2016 6:38:41 PM

Details

diff --git a/invoice/src/main/java/org/killbill/billing/invoice/config/MultiTenantInvoiceConfig.java b/invoice/src/main/java/org/killbill/billing/invoice/config/MultiTenantInvoiceConfig.java
index 65f339f..2a9a435 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/config/MultiTenantInvoiceConfig.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/config/MultiTenantInvoiceConfig.java
@@ -18,6 +18,8 @@
 package org.killbill.billing.invoice.config;
 
 import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -31,6 +33,7 @@ import org.skife.config.TimeSpan;
 
 public class MultiTenantInvoiceConfig extends MultiTenantConfigBase implements InvoiceConfig {
 
+    private final Map<String, Method> methodsCache = new HashMap<String, Method>();
     private final InvoiceConfig staticConfig;
 
     @Inject
@@ -46,8 +49,7 @@ public class MultiTenantInvoiceConfig extends MultiTenantConfigBase implements I
 
     @Override
     public int getNumberOfMonthsInFuture(final InternalTenantContext tenantContext) {
-        final Method method = new Object(){}.getClass().getEnclosingMethod();
-        final String result = getStringTenantConfig(method.getName(), tenantContext);
+        final String result = getStringTenantConfig("getNumberOfMonthsInFuture", tenantContext);
         if (result != null) {
             return Integer.parseInt(result);
         }
@@ -61,8 +63,7 @@ public class MultiTenantInvoiceConfig extends MultiTenantConfigBase implements I
 
     @Override
     public TimeSpan getDryRunNotificationSchedule(final InternalTenantContext tenantContext) {
-        final Method method = new Object(){}.getClass().getEnclosingMethod();
-        final String result = getStringTenantConfig(method.getName(), tenantContext);
+        final String result = getStringTenantConfig("getDryRunNotificationSchedule", tenantContext);
         if (result != null) {
             return new TimeSpan(result);
         }
@@ -76,8 +77,7 @@ public class MultiTenantInvoiceConfig extends MultiTenantConfigBase implements I
 
     @Override
     public int getMaxRawUsagePreviousPeriod(final InternalTenantContext tenantContext) {
-        final Method method = new Object(){}.getClass().getEnclosingMethod();
-        final String result = getStringTenantConfig(method.getName(), tenantContext);
+        final String result = getStringTenantConfig("getMaxRawUsagePreviousPeriod", tenantContext);
         if (result != null) {
             return Integer.parseInt(result);
         }
@@ -96,10 +96,20 @@ public class MultiTenantInvoiceConfig extends MultiTenantConfigBase implements I
 
     @Override
     protected Method getConfigStaticMethod(final String methodName) {
-        try {
-            return InvoiceConfig.class.getMethod(methodName, InternalTenantContext.class);
-        } catch (final NoSuchMethodException e) {
-            throw new RuntimeException(e);
+        Method method = methodsCache.get(methodName);
+        if (method == null) {
+            synchronized (methodsCache) {
+                method = methodsCache.get(methodName);
+                if (method == null) {
+                    try {
+                        method = InvoiceConfig.class.getMethod(methodName, InternalTenantContext.class);
+                        methodsCache.put(methodName, method);
+                    } catch (final NoSuchMethodException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+            }
         }
+        return method;
     }
 }
diff --git a/payment/src/main/java/org/killbill/billing/payment/config/MultiTenantPaymentConfig.java b/payment/src/main/java/org/killbill/billing/payment/config/MultiTenantPaymentConfig.java
index bbf365f..68d9e88 100644
--- a/payment/src/main/java/org/killbill/billing/payment/config/MultiTenantPaymentConfig.java
+++ b/payment/src/main/java/org/killbill/billing/payment/config/MultiTenantPaymentConfig.java
@@ -48,11 +48,9 @@ public class MultiTenantPaymentConfig extends MultiTenantConfigBase implements P
 
     @Override
     public List<Integer> getPaymentFailureRetryDays(@Param("dummy") final InternalTenantContext tenantContext) {
-        // There is no good way to achieve that in java; this solution is expensive (we could consider hardcoding the method name each time instead)
-        final Method method = new Object() {}.getClass().getEnclosingMethod();
-        final String result = getStringTenantConfig(method.getName(), tenantContext);
+        final String result = getStringTenantConfig("getPaymentFailureRetryDays", tenantContext);
         if (result != null) {
-            return convertToListInteger(result, method.getName());
+            return convertToListInteger(result, "getPaymentFailureRetryDays");
         }
         return getPaymentFailureRetryDays();
     }
@@ -64,8 +62,7 @@ public class MultiTenantPaymentConfig extends MultiTenantConfigBase implements P
 
     @Override
     public int getPluginFailureInitialRetryInSec(@Param("dummy") final InternalTenantContext tenantContext) {
-        final Method method = new Object() {}.getClass().getEnclosingMethod();
-        final String result = getStringTenantConfig(method.getName(), tenantContext);
+        final String result = getStringTenantConfig("getPluginFailureInitialRetryInSec", tenantContext);
         if (result != null) {
             return Integer.parseInt(result);
         }
@@ -79,9 +76,7 @@ public class MultiTenantPaymentConfig extends MultiTenantConfigBase implements P
 
     @Override
     public int getPluginFailureRetryMultiplier(@Param("dummy") final InternalTenantContext tenantContext) {
-        final Method method = new Object() {}.getClass().getEnclosingMethod();
-
-        final String result = getStringTenantConfig(method.getName(), tenantContext);
+        final String result = getStringTenantConfig("getPluginFailureRetryMultiplier", tenantContext);
         if (result != null) {
             return Integer.parseInt(result);
         }
@@ -95,11 +90,9 @@ public class MultiTenantPaymentConfig extends MultiTenantConfigBase implements P
 
     @Override
     public List<TimeSpan> getIncompleteTransactionsRetries(@Param("dummy") final InternalTenantContext tenantContext) {
-        final Method method = new Object() {}.getClass().getEnclosingMethod();
-
-        final String result = getStringTenantConfig(method.getName(), tenantContext);
+        final String result = getStringTenantConfig("getIncompleteTransactionsRetries", tenantContext);
         if (result != null) {
-            return convertToListTimeSpan(result, method.getName());
+            return convertToListTimeSpan(result, "getIncompleteTransactionsRetries");
         }
         return getIncompleteTransactionsRetries();
     }
@@ -111,9 +104,7 @@ public class MultiTenantPaymentConfig extends MultiTenantConfigBase implements P
 
     @Override
     public int getPluginFailureRetryMaxAttempts(@Param("dummy") final InternalTenantContext tenantContext) {
-        final Method method = new Object() {}.getClass().getEnclosingMethod();
-
-        final String result = getStringTenantConfig(method.getName(), tenantContext);
+        final String result = getStringTenantConfig("getPluginFailureRetryMaxAttempts", tenantContext);
         if (result != null) {
             return Integer.parseInt(result);
         }
@@ -127,11 +118,9 @@ public class MultiTenantPaymentConfig extends MultiTenantConfigBase implements P
 
     @Override
     public List<String> getPaymentControlPluginNames(@Param("dummy") final InternalTenantContext tenantContext) {
-        final Method method = new Object() {}.getClass().getEnclosingMethod();
-
-        final String result = getStringTenantConfig(method.getName(), tenantContext);
+        final String result = getStringTenantConfig("getPaymentControlPluginNames", tenantContext);
         if (result != null) {
-            return convertToListString(result, method.getName());
+            return convertToListString(result, "getPaymentControlPluginNames");
         }
         return getPaymentControlPluginNames();
     }
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/config/MultiTenantNotificationConfig.java b/profiles/killbill/src/main/java/org/killbill/billing/server/config/MultiTenantNotificationConfig.java
index cfea29b..509f147 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/config/MultiTenantNotificationConfig.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/config/MultiTenantNotificationConfig.java
@@ -57,11 +57,9 @@ public class MultiTenantNotificationConfig extends MultiTenantConfigBase impleme
 
     @Override
     public List<TimeSpan> getPushNotificationsRetries(@Param("dummy") final InternalTenantContext tenantContext) {
-        final Method method = new Object() {}.getClass().getEnclosingMethod();
-
-        final String result = getStringTenantConfig(method.getName(), tenantContext);
+        final String result = getStringTenantConfig("getPushNotificationsRetries", tenantContext);
         if (result != null) {
-            return convertToListTimeSpan(result, method.getName());
+            return convertToListTimeSpan(result, "getPushNotificationsRetries");
         }
         return getPushNotificationsRetries();
     }