killbill-aplcache

Tiered Block Price Override!

10/28/2016 3:36:21 PM

Changes

bin/start-server 2(+1 -1)

Details

bin/start-server 2(+1 -1)

diff --git a/bin/start-server b/bin/start-server
index f6c4786..064ea13 100755
--- a/bin/start-server
+++ b/bin/start-server
@@ -41,7 +41,7 @@ HOSTNAME=`hostname`
 PORT=8080
 JMX_PORT=8989
 START=
-DEBUG=8080
+DEBUG=
 WAIT_DEBUGGER=
 
 
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java b/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java
index 273fa61..dcc41ec 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/caching/EhCacheOverriddenPlanCache.java
@@ -91,7 +91,6 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
         final PlanPhasePriceOverride[] result = new PlanPhasePriceOverride[defaultPlan.getAllPhases().length];
 
         for (int i = 0; i < defaultPlan.getAllPhases().length; i++) {
-
             final PlanPhase curPhase = defaultPlan.getAllPhases()[i];
             final CatalogOverridePhaseDefinitionModelDao overriddenPhase = Iterables.tryFind(phaseDefs, new Predicate<CatalogOverridePhaseDefinitionModelDao>() {
                 @Override
@@ -100,9 +99,12 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
                 }
             }).orNull();
 
-            result[i] = (overriddenPhase != null) ?
-                        new DefaultPlanPhasePriceOverride(curPhase.getName(), Currency.valueOf(overriddenPhase.getCurrency()), overriddenPhase.getFixedPrice(), overriddenPhase.getRecurringPrice(), getUsagePriceOverrides(curPhase, overriddenPhase, context)) :
-                        null;
+            if(overriddenPhase != null){
+              List<UsagePriceOverride> usagePriceOverrides =  getUsagePriceOverrides(curPhase, overriddenPhase, context);
+              result[i] = new DefaultPlanPhasePriceOverride(curPhase.getName(), Currency.valueOf(overriddenPhase.getCurrency()), overriddenPhase.getFixedPrice(), overriddenPhase.getRecurringPrice(), usagePriceOverrides);
+            }
+            else
+              result[i] = null;
         }
         return result;
     }
@@ -122,13 +124,14 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
                 }
             }).orNull();
 
-            if(overriddenUsage != null)
-               usagePriceOverrides.add(new DefaultUsagePriceOverride(overriddenUsage.getParentUsageName(), curUsage.getUsageType(), getTierPriceOverrides(curUsage, overriddenUsage, context)));
+            if(overriddenUsage != null) {
+                List<TierPriceOverride> tierPriceOverrides = getTierPriceOverrides(curUsage, overriddenUsage, context);
+                usagePriceOverrides.add(new DefaultUsagePriceOverride(overriddenUsage.getParentUsageName(), curUsage.getUsageType(),tierPriceOverrides));
+            }
             else
                 usagePriceOverrides.add(null);
         }
         return usagePriceOverrides;
-
     }
 
     List<TierPriceOverride> getTierPriceOverrides(Usage curUsage, CatalogOverrideUsageDefinitionModelDao overriddenUsage, final InternalTenantContext context) {
@@ -162,13 +165,14 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
 
             }).orNull();
 
-            if(overriddenTier != null)
-                tierPriceOverrides.add(new DefaultTierPriceOverride(getTieredBlockPriceOverrides(curTier, overriddenTier, context)));
+            if(overriddenTier != null) {
+                List<TieredBlockPriceOverride> tieredBlockPriceOverrides = getTieredBlockPriceOverrides(curTier, overriddenTier, context);
+                tierPriceOverrides.add(new DefaultTierPriceOverride(tieredBlockPriceOverrides));
+            }
             else
                 tierPriceOverrides.add(null);
         }
         return tierPriceOverrides;
