killbill-memoizeit

Details

diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java
index 1c48937..0c4071b 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java
@@ -192,6 +192,8 @@ public class DefaultPlan extends ValidatingConfig<StandaloneCatalog> implements 
                                            catalog.getCatalogURI(), DefaultInternationalPrice.class, ""));
         }
 
+        validateCollection(catalog, errors, initialPhases);
+        finalPhase.validate(catalog, errors);
         return errors;
     }
 
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 e4308f8..9cfd5d1 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlanPhase.java
@@ -34,6 +34,7 @@ import org.killbill.billing.catalog.api.PlanPhase;
 import org.killbill.billing.catalog.api.Recurring;
 import org.killbill.billing.catalog.api.Usage;
 import org.killbill.billing.util.config.catalog.ValidatingConfig;
+import org.killbill.billing.util.config.catalog.ValidationError;
 import org.killbill.billing.util.config.catalog.ValidationErrors;
 
 @XmlAccessorType(XmlAccessType.NONE)
@@ -53,7 +54,7 @@ public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implem
 
     @XmlElementWrapper(name = "usages", required = false)
     @XmlElement(name = "usage", required = false)
-    private DefaultUsage[] usages;
+    private DefaultUsage[] usages = new DefaultUsage[0];
 
     //Not exposed in XML
     private Plan plan;
@@ -81,8 +82,12 @@ public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implem
 
     @Override
     public boolean compliesWithLimits(final String unit, final double value) {
-        // TODO STEPH
-        return true;
+        for (DefaultUsage usage : usages) {
+            if (!usage.compliesWithLimits(unit, value)) {
+                return false;
+            }
+        }
+        return plan.getProduct().compliesWithLimits(unit, value);
     }
 
     @Override
@@ -129,23 +134,18 @@ public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implem
     @Override
     public ValidationErrors validate(final StandaloneCatalog catalog, final ValidationErrors errors) {
 
-        // TODO STEPH check there is either fixed and/or/usage and/or recurring defined.
-
-        /*
-        //Validation: if there BP is set to NO_BILLING_PERIOD there must be a fixed price
-        if ((billingPeriod == BillingPeriod.NO_BILLING_PERIOD && fixedPrice == null)) {
-            errors.add(new ValidationError(String.format("Phase %s of plan %s has no billing period. It must have a fixed price set.",
+        if (fixed == null && recurring == null && usages.length == 0) {
+            errors.add(new ValidationError(String.format("Phase %s of plan %s need to define at least either a fixed or recurrring or usage section.",
                                                          type.toString(), plan.getName()),
                                            catalog.getCatalogURI(), DefaultPlanPhase.class, type.toString()));
         }
-
-        //Validation: there must be at least one of recurringPrice or fixedPrice
-        if ((recurringPrice == null) && fixedPrice == null) {
-            errors.add(new ValidationError(String.format("Phase %s of plan %s has neither a recurring price or a fixed price.",
-                                                         type.toString(), plan.getName()),
-                                           catalog.getCatalogURI(), DefaultPlanPhase.class, type.toString()));
+        if (fixed != null) {
+            fixed.validate(catalog, errors);
+        }
+        if (recurring != null) {
+            recurring.validate(catalog, errors);
         }
-        */
+        validateCollection(catalog, errors, usages);
         return errors;
     }
 
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultProduct.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultProduct.java
index e1d84fe..fabd692 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultProduct.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultProduct.java
@@ -26,6 +26,7 @@ import javax.xml.bind.annotation.XmlIDREF;
 import java.net.URI;
 import java.util.Arrays;
 
+import org.killbill.billing.catalog.api.BillingPeriod;
 import org.killbill.billing.catalog.api.Limit;
 import org.killbill.billing.catalog.api.Product;
 import org.killbill.billing.catalog.api.ProductCategory;
@@ -55,7 +56,7 @@ public class DefaultProduct extends ValidatingConfig<StandaloneCatalog> implemen
     @XmlIDREF
     @XmlElement(name = "addonProduct", required = true)
     private DefaultProduct[] available = EMPTY_PRODUCT_LIST;
