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