-
     }
 
     List<TieredBlockPriceOverride> getTieredBlockPriceOverrides(Tier curTier, CatalogOverrideTierDefinitionModelDao overriddenTier, final InternalTenantContext context) {
@@ -186,12 +190,10 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
             }).orNull();
 
             if(overriddenTierBlock != null)
-                blockPriceOverrides.add(new DefaultTieredBlockPriceOverride(overriddenTierBlock.getParentUnitName(),overriddenTierBlock.getSize(),overriddenTierBlock.getPrice(),overriddenTierBlock.getMax()));
+                blockPriceOverrides.add(new DefaultTieredBlockPriceOverride(overriddenTierBlock.getParentUnitName(), overriddenTierBlock.getSize(), overriddenTierBlock.getPrice(), overriddenTierBlock.getMax()));
             else
                 blockPriceOverrides.add(null);
         }
         return blockPriceOverrides;
-
     }
-
 }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionModelDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionModelDao.java
index f5e252a..6b9ee0b 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionModelDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionModelDao.java
@@ -69,7 +69,6 @@ public class CatalogOverrideBlockDefinitionModelDao {
         this.size = size;
     }
 
-
     public double getMax() {
         return max;
     }
@@ -102,7 +101,6 @@ public class CatalogOverrideBlockDefinitionModelDao {
         this.createdBy = createdBy;
     }
 
-
     public Long getTenantRecordId() {
         return tenantRecordId;
     }
@@ -115,7 +113,6 @@ public class CatalogOverrideBlockDefinitionModelDao {
     }
 
     public CatalogOverrideBlockDefinitionModelDao(String parentUnitName, String currency, BigDecimal price, double size, double max, DateTime effectiveDate) {
-
         this.parentUnitName = parentUnitName;
         this.currency = currency;
         this.price = price;
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageModelDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageModelDao.java
index 97275d8..f2b54d8 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageModelDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageModelDao.java
@@ -32,7 +32,6 @@ public class CatalogOverridePhaseUsageModelDao {
         return usageNumber;
     }
 
-
     public Long getUsageDefRecordId() {
         return usageDefRecordId;
     }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageSqlDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageSqlDao.java
index 3041193..b5df5f3 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageSqlDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageSqlDao.java
@@ -30,12 +30,10 @@ public interface CatalogOverridePhaseUsageSqlDao extends Transactional<CatalogOv
                                                           @SmartBindBean final InternalTenantContext context);
 
     @SqlQuery
-    public List<Long> getTargetPhaseDefinition(@PlanPhaseKeysCollectionBinder final Collection<String> concatUsageNumAndUsageDefRecordId,
+    public List<Long> getTargetPhaseDefinition(@PhaseUsageKeysCollectionBinder final Collection<String> concatUsageNumAndUsageDefRecordId,
                                                @Bind("targetCount") final Integer targetCount,
                                                @SmartBindBean final InternalTenantContext context);
 
-
-
     @SqlQuery
     public Long getLastInsertId();
 }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockSqlDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockSqlDao.java
index f5eef71..64ddbe5 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockSqlDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockSqlDao.java
@@ -30,12 +30,10 @@ public interface CatalogOverrideTierBlockSqlDao extends Transactional<CatalogOve
                                                                 @SmartBindBean final InternalTenantContext context);
 
     @SqlQuery
-    public Long getTargetTierDefinition(@PlanPhaseKeysCollectionBinder final Collection<String> concatBlockNumAndBlockDefRecordId,
+    public Long getTargetTierDefinition(@TierBlockKeysCollectionBinder final Collection<String> concatBlockNumAndBlockDefRecordId,
                                         @Bind("targetCount") final Integer targetCount,
                                         @SmartBindBean final InternalTenantContext context);
 
-
-
     @SqlQuery
     public Long getLastInsertId();
 }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionModelDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionModelDao.java
