killbill-aplcache

Changes

Details

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 dcc41ec..5779460 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
@@ -17,20 +17,33 @@
 
 package org.killbill.billing.catalog.caching;
 
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-
-import javax.annotation.Nullable;
-import javax.inject.Inject;
-
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
 import org.killbill.billing.ErrorCode;
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.callcontext.InternalTenantContext;
-import org.killbill.billing.catalog.*;
-import org.killbill.billing.catalog.api.*;
-import org.killbill.billing.catalog.dao.*;
+import org.killbill.billing.catalog.DefaultPlan;
+import org.killbill.billing.catalog.DefaultPlanPhasePriceOverride;
+import org.killbill.billing.catalog.DefaultTierPriceOverride;
+import org.killbill.billing.catalog.DefaultTieredBlockPriceOverride;
+import org.killbill.billing.catalog.DefaultUsagePriceOverride;
+import org.killbill.billing.catalog.api.CatalogApiException;
+import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.catalog.api.Plan;
+import org.killbill.billing.catalog.api.PlanPhase;
+import org.killbill.billing.catalog.api.PlanPhasePriceOverride;
+import org.killbill.billing.catalog.api.StaticCatalog;
+import org.killbill.billing.catalog.api.Tier;
+import org.killbill.billing.catalog.api.TierPriceOverride;
+import org.killbill.billing.catalog.api.TieredBlock;
+import org.killbill.billing.catalog.api.TieredBlockPriceOverride;
+import org.killbill.billing.catalog.api.Usage;
+import org.killbill.billing.catalog.api.UsagePriceOverride;
+import org.killbill.billing.catalog.dao.CatalogOverrideBlockDefinitionModelDao;
+import org.killbill.billing.catalog.dao.CatalogOverrideDao;
+import org.killbill.billing.catalog.dao.CatalogOverridePhaseDefinitionModelDao;
+import org.killbill.billing.catalog.dao.CatalogOverrideTierDefinitionModelDao;
+import org.killbill.billing.catalog.dao.CatalogOverrideUsageDefinitionModelDao;
 import org.killbill.billing.catalog.override.DefaultPriceOverride;
 import org.killbill.billing.util.cache.Cachable.CacheType;
 import org.killbill.billing.util.cache.CacheController;
@@ -38,8 +51,10 @@ import org.killbill.billing.util.cache.CacheControllerDispatcher;
 import org.killbill.billing.util.cache.CacheLoaderArgument;
 import org.killbill.billing.util.cache.OverriddenPlanCacheLoader.LoaderCallback;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
 
 public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
 