-    
+
     @XmlElementWrapper(name = "limits", required = false)
     @XmlElement(name = "limit", required = true)
     private DefaultLimit[] limits = new DefaultLimit[0];
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 0c2372c..2b22691 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultUsage.java
@@ -5,8 +5,10 @@ import java.net.URI;
 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.BillingPeriod;
+import org.killbill.billing.catalog.api.Limit;
 import org.killbill.billing.catalog.api.PlanPhase;
 import org.killbill.billing.catalog.api.Usage;
 import org.killbill.billing.util.config.catalog.ValidatingConfig;
@@ -18,6 +20,10 @@ public class DefaultUsage extends ValidatingConfig<StandaloneCatalog> implements
     @XmlElement(required = true)
     private BillingPeriod billingPeriod;
 
+    @XmlElementWrapper(name = "limits", required = false)
+    @XmlElement(name = "limit", required = true)
+    private DefaultLimit[] limits = new DefaultLimit[0];
+
     @Override
     public BillingPeriod getBillingPeriod() {
         return billingPeriod;
@@ -27,13 +33,22 @@ public class DefaultUsage extends ValidatingConfig<StandaloneCatalog> implements
     private PlanPhase phase;
 
     @Override
-    public boolean compliesWithLimits(final String s, final double v) {
-        return false;
+    public boolean compliesWithLimits(final String unit, final double value) {
+        for (DefaultLimit limit : limits) {
+            if (!limit.getUnit().getName().equals(unit)) {
+                continue;
+            }
+            if (!limit.compliesWith(value)) {
+                return false;
+            }
+        }
+        return true;
     }
 
     @Override
     public ValidationErrors validate(final StandaloneCatalog root, final ValidationErrors errors) {
-        return null;
+        validateCollection(root, errors, limits);
+        return errors;
     }
 
     @Override
@@ -41,6 +56,11 @@ public class DefaultUsage extends ValidatingConfig<StandaloneCatalog> implements
 
     }
 
+    @Override
+    public DefaultLimit[] getLimits() {
+        return limits;
+    }
+
     public DefaultUsage setBillingPeriod(final BillingPeriod billingPeriod) {
         this.billingPeriod = billingPeriod;
         return this;
@@ -51,21 +71,10 @@ public class DefaultUsage extends ValidatingConfig<StandaloneCatalog> implements
         return this;
     }
 
-    /*
-        /*
-     * (non-Javadoc)
-     *
-     * @see org.killbill.billing.catalog.PlanPhase#getLimit()
-     */
-
-
-    /*
-    @Override
-    public DefaultLimit[] getLimits() {
-        return limits;
+    public void setLimits(final DefaultLimit[] limits) {
+        this.limits = limits;
     }
 
-
     protected Limit findLimit(String unit) {
 
         for (Limit limit : limits) {
@@ -75,23 +84,4 @@ public class DefaultUsage extends ValidatingConfig<StandaloneCatalog> implements
         }
         return null;
     }
-
-    @Override
-    public boolean compliesWithLimits(String unit, double value) {
-        Limit l = findLimit(unit);
-        if (l == null) {
-            return getPlan().getProduct().compliesWithLimits(unit, value);
-        }
-        return l.compliesWith(value);
-    }
-
-
-    */
-
-    /*
-    @XmlElementWrapper(name = "limits", required = false)
-    @XmlElement(name = "limit", required = true)
-    private DefaultLimit[] limits = new DefaultLimit[0];
-    */
-
 }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/StandaloneCatalog.java b/catalog/src/main/java/org/killbill/billing/catalog/StandaloneCatalog.java
index 3b611fa..6491591 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/StandaloneCatalog.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/StandaloneCatalog.java
@@ -18,7 +18,6 @@ package org.killbill.billing.catalog;
 
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 
@@ -34,7 +33,6 @@ import org.killbill.billing.catalog.api.BillingAlignment;
 import org.killbill.billing.catalog.api.BillingPeriod;
 import org.killbill.billing.catalog.api.CatalogApiException;
 import org.killbill.billing.catalog.api.Currency;
-import org.killbill.billing.catalog.api.Limit;
 import org.killbill.billing.catalog.api.Listing;
 import org.killbill.billing.catalog.api.Plan;
 import org.killbill.billing.catalog.api.PlanAlignmentChange;