index f2c770a..cba6fbb 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionModelDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionModelDao.java
@@ -91,5 +91,4 @@ public class CatalogOverrideTierDefinitionModelDao {
     public void setTenantRecordId(Long tenantRecordId) {
         this.tenantRecordId = tenantRecordId;
     }
-
 }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.java
index 64f4fb1..8939428 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.java
@@ -25,8 +25,8 @@ public interface CatalogOverrideTierDefinitionSqlDao extends Transactional<Catal
 
     @SqlQuery
     public List<CatalogOverrideTierDefinitionModelDao> getOverriddenUsageTiers(@Bind("targetUsageDefRecordId") Long targetUsageDefRecordId,
-                                                                                @SmartBindBean final InternalTenantContext context);
+                                                                               @SmartBindBean final InternalTenantContext context);
 
     @SqlQuery
     public Long getLastInsertId();
-}
\ No newline at end of file
+}
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideUsageDefinitionModelDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideUsageDefinitionModelDao.java
index 17c3e7a..568be92 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideUsageDefinitionModelDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideUsageDefinitionModelDao.java
@@ -50,8 +50,6 @@ public class CatalogOverrideUsageDefinitionModelDao {
         this.parentUsageType = parentUsageType;
     }
 
-
-
     public void setCurrency(String currency) {
         this.currency = currency;
     }
@@ -89,8 +87,6 @@ public class CatalogOverrideUsageDefinitionModelDao {
         return parentUsageType;
     }
 
-
-
     public String getCurrency() {
         return currency;
     }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideUsageTierModelDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideUsageTierModelDao.java
index 45f0ea9..8061f63 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideUsageTierModelDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideUsageTierModelDao.java
@@ -15,7 +15,6 @@ public class CatalogOverrideUsageTierModelDao {
     private String createdBy;
     private Long tenantRecordId;
 
-
     public CatalogOverrideUsageTierModelDao() {
     }
 
@@ -81,5 +80,4 @@ public class CatalogOverrideUsageTierModelDao {
     public Long getTenantRecordId() {
         return tenantRecordId;
     }
-
 }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java
index 3696b2f..f3dcbf0 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/DefaultCatalogOverrideDao.java
@@ -127,7 +127,7 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
         final CatalogOverridePhaseDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
 
         if(override.getUsagePriceOverrides() != null && isUsageOverrideListHasOnlyNull(override.getUsagePriceOverrides())) {
-            getOrCreatePhaseDefinitionFromTransactionWithoutUsageOverrides(parentPhaseName, catalogEffectiveDate, override, inTransactionHandle, context);
+            return getOrCreatePhaseDefinitionFromTransactionWithoutUsageOverrides(parentPhaseName, catalogEffectiveDate, override, inTransactionHandle, context);
         }
 
         final CatalogOverrideUsageDefinitionModelDao[] overrideUsageDefinitionModelDaos = new CatalogOverrideUsageDefinitionModelDao[override.getUsagePriceOverrides().size()];
@@ -281,7 +281,6 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
             }
         }
         return resultTierDef;
