killbill-memoizeit

Details

account/pom.xml 2(+1 -1)

diff --git a/account/pom.xml b/account/pom.xml
index 803f964..2bc7a7b 100644
--- a/account/pom.xml
+++ b/account/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-account</artifactId>

api/pom.xml 2(+1 -1)

diff --git a/api/pom.xml b/api/pom.xml
index cb31f40..9129b20 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-internal-api</artifactId>

beatrix/pom.xml 2(+1 -1)

diff --git a/beatrix/pom.xml b/beatrix/pom.xml
index 3c4f78c..d6f1f37 100644
--- a/beatrix/pom.xml
+++ b/beatrix/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-beatrix</artifactId>

catalog/pom.xml 2(+1 -1)

diff --git a/catalog/pom.xml b/catalog/pom.xml
index 8326c73..129e5df 100644
--- a/catalog/pom.xml
+++ b/catalog/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-catalog</artifactId>

currency/pom.xml 2(+1 -1)

diff --git a/currency/pom.xml b/currency/pom.xml
index ec7bca9..1e5edc2 100644
--- a/currency/pom.xml
+++ b/currency/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-currency</artifactId>
diff --git a/entitlement/pom.xml b/entitlement/pom.xml
index acf371a..30db7f4 100644
--- a/entitlement/pom.xml
+++ b/entitlement/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-entitlement</artifactId>

invoice/pom.xml 2(+1 -1)

diff --git a/invoice/pom.xml b/invoice/pom.xml
index a3bfd4a..d68dee7 100644
--- a/invoice/pom.xml
+++ b/invoice/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-invoice</artifactId>

jaxrs/pom.xml 2(+1 -1)

diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml
index 9c978f0..14bc6ed 100644
--- a/jaxrs/pom.xml
+++ b/jaxrs/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-jaxrs</artifactId>

junction/pom.xml 2(+1 -1)

diff --git a/junction/pom.xml b/junction/pom.xml
index b945744..0fd4150 100644
--- a/junction/pom.xml
+++ b/junction/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-junction</artifactId>

NEWS 13(+11 -2)

diff --git a/NEWS b/NEWS
index 59cc6c7..767f9ea 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,15 @@
+0.11.9
+    payment: rework Janitor shutdown sequence
+    jdbc: integrate log4jdbc-log4j2
+    profiling: add support for JAX-RS and EhCache
+    Shiro integration bugfixes
+    Fix tests failures on H2
+    https://github.com/killbill/killbill/issues/204
+    Update killbill-oss-parent to 0.7.20
+
 0.11.8
-    Add suppport for profiling data
-    Harden code to fix sporadic failure in intergation tests
+    Add support for profiling data
+    Harden code to fix sporadic failure in integration tests
 
 0.11.6
     Payment subsystem (complete merge payment and direct payment, and does renaming)

overdue/pom.xml 2(+1 -1)

diff --git a/overdue/pom.xml b/overdue/pom.xml
index ecd620f..788e1f8 100644
--- a/overdue/pom.xml
+++ b/overdue/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-overdue</artifactId>

payment/pom.xml 2(+1 -1)

diff --git a/payment/pom.xml b/payment/pom.xml
index 8c23988..8cc8597 100644
--- a/payment/pom.xml
+++ b/payment/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-payment</artifactId>
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentErrorEvent.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentErrorEvent.java
index 82afcb7..d81ebad 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentErrorEvent.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentErrorEvent.java
@@ -74,6 +74,17 @@ public class DefaultPaymentErrorEvent extends BusEventBase implements PaymentErr
     }
 
     @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("DefaultPaymentErrorEvent{");