@@ -49,7 +47,6 @@ import org.killbill.billing.catalog.api.ProductCategory;
 import org.killbill.billing.catalog.api.StaticCatalog;
 import org.killbill.billing.catalog.rules.PlanRules;
 import org.killbill.billing.util.config.catalog.ValidatingConfig;
-import org.killbill.billing.util.config.catalog.ValidationError;
 import org.killbill.billing.util.config.catalog.ValidationErrors;
 
 @XmlRootElement(name = "catalog")
@@ -253,21 +250,13 @@ public class StandaloneCatalog extends ValidatingConfig<StandaloneCatalog> imple
 
     @Override
     public ValidationErrors validate(final StandaloneCatalog catalog, final ValidationErrors errors) {
-        validate(catalog, errors, products);
-        validate(catalog, errors, plans);
+        validateCollection(catalog, errors, products);
+        validateCollection(catalog, errors, plans);
         priceLists.validate(catalog, errors);
         planRules.validate(catalog, errors);
         return errors;
     }
 
-    private Collection<? extends ValidationError> validate(final StandaloneCatalog catalog,
-                                                           final ValidationErrors errors, final ValidatingConfig<StandaloneCatalog>[] configs) {
-        for (final ValidatingConfig<StandaloneCatalog> config : configs) {
-            config.validate(catalog, errors);
-        }
-        return errors;
-    }
-
 
     @Override
     public void initialize(final StandaloneCatalog catalog, final URI sourceURI) {
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/MockPlanPhase.java b/catalog/src/test/java/org/killbill/billing/catalog/MockPlanPhase.java
index cf1ea5b..5ba79d3 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/MockPlanPhase.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/MockPlanPhase.java
@@ -71,7 +71,7 @@ public class MockPlanPhase extends DefaultPlanPhase {
         setPhaseType(type);
         setDuration(duration);
         setFixed(new MockFixed(fixedPrice));
-        setRecurring(new MockRecurring(billingPeriod, recurringPrice));
+        setRecurring(new MockRecurring(billingPeriod, recurringPrice).setPhase(this));
     }
 
     public MockPlanPhase() {
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/TestLimits.java b/catalog/src/test/java/org/killbill/billing/catalog/TestLimits.java
index 5e7246b..7cfe30c 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/TestLimits.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/TestLimits.java
@@ -16,17 +16,17 @@
 
 package org.killbill.billing.catalog;
 
+import org.killbill.billing.catalog.api.PlanPhase;
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import com.google.common.io.Resources;
-import org.killbill.billing.catalog.api.PlanPhase;
-import org.killbill.billing.lifecycle.KillbillService.ServiceException;
 
 public class TestLimits extends CatalogTestSuiteNoDB {
+
     private VersionedCatalog catalog;
-    
+
     @BeforeClass(groups = "fast")
     public void beforeClass() throws Exception {
         super.beforeClass();
@@ -37,17 +37,26 @@ public class TestLimits extends CatalogTestSuiteNoDB {
     public void testLimits() throws Exception {
         PlanPhase phase = catalog.findCurrentPhase("pistol-monthly-evergreen");
         Assert.assertNotNull(phase);
-        
-        //<limits>
-        //    <limit>
-        //        <unit>targets</unit>
-        //        <min>3</min>
-        //    </limit>
-        //    <limit>
-        //        <unit>misfires</unit>
-        //        <max>20</max>
-        //    </limit>
-        //</limits>
+
+
+        /*
+                     <usages>
+                    <usage>
+                        <billingPeriod>NO_BILLING_PERIOD</billingPeriod>
+                        <limits>
+                            <limit>
+                                <unit>targets</unit>
+                                <min>3</min>
+                            </limit>
+                            <limit>
+                                <unit>misfires</unit>
+                                <max>20</max>
+                            </limit>
+                        </limits>
+                    </usage>
+                </usages>
+         */
+
         Assert.assertTrue(catalog.compliesWithLimits("pistol-monthly-evergreen", "targets", 3));
         Assert.assertTrue(catalog.compliesWithLimits("pistol-monthly-evergreen", "targets", 2000));
         Assert.assertFalse(catalog.compliesWithLimits("pistol-monthly-evergreen", "targets", 2));
@@ -55,38 +64,40 @@ public class TestLimits extends CatalogTestSuiteNoDB {
         Assert.assertTrue(catalog.compliesWithLimits("pistol-monthly-evergreen", "misfires", 3));
         Assert.assertFalse(catalog.compliesWithLimits("pistol-monthly-evergreen", "misfires", 21));
         Assert.assertTrue(catalog.compliesWithLimits("pistol-monthly-evergreen", "misfires", -1));
-/*      <product name="Shotgun">
-            <category>BASE</category>
-            <limits>
+
+
+        /*
+            <product name="Shotgun">
+              <category>BASE</category>
+              <limits>
                 <limit>
                     <unit>shells</unit>
                     <max>300</max>
                 </limit>
-            </limits>
-        </product>
-        <plan name="shotgun-annual">
-            <product>Shotgun</product>
-        ...
-            <finalPhase type="EVERGREEN">
-                <limits>
-                    <limit>
-                        <unit>shells</unit>
-                        <max>200</max>
-                    </limit>
-                </limits>
-            </finalPhase>
-        </plan>
-*/
+              </limits>
+            </product>
+        */
         Assert.assertTrue(catalog.compliesWithLimits("shotgun-monthly-evergreen", "shells", 100));
         Assert.assertFalse(catalog.compliesWithLimits("shotgun-monthly-evergreen", "shells", 400));
         Assert.assertTrue(catalog.compliesWithLimits("shotgun-monthly-evergreen", "shells", 250));
-     
+
+       /*
+                   <!-- shotgun-annual-evergreen -->
+                   <usages>
+                    <usage>
+                        <billingPeriod>ANNUAL</billingPeriod>
+                        <limits>
+                            <limit>
+                                <unit>shells</unit>
+                                <max>200</max>
+                            </limit>
+                        </limits>
+                    </usage>
+                </usages>
+         */
         Assert.assertTrue(catalog.compliesWithLimits("shotgun-annual-evergreen", "shells", 100));
         Assert.assertFalse(catalog.compliesWithLimits("shotgun-annual-evergreen", "shells", 400));
         Assert.assertFalse(catalog.compliesWithLimits("shotgun-annual-evergreen", "shells", 250));
-     
-        
-        
-        
+
     }
 }
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/TestPlanPhase.java b/catalog/src/test/java/org/killbill/billing/catalog/TestPlanPhase.java
index 03820e7..e68244d 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/TestPlanPhase.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/TestPlanPhase.java
@@ -16,6 +16,8 @@
 
 package org.killbill.billing.catalog;
 
+import java.math.BigDecimal;
+
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -34,18 +36,10 @@ public class TestPlanPhase extends CatalogTestSuiteNoDB {
         errors.log(log);
         Assert.assertEquals(errors.size(), 1);
 
-        /*
-        TODO STEPH
-        pp = MockPlanPhase.createUSDMonthlyEvergreen("1.00", null).setBillCycleDuration(BillingPeriod.NO_BILLING_PERIOD).setPlan(MockPlan.createBicycleNoTrialEvergreen1USD());
+        pp = MockPlanPhase.createUSDMonthlyEvergreen("1.00", null).setRecurring(new MockRecurring(BillingPeriod.NO_BILLING_PERIOD, MockInternationalPrice.createUSD("1.00")).setPhase(pp)).setPlan(MockPlan.createBicycleNoTrialEvergreen1USD());
         errors = pp.validate(new MockCatalog(), new ValidationErrors());
         errors.log(log);
-        Assert.assertEquals(errors.size(), 2);
-
-        pp = MockPlanPhase.createUSDMonthlyEvergreen(null, null).setBillCycleDuration(BillingPeriod.NO_BILLING_PERIOD).setPlan(MockPlan.createBicycleNoTrialEvergreen1USD());
-        errors = pp.validate(new MockCatalog(), new ValidationErrors());
-        errors.log(log);
-        */
-        Assert.assertEquals(errors.size(), 2);
+        Assert.assertEquals(errors.size(), 1);
     }
 
     @Test(groups = "fast")
diff --git a/catalog/src/test/resources/versionedCatalog/WeaponsHireSmall-2.xml b/catalog/src/test/resources/versionedCatalog/WeaponsHireSmall-2.xml
index ef05026..5ec6a46 100644
--- a/catalog/src/test/resources/versionedCatalog/WeaponsHireSmall-2.xml
+++ b/catalog/src/test/resources/versionedCatalog/WeaponsHireSmall-2.xml
@@ -18,7 +18,7 @@
 <catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="CatalogSchema.xsd ">
 
-    <effectiveDate>2011-02-01T00:00:00+00:00</effectiveDate>
+    <effectiveDate>2011-02-02T00:00:00+00:00</effectiveDate>
     <catalogName>WeaponsHireSmall</catalogName>
 
     <currencies>
diff --git a/catalog/src/test/resources/versionedCatalog/WeaponsHireSmall-3.xml b/catalog/src/test/resources/versionedCatalog/WeaponsHireSmall-3.xml
index 0e2de86..987d211 100644
--- a/catalog/src/test/resources/versionedCatalog/WeaponsHireSmall-3.xml
+++ b/catalog/src/test/resources/versionedCatalog/WeaponsHireSmall-3.xml
@@ -18,7 +18,7 @@
 <catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="CatalogSchema.xsd ">
 
-    <effectiveDate>2011-03-01T00:00:00+00:00</effectiveDate>
+    <effectiveDate>2011-03-03T00:00:00+00:00</effectiveDate>
     <catalogName>WeaponsHireSmall</catalogName>
 
     <currencies>
diff --git a/catalog/src/test/resources/WeaponsHireSmall.xml b/catalog/src/test/resources/WeaponsHireSmall.xml
index 365cf11..212dd75 100644
--- a/catalog/src/test/resources/WeaponsHireSmall.xml
+++ b/catalog/src/test/resources/WeaponsHireSmall.xml
@@ -118,19 +118,22 @@
                             <value>29.95</value>
                         </price>
                     </recurringPrice>
-                    <!--
-                    <limits>
-                        <limit>
-                            <unit>targets</unit>
-                            <min>3</min>
-                        </limit>
-                        <limit>
-                            <unit>misfires</unit>
-                            <max>20</max>
-                        </limit>
-                    </limits>
-                    -->
                 </recurring>
+                <usages>
+                    <usage>
+                        <billingPeriod>NO_BILLING_PERIOD</billingPeriod>
+                        <limits>
+                            <limit>
+                                <unit>targets</unit>
+                                <min>3</min>
+                            </limit>
+                            <limit>
+                                <unit>misfires</unit>
+                                <max>20</max>
+                            </limit>
+                        </limits>
+                    </usage>
+                </usages>
             </finalPhase>
         </plan>
         <plan name="shotgun-monthly">
@@ -205,15 +208,18 @@
                             <value>1699.95</value>
                         </price>
                     </recurringPrice>
-                    <!--
-                    <limits>
-                        <limit>
-                            <unit>shells</unit>
-                            <max>200</max>
-                        </limit>
-                    </limits>
-                    -->
                 </recurring>
+                <usages>
+                    <usage>
+                        <billingPeriod>ANNUAL</billingPeriod>
+                        <limits>
+                            <limit>
+                                <unit>shells</unit>
+                                <max>200</max>
+                            </limit>
+                        </limits>
+                    </usage>
+                </usages>
             </finalPhase>
         </plan>
         <plan name="laser-scope-monthly">
diff --git a/util/src/main/java/org/killbill/billing/util/config/catalog/ValidatingConfig.java b/util/src/main/java/org/killbill/billing/util/config/catalog/ValidatingConfig.java
index dc9ad83..8278117 100644
--- a/util/src/main/java/org/killbill/billing/util/config/catalog/ValidatingConfig.java
+++ b/util/src/main/java/org/killbill/billing/util/config/catalog/ValidatingConfig.java
@@ -17,6 +17,7 @@
 package org.killbill.billing.util.config.catalog;
 
 import java.net.URI;
+import java.util.Collection;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
@@ -41,4 +42,11 @@ public abstract class ValidatingConfig<Context> {
     public void initialize(final Context root, final URI uri) {
     }
 
+    protected Collection<? extends ValidationError> validateCollection(final Context context,
+                                                                       final ValidationErrors errors, final ValidatingConfig<Context>[] configs) {
+        for (final ValidatingConfig<Context> config : configs) {
+            config.validate(context, errors);
+        }
+        return errors;
+    }
 }