killbill-uncached

Details

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 3c35e29..8f2fbcf 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
@@ -57,7 +57,7 @@ public interface StaticCatalog {
     public abstract PriceList findCurrentPricelist(String name) throws CatalogApiException;
 
     //
-    //  
+    //
     //
     public abstract ActionPolicy planChangePolicy(PlanPhaseSpecifier from,
                                                   PlanSpecifier to) throws CatalogApiException;
@@ -77,6 +77,7 @@ public interface StaticCatalog {
 
     public abstract boolean canCreatePlan(PlanSpecifier specifier) throws CatalogApiException;
 
+    public abstract List<Listing> getAvailableBasePlanListings() throws CatalogApiException;
     public abstract List<Listing> getAvailableAddonListings(String baseProductName) throws CatalogApiException;
 
 }
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 22c091b..3b3869f 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
@@ -16,17 +16,18 @@
 
 package com.ning.billing.catalog;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
 import com.ning.billing.ErrorCode;
 import com.ning.billing.catalog.api.ActionPolicy;
 import com.ning.billing.catalog.api.BillingAlignment;
@@ -43,6 +44,7 @@ import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.PlanSpecifier;
 import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.Product;
+import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.catalog.api.StaticCatalog;
 import com.ning.billing.catalog.rules.PlanRules;
 import com.ning.billing.util.config.ValidatingConfig;
@@ -342,4 +344,22 @@ public class StandaloneCatalog extends ValidatingConfig<StandaloneCatalog> imple
         return availAddons;
     }
 
+    @Override
+    public List<Listing> getAvailableBasePlanListings() {
+        final List<Listing> availBasePlans = new ArrayList<Listing>();
+
+        for (Plan plan : getCurrentPlans()) {
+            if (plan.getProduct().getCategory().equals(ProductCategory.BASE)) {
+                for (PriceList priceList : getPriceLists().getAllPriceLists()) {
+                    Plan planInList = priceList.findPlan(plan.getProduct(), plan.getBillingPeriod());
+
+                    if (planInList != null) {
+                        availBasePlans.add(new DefaultListing(plan, priceList));
+                    }
+                }
+            }
+        }
+
+        return availBasePlans;
+    }
 }
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 5050a17..81e1c02 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java
@@ -15,10 +15,6 @@
  */
 package com.ning.billing.catalog;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -27,6 +23,11 @@ import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -448,4 +449,8 @@ public class VersionedCatalog extends ValidatingConfig<StandaloneCatalog> implem
         return versionForDate(clock.getUTCNow()).getAvailableAddonListings(baseProductName);
     }
 
+    @Override
+    public List<Listing> getAvailableBasePlanListings() throws CatalogApiException {
+        return versionForDate(clock.getUTCNow()).getAvailableBasePlanListings();
+    }
 }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CatalogJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CatalogJsonSimple.java
index 3a8e86f..efd1778 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CatalogJsonSimple.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CatalogJsonSimple.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -37,9 +37,9 @@ import com.ning.billing.catalog.api.StaticCatalog;
 
 @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
 public class CatalogJsonSimple {
-    
+
     private final ProductJson [] products;
-    
+
     public CatalogJsonSimple(StaticCatalog catalog) throws CatalogApiException {
 
         Map<String, ProductJson> productMap = new HashMap<String, CatalogJsonSimple.ProductJson>();
@@ -69,27 +69,28 @@ public class CatalogJsonSimple {
                 PhaseJson jPhase = new PhaseJson(phase.getPhaseType().toString(), prices);
                 phases[i++] = jPhase;
             }
-            PlanJson jPlan = new PlanJson(plan.getName(), phases); 
+            PlanJson jPlan = new PlanJson(plan.getName(), phases);
             jProduct.addPlan(jPlan);
         }
         products = productMap.values().toArray(new ProductJson[productMap.values().size()]);
     }
-    
+
     private Collection<String> toProductNames(Product [] in) {
         return Collections2.transform(Lists.newArrayList(in), new Function<Product, String>() {
+            @Override
             public String apply(Product input) {
                 return input.getName();
             }
         });
     }
-    
+
     @JsonCreator
     public CatalogJsonSimple(@JsonProperty("products")  ProductJson[] products) {
         super();
         this.products = products;
     }
