killbill-memoizeit

Added API for Limits and a unit test

2/16/2013 12:05:16 AM

Details

diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockPhase.java b/analytics/src/test/java/com/ning/billing/analytics/MockPhase.java
index 6a1604c..b9f05f2 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockPhase.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockPhase.java
@@ -116,4 +116,9 @@ public class MockPhase implements PlanPhase {
     public Limit[] getLimits() {
          return new Limit[0];
     }
+
+    @Override
+    public boolean compliesWithLimits(String unit, double value) {
+        return false;
+    }
 }
diff --git a/api/src/main/java/com/ning/billing/catalog/api/Limit.java b/api/src/main/java/com/ning/billing/catalog/api/Limit.java
index 70a0d62..f646a96 100644
--- a/api/src/main/java/com/ning/billing/catalog/api/Limit.java
+++ b/api/src/main/java/com/ning/billing/catalog/api/Limit.java
@@ -25,4 +25,6 @@ public interface Limit {
 
     public abstract Double getMin();
 
+    public abstract boolean compliesWith(double value);
+
 }
\ No newline at end of file
diff --git a/api/src/main/java/com/ning/billing/catalog/api/PlanPhase.java b/api/src/main/java/com/ning/billing/catalog/api/PlanPhase.java
index e9803b8..23117b1 100644
--- a/api/src/main/java/com/ning/billing/catalog/api/PlanPhase.java
+++ b/api/src/main/java/com/ning/billing/catalog/api/PlanPhase.java
@@ -72,4 +72,10 @@ public interface PlanPhase {
     * @return  the {@code Limit}
     */
     public Limit[] getLimits();
+    
+    /**
+    *
+    * @return  compliance boolean
+    */
+    public boolean compliesWithLimits(String unit, double value);
 }
diff --git a/api/src/main/java/com/ning/billing/catalog/api/StaticCatalog.java b/api/src/main/java/com/ning/billing/catalog/api/StaticCatalog.java
index 1e5632a..8f06f6b 100644
--- a/api/src/main/java/com/ning/billing/catalog/api/StaticCatalog.java
+++ b/api/src/main/java/com/ning/billing/catalog/api/StaticCatalog.java
@@ -145,5 +145,7 @@ public interface StaticCatalog {
     public List<Listing> getAvailableBasePlanListings() throws CatalogApiException;
     public List<Listing> getAvailableAddonListings(String baseProductName) throws CatalogApiException;
 
+    boolean compliesWithLimits(String phaseName, String unit, double value) throws CatalogApiException;
+
 
 }
diff --git a/catalog/src/main/java/com/ning/billing/catalog/DefaultLimit.java b/catalog/src/main/java/com/ning/billing/catalog/DefaultLimit.java
index c583679..5f4130e 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/DefaultLimit.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/DefaultLimit.java
@@ -73,4 +73,19 @@ public class DefaultLimit extends ValidatingConfig<StandaloneCatalog> implements
 
         return errors;
     }
+
+    @Override
+    public boolean compliesWith(double value) {
+        if (max != null) {
+            if (value > max.doubleValue()) {
+                return false;
+            }
+        }
+        if (min != null) {
+            if (value < min.doubleValue()) {
+                return false;
+            }
+        }
+        return true;
+    }
 }
diff --git a/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java b/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java
index 85ee0ee..336605c 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/DefaultPlanPhase.java
@@ -16,14 +16,14 @@
 
 package com.ning.billing.catalog;
 
+import java.net.URI;
+
 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.XmlElementWrapper;
 
-import java.net.URI;
-
 import com.ning.billing.ErrorCode;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.CatalogApiException;
@@ -147,6 +147,27 @@ public class DefaultPlanPhase extends ValidatingConfig<StandaloneCatalog> implem
     public DefaultLimit[] getLimits() {
         return limits;
     }
+    
+    
+    protected Limit findLimit(String unit) {
+        for(Limit limit: limits) {
+            if(limit.getUnit().getName().equals(unit) ) {
+                    return limit;
+            }
+        }
+        return null;
+    }
+    
+    
+    @Override
+    public boolean compliesWithLimits(String unit, double value) {
+        Limit l = findLimit(unit);
+        if (l == null) {
+            return true;
+        }
+        return l.compliesWith(value);
+    }
+
 
     @Override
     public ValidationErrors validate(final StandaloneCatalog catalog, final ValidationErrors errors) {
diff --git a/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java b/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
index 864e33b..f1488a3 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
@@ -34,6 +34,7 @@ import com.ning.billing.catalog.api.BillingAlignment;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.CatalogApiException;
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.catalog.api.Limit;
 import com.ning.billing.catalog.api.Listing;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanAlignmentChange;
@@ -284,6 +285,18 @@ public class StandaloneCatalog extends ValidatingConfig<StandaloneCatalog> imple
     }
 
 
+    //////////////////////////////////////////////////////////////////////////////
+    //
+    // UNIT LIMIT
+    //
+    //////////////////////////////////////////////////////////////////////////////
+    
+    @Override
+    public boolean compliesWithLimits(final String phaseName, final String unit, final double value) throws CatalogApiException {
+        PlanPhase phase = findCurrentPhase(phaseName);
+        return phase.compliesWithLimits(unit, value);
+    }
+
     protected StandaloneCatalog setProducts(final DefaultProduct[] products) {
         this.products = products;
         return this;
diff --git a/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java b/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java
index fc58c52..2796ae4 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java
@@ -456,4 +456,9 @@ public class VersionedCatalog extends ValidatingConfig<StandaloneCatalog> implem
     public List<Listing> getAvailableBasePlanListings() throws CatalogApiException {
         return versionForDate(clock.getUTCNow()).getAvailableBasePlanListings();
     }
+
+    @Override
+    public boolean compliesWithLimits(String phaseName, String unit, double value) throws CatalogApiException {
+        return versionForDate(clock.getUTCNow()).compliesWithLimits(phaseName, unit, value);
+    }
 }
diff --git a/catalog/src/test/java/com/ning/billing/catalog/TestLimits.java b/catalog/src/test/java/com/ning/billing/catalog/TestLimits.java
new file mode 100644
index 0000000..1e6f760
--- /dev/null
+++ b/catalog/src/test/java/com/ning/billing/catalog/TestLimits.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.catalog;
+
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.io.Resources;
+import com.ning.billing.catalog.api.PlanPhase;
+import com.ning.billing.lifecycle.KillbillService.ServiceException;
+
+public class TestLimits extends CatalogTestSuiteNoDB {
+    private VersionedCatalog catalog;
+    
+    @BeforeClass(groups = "fast")
+    public void setUp() throws ServiceException {
+        catalog = loader.load(Resources.getResource("WeaponsHireSmall.xml").toString());
+    }
+
+    @Test(groups = "fast")
+    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>
+        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));
+
+        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));
+
+    }
+}