killbill-memoizeit

catalog: Add catalogName validation when uploading a new catalog

12/27/2016 11:13:05 PM

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..b074630 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);