-
     }
 
     private void createCatalogOverrideTierBlockFromTransaction(final short blockNum, final CatalogOverrideBlockDefinitionModelDao blockDef, final CatalogOverrideTierDefinitionModelDao tierDef, final Handle inTransactionHandle, final InternalCallContext context) {
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/PhaseUsageKeysCollectionBinder.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/PhaseUsageKeysCollectionBinder.java
new file mode 100644
index 0000000..afe73f3
--- /dev/null
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/PhaseUsageKeysCollectionBinder.java
@@ -0,0 +1,40 @@
+package org.killbill.billing.catalog.dao;
+
+import java.lang.annotation.Annotation;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.Collection;
+
+import org.killbill.billing.catalog.dao.PhaseUsageKeysCollectionBinder.PhaseUsageKeysCollectionBinderFactory;
+import org.skife.jdbi.v2.SQLStatement;
+import org.skife.jdbi.v2.sqlobject.Binder;
+import org.skife.jdbi.v2.sqlobject.BinderFactory;
+import org.skife.jdbi.v2.sqlobject.BindingAnnotation;
+
+@BindingAnnotation(PhaseUsageKeysCollectionBinderFactory.class)
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.PARAMETER})
+public @interface PhaseUsageKeysCollectionBinder {
+
+    public static class PhaseUsageKeysCollectionBinderFactory implements BinderFactory {
+
+        @Override
+        public Binder build(Annotation annotation) {
+            return new Binder<PhaseUsageKeysCollectionBinder, Collection<String>>() {
+
+                @Override
+                public void bind(SQLStatement<?> query, PhaseUsageKeysCollectionBinder bind, Collection<String> keys) {
+                    query.define("keys", keys);
+
+                    int idx = 0;
+                    for (String state : keys) {
+                        query.bind("key_" + idx, state);
+                        idx++;
+                    }
+                }
+            };
+        }
+    }
+}
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/TierBlockKeysCollectionBinder.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/TierBlockKeysCollectionBinder.java
new file mode 100644
index 0000000..ed3fc62
--- /dev/null
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/TierBlockKeysCollectionBinder.java
@@ -0,0 +1,40 @@
+package org.killbill.billing.catalog.dao;
+
+import java.lang.annotation.Annotation;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.Collection;
+
+import org.killbill.billing.catalog.dao.TierBlockKeysCollectionBinder.TierBlockKeysCollectionBinderFactory;
+import org.skife.jdbi.v2.SQLStatement;
+import org.skife.jdbi.v2.sqlobject.Binder;
+import org.skife.jdbi.v2.sqlobject.BinderFactory;
+import org.skife.jdbi.v2.sqlobject.BindingAnnotation;
+
+@BindingAnnotation(TierBlockKeysCollectionBinderFactory.class)
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.PARAMETER})
+public @interface TierBlockKeysCollectionBinder {
+
+    public static class TierBlockKeysCollectionBinderFactory implements BinderFactory {
+
+        @Override
+        public Binder build(Annotation annotation) {
+            return new Binder<TierBlockKeysCollectionBinder, Collection<String>>() {
+
+                @Override
+                public void bind(SQLStatement<?> query, TierBlockKeysCollectionBinder bind, Collection<String> keys) {
+                    query.define("keys", keys);
+
+                    int idx = 0;
+                    for (String state : keys) {
+                        query.bind("key_" + idx, state);
+                        idx++;
+                    }
+                }
+            };
+        }
+    }
+}
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java
index 112c7c3..f6a4e69 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java
@@ -90,17 +90,15 @@ public class DefaultBlock extends ValidatingConfig<StandaloneCatalog> implements
         return errors;
     }
 
+    public DefaultBlock() {
+    }
 
     public DefaultBlock(final DefaultUnit unit, final Double size, final DefaultInternationalPrice prices, final BigDecimal overriddenPrice, Currency currency) {
-
         this.unit = unit;
         this.size = size;
         this.prices = prices != null ? new DefaultInternationalPrice(prices, overriddenPrice, currency) : null;
     }
 
