Details
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/api/user/DefaultCatalogUserApi.java b/catalog/src/main/java/org/killbill/billing/catalog/api/user/DefaultCatalogUserApi.java
index 5c6482d..48e22ad 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/api/user/DefaultCatalogUserApi.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/api/user/DefaultCatalogUserApi.java
@@ -31,7 +31,6 @@ import org.killbill.billing.ErrorCode;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.CatalogUpdater;
import org.killbill.billing.catalog.StandaloneCatalog;
-import org.killbill.billing.catalog.StandaloneCatalogWithPriceOverride;
import org.killbill.billing.catalog.VersionedCatalog;
import org.killbill.billing.catalog.api.BillingMode;
import org.killbill.billing.catalog.api.Catalog;
@@ -48,12 +47,17 @@ import org.killbill.billing.tenant.api.TenantUserApi;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.callcontext.TenantContext;
+import org.killbill.xmlloader.ValidationErrors;
import org.killbill.xmlloader.ValidationException;
import org.killbill.xmlloader.XMLLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;
public class DefaultCatalogUserApi implements CatalogUserApi {
+ private final Logger logger = LoggerFactory.getLogger(DefaultCatalogUserApi.class);
+
private final CatalogService catalogService;
private final InternalCallContextFactory internalCallContextFactory;
private final TenantUserApi tenantApi;
@@ -89,9 +93,27 @@ public class DefaultCatalogUserApi implements CatalogUserApi {
final InternalTenantContext internalTenantContext = createInternalTenantContext(callContext);
try {
+
+ final StaticCatalog currentCatalog = catalogService.getCurrentCatalog(false, true, internalTenantContext);
+
+
// Validation purpose: Will throw if bad XML or catalog validation fails
final InputStream stream = new ByteArrayInputStream(catalogXML.getBytes());
- XMLLoader.getObjectFromStream(new URI("dummy"), stream, StandaloneCatalog.class);
+ final StaticCatalog newCatalogVersion = XMLLoader.getObjectFromStream(new URI("dummy"), stream, StandaloneCatalog.class);
+
+ // currentCatalog.getCatalogName() could be null if tenant was created with a default catalog
+ if (currentCatalog != null && currentCatalog.getCatalogName() != null) {
+ if (!newCatalogVersion.getCatalogName().equals(currentCatalog.getCatalogName())) {
+ final ValidationErrors errors = new ValidationErrors();
+ errors.add(String.format("Catalog name '%s' should match previous catalog name '%s'", newCatalogVersion.getCatalogName(), currentCatalog.getCatalogName()),
+ new URI("dummy"), StandaloneCatalog.class, "");
+ // Bummer ValidationException CTOR is private to package...
+ //final ValidationException validationException = new ValidationException(errors);
+ //throw new CatalogApiException(errors, ErrorCode.CAT_INVALID_FOR_TENANT, internalTenantContext.getTenantRecordId());
+ logger.info("Failed to load new catalog version: " + errors.toString());
+ throw new CatalogApiException(ErrorCode.CAT_INVALID_FOR_TENANT, internalTenantContext.getTenantRecordId());
+ }
+ }
catalogCache.clearCatalog(internalTenantContext);
tenantApi.addTenantKeyValue(TenantKey.CATALOG.toString(), catalogXML, callContext);
@@ -124,7 +146,7 @@ public class DefaultCatalogUserApi implements CatalogUserApi {
final StandaloneCatalog currentCatalog = getCurrentStandaloneCatalogForTenant(internalTenantContext);
final CatalogUpdater catalogUpdater = (currentCatalog != null) ?
new CatalogUpdater(currentCatalog) :
- new CatalogUpdater("dummy", BillingMode.IN_ADVANCE, effectiveDate, null);
+ new CatalogUpdater(BillingMode.IN_ADVANCE, effectiveDate, null);
catalogCache.clearCatalog(internalTenantContext);
tenantApi.updateTenantKeyValue(TenantKey.CATALOG.toString(), catalogUpdater.getCatalogXML(), callContext);
@@ -141,7 +163,7 @@ public class DefaultCatalogUserApi implements CatalogUserApi {
final StandaloneCatalog currentCatalog = getCurrentStandaloneCatalogForTenant(internalTenantContext);
final CatalogUpdater catalogUpdater = (currentCatalog != null) ?
new CatalogUpdater(currentCatalog) :
- new CatalogUpdater("dummy", BillingMode.IN_ADVANCE, effectiveDate, descriptor.getCurrency());
+ new CatalogUpdater(BillingMode.IN_ADVANCE, effectiveDate, descriptor.getCurrency());
catalogUpdater.addSimplePlanDescriptor(descriptor);
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/CatalogUpdater.java b/catalog/src/main/java/org/killbill/billing/catalog/CatalogUpdater.java
index 9701a73..4ee0f3a 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/CatalogUpdater.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/CatalogUpdater.java
@@ -51,11 +51,13 @@ import com.google.common.collect.ImmutableList;
public class CatalogUpdater {
- private static URI DUMMY_URI;
+ public static String DEFAULT_CATALOG_NAME = "DEFAULT";
+
+ private static URI DEFAULT_URI;
static {
try {
- DUMMY_URI = new URI("dummy");
+ DEFAULT_URI = new URI(DEFAULT_CATALOG_NAME);
} catch (URISyntaxException e) {
}
}
@@ -68,11 +70,11 @@ public class CatalogUpdater {
this.catalog = new DefaultMutableStaticCatalog(standaloneCatalog);
}
- public CatalogUpdater(final String catalogName, final BillingMode billingMode, final DateTime effectiveDate, final Currency... currencies) {
+ public CatalogUpdater(final BillingMode billingMode, final DateTime effectiveDate, final Currency... currencies) {
final DefaultPriceList defaultPriceList = new DefaultPriceList().setName(PriceListSet.DEFAULT_PRICELIST_NAME);
final StandaloneCatalog tmp = new StandaloneCatalog()
- .setCatalogName(catalogName)
+ .setCatalogName(DEFAULT_CATALOG_NAME)
.setEffectiveDate(effectiveDate.toDate())
.setRecurringBillingMode(billingMode)
.setProducts(ImmutableList.<Product>of())
@@ -84,7 +86,7 @@ public class CatalogUpdater {
} else {
tmp.setSupportedCurrencies(new Currency[0]);
}
- tmp.initialize(tmp, DUMMY_URI);
+ tmp.initialize(tmp, DEFAULT_URI);
this.catalog = new DefaultMutableStaticCatalog(tmp);
}
@@ -118,7 +120,7 @@ public class CatalogUpdater {
product = new DefaultProduct();
product.setName(desc.getProductName());
product.setCatagory(desc.getProductCategory());
- product.initialize(catalog, DUMMY_URI);
+ product.initialize(catalog, DEFAULT_URI);
catalog.addProduct(product);
}
@@ -192,7 +194,7 @@ public class CatalogUpdater {
}
// Reinit catalog
- catalog.initialize(catalog, DUMMY_URI);
+ catalog.initialize(catalog, DEFAULT_URI);
}
private boolean isPriceForCurrencyExists(final InternationalPrice price, final Currency currency) {
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java b/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java
index b8f8fd0..8d31aff 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java
@@ -224,7 +224,7 @@ public class VersionedCatalog extends ValidatingConfig<VersionedCatalog> impleme
}
public void add(final StandaloneCatalog e) throws CatalogApiException {
- if (catalogName == null) {
+ if (catalogName == null && e.getCatalogName() != null) {
catalogName = e.getCatalogName();
}
if (recurringBillingMode == null) {
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/TestCatalogUpdater.java b/catalog/src/test/java/org/killbill/billing/catalog/TestCatalogUpdater.java
index 279b914..af11ffe 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/TestCatalogUpdater.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/TestCatalogUpdater.java
@@ -55,7 +55,7 @@ public class TestCatalogUpdater extends CatalogTestSuiteNoDB {
final DateTime now = clock.getUTCNow();
- final CatalogUpdater catalogUpdater = new CatalogUpdater("dummy", BillingMode.IN_ADVANCE, now, null);
+ final CatalogUpdater catalogUpdater = new CatalogUpdater(BillingMode.IN_ADVANCE, now, null);
final String catalogXML = catalogUpdater.getCatalogXML();
final StandaloneCatalog catalog = XMLLoader.getObjectFromStream(new URI("dummy"), new ByteArrayInputStream(catalogXML.getBytes(Charset.forName("UTF-8"))), StandaloneCatalog.class);
assertEquals(catalog.getCurrentPlans().size(), 0);
@@ -67,7 +67,7 @@ public class TestCatalogUpdater extends CatalogTestSuiteNoDB {
final DateTime now = clock.getUTCNow();
final SimplePlanDescriptor desc = new DefaultSimplePlanDescriptor("foo-monthly", "Foo", ProductCategory.BASE, Currency.EUR, BigDecimal.TEN, BillingPeriod.MONTHLY, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of());
- final CatalogUpdater catalogUpdater = new CatalogUpdater("dummy", BillingMode.IN_ADVANCE, now, desc.getCurrency());
+ final CatalogUpdater catalogUpdater = new CatalogUpdater(BillingMode.IN_ADVANCE, now, desc.getCurrency());
catalogUpdater.addSimplePlanDescriptor(desc);
@@ -108,7 +108,7 @@ public class TestCatalogUpdater extends CatalogTestSuiteNoDB {
final DateTime now = clock.getUTCNow();
final SimplePlanDescriptor desc = new DefaultSimplePlanDescriptor("foo-monthly", "Foo", ProductCategory.BASE, Currency.EUR, BigDecimal.TEN, BillingPeriod.MONTHLY, 14, TimeUnit.DAYS, ImmutableList.<String>of());
- final CatalogUpdater catalogUpdater = new CatalogUpdater("dummy", BillingMode.IN_ADVANCE, now, desc.getCurrency());
+ final CatalogUpdater catalogUpdater = new CatalogUpdater(BillingMode.IN_ADVANCE, now, desc.getCurrency());
catalogUpdater.addSimplePlanDescriptor(desc);