killbill-aplcache

Details

diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java
index 4e270a0..46c9878 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java
@@ -44,17 +44,17 @@ import com.ning.billing.util.svcapi.junction.DefaultBlockingState;
 
 public class DefaultEntitlement extends EntityBase implements Entitlement {
 
-    private final EntitlementDateHelper dateHelper;
-    private final SubscriptionBase subscriptionBase;
-    private final InternalCallContextFactory internalCallContextFactory;
-    private final Clock clock;
-    private final EntitlementState state;
-    private final BlockingState entitlementBlockingState;
-    private final BlockingChecker checker;
-    private final UUID accountId;
-    private final String externalKey;
-    private final DateTimeZone accountTimeZone;
-    private final BlockingStateDao blockingStateDao;
+    protected final EntitlementDateHelper dateHelper;
+    protected final SubscriptionBase subscriptionBase;
+    protected final InternalCallContextFactory internalCallContextFactory;
+    protected final Clock clock;
+    protected final EntitlementState state;
+    protected final BlockingState entitlementBlockingState;
+    protected final BlockingChecker checker;
+    protected final UUID accountId;
+    protected final String externalKey;
+    protected final DateTimeZone accountTimeZone;
+    protected final BlockingStateDao blockingStateDao;
 
     public DefaultEntitlement(final EntitlementDateHelper dateHelper, final SubscriptionBase subscriptionBase, final UUID accountId,
                               final String externalKey, final EntitlementState state, final BlockingState entitlementBlockingState, final DateTimeZone accountTimeZone,
@@ -75,11 +75,53 @@ public class DefaultEntitlement extends EntityBase implements Entitlement {
         this.blockingStateDao = blockingStateDao;
     }
 
+    public DefaultEntitlement(final DefaultEntitlement in) {
+        this(in.getDateHelper(),
+             in.getSubscriptionBase(),
+             in.getAccountId(),
+             in.getExternalKey(),
+             in.getState(),
+             in.getEntitlementBlockingState(),
+             in.getAccountTimeZone(),
+             in.getInternalCallContextFactory(),
+             in.getBlockingStateDao(),
+             in.getClock(),
+             in.getChecker());
+    }
+
     // STEPH_ENT should be remove but beatrix tests need to be changed
     public SubscriptionBase getSubscriptionBase() {
         return subscriptionBase;
     }
 
+    public EntitlementDateHelper getDateHelper() {
+        return dateHelper;
+    }
+
+    public InternalCallContextFactory getInternalCallContextFactory() {
+        return internalCallContextFactory;
+    }
+
+    public Clock getClock() {
+        return clock;
+    }
+
+    public BlockingState getEntitlementBlockingState() {
+        return entitlementBlockingState;
+    }
+
+    public BlockingChecker getChecker() {
+        return checker;
+    }
+
+    public DateTimeZone getAccountTimeZone() {
+        return accountTimeZone;
+    }
+
+    public BlockingStateDao getBlockingStateDao() {
+        return blockingStateDao;
+    }
+
     @Override
     public UUID getBaseEntitlementId() {
         return subscriptionBase.getId();
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscription.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscription.java
new file mode 100644
index 0000000..888acf1
--- /dev/null
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscription.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.entitlement.api;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
+
+public class DefaultSubscription extends DefaultEntitlement implements Subscription {
+
+
+    private final List<BlockingState> blockingStates;
+
+    DefaultSubscription(final DefaultEntitlement entitlement, final List<BlockingState> blockingStates) {
+        super(entitlement);
+        this.blockingStates = blockingStates;
+    }
+
+    @Override
+    public LocalDate getBillingStartDate() {
+        return new LocalDate(subscriptionBase.getStartDate(), accountTimeZone);
+    }
+
+    @Override
+    public LocalDate getBillingEndDate() {
+        final DateTime futureOrCurrentEndDate = subscriptionBase.getEndDate() != null ? subscriptionBase.getEndDate() : subscriptionBase.getFutureEndDate();
+        return futureOrCurrentEndDate != null ? new LocalDate(futureOrCurrentEndDate, accountTimeZone) : null;
+    }
+
+    @Override
+    public LocalDate getChargedThroughDate() {
+        return subscriptionBase.getChargedThroughDate() != null ? new LocalDate(subscriptionBase.getChargedThroughDate(), accountTimeZone) : null;
+    }
+
+    @Override
+    public int getBCD() {
+        // STEPH_ENT
+        return 0;
+    }
+
+    @Override
+    public Map<String, String> getCurrentStatesForService() {
+
+        final Map<String, String> result = new HashMap<String, String>();
+        if (blockingStates == null) {
+            return result;
+        }
+        for (BlockingState cur : blockingStates) {
+            result.put(cur.getService(), cur.getStateName());
+        }
+        return result;
+    }
+}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscriptionApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscriptionApi.java
index bb4171c..e38318c 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscriptionApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscriptionApi.java
@@ -1,29 +1,141 @@
 package com.ning.billing.entitlement.api;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
+import com.ning.billing.ErrorCode;
+import com.ning.billing.clock.Clock;
+import com.ning.billing.entitlement.block.BlockingChecker;
+import com.ning.billing.entitlement.dao.BlockingStateDao;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseBundle;
+import com.ning.billing.util.callcontext.InternalCallContextFactory;
+import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.callcontext.TenantContext;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Multimaps;
 
 public class DefaultSubscriptionApi implements SubscriptionApi  {
 
+    private final SubscriptionBaseInternalApi subscriptionInternalApi;
+    private final EntitlementApi entitlementApi;
+    private final BlockingChecker checker;
+    private final BlockingStateDao blockingStateDao;
+    private final EntitlementDateHelper dateHelper;
+    private final Clock clock;
+    private final InternalCallContextFactory internalCallContextFactory;
+
+    public DefaultSubscriptionApi(final SubscriptionBaseInternalApi subscriptionInternalApi, final EntitlementApi entitlementApi, final BlockingChecker checker, final BlockingStateDao blockingStateDao, final EntitlementDateHelper dateHelper, final Clock clock, final InternalCallContextFactory internalCallContextFactory) {
+        this.subscriptionInternalApi = subscriptionInternalApi;
+        this.entitlementApi = entitlementApi;
+        this.checker = checker;
+        this.blockingStateDao = blockingStateDao;
+        this.dateHelper = dateHelper;
+        this.clock = clock;
+        this.internalCallContextFactory = internalCallContextFactory;
+    }
+
     @Override
     public Subscription getSubscriptionForEntitlementId(final UUID entitlementId, final TenantContext context) throws SubscriptionApiException {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+        try {
+            final Entitlement entitlement = entitlementApi.getEntitlementForId(entitlementId, context);
+            final InternalTenantContext contextWithValidAccountRecordId = internalCallContextFactory.createInternalTenantContext(entitlement.getAccountId(), context);
+            return fromEntitlement(entitlement, contextWithValidAccountRecordId);
+        } catch (EntitlementApiException e) {
+            throw new SubscriptionApiException(e);
+        }
     }
 
     @Override
     public SubscriptionBundle getSubscriptionBundle(final UUID bundleId, final TenantContext context) throws SubscriptionApiException {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+
+        try {
+
+            final List<Entitlement> entitlements = entitlementApi.getAllEntitlementsForBundle(bundleId, context);
+            if (entitlements.isEmpty()) {
+                throw new SubscriptionApiException(ErrorCode.SUB_GET_INVALID_BUNDLE_ID, bundleId);
+            }
+            return getSubscriptionBundleFromEntitlement(bundleId, entitlements, context);
+        } catch (EntitlementApiException e) {
+            throw new SubscriptionApiException(e);
+        } catch (SubscriptionBaseApiException e) {
+            throw new SubscriptionApiException(e);
+        }
     }
 
+
+
     @Override
     public SubscriptionBundle getSubscriptionBundleForAccountIdAndExternalKey(final UUID accountId, final String externalKey, final TenantContext context) throws SubscriptionApiException {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+
+        try {
+            final List<Entitlement> entitlements = entitlementApi.getAllEntitlementsForAccountIdAndExternalKey(accountId, externalKey, context);
+            if (entitlements.isEmpty()) {
+                throw new SubscriptionApiException(ErrorCode.SUB_GET_INVALID_BUNDLE_KEY, externalKey);
+            }
+            return getSubscriptionBundleFromEntitlement(entitlements.get(0).getBundleId(), entitlements, context);
+        } catch (EntitlementApiException e) {
+            throw new SubscriptionApiException(e);
+        } catch (SubscriptionBaseApiException e) {
+            throw new SubscriptionApiException(e);
+        }
     }
 
     @Override
     public List<SubscriptionBundle> getSubscriptionBundlesForAccountId(final UUID accountId, final TenantContext context) throws SubscriptionApiException {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+        try {
+
+            final List<Entitlement> entitlements = entitlementApi.getAllEntitlementsForAccountId(accountId, context);
+            if (entitlements.isEmpty()) {
+                throw new SubscriptionApiException(ErrorCode.SUB_GET_INVALID_ACCOUNT_ID, accountId);
+            }
+
+            final ListMultimap<UUID, Entitlement> perBundleEntitlements = LinkedListMultimap.create();
+            for (Entitlement cur : entitlements) {
+                perBundleEntitlements.put(cur.getBundleId(), cur);
+            }
+
+            final List<SubscriptionBundle> result  = new ArrayList<SubscriptionBundle>(perBundleEntitlements.keySet().size());
+            for (UUID bundleId : perBundleEntitlements.keySet()) {
+                final List<Entitlement> e = perBundleEntitlements.get(bundleId);
+                final SubscriptionBundle b = getSubscriptionBundleFromEntitlement(bundleId, e, context);
+                result.add(b);
+            }
+            return result;
+        } catch (EntitlementApiException e) {
+            throw new SubscriptionApiException(e);
+        } catch (SubscriptionBaseApiException e) {
+            throw new SubscriptionApiException(e);
+        }
+    }
+
+    private Subscription fromEntitlement(final Entitlement entitlement, final InternalTenantContext internalTenantContext) {
+
+        final List<BlockingState> states = blockingStateDao.getBlockingState(entitlement.getId(), internalTenantContext);
+        final Subscription result = new DefaultSubscription((DefaultEntitlement) entitlement, states);
+        return result;
+    }
+
+    private SubscriptionBundle getSubscriptionBundleFromEntitlement(final UUID bundleId, final List<Entitlement> entitlements, final TenantContext context) throws SubscriptionBaseApiException {
+        final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(context);
+        final SubscriptionBaseBundle baseBundle = subscriptionInternalApi.getBundleFromId(bundleId, internalTenantContext);
+        final List<Subscription> subscriptions = new ArrayList<Subscription>();
+        subscriptions.addAll(Collections2.transform(entitlements, new Function<Entitlement, Subscription>() {
+            @Override
+            public Subscription apply(final Entitlement input) {
+                return fromEntitlement(input, internalTenantContext);
+            }
+        }));
+        // STEPH_ENT account timeline
+        final DefaultSubscriptionBundle bundle = new DefaultSubscriptionBundle(bundleId, baseBundle.getAccountId(), baseBundle.getExternalKey(), subscriptions, null, baseBundle.getCreatedDate(), baseBundle.getUpdatedDate());
+        return bundle;
     }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscriptionBundle.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscriptionBundle.java
new file mode 100644
index 0000000..8cd38f9
--- /dev/null
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultSubscriptionBundle.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.entitlement.api;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+public class DefaultSubscriptionBundle implements SubscriptionBundle {
+
+    private final UUID id;
+    private final UUID accountId;
+    private final String externalKey;
+    private final List<Subscription> subscriptions;
+    private final SubscriptionBundleTimeline bundleTimeline;
+    private final DateTime createdDate;
+    private final DateTime updatedDate;
+
+    public DefaultSubscriptionBundle(final UUID id, final UUID accountId, final String externalKey, final List<Subscription> subscriptions, final SubscriptionBundleTimeline bundleTimeline, final DateTime createdDate, final DateTime updatedDate) {
+        this.id = id;
+        this.accountId = accountId;
+        this.externalKey = externalKey;
+        this.subscriptions = subscriptions;
+        this.bundleTimeline = bundleTimeline;
+        this.createdDate = createdDate;
+        this.updatedDate = updatedDate;
+    }
+
+    @Override
+    public UUID getAccountId() {
+        return accountId;
+    }
+
+    @Override
+    public String getExternalKey() {
+        return externalKey;
+    }
+
+    @Override
+    public List<Subscription> getSubscriptions() {
+        return subscriptions;
+    }
+
+    @Override
+    public SubscriptionBundleTimeline getTimeline() {
+        return bundleTimeline;
+    }
+
+    @Override
+    public UUID getId() {
+        return id;
+    }
+
+    @Override
+    public DateTime getCreatedDate() {
+        return createdDate;
+    }
+
+    @Override
+    public DateTime getUpdatedDate() {
+        return updatedDate;
+    }
+}
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/glue/DefaultEntitlementModule.java b/entitlement/src/main/java/com/ning/billing/entitlement/glue/DefaultEntitlementModule.java
index 691b2ba..8d96e35 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/glue/DefaultEntitlementModule.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/glue/DefaultEntitlementModule.java
@@ -43,6 +43,7 @@ public class DefaultEntitlementModule extends AbstractModule implements Entitlem
         installBlockingStateDao();
         installBlockingApi();
         installEntitlementApi();
+        installSubscriptionApi();
         installBlockingChecker();
     }
 
diff --git a/entitlement/src/main/resources/com/ning/billing/entitlement/dao/BlockingStateSqlDao.sql.stg b/entitlement/src/main/resources/com/ning/billing/entitlement/dao/BlockingStateSqlDao.sql.stg
index ad7ed24..dacc64f 100644
--- a/entitlement/src/main/resources/com/ning/billing/entitlement/dao/BlockingStateSqlDao.sql.stg
+++ b/entitlement/src/main/resources/com/ning/billing/entitlement/dao/BlockingStateSqlDao.sql.stg
@@ -88,7 +88,7 @@ order by record_id asc
 ;
 >>
 
-getBlockingAll) ::= <<
+getBlockingAll() ::= <<
 select
 <allTableFields()>
 from
@@ -97,4 +97,4 @@ where blockable_id = :blockableId
 <AND_CHECK_TENANT()>
 order by record_id asc
 ;
->>
\ No newline at end of file
+>>
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonNoEvents.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonNoEvents.java
index 8b42de4..99499e9 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonNoEvents.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubscriptionJsonNoEvents.java
@@ -20,7 +20,6 @@ public class SubscriptionJsonNoEvents extends EntitlementJsonNoEvents {
     private final LocalDate billingStartDate;
     private final LocalDate billingEndDate;
     private final Integer bcd;
-    private final String billingState;
     //private final Map<String, String> currentStatesForServices;
 
 
@@ -38,14 +37,12 @@ public class SubscriptionJsonNoEvents extends EntitlementJsonNoEvents {
                                     @JsonProperty("chargedThroughDate") @Nullable final LocalDate chargedThroughDate,
                                     @JsonProperty("billingStartDate") @Nullable final LocalDate billingStartDate,
                                     @JsonProperty("billingEndDate") @Nullable final LocalDate billingEndDate,
-                                    @JsonProperty("bcd") @Nullable final Integer bcd,
-                                    @JsonProperty("billingState") @Nullable final String billingState) {
+                                    @JsonProperty("bcd") @Nullable final Integer bcd) {
         super(accountId, bundleId, entitlementId, externalKey, startDate, productName, productCategory, billingPeriod, priceList, cancelledDate, auditLogs);
         this.chargedThroughDate = chargedThroughDate;
         this.billingStartDate = billingStartDate;
         this.billingEndDate = billingEndDate;
         this.bcd = bcd;
-        this.billingState = billingState;
     }
 
     public SubscriptionJsonNoEvents(final Subscription s,
@@ -64,8 +61,7 @@ public class SubscriptionJsonNoEvents extends EntitlementJsonNoEvents {
              s.getChargedThroughDate() != null ? s.getChargedThroughDate() : null,
              s.getBillingStartDate(),
              s.getBillingEndDate(),
-             s.getBCD(),
-             s.getBillingState() != null ? s.getBillingState().name() : null);
+             s.getBCD());
     }
 
     public LocalDate getChargedThroughDate() {
@@ -84,7 +80,4 @@ public class SubscriptionJsonNoEvents extends EntitlementJsonNoEvents {
         return bcd;
     }
 
-    public String getBillingState() {
-        return billingState;
-    }
 }
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonNoEvents.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonNoEvents.java
index f52cd7e..6529c00 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonNoEvents.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestSubscriptionJsonNoEvents.java
@@ -59,7 +59,7 @@ public class TestSubscriptionJsonNoEvents extends JaxrsTestSuiteNoDB {
         final List<AuditLogJson> auditLogs = createAuditLogsJson(clock.getUTCNow());
         final SubscriptionJsonNoEvents subscriptionJsonNoEvents = new SubscriptionJsonNoEvents(accountId, bundleId, entitlementId, externalKey, startDate, productName,
                                                                                                productCategory, billingPeriod, priceList, cancelDate, auditLogs, chargedThroughDate,
-                                                                                               billingStartDate, billingEndDate, new Integer(1), "OK");
+                                                                                               billingStartDate, billingEndDate, new Integer(1));
 
         Assert.assertEquals(subscriptionJsonNoEvents.getEntitlementId(), entitlementId);
         Assert.assertEquals(subscriptionJsonNoEvents.getBundleId(), bundleId);