-    public DefaultBlock() {
-    }
-
     public DefaultBlock setType(final BlockType type) {
         this.type = type;
         return this;
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlockPriceOverride.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlockPriceOverride.java
index 78968cb..d66d331 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlockPriceOverride.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlockPriceOverride.java
@@ -12,15 +12,12 @@ import java.math.BigDecimal;
  */
 public class DefaultBlockPriceOverride implements BlockPriceOverride {
 
-
     private String unitName;
 
     private Double size;
 
     private BigDecimal price;
 
-
-
     @Override
     public String getUnitName() {
         return unitName;
@@ -41,5 +38,4 @@ public class DefaultBlockPriceOverride implements BlockPriceOverride {
         this.size = size;
         this.price = price;
     }
-
 }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java
index 42b1b03..eb64e2b 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java
@@ -65,14 +65,12 @@ public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implem
         this.duration = (DefaultDuration) in.getDuration();
         this.fixed = override != null && override.getFixedPrice() != null ? new DefaultFixed((DefaultFixed) in.getFixed(), override) : (DefaultFixed) in.getFixed();
         this.recurring = override != null && override.getRecurringPrice() != null ? new DefaultRecurring((DefaultRecurring) in.getRecurring(), override) : (DefaultRecurring) in.getRecurring();
-        this.usages =  new DefaultUsage[in.getUsages().length];
+        this.usages = new DefaultUsage[in.getUsages().length];
         for (int i = 0; i < in.getUsages().length; i++) {
-
             if(override != null && override.getUsagePriceOverrides().get(i)!= null) {
                 usages[i] = new DefaultUsage(in.getUsages()[i], override.getUsagePriceOverrides().get(i), override.getCurrency());
             }
             else {
-
                 usages[i] = (DefaultUsage) in.getUsages()[i];
             }
         }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultTier.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultTier.java
index d19c86d..50ae522 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultTier.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultTier.java
@@ -61,16 +61,12 @@ public class DefaultTier extends ValidatingConfig<StandaloneCatalog> implements 
     public DefaultTier(Tier in, TierPriceOverride override, Currency currency) {
         this.limits = (DefaultLimit[])in.getLimits();
         this.blocks = new DefaultTieredBlock[in.getTieredBlocks().length];
-
         for (int i = 0; i < in.getTieredBlocks().length; i++) {
-
             if(override != null && override.getTieredBlockPriceOverrides().get(i)!=null)
                 blocks[i] = new DefaultTieredBlock(in.getTieredBlocks()[i], override.getTieredBlockPriceOverrides().get(i), currency) ;
             else
                 blocks[i] = (DefaultTieredBlock) in.getTieredBlocks()[i];
-
         }
-
     }
 
     @Override
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
index 2043107..80e6bc9 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
@@ -88,17 +88,14 @@ public class DefaultUsage extends ValidatingConfig<StandaloneCatalog> implements
               this.limits = (DefaultLimit[]) in.getLimits();
               this.blocks = (DefaultBlock[]) in.getBlocks();
               this.tiers = new DefaultTier[in.getTiers().length];
-               for (int i = 0; i < in.getTiers().length; i++) {
-
-                 if(override != null && override.getTierPriceOverrides().get(i)!=null)
-                    tiers[i] = new DefaultTier(in.getTiers()[i], override.getTierPriceOverrides().get(i), currency) ;
-                 else
+              for (int i = 0; i < in.getTiers().length; i++) {
+                if(override != null && override.getTierPriceOverrides().get(i)!=null)
+                    tiers[i] = new DefaultTier(in.getTiers()[i], override.getTierPriceOverrides().get(i), currency);
+                else
                     tiers[i] = (DefaultTier) in.getTiers()[i];
-               }
+              }
     }
 
-
-
     @Override
     public String getName() {
         return name;
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java b/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
index 1f7ccdd..856f035 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/override/DefaultPriceOverride.java
@@ -70,9 +70,12 @@ public class DefaultPriceOverride implements PriceOverride {
                 }
             }).orNull();
 