+        sb.append("message='").append(message).append('\'');
+        sb.append(", accountId=").append(accountId);
+        sb.append(", paymentId=").append(paymentId);
+        sb.append(", transactionType=").append(transactionType);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
     public boolean equals(final Object o) {
         if (this == o) {
             return true;
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java b/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java
index 377da1f..f848cf0 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java
@@ -68,7 +68,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
-import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
@@ -314,7 +313,7 @@ public class PaymentProcessor extends ProcessorBase {
                                      @Nullable final String paymentExternalKey, @Nullable final String paymentTransactionExternalKey,
                                      final boolean shouldLockAccountAndDispatch, @Nullable final OperationResult overridePluginOperationResult,
                                      final Iterable<PluginProperty> properties,
-                                     final CallContext callContext,final InternalCallContext internalCallContext) throws PaymentApiException {
+                                     final CallContext callContext, final InternalCallContext internalCallContext) throws PaymentApiException {
 
         validateUniqueTransactionExternalKey(paymentTransactionExternalKey, internalCallContext);
         final UUID nonNullPaymentId = paymentAutomatonRunner.run(isApiPayment,
@@ -357,7 +356,7 @@ public class PaymentProcessor extends ProcessorBase {
         return toPayment(paymentModelDao, transactionsForPayment, pluginInfo);
     }
 
-    private Payment toPayment(final PaymentModelDao curPaymentModelDao, final Iterable<PaymentTransactionModelDao> transactionsModelDao, @Nullable final List<PaymentTransactionInfoPlugin> pluginTransactions) {
+    private Payment toPayment(final PaymentModelDao curPaymentModelDao, final Iterable<PaymentTransactionModelDao> transactionsModelDao, @Nullable final Iterable<PaymentTransactionInfoPlugin> pluginTransactions) {
         final Ordering<PaymentTransaction> perPaymentTransactionOrdering = Ordering.<PaymentTransaction>from(new Comparator<PaymentTransaction>() {
             @Override
             public int compare(final PaymentTransaction o1, final PaymentTransaction o2) {
@@ -374,20 +373,19 @@ public class PaymentProcessor extends ProcessorBase {
 
         final Iterable<PaymentTransaction> transactions = Iterables.transform(filteredTransactions, new Function<PaymentTransactionModelDao, PaymentTransaction>() {
             @Override
-            public PaymentTransaction apply(final PaymentTransactionModelDao input) {
-
-                final PaymentTransactionInfoPlugin info = pluginTransactions != null ?
-                                                          Iterables.tryFind(pluginTransactions, new Predicate<PaymentTransactionInfoPlugin>() {
-                                                              @Override
-                                                              public boolean apply(final PaymentTransactionInfoPlugin input) {
-                                                                  return input.getKbTransactionPaymentId().equals(input.getKbTransactionPaymentId());
-                                                              }
-                                                          }).orNull() : null;
-
-                return new DefaultPaymentTransaction(input.getId(), input.getAttemptId(), input.getTransactionExternalKey(), input.getCreatedDate(), input.getUpdatedDate(), input.getPaymentId(),
-                                                     input.getTransactionType(), input.getEffectiveDate(), input.getTransactionStatus(), input.getAmount(), input.getCurrency(),
-                                                     input.getProcessedAmount(), input.getProcessedCurrency(),
-                                                     input.getGatewayErrorCode(), input.getGatewayErrorMsg(), info);
+            public PaymentTransaction apply(final PaymentTransactionModelDao paymentTransactionModelDao) {
+                final PaymentTransactionInfoPlugin paymentTransactionInfoPlugin = pluginTransactions != null ?
+                                                                                  Iterables.tryFind(pluginTransactions, new Predicate<PaymentTransactionInfoPlugin>() {
+                                                                                      @Override
+                                                                                      public boolean apply(final PaymentTransactionInfoPlugin paymentTransactionInfoPlugin) {
+                                                                                          return paymentTransactionModelDao.getId().equals(paymentTransactionInfoPlugin.getKbTransactionPaymentId());
+                                                                                      }
+                                                                                  }).orNull() : null;
+
+                return new DefaultPaymentTransaction(paymentTransactionModelDao.getId(), paymentTransactionModelDao.getAttemptId(), paymentTransactionModelDao.getTransactionExternalKey(), paymentTransactionModelDao.getCreatedDate(), paymentTransactionModelDao.getUpdatedDate(), paymentTransactionModelDao.getPaymentId(),
+                                                     paymentTransactionModelDao.getTransactionType(), paymentTransactionModelDao.getEffectiveDate(), paymentTransactionModelDao.getTransactionStatus(), paymentTransactionModelDao.getAmount(), paymentTransactionModelDao.getCurrency(),
+                                                     paymentTransactionModelDao.getProcessedAmount(), paymentTransactionModelDao.getProcessedCurrency(),
+                                                     paymentTransactionModelDao.getGatewayErrorCode(), paymentTransactionModelDao.getGatewayErrorMsg(), paymentTransactionInfoPlugin);
             }
         });
 
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/OperationCallbackBase.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/OperationCallbackBase.java
index d4da958..6a81f1d 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/sm/OperationCallbackBase.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/OperationCallbackBase.java
@@ -32,7 +32,7 @@ import org.killbill.commons.locker.GlobalLocker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class OperationCallbackBase {
+public abstract class OperationCallbackBase<CallbackOperationResult, CallbackOperationException extends Exception> {
 
     protected final Logger logger = LoggerFactory.getLogger(OperationCallbackBase.class);
 
@@ -60,8 +60,8 @@ public abstract class OperationCallbackBase {
 
         try {
             final Callable<PluginDispatcherReturnType<OperationResult>> task = new CallableWithAccountLock<OperationResult, ExceptionType>(locker,
-                                                                                                               account.getExternalKey(),
-                                                                                                               callback);
+                                                                                                                                           account.getExternalKey(),
+                                                                                                                                           callback);
             final OperationResult operationResult = paymentPluginDispatcher.dispatchWithTimeout(task);
             logger.debug("Successful plugin call for account {} with result {}", account.getExternalKey(), operationResult);
             return operationResult;
@@ -81,8 +81,7 @@ public abstract class OperationCallbackBase {
     // There is a base glue code that is common to all calls and shared in a base class and then a per call specific operation
     // using the doCallSpecificOperationCallback method below.
     //
-    protected abstract <CallbackOperationResult, CallbackOperationException extends Exception> CallbackOperationResult doCallSpecificOperationCallback()
-            throws CallbackOperationException;
+    protected abstract CallbackOperationResult doCallSpecificOperationCallback() throws CallbackOperationException;
 
     //
     // The methods below allow to convert the exceptions thrown back by the Executor into an appropriate  OperationException
@@ -92,5 +91,4 @@ public abstract class OperationCallbackBase {
     protected abstract OperationException wrapTimeoutException(final PaymentStateContext paymentStateContext, final TimeoutException e);
 
     protected abstract OperationException wrapInterruptedException(final PaymentStateContext paymentStateContext, final InterruptedException e);
-
 }
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentOperation.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentOperation.java
index 556fb42..e2b2a65 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentOperation.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/PaymentOperation.java
@@ -26,7 +26,6 @@ import org.killbill.automaton.Operation.OperationCallback;
 import org.killbill.automaton.OperationException;
 import org.killbill.automaton.OperationResult;
 import org.killbill.billing.ErrorCode;
-import org.killbill.billing.osgi.api.OSGIServiceRegistration;
 import org.killbill.billing.payment.api.PaymentApiException;
 import org.killbill.billing.payment.api.TransactionStatus;
 import org.killbill.billing.payment.api.TransactionType;
@@ -43,14 +42,12 @@ import org.killbill.commons.locker.GlobalLocker;
 import org.killbill.commons.locker.LockFailedException;
 
 import com.google.common.base.Objects;
-
-import com.google.common.base.Objects;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 
 // Encapsulates the payment specific logic
-public abstract class PaymentOperation extends OperationCallbackBase implements OperationCallback {
+public abstract class PaymentOperation extends OperationCallbackBase<PaymentTransactionInfoPlugin, PaymentPluginApiException> implements OperationCallback {
 
     protected final PaymentAutomatonDAOHelper daoHelper;
     protected PaymentPluginApi plugin;
@@ -63,12 +60,9 @@ public abstract class PaymentOperation extends OperationCallbackBase implements 
         this.daoHelper = daoHelper;
     }
 
-
     @Override
     public OperationResult doOperationCallback() throws OperationException {
-
         try {
-
             this.plugin = daoHelper.getPaymentProviderPlugin();
 
             if (paymentStateContext.shouldLockAccountAndDispatch()) {
@@ -76,7 +70,7 @@ public abstract class PaymentOperation extends OperationCallbackBase implements 
             } else {
                 return doSimpleOperationCallback();
             }
-        } catch (PaymentApiException e) {
+        } catch (final PaymentApiException e) {
             throw new OperationException(e, OperationResult.EXCEPTION);
         }
     }
@@ -126,7 +120,7 @@ public abstract class PaymentOperation extends OperationCallbackBase implements 
 
     protected BigDecimal getSumAmount(final Iterable<PaymentTransactionModelDao> transactions) {
         BigDecimal result = BigDecimal.ZERO;
-        Iterator<PaymentTransactionModelDao> iterator = transactions.iterator();
+        final Iterator<PaymentTransactionModelDao> iterator = transactions.iterator();
         while (iterator.hasNext()) {
             result = result.add(iterator.next().getAmount());
         }
@@ -148,7 +142,7 @@ public abstract class PaymentOperation extends OperationCallbackBase implements 
             return doOperation();
         } catch (final PaymentApiException e) {
             throw new OperationException(e, OperationResult.FAILURE);
-        } catch (RuntimeException e) {
+        } catch (final RuntimeException e) {
             throw new OperationException(e, OperationResult.EXCEPTION);
         }
     }
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/sm/RetryOperationCallback.java b/payment/src/main/java/org/killbill/billing/payment/core/sm/RetryOperationCallback.java
index d73d022..0e44d5c 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/sm/RetryOperationCallback.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/sm/RetryOperationCallback.java
@@ -32,8 +32,8 @@ import org.killbill.billing.callcontext.DefaultCallContext;
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.osgi.api.OSGIServiceRegistration;
 import org.killbill.billing.payment.api.Payment;
-import org.killbill.billing.payment.api.PaymentTransaction;
 import org.killbill.billing.payment.api.PaymentApiException;
+import org.killbill.billing.payment.api.PaymentTransaction;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.payment.api.TransactionStatus;
 import org.killbill.billing.payment.api.TransactionType;
@@ -52,14 +52,13 @@ import org.killbill.commons.locker.LockFailedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class RetryOperationCallback extends OperationCallbackBase implements OperationCallback {
+public abstract class RetryOperationCallback extends OperationCallbackBase<Payment, PaymentApiException> implements OperationCallback {
 
     private final OSGIServiceRegistration<PaymentControlPluginApi> paymentControlPluginRegistry;
 
     protected final PaymentProcessor paymentProcessor;
     protected final RetryablePaymentStateContext retryablePaymentStateContext;
 
-
     private final Logger logger = LoggerFactory.getLogger(RetryOperationCallback.class);
 
     protected RetryOperationCallback(final GlobalLocker locker, final PluginDispatcher<OperationResult> paymentPluginDispatcher, final RetryablePaymentStateContext paymentStateContext, final PaymentProcessor paymentProcessor, final OSGIServiceRegistration<PaymentControlPluginApi> retryPluginRegistry) {
@@ -69,7 +68,6 @@ public abstract class RetryOperationCallback extends OperationCallbackBase imple
         this.retryablePaymentStateContext = paymentStateContext;
     }
 
-
     @Override
     protected abstract Payment doCallSpecificOperationCallback() throws PaymentApiException;
 
@@ -101,12 +99,12 @@ public abstract class RetryOperationCallback extends OperationCallbackBase imple
                         // Transition to ABORTED
                         return PluginDispatcher.createPluginDispatcherReturnType(OperationResult.EXCEPTION);
                     }
-                } catch (PaymentControlApiException e) {
+                } catch (final PaymentControlApiException e) {
                     // Transition to ABORTED and throw PaymentControlApiException to caller.
                     throw new OperationException(e, OperationResult.EXCEPTION);
                 }
 
-                boolean success;
+                final boolean success;
                 try {
                     // Adjust amount with value returned by plugin if necessary
                     if (paymentStateContext.getAmount() == null ||
@@ -141,10 +139,10 @@ public abstract class RetryOperationCallback extends OperationCallbackBase imple
                     } else {
                         throw new OperationException(null, getOperationResultAndSetContext(retryablePaymentStateContext, paymentControlContext));
                     }
-                } catch (PaymentApiException e) {
+                } catch (final PaymentApiException e) {
                     // Wrap PaymentApiException, and throw a new OperationException with an ABORTED/FAILURE state based on the retry result.
                     throw new OperationException(e, getOperationResultAndSetContext(retryablePaymentStateContext, paymentControlContext));
-                } catch (RuntimeException e) {
+                } catch (final RuntimeException e) {
                     // Attempts to set the retry date in context if needed.
                     getOperationResultAndSetContext(retryablePaymentStateContext, paymentControlContext);
                     throw e;
@@ -183,7 +181,7 @@ public abstract class RetryOperationCallback extends OperationCallbackBase imple
         final PaymentControlPluginApi plugin = paymentControlPluginRegistry.getServiceForName(pluginName);
         try {
             plugin.onSuccessCall(paymentControlContext);
-        } catch (PaymentControlApiException e) {
+        } catch (final PaymentControlApiException e) {
             logger.warn("Plugin " + pluginName + " failed to complete onCompletion call for " + paymentControlContext.getPaymentExternalKey(), e);
         }
     }
@@ -195,7 +193,6 @@ public abstract class RetryOperationCallback extends OperationCallbackBase imple
     }
 
     private PriorPaymentControlResult getPluginResult(final String pluginName, final PaymentControlContext paymentControlContext) throws PaymentControlApiException {
-
         final PaymentControlPluginApi plugin = paymentControlPluginRegistry.getServiceForName(pluginName);
         final PriorPaymentControlResult result = plugin.priorCall(paymentControlContext);
         return result;
@@ -216,13 +213,12 @@ public abstract class RetryOperationCallback extends OperationCallbackBase imple
             final PaymentControlPluginApi plugin = paymentControlPluginRegistry.getServiceForName(pluginName);
             final FailureCallResult result = plugin.onFailureCall(paymentControlContext);
             return result.getNextRetryDate();
-        } catch (PaymentControlApiException e) {
+        } catch (final PaymentControlApiException e) {
             logger.warn("Plugin " + pluginName + " failed to return next retryDate for payment " + paymentControlContext.getPaymentExternalKey(), e);
             return null;
         }
     }
 
-
     public static class DefaultPaymentControlContext extends DefaultCallContext implements PaymentControlContext {
 
         private final Account account;
@@ -324,12 +320,10 @@ public abstract class RetryOperationCallback extends OperationCallbackBase imple
             return isApiPayment;
         }
 
-
         public UUID getTransactionId() {
             return transactionId;
         }
 
-
         @Override
         public Iterable<PluginProperty> getPluginProperties() {
             return properties;

pom.xml 4(+2 -2)

diff --git a/pom.xml b/pom.xml
index 4151d5c..4648d6d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,10 +20,10 @@
     <parent>
         <artifactId>killbill-oss-parent</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.7.20-SNAPSHOT</version>
+        <version>0.7.20</version>
     </parent>
     <artifactId>killbill</artifactId>
-    <version>0.11.9-SNAPSHOT</version>
+    <version>0.11.10-SNAPSHOT</version>
     <packaging>pom</packaging>
     <name>killbill</name>
     <description>Library for managing recurring subscriptions and the associated billing</description>
diff --git a/profiles/killbill/pom.xml b/profiles/killbill/pom.xml
index c7d415b..0277ed7 100644
--- a/profiles/killbill/pom.xml
+++ b/profiles/killbill/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>killbill-profiles</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-profiles-killbill</artifactId>
diff --git a/profiles/killbill/src/main/resources/logback.xml b/profiles/killbill/src/main/resources/logback.xml
index 9bab6a4..b146654 100644
--- a/profiles/killbill/src/main/resources/logback.xml
+++ b/profiles/killbill/src/main/resources/logback.xml
@@ -177,7 +177,7 @@
     </logger>
 
     <!-- Silence verbose loggers in DEBUG mode -->
-    <logger name="com.dmurph" level="INFO"/>
+    <logger name="com.dmurph" level="OFF"/>
     <logger name="org.killbill.billing.notificationq" level="INFO"/>
     <logger name="org.killbill.billing.queue" level="INFO"/>
     <logger name="org.killbill.billing.server.updatechecker" level="INFO"/>
diff --git a/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties b/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties
index dab32ca..f04e249 100644
--- a/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties
+++ b/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties
@@ -3,34 +3,49 @@
 
 ### 0.11.x series ###
 
-## 0.11.7 -- latest unstable release
-0.11.7.updates           =
-0.11.7.notices           = This is the latest dev release.
+## 0.11.9 -- latest unstable release
+0.11.9.updates           =
+0.11.9.notices           = This is the latest dev release.
+0.11.9.release-notes     = http://kill-bill.org
+
+## 0.11.8
+0.11.8.updates           = 0.11.9
+0.11.8.notices           = We recommend upgrading to 0.11.9, our latest dev release.
+0.11.8.release-notes     = http://kill-bill.org
+
+## 0.11.7
+0.11.7.updates           = 0.11.9
+0.11.7.notices           = We recommend upgrading to 0.11.9, our latest dev release.
 0.11.7.release-notes     = http://kill-bill.org
 
-## 0.11.5 -- latest unstable release
-0.11.5.updates           = 0.11.7
-0.11.5.notices           = This is the latest dev release.
+## 0.11.6
+0.11.6.updates           = 0.11.9
+0.11.6.notices           = We recommend upgrading to 0.11.9, our latest dev release.
+0.11.6.release-notes     = http://kill-bill.org
+
+## 0.11.5
+0.11.5.updates           = 0.11.9
+0.11.5.notices           = We recommend upgrading to 0.11.9, our latest dev release.
 0.11.5.release-notes     = http://kill-bill.org
 
 ## 0.11.4
-0.11.4.updates           = 0.11.7
-0.11.4.notices           = We recommend upgrading to 0.11.7, our latest dev release.
+0.11.4.updates           = 0.11.9
+0.11.4.notices           = We recommend upgrading to 0.11.9, our latest dev release.
 0.11.4.release-notes     = http://kill-bill.org
 
 ## 0.11.3
-0.11.3.updates           = 0.11.7
-0.11.3.notices           = We recommend upgrading to 0.11.7, our latest dev release.
+0.11.3.updates           = 0.11.9
+0.11.3.notices           = We recommend upgrading to 0.11.9, our latest dev release.
 0.11.3.release-notes     = http://kill-bill.org
 
 ## 0.11.2
-0.11.2.updates           = 0.11.7
-0.11.2.notices           = We recommend upgrading to 0.11.7, our latest dev release.
+0.11.2.updates           = 0.11.9
+0.11.2.notices           = We recommend upgrading to 0.11.9, our latest dev release.
 0.11.2.release-notes     = http://kill-bill.org
 
 ## 0.11.1
-0.11.1.updates           = 0.11.7
-0.11.1.notices           = We recommend upgrading to 0.11.7, our latest dev release.
+0.11.1.updates           = 0.11.9
+0.11.1.notices           = We recommend upgrading to 0.11.9, our latest dev release.
 0.11.1.release-notes     = http://kill-bill.org
 
 ### 0.10.x series ###
diff --git a/profiles/killpay/pom.xml b/profiles/killpay/pom.xml
index bf56d50..4024de5 100644
--- a/profiles/killpay/pom.xml
+++ b/profiles/killpay/pom.xml
@@ -20,7 +20,7 @@
     <parent>
         <artifactId>killbill-profiles</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-profiles-killpay</artifactId>
diff --git a/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties b/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties
index 8b7b2a4..a56bcc5 100644
--- a/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties
+++ b/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties
@@ -3,7 +3,27 @@
 
 ### 0.11.x series ###
 
-## 0.11.5 -- latest unstable release
-0.11.5.updates           =
-0.11.5.notices           = This is the latest dev release.
+## 0.11.9 -- latest unstable release
+0.11.9.updates           =
+0.11.9.notices           = This is the latest dev release.
+0.11.9.release-notes     = http://kill-bill.org
+
+## 0.11.8
+0.11.8.updates           = 0.11.9
+0.11.8.notices           = We recommend upgrading to 0.11.9, our latest dev release.
+0.11.8.release-notes     = http://kill-bill.org
+
+## 0.11.7
+0.11.7.updates           = 0.11.9
+0.11.7.notices           = We recommend upgrading to 0.11.9, our latest dev release.
+0.11.7.release-notes     = http://kill-bill.org
+
+## 0.11.6
+0.11.6.updates           = 0.11.9
+0.11.6.notices           = We recommend upgrading to 0.11.9, our latest dev release.
+0.11.6.release-notes     = http://kill-bill.org
+
+## 0.11.5
+0.11.5.updates           = 0.11.9
+0.11.5.notices           = We recommend upgrading to 0.11.9, our latest dev release.
 0.11.5.release-notes     = http://kill-bill.org

profiles/pom.xml 2(+1 -1)

diff --git a/profiles/pom.xml b/profiles/pom.xml
index 0f6d190..7e8d594 100644
--- a/profiles/pom.xml
+++ b/profiles/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-profiles</artifactId>
diff --git a/subscription/pom.xml b/subscription/pom.xml
index 9b43ffe..1b46563 100644
--- a/subscription/pom.xml
+++ b/subscription/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-subscription</artifactId>

tenant/pom.xml 2(+1 -1)

diff --git a/tenant/pom.xml b/tenant/pom.xml
index 02b3d0f..13b6f60 100644
--- a/tenant/pom.xml
+++ b/tenant/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-tenant</artifactId>

usage/pom.xml 2(+1 -1)

diff --git a/usage/pom.xml b/usage/pom.xml
index 24def5c..0d62d1a 100644
--- a/usage/pom.xml
+++ b/usage/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-usage</artifactId>

util/pom.xml 2(+1 -1)

diff --git a/util/pom.xml b/util/pom.xml
index 2d4c8a8..71477c8 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -12,7 +12,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.11.9-SNAPSHOT</version>
+        <version>0.11.10-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-util</artifactId>
diff --git a/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldCreationEvent.java b/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldCreationEvent.java
index 97e131d..a2572b6 100644
--- a/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldCreationEvent.java
+++ b/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldCreationEvent.java
@@ -67,6 +67,16 @@ public class DefaultCustomFieldCreationEvent extends BusEventBase implements Cus
     }
 
     @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("DefaultCustomFieldCreationEvent{");
+        sb.append("customFieldId=").append(customFieldId);
+        sb.append(", objectId=").append(objectId);
+        sb.append(", objectType=").append(objectType);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
     public boolean equals(final Object o) {
         if (this == o) {
             return true;
diff --git a/util/src/main/java/org/killbill/billing/util/security/api/DefaultSecurityApi.java b/util/src/main/java/org/killbill/billing/util/security/api/DefaultSecurityApi.java
index a699084..5d0bc2b 100644
--- a/util/src/main/java/org/killbill/billing/util/security/api/DefaultSecurityApi.java
+++ b/util/src/main/java/org/killbill/billing/util/security/api/DefaultSecurityApi.java
@@ -40,9 +40,16 @@ public class DefaultSecurityApi implements SecurityApi {
     private static final String[] allPermissions = new String[Permission.values().length];
 
     @Override
-    public void login(final Object principal, final Object credentials) {
+    public synchronized void login(final Object principal, final Object credentials) {
         final Subject currentUser = SecurityUtils.getSubject();
 
+        // Workaround for https://issues.apache.org/jira/browse/SHIRO-510
+        // TODO Not sure if it's a good fix?
+        if (principal.equals(currentUser.getPrincipal()) &&
+            currentUser.isAuthenticated()) {
+            return;
+        }
+
         // UsernamePasswordToken is hardcoded in AuthenticatingRealm
         if (principal instanceof String && credentials instanceof String) {
             currentUser.login(new UsernamePasswordToken((String) principal, (String) credentials));