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));
+
+ }
+}