-            resolvedOverride[index++] = curOverride != null ?
-                                        new DefaultPlanPhasePriceOverride(curPhase.getName(), curOverride.getCurrency(), curOverride.getFixedPrice(), curOverride.getRecurringPrice(), getResolvedUsageOverrides(curPhase.getUsages(), curOverride.getUsagePriceOverrides())) :
-                                        null;
+            if(curOverride != null) {
+                List<UsagePriceOverride> resolvedUsageOverrides = getResolvedUsageOverrides(curPhase.getUsages(), curOverride.getUsagePriceOverrides());
+                resolvedOverride[index++] = new DefaultPlanPhasePriceOverride(curPhase.getName(), curOverride.getCurrency(), curOverride.getFixedPrice(), curOverride.getRecurringPrice(), resolvedUsageOverrides);
+            }
+            else
+                resolvedOverride[index++] = null;
         }
 
         for (int i = 0; i < resolvedOverride.length; i++) {
@@ -98,7 +101,6 @@ public class DefaultPriceOverride implements PriceOverride {
         return result;
     }
 
-
     public List<UsagePriceOverride> getResolvedUsageOverrides(Usage[] usages, List<UsagePriceOverride> usagePriceOverrides) throws CatalogApiException{
         List<UsagePriceOverride> resolvedUsageOverrides = new ArrayList<UsagePriceOverride>();
 
@@ -109,9 +111,10 @@ public class DefaultPriceOverride implements PriceOverride {
                     return input.getName() != null && input.getName().equals(curUsage.getName());
                 }
             }).orNull();
-              if(curOverride != null)
-                   resolvedUsageOverrides.add(new DefaultUsagePriceOverride(curUsage.getName(), curUsage.getUsageType(), getResolvedTierOverrides(curUsage.getTiers(), curOverride.getTierPriceOverrides())));
-              else
+              if(curOverride != null) {
+                  List<TierPriceOverride>  tierPriceOverrides = getResolvedTierOverrides(curUsage.getTiers(), curOverride.getTierPriceOverrides());
+                  resolvedUsageOverrides.add(new DefaultUsagePriceOverride(curUsage.getName(), curUsage.getUsageType(),tierPriceOverrides));
+              } else
                  resolvedUsageOverrides.add(null);
         }
 
@@ -146,8 +149,10 @@ public class DefaultPriceOverride implements PriceOverride {
                 }
             }).orNull();
 
-            if(curOverride != null)
-                resolvedTierOverrides.add(new DefaultTierPriceOverride(getResolvedTieredBlockPriceOverrides(curTier.getTieredBlocks(),curOverride.getTieredBlockPriceOverrides())));
+            if(curOverride != null) {
+                List<TieredBlockPriceOverride> tieredBlockPriceOverrides = getResolvedTieredBlockPriceOverrides(curTier.getTieredBlocks(),curOverride.getTieredBlockPriceOverrides());
+                resolvedTierOverrides.add(new DefaultTierPriceOverride(tieredBlockPriceOverrides));
+            }
             else
                 resolvedTierOverrides.add(null);
         }
@@ -177,18 +182,6 @@ public class DefaultPriceOverride implements PriceOverride {
                 resolvedTieredBlockPriceOverrides.add(null);
         }
 
-        for (int i = 0; i < resolvedTieredBlockPriceOverrides.size(); i++) {
-            final TieredBlockPriceOverride curOverride = resolvedTieredBlockPriceOverrides.get(i);
-            if (curOverride != null) {
-                final DefaultTieredBlock curTieredBlock = (DefaultTieredBlock)tieredBlocks[i];
-
-                if (curTieredBlock.getPrice() == null && curOverride.getPrice() != null) {
-                    final String error = String.format("There is no existing price for the tiered block %s", curTieredBlock.getUnit().getName());
-                    throw new CatalogApiException(ErrorCode.CAT_INVALID_INVALID_UNIT_PRICE_OVERRIDE, curTieredBlock.getUnit().getName() , error);
-                }
-            }
-        }
-
         return resolvedTieredBlockPriceOverrides;
     }
 
diff --git a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionSqlDao.sql.stg b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionSqlDao.sql.stg
index c599660..217209a 100644
--- a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionSqlDao.sql.stg
+++ b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionSqlDao.sql.stg
@@ -2,7 +2,6 @@ group CatalogOverrideBlockDefinitionSqlDao;
 
 tableName() ::= "catalog_override_block_definition"
 
-
 tableFields(prefix) ::= <<
   <prefix>parent_unit_name
 , <prefix>size
