@Subscribe
 public void handleSubscriptionEvents(final EffectiveSubscriptionInternalEvent eventEffective) {
   log.info(String.format("Got subscription event %s", eventEffective.toString()));
   switch (eventEffective.getTransitionType()) {
     case TRANSFER:
       assertEqualsNicely(NextEvent.TRANSFER);
       notifyIfStackEmpty();
       break;
     case CREATE:
       assertEqualsNicely(NextEvent.CREATE);
       notifyIfStackEmpty();
       break;
     case CANCEL:
       assertEqualsNicely(NextEvent.CANCEL);
       notifyIfStackEmpty();
       break;
     case CHANGE:
       assertEqualsNicely(NextEvent.CHANGE);
       notifyIfStackEmpty();
       break;
     case UNCANCEL:
       assertEqualsNicely(NextEvent.UNCANCEL);
       notifyIfStackEmpty();
       break;
     case PHASE:
       assertEqualsNicely(NextEvent.PHASE);
       notifyIfStackEmpty();
       break;
     case BCD_CHANGE:
       assertEqualsNicely(NextEvent.BCD_CHANGE);
       notifyIfStackEmpty();
       break;
     default:
       throw new RuntimeException(
           "Unexpected event type " + eventEffective.getRequestedTransitionTime());
   }
 }
 @Subscribe
 public void handlePaymentPluginErrorEvents(final PaymentPluginErrorInternalEvent event) {
   log.info(String.format("Got PaymentPluginError event %s", event.toString()));
   assertEqualsNicely(NextEvent.PAYMENT_PLUGIN_ERROR);
   notifyIfStackEmpty();
 }
 @Subscribe
 public void handlePaymentEvents(final PaymentInfoInternalEvent event) {
   log.info(String.format("Got PaymentInfo event %s", event.toString()));
   assertEqualsNicely(NextEvent.PAYMENT);
   notifyIfStackEmpty();
 }
 @Subscribe
 public void handleInvoicePaymentErrorEvents(final InvoicePaymentErrorInternalEvent event) {
   log.info(String.format("Got InvoicePaymentError event %s", event.toString()));
   assertEqualsNicely(NextEvent.INVOICE_PAYMENT_ERROR);
   notifyIfStackEmpty();
 }
 @Subscribe
 public void handleInvoiceAdjustmentEvents(final InvoiceAdjustmentInternalEvent event) {
   log.info(String.format("Got Invoice adjustment event %s", event.toString()));
   assertEqualsNicely(NextEvent.INVOICE_ADJUSTMENT);
   notifyIfStackEmpty();
 }
 @Subscribe
 public void handleInvoiceEvents(final InvoiceCreationInternalEvent event) {
   log.info(String.format("Got Invoice event %s", event.toString()));
   assertEqualsNicely(NextEvent.INVOICE);
   notifyIfStackEmpty();
 }
 @Subscribe
 public synchronized void processTagDefinitonEvent(final TagDefinitionInternalEvent event) {
   log.info(String.format("Got TagDefinitionInternalEvent event %s", event.toString()));
   assertEqualsNicely(NextEvent.TAG_DEFINITION);
   notifyIfStackEmpty();
 }
 @Subscribe
 public synchronized void processCustomFieldEvent(final CustomFieldEvent event) {
   log.info(String.format("Got CustomFieldEvent event %s", event.toString()));
   assertEqualsNicely(NextEvent.CUSTOM_FIELD);
   notifyIfStackEmpty();
 }
 @Subscribe
 public void handleEntitlementEvents(final BlockingTransitionInternalEvent event) {
   log.info(String.format("Got entitlement event %s", event.toString()));
   assertEqualsNicely(NextEvent.BLOCK);
   notifyIfStackEmpty();
 }
 @Subscribe
 public void handleBroadcastEvents(final BroadcastInternalEvent event) {
   log.info(String.format("Got BroadcastInternalEvent event %s", event.toString()));
   assertEqualsNicely(NextEvent.BROADCAST_SERVICE);
   notifyIfStackEmpty();
 }