-    
-    
+
+
 
     public ProductJson[] getProducts() {
         return products;
@@ -104,7 +105,7 @@ public class CatalogJsonSimple {
         private final String [] included;
         private final String [] available;
         private final List<PlanJson> plans;
-        
+
 
         @JsonCreator
         public ProductJson(@JsonProperty("type") String type,
@@ -127,7 +128,7 @@ public class CatalogJsonSimple {
         public void addPlan(PlanJson plan) {
             plans.add(plan);
         }
-        
+
         public String getType() {
             return type;
         }
@@ -139,7 +140,7 @@ public class CatalogJsonSimple {
         public List<PlanJson> getPlans() {
             return plans;
         }
-        
+
         public String[] getIncluded() {
             return included;
         }
@@ -148,13 +149,13 @@ public class CatalogJsonSimple {
             return available;
         }
     }
-    
+
     @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
     public static class PlanJson {
 
         private final String name;
         private final PhaseJson [] phases;
-        
+
         @JsonCreator
         public PlanJson(@JsonProperty("name") String name,
                 @JsonProperty("phases") PhaseJson[] phases) {
@@ -175,7 +176,7 @@ public class CatalogJsonSimple {
 
         private final String type;
         private final Map<String, BigDecimal> prices;
-        
+
         @JsonCreator
         public PhaseJson(@JsonProperty("type") String type,
                 @JsonProperty("prices") Map<String, BigDecimal> prices) {
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/CatalogResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/CatalogResource.java
index 3941dc6..dbd8ff4 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/CatalogResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/CatalogResource.java
@@ -16,6 +16,12 @@
 
 package com.ning.billing.jaxrs.resources;
 
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+import static javax.ws.rs.core.MediaType.APPLICATION_XML;
+
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
@@ -23,27 +29,16 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
-import org.joda.time.DateTime;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.google.common.base.Joiner;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.ning.billing.catalog.api.CatalogApiException;
 import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.Listing;
-import com.ning.billing.catalog.api.Plan;
-import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.StaticCatalog;
 import com.ning.billing.jaxrs.json.CatalogJsonSimple;
 import com.ning.billing.jaxrs.json.PlanDetailJason;
 import com.ning.billing.util.config.XMLWriter;
 
-import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
-import static javax.ws.rs.core.MediaType.APPLICATION_XML;
-
 @Singleton
 @Path(JaxrsResource.CATALOG_PATH)
 public class CatalogResource implements JaxrsResource {
@@ -57,8 +52,16 @@ public class CatalogResource implements JaxrsResource {
 
     @GET
     @Produces(APPLICATION_XML)
-    public Response getCatalog() throws Exception {
-        return Response.status(Status.OK).entity(XMLWriter.writeXML((StaticCatalog) catalogService.getCurrentCatalog(), StaticCatalog.class)).build();
+    public Response getCatalogXml() throws Exception {
+        return Response.status(Status.OK).entity(XMLWriter.writeXML(catalogService.getCurrentCatalog(), StaticCatalog.class)).build();
+    }
+
+    @GET
+    @Produces(APPLICATION_JSON)
+    public Response getCatalogJson() throws Exception {
+        StaticCatalog catalog = catalogService.getCurrentCatalog();
+
+        return Response.status(Status.OK).entity(catalog).build();
     }
 
     // Need to figure out dependency on StandaloneCatalog
@@ -90,13 +93,26 @@ public class CatalogResource implements JaxrsResource {
     }
 
     @GET
+    @Path("/availableBasePlans")
+    @Produces(APPLICATION_JSON)
+    public Response getAvailableBasePlans() throws CatalogApiException {
+        final StaticCatalog catalog = catalogService.getCurrentCatalog();
+        final List<Listing> listings = catalog.getAvailableBasePlanListings();
+        final List<PlanDetailJason> details = new ArrayList<PlanDetailJason>();
+        for (final Listing listing : listings) {
+            details.add(new PlanDetailJason(listing));
+        }
+        return Response.status(Status.OK).entity(details).build();
+    }
+
+    @GET
     @Path("/simpleCatalog")
     @Produces(APPLICATION_JSON)
     public Response getSimpleCatalog() throws CatalogApiException {
 
         StaticCatalog catalog  = catalogService.getCurrentCatalog();
-        
+
         CatalogJsonSimple json = new CatalogJsonSimple(catalog);
-        return Response.status(Status.OK).entity(json).build();            
+        return Response.status(Status.OK).entity(json).build();
     }
 }