@@ -20,7 +19,6 @@ allTableFields(prefix) ::= <<
 , <tableFields(prefix)>
 >>
 
-
 tableValues() ::= <<
   :parentUnitName
 , :size
@@ -33,7 +31,6 @@ tableValues() ::= <<
 , :tenantRecordId
 >>
 
-
 allTableValues() ::= <<
   :recordId
 , <tableValues()>
@@ -78,7 +75,6 @@ and tb.tenant_record_id = :tenantRecordId
 ;
 >>
 
-
 getLastInsertId() ::= <<
 select LAST_INSERT_ID();
 >>
diff --git a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageSqlDao.sql.stg b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageSqlDao.sql.stg
index 67055d1..127e89b 100644
--- a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageSqlDao.sql.stg
+++ b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverridePhaseUsageSqlDao.sql.stg
@@ -1,9 +1,7 @@
 group CatalogOverridePhaseUsageSqlDao;
 
-
 tableName() ::= "catalog_override_phase_usage"
 
-
 tableFields(prefix) ::= <<
   <prefix>usage_number
 , <prefix>usage_def_record_id
@@ -18,7 +16,6 @@ allTableFields(prefix) ::= <<
 , <tableFields(prefix)>
 >>
 
-
 tableValues() ::= <<
   :usageNumber
 , :usageDefRecordId
@@ -28,7 +25,6 @@ tableValues() ::= <<
 , :tenantRecordId
 >>
 
-
 allTableValues() ::= <<
   :recordId
 , <tableValues()>
@@ -70,6 +66,7 @@ where
 and tmp.count = :targetCount
 ;
 >>
+
 getLastInsertId() ::= <<
 select LAST_INSERT_ID();
 >>
diff --git a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockSqlDao.sql.stg b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockSqlDao.sql.stg
index 9340433..34e52da 100644
--- a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockSqlDao.sql.stg
+++ b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockSqlDao.sql.stg
@@ -1,9 +1,7 @@
 group CatalogOverrideTierBlockSqlDao;
 
-
 tableName() ::= "catalog_override_tier_block"
 
-
 tableFields(prefix) ::= <<
   <prefix>block_number
 , <prefix>block_def_record_id
@@ -18,7 +16,6 @@ allTableFields(prefix) ::= <<
 , <tableFields(prefix)>
 >>
 
-
 tableValues() ::= <<
   :blockNumber
 , :blockDefRecordId
@@ -28,7 +25,6 @@ tableValues() ::= <<
 , :tenantRecordId
 >>
 
-
 allTableValues() ::= <<
   :recordId
 , <tableValues()>
@@ -70,6 +66,7 @@ where
 and tmp.count = :targetCount
 ;
 >>
+
 getLastInsertId() ::= <<
 select LAST_INSERT_ID();
 >>
diff --git a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg
index c9582cc..dbf1b54 100644
--- a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg
+++ b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideTierDefinitionSqlDao.sql.stg
@@ -17,7 +17,6 @@ allTableFields(prefix) ::= <<
 , <tableFields(prefix)>
 >>
 
-
 tableValues() ::= <<
   :fixedPrice
 , :recurringPrice
@@ -28,7 +27,6 @@ tableValues() ::= <<
 , :tenantRecordId
 >>
 
-
 allTableValues() ::= <<
   :recordId
 , <tableValues()>
diff --git a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideUsageTierSqlDao.sql.stg b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideUsageTierSqlDao.sql.stg
index d273c86..18aa401 100644
--- a/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideUsageTierSqlDao.sql.stg
+++ b/catalog/src/main/resources/org/killbill/billing/catalog/dao/CatalogOverrideUsageTierSqlDao.sql.stg
@@ -1,9 +1,7 @@
 group CatalogOverrideUsageTierSqlDao;
 
-
 tableName() ::= "catalog_override_usage_tier"
 
