package com.ning.billing.catalog.rules;
import com.ning.billing.catalog.DefaultPriceList;
import com.ning.billing.catalog.DefaultProduct;
import com.ning.billing.catalog.StandaloneCatalog;
import com.ning.billing.catalog.api.BillingPeriod;
import com.ning.billing.catalog.api.CatalogApiException;
import com.ning.billing.catalog.api.PlanSpecifier;
import com.ning.billing.catalog.api.ProductCategory;
import com.ning.billing.util.config.catalog.ValidatingConfig;
import com.ning.billing.util.config.catalog.ValidationErrors;
public abstract class Case<T> extends ValidatingConfig<StandaloneCatalog> {
protected abstract T getResult();
public abstract DefaultProduct getProduct();
public abstract ProductCategory getProductCategory();
public abstract BillingPeriod getBillingPeriod();
public abstract DefaultPriceList getPriceList();
public T getResult(final PlanSpecifier planPhase, final StandaloneCatalog c) throws CatalogApiException {
if (satisfiesCase(planPhase, c)) {
return getResult();
}
return null;
}
protected boolean satisfiesCase(final PlanSpecifier planPhase, final StandaloneCatalog c) throws CatalogApiException {
return (getProduct() == null || getProduct().equals(c.findCurrentProduct(planPhase.getProductName()))) &&
(getProductCategory() == null || getProductCategory().equals(planPhase.getProductCategory())) &&
(getBillingPeriod() == null || getBillingPeriod().equals(planPhase.getBillingPeriod())) &&
(getPriceList() == null || getPriceList().equals(c.findCurrentPriceList(planPhase.getPriceListName())));
}
public static <K> K getResult(final Case<K>[] cases, final PlanSpecifier planSpec, final StandaloneCatalog catalog) throws CatalogApiException {
if (cases != null) {
for (final Case<K> c : cases) {
final K result = c.getResult(planSpec, catalog);
if (result != null) {
return result;
}
}
}
return null;
}
@Override
public ValidationErrors validate(final StandaloneCatalog catalog, final ValidationErrors errors) {
return errors;
}
protected abstract Case<T> setProduct(DefaultProduct product);
protected abstract Case<T> setProductCategory(ProductCategory productCategory);
protected abstract Case<T> setBillingPeriod(BillingPeriod billingPeriod);
protected abstract Case<T> setPriceList(DefaultPriceList priceList);
}