@@ -112,11 +127,10 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
     List<UsagePriceOverride> getUsagePriceOverrides(PlanPhase curPhase, CatalogOverridePhaseDefinitionModelDao overriddenPhase, final InternalTenantContext context) {
 
         final List<UsagePriceOverride> usagePriceOverrides = new ArrayList<UsagePriceOverride>();
+        final List<CatalogOverrideUsageDefinitionModelDao> usageDefs = overrideDao.getOverriddenPhaseUsages(overriddenPhase.getRecordId(), context);
+
         for(int i = 0; i < curPhase.getUsages().length; i++){
             final Usage curUsage = curPhase.getUsages()[i];
-
-            final List<CatalogOverrideUsageDefinitionModelDao> usageDefs = overrideDao.getOverriddenPhaseUsages(overriddenPhase.getRecordId(), context);
-
             final CatalogOverrideUsageDefinitionModelDao overriddenUsage = Iterables.tryFind(usageDefs, new Predicate<CatalogOverrideUsageDefinitionModelDao>() {
                 @Override
                 public boolean apply(final CatalogOverrideUsageDefinitionModelDao input) {
@@ -128,8 +142,6 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
                 List<TierPriceOverride> tierPriceOverrides = getTierPriceOverrides(curUsage, overriddenUsage, context);
                 usagePriceOverrides.add(new DefaultUsagePriceOverride(overriddenUsage.getParentUsageName(), curUsage.getUsageType(),tierPriceOverrides));
             }
-            else
-                usagePriceOverrides.add(null);
         }
         return usagePriceOverrides;
     }
@@ -137,12 +149,12 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
     List<TierPriceOverride> getTierPriceOverrides(Usage curUsage, CatalogOverrideUsageDefinitionModelDao overriddenUsage, final InternalTenantContext context) {
 
         final List<TierPriceOverride> tierPriceOverrides = new ArrayList<TierPriceOverride>();
+
+        final List<CatalogOverrideTierDefinitionModelDao> tierDefs = overrideDao.getOverriddenUsageTiers(overriddenUsage.getRecordId(), context);
         for(int i = 0; i < curUsage.getTiers().length; i++){
             final Tier curTier = curUsage.getTiers()[i];
             final TieredBlock[] curTieredBlocks = curTier.getTieredBlocks();
 
-            final List<CatalogOverrideTierDefinitionModelDao> tierDefs = overrideDao.getOverriddenUsageTiers(overriddenUsage.getRecordId(), context);
-
             final CatalogOverrideTierDefinitionModelDao overriddenTier = Iterables.tryFind(tierDefs, new Predicate<CatalogOverrideTierDefinitionModelDao>() {
                 @Override
                 public boolean apply(final CatalogOverrideTierDefinitionModelDao input) {
@@ -153,10 +165,10 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
                          Double max = blockDef.getMax();
                          Double size = blockDef.getSize();
 
-                         for(int j=0; j <curTieredBlocks.length;j++)
-                             if (unitName.equals(curTieredBlocks[j].getUnit().getName()) &&
-                                     Double.compare(size, curTieredBlocks[j].getSize()) == 0 &&
-                                     Double.compare(max, curTieredBlocks[j].getMax()) == 0) {
+                         for(TieredBlock curTieredBlock : curTieredBlocks)
+                             if (unitName.equals(curTieredBlock.getUnit().getName()) &&
+                                     Double.compare(size, curTieredBlock.getSize()) == 0 &&
+                                     Double.compare(max, curTieredBlock.getMax()) == 0) {
                                  return true;
                              }
                      }
@@ -169,8 +181,6 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
                 List<TieredBlockPriceOverride> tieredBlockPriceOverrides = getTieredBlockPriceOverrides(curTier, overriddenTier, context);
                 tierPriceOverrides.add(new DefaultTierPriceOverride(tieredBlockPriceOverrides));
             }
-            else
-                tierPriceOverrides.add(null);
         }
         return tierPriceOverrides;
     }
@@ -178,21 +188,22 @@ public class EhCacheOverriddenPlanCache implements OverriddenPlanCache {
     List<TieredBlockPriceOverride> getTieredBlockPriceOverrides(Tier curTier, CatalogOverrideTierDefinitionModelDao overriddenTier, final InternalTenantContext context) {
 
         final List<TieredBlockPriceOverride> blockPriceOverrides = new ArrayList<TieredBlockPriceOverride>();
-        for(int i = 0; i < curTier.getTieredBlocks().length; i++){
-            final List<CatalogOverrideBlockDefinitionModelDao> blockDefs = overrideDao.getOverriddenTierBlocks(overriddenTier.getRecordId(), context);
+        final List<CatalogOverrideBlockDefinitionModelDao> blockDefs = overrideDao.getOverriddenTierBlocks(overriddenTier.getRecordId(), context);
 
+        for(int i = 0; i < curTier.getTieredBlocks().length; i++){
+            final TieredBlock curTieredBlock = curTier.getTieredBlocks()[i];
             final CatalogOverrideBlockDefinitionModelDao overriddenTierBlock = Iterables.tryFind(blockDefs, new Predicate<CatalogOverrideBlockDefinitionModelDao>() {
                 @Override
                 public boolean apply(final CatalogOverrideBlockDefinitionModelDao input) {
-                    return true;
-                }
+                    return (input.getParentUnitName().equals(curTieredBlock.getUnit().getName()) &&
+                            Double.compare(input.getSize(), curTieredBlock.getSize()) == 0 &&
+                            Double.compare(input.getMax(), curTieredBlock.getMax()) == 0);
 
+                }
             }).orNull();
 
             if(overriddenTierBlock != null)
                 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 6b9ee0b..319b0de 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
@@ -4,9 +4,6 @@ import org.joda.time.DateTime;
 
 import java.math.BigDecimal;
 
-/**
- * Created by sruthipendyala on 10/7/16.
- */
 public class CatalogOverrideBlockDefinitionModelDao {
 
     private Long recordId;
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionSqlDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionSqlDao.java
index 3121b91..0587ee1 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionSqlDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideBlockDefinitionSqlDao.java
@@ -1,9 +1,5 @@
 package org.killbill.billing.catalog.dao;
 
-/**
- * Created by sruthipendyala on 10/7/16.
- */
-
 import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.callcontext.InternalTenantContext;
 import org.killbill.billing.util.entity.dao.EntitySqlDaoStringTemplate;
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 f2b54d8..5e98460 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
@@ -2,9 +2,6 @@ package org.killbill.billing.catalog.dao;
 
 import org.joda.time.DateTime;
 
-/**
- * Created by sruthipendyala on 10/7/16.
- */
 public class CatalogOverridePhaseUsageModelDao {
 
     private Short usageNumber;
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 b5df5f3..512197b 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
@@ -1,8 +1,5 @@
 package org.killbill.billing.catalog.dao;
 
-/**
- * Created by sruthipendyala on 10/7/16.
- */
 import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.callcontext.InternalTenantContext;
 import org.killbill.billing.util.entity.dao.EntitySqlDaoStringTemplate;
@@ -17,7 +14,6 @@ import org.skife.jdbi.v2.sqlobject.mixins.Transactional;
 import java.util.Collection;
 import java.util.List;
 
-
 @EntitySqlDaoStringTemplate
 public interface CatalogOverridePhaseUsageSqlDao extends Transactional<CatalogOverridePhaseUsageSqlDao>, CloseMe {
 
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockModelDao.java b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockModelDao.java
index bbc7451..f364926 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockModelDao.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/dao/CatalogOverrideTierBlockModelDao.java
@@ -2,9 +2,6 @@ package org.killbill.billing.catalog.dao;
 
 import org.joda.time.DateTime;
 
-/**
- * Created by sruthipendyala on 10/7/16.
- */
 public class CatalogOverrideTierBlockModelDao {
     private Short blockNumber;
     private Long recordId;
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 64ddbe5..e683a9d 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
@@ -1,9 +1,5 @@
 package org.killbill.billing.catalog.dao;
 
-/**
- * Created by sruthipendyala on 10/7/16.
- */
-
 import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.callcontext.InternalTenantContext;
 import org.killbill.billing.util.entity.dao.EntitySqlDaoStringTemplate;
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 cba6fbb..91c5470 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
@@ -4,9 +4,6 @@ import org.joda.time.DateTime;
 
 import java.math.BigDecimal;
 
-/**
- * Created by sruthipendyala on 10/7/16.
- */
 public class CatalogOverrideTierDefinitionModelDao {
 
     private Long recordId;
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 568be92..542054e 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
@@ -4,9 +4,6 @@ import org.joda.time.DateTime;
 
 import java.math.BigDecimal;
 
-/**
- * Created by sruthipendyala on 10/7/16.
- */
 public class CatalogOverrideUsageDefinitionModelDao {
 
 
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 8061f63..349c76d 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
@@ -2,9 +2,6 @@ package org.killbill.billing.catalog.dao;
 
 import org.joda.time.DateTime;
 
-/**
- * Created by sruthipendyala on 10/7/16.
- */
 public class CatalogOverrideUsageTierModelDao {
 
     private Long recordId;
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 f3dcbf0..4085ce8 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
@@ -18,20 +18,19 @@
 package org.killbill.billing.catalog.dao;
 
 
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.StreamSupport;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
+import com.google.inject.Inject;
 import org.joda.time.DateTime;
 import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.callcontext.InternalTenantContext;
-import org.killbill.billing.catalog.DefaultTierPriceOverride;
-import org.killbill.billing.catalog.DefaultTieredBlockPriceOverride;
-import org.killbill.billing.catalog.DefaultUsagePriceOverride;
-import org.killbill.billing.catalog.api.*;
+import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.catalog.api.Plan;
+import org.killbill.billing.catalog.api.PlanPhase;
+import org.killbill.billing.catalog.api.PlanPhasePriceOverride;
+import org.killbill.billing.catalog.api.Tier;
+import org.killbill.billing.catalog.api.TierPriceOverride;
+import org.killbill.billing.catalog.api.TieredBlockPriceOverride;
+import org.killbill.billing.catalog.api.Usage;
+import org.killbill.billing.catalog.api.UsagePriceOverride;
 import org.killbill.clock.Clock;
 import org.killbill.commons.jdbi.mapper.LowerToCamelBeanMapperFactory;
 import org.skife.jdbi.v2.DBI;
@@ -40,9 +39,8 @@ import org.skife.jdbi.v2.IDBI;
 import org.skife.jdbi.v2.TransactionCallback;
 import org.skife.jdbi.v2.TransactionStatus;
 
-import com.google.inject.Inject;
-
-import javax.annotation.Nullable;
+import java.util.ArrayList;
+import java.util.List;
 
 public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
 
@@ -123,7 +121,7 @@ public class DefaultCatalogOverrideDao implements CatalogOverrideDao {
         sqlDao.create(modelDao, context);
     }
 
-    private CatalogOverridePhaseDefinitionModelDao getOrCreateOverridePhaseDefinitionFromTransaction(final PlanPhase parentPlanPhase, final String parentPhaseName,final Currency currency, final DateTime catalogEffectiveDate, final PlanPhasePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context) {
+    private CatalogOverridePhaseDefinitionModelDao getOrCreateOverridePhaseDefinitionFromTransaction(final PlanPhase parentPlanPhase, final String parentPhaseName, final Currency currency, final DateTime catalogEffectiveDate, final PlanPhasePriceOverride override, final Handle inTransactionHandle, final InternalCallContext context) {
         final CatalogOverridePhaseDefinitionSqlDao sqlDao = inTransactionHandle.attach(CatalogOverridePhaseDefinitionSqlDao.class);
 
         if(override.getUsagePriceOverrides() != null && isUsageOverrideListHasOnlyNull(override.getUsagePriceOverrides())) {
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 f6a4e69..eb6d119 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlock.java
@@ -17,18 +17,23 @@
 
 package org.killbill.billing.catalog;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlIDREF;
-
 import org.killbill.billing.ErrorCode;
-import org.killbill.billing.catalog.api.*;
+import org.killbill.billing.catalog.api.Block;
+import org.killbill.billing.catalog.api.BlockType;
+import org.killbill.billing.catalog.api.CatalogApiException;
+import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.catalog.api.InternationalPrice;
+import org.killbill.billing.catalog.api.PlanPhase;
+import org.killbill.billing.catalog.api.Unit;
 import org.killbill.xmlloader.ValidatingConfig;
 import org.killbill.xmlloader.ValidationError;
 import org.killbill.xmlloader.ValidationErrors;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlIDREF;
 import java.math.BigDecimal;
 
 @XmlAccessorType(XmlAccessType.NONE)
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 d66d331..b69b000 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlockPriceOverride.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultBlockPriceOverride.java
@@ -7,9 +7,6 @@ import org.killbill.billing.catalog.api.Unit;
 
 import java.math.BigDecimal;
 
-/**
- * Created by sruthipendyala on 10/6/16.
- */
 public class DefaultBlockPriceOverride implements BlockPriceOverride {
 
     private String unitName;
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java
index 7e40cfc..c5b3c93 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultInternationalPrice.java
@@ -16,6 +16,16 @@
 
 package org.killbill.billing.catalog;
 
+import org.killbill.billing.ErrorCode;
+import org.killbill.billing.catalog.api.CatalogApiException;
+import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.catalog.api.CurrencyValueNull;
+import org.killbill.billing.catalog.api.InternationalPrice;
+import org.killbill.billing.catalog.api.PlanPhasePriceOverride;
+import org.killbill.billing.catalog.api.Price;
+import org.killbill.xmlloader.ValidatingConfig;
+import org.killbill.xmlloader.ValidationErrors;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
@@ -23,11 +33,6 @@ import java.math.BigDecimal;
 import java.net.URI;
 import java.util.Arrays;
 
-import org.killbill.billing.ErrorCode;
-import org.killbill.billing.catalog.api.*;
-import org.killbill.xmlloader.ValidatingConfig;
-import org.killbill.xmlloader.ValidationErrors;
-
 @XmlAccessorType(XmlAccessType.NONE)
 public class DefaultInternationalPrice extends ValidatingConfig<StandaloneCatalog> implements InternationalPrice {
 
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 eb64e2b..41fc61a 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java
@@ -18,8 +18,22 @@
 
 package org.killbill.billing.catalog;
 
-import java.net.URI;
-import java.util.Arrays;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import org.killbill.billing.ErrorCode;
+import org.killbill.billing.catalog.api.CatalogApiException;
+import org.killbill.billing.catalog.api.Duration;
+import org.killbill.billing.catalog.api.Fixed;
+import org.killbill.billing.catalog.api.PhaseType;
+import org.killbill.billing.catalog.api.Plan;
+import org.killbill.billing.catalog.api.PlanPhase;
+import org.killbill.billing.catalog.api.PlanPhasePriceOverride;
+import org.killbill.billing.catalog.api.Recurring;
+import org.killbill.billing.catalog.api.Usage;
+import org.killbill.billing.catalog.api.UsagePriceOverride;
+import org.killbill.xmlloader.ValidatingConfig;
+import org.killbill.xmlloader.ValidationError;
+import org.killbill.xmlloader.ValidationErrors;
 
 import javax.annotation.Nullable;
 import javax.xml.bind.annotation.XmlAccessType;
@@ -27,12 +41,7 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
-
-import org.killbill.billing.ErrorCode;
-import org.killbill.billing.catalog.api.*;
-import org.killbill.xmlloader.ValidatingConfig;
-import org.killbill.xmlloader.ValidationError;
-import org.killbill.xmlloader.ValidationErrors;
+import java.net.URI;
 
 @XmlAccessorType(XmlAccessType.NONE)
 public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implements PlanPhase {
@@ -67,11 +76,18 @@ public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implem
         this.recurring = override != null && override.getRecurringPrice() != null ? new DefaultRecurring((DefaultRecurring) in.getRecurring(), override) : (DefaultRecurring) in.getRecurring();
         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());
+            final Usage curUsage = in.getUsages()[i];
+            if(override != null && override.getUsagePriceOverrides()!= null) {
+                final UsagePriceOverride usagePriceOverride = Iterables.tryFind(override.getUsagePriceOverrides(), new Predicate<UsagePriceOverride>() {
+                 @Override
+                 public boolean apply(final UsagePriceOverride input) {
+                     return input !=null && input.getName().equals(curUsage.getName());
+                 }
+                 }).orNull();
+                usages[i] = (usagePriceOverride !=null) ? new DefaultUsage(in.getUsages()[i], usagePriceOverride, override.getCurrency()) : (DefaultUsage)curUsage;
             }
             else {
-                usages[i] = (DefaultUsage) in.getUsages()[i];
+                usages[i] = (DefaultUsage)curUsage;
             }
         }
         this.plan = parentPlan;
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 50ae522..f3da569 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultTier.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultTier.java
@@ -17,17 +17,26 @@
 
 package org.killbill.billing.catalog;
 
-import java.util.Arrays;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import org.killbill.billing.catalog.api.BillingMode;
+import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.catalog.api.InternationalPrice;
+import org.killbill.billing.catalog.api.PlanPhase;
+import org.killbill.billing.catalog.api.Tier;
+import org.killbill.billing.catalog.api.TierPriceOverride;
+import org.killbill.billing.catalog.api.TieredBlock;
+import org.killbill.billing.catalog.api.TieredBlockPriceOverride;
+import org.killbill.billing.catalog.api.UsageType;
+import org.killbill.xmlloader.ValidatingConfig;
+import org.killbill.xmlloader.ValidationError;
+import org.killbill.xmlloader.ValidationErrors;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
-
-import org.killbill.billing.catalog.api.*;
-import org.killbill.xmlloader.ValidatingConfig;
-import org.killbill.xmlloader.ValidationError;
-import org.killbill.xmlloader.ValidationErrors;
+import java.util.Arrays;
 
 @XmlAccessorType(XmlAccessType.NONE)
 public class DefaultTier extends ValidatingConfig<StandaloneCatalog> implements Tier {
@@ -61,11 +70,26 @@ 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
+            if(override != null && override.getTieredBlockPriceOverrides() != null) {
+                final TieredBlock curTieredBlock = in.getTieredBlocks()[i];
+                final TieredBlockPriceOverride overriddenTierBlock = Iterables.tryFind(override.getTieredBlockPriceOverrides(), new Predicate<TieredBlockPriceOverride>() {
+                    @Override
+                    public boolean apply(final TieredBlockPriceOverride input) {
+                        return (input != null && input.getUnitName().equals(curTieredBlock.getUnit().getName()) &&
+                                Double.compare(input.getSize(), curTieredBlock.getSize()) == 0 &&
+                                Double.compare(input.getMax(), curTieredBlock.getMax()) == 0);
+                    }
+
+                }).orNull();
+
+                blocks[i] = (overriddenTierBlock != null) ? new DefaultTieredBlock(in.getTieredBlocks()[i], overriddenTierBlock, currency) :
+                        (DefaultTieredBlock) in.getTieredBlocks()[i];
+            }
+            else {
                 blocks[i] = (DefaultTieredBlock) in.getTieredBlocks()[i];
+            }
         }
     }
 
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultTieredBlockPriceOverride.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultTieredBlockPriceOverride.java
index cb5fc65..c9e1dbb 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultTieredBlockPriceOverride.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultTieredBlockPriceOverride.java
@@ -7,9 +7,6 @@ import org.killbill.billing.catalog.api.Unit;
 
 import java.math.BigDecimal;
 
-/**
- * Created by sruthipendyala on 10/6/16.
- */
 public class DefaultTieredBlockPriceOverride extends DefaultBlockPriceOverride implements TieredBlockPriceOverride{
 
     private Double max;
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultTierPriceOverride.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultTierPriceOverride.java
index 4ee99bf..78355f0 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultTierPriceOverride.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultTierPriceOverride.java
@@ -5,9 +5,6 @@ import org.killbill.billing.catalog.api.TieredBlockPriceOverride;
 
 import java.util.List;
 
-/**
- * Created by sruthipendyala on 10/6/16.
- */
 public class DefaultTierPriceOverride implements TierPriceOverride {
 
     List<TieredBlockPriceOverride> tieredBlockPriceOverrides;
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 80e6bc9..855acf9 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
@@ -17,8 +17,25 @@
 
 package org.killbill.billing.catalog;
 
-import java.net.URI;
-import java.util.Arrays;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import org.killbill.billing.catalog.api.BillingMode;
+import org.killbill.billing.catalog.api.BillingPeriod;
+import org.killbill.billing.catalog.api.Block;
+import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.catalog.api.InternationalPrice;
+import org.killbill.billing.catalog.api.Limit;
+import org.killbill.billing.catalog.api.PlanPhase;
+import org.killbill.billing.catalog.api.Tier;
+import org.killbill.billing.catalog.api.TierPriceOverride;
+import org.killbill.billing.catalog.api.TieredBlock;
+import org.killbill.billing.catalog.api.TieredBlockPriceOverride;
+import org.killbill.billing.catalog.api.Usage;
+import org.killbill.billing.catalog.api.UsagePriceOverride;
+import org.killbill.billing.catalog.api.UsageType;
+import org.killbill.xmlloader.ValidatingConfig;
+import org.killbill.xmlloader.ValidationError;
+import org.killbill.xmlloader.ValidationErrors;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
@@ -26,11 +43,9 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlID;
-
-import org.killbill.billing.catalog.api.*;
-import org.killbill.xmlloader.ValidatingConfig;
-import org.killbill.xmlloader.ValidationError;
-import org.killbill.xmlloader.ValidationErrors;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.List;
 
 @XmlAccessorType(XmlAccessType.NONE)
 public class DefaultUsage extends ValidatingConfig<StandaloneCatalog> implements Usage {
@@ -88,11 +103,39 @@ 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
-                    tiers[i] = (DefaultTier) in.getTiers()[i];
+                  if(override != null && override.getTierPriceOverrides()!=null) {
+                      final TieredBlock[] curTieredBlocks = in.getTiers()[i].getTieredBlocks();
+
+                      final TierPriceOverride overriddenTier = Iterables.tryFind(override.getTierPriceOverrides(), new Predicate<TierPriceOverride>() {
+                          @Override
+                          public boolean apply(final TierPriceOverride input) {
+
+                              if(input !=null) {
+                                  final List<TieredBlockPriceOverride> blockPriceOverrides = input.getTieredBlockPriceOverrides();
+                                  for (TieredBlockPriceOverride blockDef : blockPriceOverrides) {
+                                      String unitName = blockDef.getUnitName();
+                                      Double max = blockDef.getMax();
+                                      Double size = blockDef.getSize();
+
+                                      for (TieredBlock curTieredBlock : curTieredBlocks)
+                                          if (unitName.equals(curTieredBlock.getUnit().getName()) &&
+                                                  Double.compare(size, curTieredBlock.getSize()) == 0 &&
+                                                  Double.compare(max, curTieredBlock.getMax()) == 0) {
+                                              return true;
+                                          }
+                                  }
+                              }
+                              return false;
+                          }
+                      }).orNull();
+
+                      tiers[i] = (overriddenTier != null) ? new DefaultTier(in.getTiers()[i], overriddenTier, currency) : (DefaultTier)in.getTiers()[i] ;
+                  }
+                  else {
+                      tiers[i] = (DefaultTier) in.getTiers()[i];
+                  }
               }
     }
 
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 856f035..56e21fb 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
@@ -17,23 +17,38 @@
 
 package org.killbill.billing.catalog.override;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
-
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.inject.Inject;
 import org.joda.time.DateTime;
 import org.killbill.billing.ErrorCode;
 import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.callcontext.InternalTenantContext;
-import org.killbill.billing.catalog.*;
-import org.killbill.billing.catalog.api.*;
+import org.killbill.billing.catalog.DefaultPlan;
+import org.killbill.billing.catalog.DefaultPlanPhase;
+import org.killbill.billing.catalog.DefaultPlanPhasePriceOverride;
+import org.killbill.billing.catalog.DefaultTierPriceOverride;
+import org.killbill.billing.catalog.DefaultTieredBlockPriceOverride;
+import org.killbill.billing.catalog.DefaultUsagePriceOverride;
+import org.killbill.billing.catalog.api.CatalogApiException;
+import org.killbill.billing.catalog.api.Plan;
+import org.killbill.billing.catalog.api.PlanPhase;
+import org.killbill.billing.catalog.api.PlanPhasePriceOverride;
+import org.killbill.billing.catalog.api.PlanPhaseSpecifier;
+import org.killbill.billing.catalog.api.StaticCatalog;
+import org.killbill.billing.catalog.api.Tier;
+import org.killbill.billing.catalog.api.TierPriceOverride;
+import org.killbill.billing.catalog.api.TieredBlock;
+import org.killbill.billing.catalog.api.TieredBlockPriceOverride;
+import org.killbill.billing.catalog.api.Usage;
+import org.killbill.billing.catalog.api.UsagePriceOverride;
 import org.killbill.billing.catalog.caching.OverriddenPlanCache;
 import org.killbill.billing.catalog.dao.CatalogOverrideDao;
 import org.killbill.billing.catalog.dao.CatalogOverridePlanDefinitionModelDao;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
 
 public class DefaultPriceOverride implements PriceOverride {
 
@@ -72,7 +87,8 @@ public class DefaultPriceOverride implements PriceOverride {
 
             if(curOverride != null) {
                 List<UsagePriceOverride> resolvedUsageOverrides = getResolvedUsageOverrides(curPhase.getUsages(), curOverride.getUsagePriceOverrides());
-                resolvedOverride[index++] = new DefaultPlanPhasePriceOverride(curPhase.getName(), curOverride.getCurrency(), curOverride.getFixedPrice(), curOverride.getRecurringPrice(), resolvedUsageOverrides);
+                resolvedOverride[index++] = new DefaultPlanPhasePriceOverride(curPhase.getName(), curOverride.getCurrency(), curOverride.getFixedPrice(),
+                        curOverride.getRecurringPrice(), resolvedUsageOverrides);
             }
             else
                 resolvedOverride[index++] = null;
@@ -150,7 +166,8 @@ public class DefaultPriceOverride implements PriceOverride {
             }).orNull();
 
             if(curOverride != null) {
-                List<TieredBlockPriceOverride> tieredBlockPriceOverrides = getResolvedTieredBlockPriceOverrides(curTier.getTieredBlocks(),curOverride.getTieredBlockPriceOverrides());
+                List<TieredBlockPriceOverride> tieredBlockPriceOverrides = getResolvedTieredBlockPriceOverrides(curTier.getTieredBlocks(),
+                        curOverride.getTieredBlockPriceOverrides());
                 resolvedTierOverrides.add(new DefaultTierPriceOverride(tieredBlockPriceOverrides));
             }
             else
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java
index 32eb734..15092c2 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/PhasePriceOverrideJson.java
@@ -17,23 +17,32 @@
 
 package org.killbill.billing.jaxrs.json;
 
-import java.math.BigDecimal;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.annotation.Nullable;
-
-import org.killbill.billing.catalog.DefaultPlanPhasePriceOverride;
-import org.killbill.billing.catalog.DefaultTierPriceOverride;
-import org.killbill.billing.catalog.DefaultTieredBlockPriceOverride;
-import org.killbill.billing.catalog.DefaultUsagePriceOverride;
-import org.killbill.billing.catalog.api.*;
-
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
+import org.killbill.billing.catalog.DefaultPlanPhasePriceOverride;
+import org.killbill.billing.catalog.DefaultTierPriceOverride;
+import org.killbill.billing.catalog.DefaultTieredBlockPriceOverride;
+import org.killbill.billing.catalog.DefaultUsagePriceOverride;
+import org.killbill.billing.catalog.api.CatalogApiException;
+import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.catalog.api.PhaseType;
+import org.killbill.billing.catalog.api.PlanPhasePriceOverride;
+import org.killbill.billing.catalog.api.PlanPhaseSpecifier;
+import org.killbill.billing.catalog.api.PlanSpecifier;
+import org.killbill.billing.catalog.api.Tier;
+import org.killbill.billing.catalog.api.TierPriceOverride;
+import org.killbill.billing.catalog.api.TieredBlock;
+import org.killbill.billing.catalog.api.TieredBlockPriceOverride;
+import org.killbill.billing.catalog.api.Usage;
+import org.killbill.billing.catalog.api.UsagePriceOverride;
+
+import javax.annotation.Nullable;
+import java.math.BigDecimal;
+import java.util.LinkedList;
+import java.util.List;
 
 public class PhasePriceOverrideJson {