-
 tableFields(prefix) ::= <<
   <prefix>tier_number
 , <prefix>tier_def_record_id
@@ -18,7 +16,6 @@ allTableFields(prefix) ::= <<
 , <tableFields(prefix)>
 >>
 
-
 tableValues() ::= <<
   :tierNumber
 , :tierDefRecordId
@@ -28,7 +25,6 @@ tableValues() ::= <<
 , :tenantRecordId
 >>
 
-
 allTableValues() ::= <<
   :recordId
 , <tableValues()>
diff --git a/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql b/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql
index aa2c415..380d7ad 100644
--- a/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql
+++ b/catalog/src/main/resources/org/killbill/billing/catalog/ddl.sql
@@ -107,11 +107,9 @@ PRIMARY KEY(record_id)
 );
 CREATE INDEX catalog_override_phase_usage_idx ON catalog_override_phase_usage(tenant_record_id, usage_number, usage_def_record_id);
 
-
 DROP TABLE IF EXISTS catalog_override_usage_tier;
 create table catalog_override_usage_tier
 (
-
 record_id serial unique,
 tier_number smallint(5) unsigned,
 tier_def_record_id bigint /*! unsigned */ not null,
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/BlockPriceOverrideJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/BlockPriceOverrideJson.java
index 54e8eb6..21f1d7f 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/BlockPriceOverrideJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/BlockPriceOverrideJson.java
@@ -10,7 +10,6 @@ import java.math.BigDecimal;
 
 public class BlockPriceOverrideJson {
 
-
     private String unitName;
 
     private Double size;
@@ -84,6 +83,4 @@ public class BlockPriceOverrideJson {
         }
         return true;
     }
-
-
 }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/UsagePriceOverrideJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/UsagePriceOverrideJson.java
index c7bcdc5..8d4b020 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/UsagePriceOverrideJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/UsagePriceOverrideJson.java
@@ -12,14 +12,12 @@ import java.util.List;
 
 public class UsagePriceOverrideJson {
 
-
     private final String usageName;
 
     private final UsageType usageType;
 
     private final BillingMode billingMode;
 
-
     private final List<TierPriceOverrideJson> tierPriceOverrides;
 
     public String getUsageName() {
@@ -48,6 +46,4 @@ public class UsagePriceOverrideJson {
         this.billingMode = billingMode;
         this.tierPriceOverrides = tierPriceOverrides;
     }
-
-
 }
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java
index f09efa0..947473c 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestBundleJsonWithSubscriptions.java
@@ -35,7 +35,7 @@ import static org.killbill.billing.jaxrs.JaxrsTestUtils.createAuditLogsJson;
 
 public class TestBundleJsonWithSubscriptions extends JaxrsTestSuiteNoDB {
 
-  /*  @Test(groups = "fast")
+    @Test(groups = "fast")
     public void testJson() throws Exception {
         final String someUUID = UUID.randomUUID().toString();
         final UUID bundleId = UUID.randomUUID();
@@ -56,7 +56,7 @@ public class TestBundleJsonWithSubscriptions extends JaxrsTestSuiteNoDB {
                                                                       UUID.randomUUID().toString(),
                                                                       null);
 
-        final PhasePriceOverrideJson priceOverride = new PhasePriceOverrideJson(null, "somePhaseType", BigDecimal.ONE, null);
+        final PhasePriceOverrideJson priceOverride = new PhasePriceOverrideJson(null, "somePhaseType", BigDecimal.ONE, null, null);
 
         final SubscriptionJson subscription = new SubscriptionJson(UUID.randomUUID().toString(),
                                                                    UUID.randomUUID().toString(),
@@ -88,5 +88,5 @@ public class TestBundleJsonWithSubscriptions extends JaxrsTestSuiteNoDB {
         final BundleJson fromJson = mapper.readValue(asJson, BundleJson.class);
         Assert.assertEquals(fromJson, bundleJson);
 
-      } */
+      }
 }