killbill-aplcache

Details

diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
index 204cf6a..b3ca059 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/AccountTimelineJson.java
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -25,7 +25,6 @@ import java.util.UUID;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonView;
-
 import com.ning.billing.account.api.Account;
 import com.ning.billing.entitlement.api.timeline.BundleTimeline;
 import com.ning.billing.invoice.api.Invoice;
@@ -39,24 +38,24 @@ public class AccountTimelineJson {
 
     @JsonView(BundleTimelineViews.ReadTimeline.class)
     private final List<InvoiceJsonWithBundleKeys> invoices;
-    
+
     @JsonView(BundleTimelineViews.ReadTimeline.class)
     private final AccountJsonSimple account;
-    
+
     @JsonView(BundleTimelineViews.Timeline.class)
     private final List<BundleJsonWithSubscriptions> bundles;
-    
+
     @JsonCreator
     public AccountTimelineJson(@JsonProperty("account") AccountJsonSimple account,
             @JsonProperty("bundles") List<BundleJsonWithSubscriptions> bundles,
-            @JsonProperty("invoices") List<InvoiceJsonWithBundleKeys> invoices,            
+            @JsonProperty("invoices") List<InvoiceJsonWithBundleKeys> invoices,
             @JsonProperty("payments") List<PaymentJsonWithBundleKeys> payments) {
         this.account = account;
         this.bundles = bundles;
         this.invoices = invoices;
         this.payments = payments;
     }
-    
+
     private String getBundleExternalKey(UUID invoiceId,  List<Invoice> invoices, List<BundleTimeline> bundles) {
         for (Invoice cur : invoices) {
             if (cur.getId().equals(invoiceId)) {
@@ -65,7 +64,7 @@ public class AccountTimelineJson {
         }
         return null;
     }
-    
+
     private String getBundleExternalKey(Invoice invoice, List<BundleTimeline> bundles) {
         Set<UUID> b = new HashSet<UUID>();
         for (final InvoiceItem cur : invoice.getInvoiceItems()) {
@@ -87,32 +86,46 @@ public class AccountTimelineJson {
         }
         return tmp.toString();
     }
-    
+
     public AccountTimelineJson(Account account, List<Invoice> invoices, List<PaymentAttempt> payments, List<BundleTimeline> bundles) {
         this.account = new AccountJsonSimple(account.getId().toString(), account.getExternalKey());
         this.bundles = new LinkedList<BundleJsonWithSubscriptions>();
         for (BundleTimeline cur : bundles) {
-            this.bundles.add(new BundleJsonWithSubscriptions(account.getId(), cur));            
+            this.bundles.add(new BundleJsonWithSubscriptions(account.getId(), cur));
         }
         this.invoices = new LinkedList<InvoiceJsonWithBundleKeys>();
         for (Invoice cur : invoices) {
-            this.invoices.add(new InvoiceJsonWithBundleKeys(cur.getAmountCharged(), cur.getAmountCredited(), cur.getId().toString(), cur.getInvoiceDate(), cur.getTargetDate(),
-                    Integer.toString(cur.getInvoiceNumber()), cur.getBalance(),
-                    getBundleExternalKey(cur, bundles)));
+            this.invoices.add(new InvoiceJsonWithBundleKeys(cur.getAmountPaid(),
+                                                            cur.getAmountCredited(),
+                                                            cur.getId().toString(),
+                                                            cur.getInvoiceDate(),
+                                                            cur.getTargetDate(),
+                                                            Integer.toString(cur.getInvoiceNumber()),
+                                                            cur.getBalance(),
+                                                            cur.getAccountId().toString(),
+                                                            getBundleExternalKey(cur, bundles)));
         }
         this.payments = new LinkedList<PaymentJsonWithBundleKeys>();
         for (PaymentAttempt cur : payments) {
-            
+
 
             String status = cur.getPaymentId() != null ? "Success" : "Failed";
             BigDecimal paidAmount = cur.getPaymentId() != null ? cur.getAmount() : BigDecimal.ZERO;
-            
-            this.payments.add(new PaymentJsonWithBundleKeys(cur.getAmount(), paidAmount, cur.getInvoiceId(), cur.getPaymentId(), cur.getCreatedDate(), cur.getUpdatedDate(),
-                    cur.getRetryCount(), cur.getCurrency().toString(), status,
-                    getBundleExternalKey(cur.getInvoiceId(), invoices, bundles)));
+
+            this.payments.add(new PaymentJsonWithBundleKeys(cur.getAmount(),
+                                                            paidAmount,
+                                                            cur.getInvoiceId(),
+                                                            cur.getPaymentId(),
+                                                            cur.getCreatedDate(),
+                                                            cur.getUpdatedDate(),
+                                                            cur.getRetryCount(),
+                                                            cur.getCurrency().toString(),
+                                                            status,
+                                                            cur.getAccountId(),
+                                                            getBundleExternalKey(cur.getInvoiceId(), invoices, bundles)));
           }
     }
-    
+
     public AccountTimelineJson() {
         this.account = null;
         this.bundles = null;
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceItemJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceItemJsonSimple.java
new file mode 100644
index 0000000..e3011f3
--- /dev/null
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceItemJsonSimple.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2010-2011 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.jaxrs.json;
+
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.InvoiceItem;
+
+public class InvoiceItemJsonSimple {
+    private final UUID invoiceId;
+    private final UUID accountId;
+    private final UUID bundleId;
+    private final UUID subscriptionId;
+    private final String planName;
+    private final String phaseName;
+    private final String description;
+    private final DateTime startDate;
+    private final DateTime endDate;
+    private final BigDecimal amount;
+    private final Currency currency;
+
+    public InvoiceItemJsonSimple(@JsonProperty("invoiceId") UUID invoiceId,
+                                 @JsonProperty("accountId") UUID accountId,
+                                 @JsonProperty("bundleId") UUID bundleId,
+                                 @JsonProperty("subscriptionId") UUID subscriptionId,
+                                 @JsonProperty("planName") String planName,
+                                 @JsonProperty("phaseName") String phaseName,
+                                 @JsonProperty("description") String description,
+                                 @JsonProperty("startDate") DateTime startDate,
+                                 @JsonProperty("endDate") DateTime endDate,
+                                 @JsonProperty("amount") BigDecimal amount,
+                                 @JsonProperty("currency") Currency currency) {
+        this.invoiceId = invoiceId;
+        this.accountId = accountId;
+        this.bundleId = bundleId;
+        this.subscriptionId = subscriptionId;
+        this.planName = planName;
+        this.phaseName = phaseName;
+        this.description = description;
+        this.startDate = startDate;
+        this.endDate = endDate;
+        this.amount = amount;
+        this.currency = currency;
+    }
+
+    public InvoiceItemJsonSimple(InvoiceItem item) {
+        this.invoiceId = item.getInvoiceId();
+        this.accountId = item.getAccountId();
+        this.bundleId = item.getBundleId();
+        this.subscriptionId = item.getSubscriptionId();
+        this.planName = item.getPlanName();
+        this.phaseName = item.getPhaseName();
+        this.description = item.getDescription();
+        this.startDate = item.getStartDate();
+        this.endDate = item.getEndDate();
+        this.amount = item.getAmount();
+        this.currency = item.getCurrency();
+    }
+
+    public UUID getInvoiceId() {
+        return invoiceId;
+    }
+
+    public UUID getAccountId() {
+        return accountId;
+    }
+
+    public UUID getBundleId() {
+        return bundleId;
+    }
+
+    public UUID getSubscriptionId() {
+        return subscriptionId;
+    }
+
+    public String getPlanName() {
+        return planName;
+    }
+
+    public String getPhaseName() {
+        return phaseName;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public DateTime getStartDate() {
+        return startDate;
+    }
+
+    public DateTime getEndDate() {
+        return endDate;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public Currency getCurrency() {
+        return currency;
+    }
+}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
index 5680db1..7b0d504 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonSimple.java
@@ -18,11 +18,10 @@ package com.ning.billing.jaxrs.json;
 
 import java.math.BigDecimal;
 
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonView;
 import org.joda.time.DateTime;
 
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ning.billing.invoice.api.Invoice;
 
 public class InvoiceJsonSimple {
@@ -33,17 +32,19 @@ public class InvoiceJsonSimple {
     private final DateTime targetDate;
     private final String invoiceNumber;
     private final BigDecimal balance;
+    private final String accountId;
 
     public InvoiceJsonSimple() {
         this.amount = BigDecimal.ZERO;
         this.credit = BigDecimal.ZERO;
         this.invoiceId = null;
         this.invoiceDate = null;
-        this.targetDate = null;        
+        this.targetDate = null;
         this.invoiceNumber = null;
         this.balance = BigDecimal.ZERO;
+        this.accountId = null;
     }
-    
+
     @JsonCreator
     public InvoiceJsonSimple(@JsonProperty("amount") BigDecimal amount,
                              @JsonProperty("credit") BigDecimal credit,
@@ -51,7 +52,8 @@ public class InvoiceJsonSimple {
                              @JsonProperty("invoiceDate") DateTime invoiceDate,
                              @JsonProperty("targetDate") DateTime targetDate,
                              @JsonProperty("invoiceNumber") String invoiceNumber,
-                             @JsonProperty("balance") BigDecimal balance) {
+                             @JsonProperty("balance") BigDecimal balance,
+                             @JsonProperty("accountId") String accountId) {
         super();
         this.amount = amount;
         this.credit = credit;
@@ -60,6 +62,7 @@ public class InvoiceJsonSimple {
         this.targetDate = targetDate;
         this.invoiceNumber = invoiceNumber;
         this.balance = balance;
+        this.accountId = accountId;
     }
 
     public InvoiceJsonSimple(Invoice input) {
@@ -70,8 +73,9 @@ public class InvoiceJsonSimple {
         this.targetDate = input.getTargetDate();
         this.invoiceNumber = String.valueOf(input.getInvoiceNumber());
         this.balance = input.getBalance();
+        this.accountId = input.getAccountId().toString();
     }
-    
+
     public BigDecimal getAmount() {
         return amount;
     }
@@ -100,6 +104,10 @@ public class InvoiceJsonSimple {
         return balance;
     }
 
+    public String getAccountId() {
+        return accountId;
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;
@@ -161,6 +169,12 @@ public class InvoiceJsonSimple {
         } else if (!invoiceNumber.equals(other.invoiceNumber))
             return false;
 
+        if (accountId == null) {
+            if (other.accountId != null)
+                return false;
+        } else if (!accountId.equals(other.accountId))
+            return false;
+
         return true;
     }
 }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
index f1b0b4a..da3ccf4 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithBundleKeys.java
@@ -1,13 +1,13 @@
 package com.ning.billing.jaxrs.json;
 import java.math.BigDecimal;
 
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
 import org.joda.time.DateTime;
 
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ning.billing.invoice.api.Invoice;
 
-/* 
+/*
  * Copyright 2010-2011 Ning, Inc.
  *
  * Ning licenses this file to you under the Apache License, version 2.0
@@ -30,7 +30,7 @@ public class InvoiceJsonWithBundleKeys extends InvoiceJsonSimple {
         super();
         this.bundleKeys = null;
     }
-    
+
     @JsonCreator
     public InvoiceJsonWithBundleKeys(@JsonProperty("amount") BigDecimal amount,
                                      @JsonProperty("credit") BigDecimal credit,
@@ -39,8 +39,9 @@ public class InvoiceJsonWithBundleKeys extends InvoiceJsonSimple {
                                      @JsonProperty("targetDate") DateTime targetDate,
                                      @JsonProperty("invoiceNumber") String invoiceNumber,
                                      @JsonProperty("balance") BigDecimal balance,
+                                     @JsonProperty("accountId") String accountId,
                                      @JsonProperty("externalBundleKeys") String bundleKeys) {
-        super(amount, credit, invoiceId, invoiceDate, targetDate, invoiceNumber, balance);
+        super(amount, credit, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId);
         this.bundleKeys = bundleKeys;
     }
 
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java
new file mode 100644
index 0000000..b68d34d
--- /dev/null
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceJsonWithItems.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2010-2011 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.jaxrs.json;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.joda.time.DateTime;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceItem;
+
+public class InvoiceJsonWithItems extends InvoiceJsonSimple {
+    private final List<InvoiceItemJsonSimple> items;
+
+    @JsonCreator
+    public InvoiceJsonWithItems(@JsonProperty("amount") BigDecimal amount,
+                                @JsonProperty("credit") BigDecimal credit,
+                                @JsonProperty("invoiceId") String invoiceId,
+                                @JsonProperty("invoiceDate") DateTime invoiceDate,
+                                @JsonProperty("targetDate") DateTime targetDate,
+                                @JsonProperty("invoiceNumber") String invoiceNumber,
+                                @JsonProperty("balance") BigDecimal balance,
+                                @JsonProperty("accountId") String accountId,
+            @JsonProperty("items") List<InvoiceItemJsonSimple> items) {
+        super(amount, credit, invoiceId, invoiceDate, targetDate, invoiceNumber, balance, accountId);
+        this.items = new ArrayList<InvoiceItemJsonSimple>(items);
+    }
+
+    public InvoiceJsonWithItems(Invoice input) {
+        super(input);
+        this.items = new ArrayList<InvoiceItemJsonSimple>(input.getInvoiceItems().size());
+        for (InvoiceItem item : input.getInvoiceItems()) {
+            this.items.add(new InvoiceItemJsonSimple(item));
+        }
+    }
+
+    public List<InvoiceItemJsonSimple> getItems() {
+        return Collections.unmodifiableList(items);
+    }
+}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
index 93cd5a0..b84d8b4 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
@@ -19,11 +19,10 @@ package com.ning.billing.jaxrs.json;
 import java.math.BigDecimal;
 import java.util.UUID;
 
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonView;
 import org.joda.time.DateTime;
 
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ning.billing.util.clock.DefaultClock;
 
 public class PaymentJsonSimple {
@@ -33,19 +32,21 @@ public class PaymentJsonSimple {
     private final BigDecimal amount;
 
     private final UUID invoiceId;
-    
+
     private final UUID paymentId;
-    
+
     private final DateTime requestedDate;
-    
+
     private final DateTime effectiveDate;
-    
+
     private final Integer retryCount;
-    
+
     private final String currency;
-    
+
     private final String status;
-      
+
+    private final UUID accountId;
+
     public PaymentJsonSimple() {
         this.amount = null;
         this.paidAmount = null;
@@ -56,6 +57,7 @@ public class PaymentJsonSimple {
         this.currency = null;
         this.retryCount = null;
         this.status = null;
+        this.accountId = null;
     }
 
     @JsonCreator
@@ -66,8 +68,9 @@ public class PaymentJsonSimple {
             @JsonProperty("requestedDate") DateTime requestedDate,
             @JsonProperty("effectiveDate") DateTime effectiveDate,
             @JsonProperty("retryCount") Integer retryCount,
-            @JsonProperty("currency") String currency,            
-            @JsonProperty("status") String status) {
+            @JsonProperty("currency") String currency,
+            @JsonProperty("status") String status,
+            @JsonProperty("paymentId") UUID accountId) {
         super();
         this.amount = amount;
         this.paidAmount = paidAmount;
@@ -78,6 +81,7 @@ public class PaymentJsonSimple {
         this.currency = currency;
         this.retryCount = retryCount;
         this.status = status;
+        this.accountId = accountId;
     }
 
     public BigDecimal getPaidAmount() {
@@ -115,4 +119,8 @@ public class PaymentJsonSimple {
     public String getCurrency() {
         return currency;
     }
+
+    public UUID getAccountId() {
+        return accountId;
+    }
 }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java
index bd11782..8430a1b 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java
@@ -19,14 +19,15 @@ package com.ning.billing.jaxrs.json;
 import java.math.BigDecimal;
 import java.util.UUID;
 
+import org.joda.time.DateTime;
+
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import org.joda.time.DateTime;
 
 public class PaymentJsonWithBundleKeys extends PaymentJsonSimple {
 
     private final String bundleKeys;
-    
+
     public PaymentJsonWithBundleKeys() {
         super();
         this.bundleKeys = null;
@@ -40,13 +41,14 @@ public class PaymentJsonWithBundleKeys extends PaymentJsonSimple {
             @JsonProperty("requestedDt") DateTime requestedDate,
             @JsonProperty("effectiveDt") DateTime effectiveDate,
             @JsonProperty("retryCount") Integer retryCount,
-            @JsonProperty("currency") String currency,            
+            @JsonProperty("currency") String currency,
             @JsonProperty("status") String status,
+            @JsonProperty("accountId") UUID accountId,
             @JsonProperty("externalBundleKeys") String bundleKeys) {
-        super(amount, paidAmount, invoiceId, paymentId, requestedDate, effectiveDate, retryCount, currency, status);
+        super(amount, paidAmount, invoiceId, paymentId, requestedDate, effectiveDate, retryCount, currency, status, accountId);
         this.bundleKeys = bundleKeys;
     }
-    
+
     public String getBundleKeys() {
         return bundleKeys;
     }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java
index 0081a16..58703b3 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/InvoiceResource.java
@@ -32,15 +32,9 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
-
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
-import com.ning.billing.jaxrs.json.CustomFieldJson;
-import com.ning.billing.jaxrs.util.TagHelper;
-import com.ning.billing.util.api.CustomFieldUserApi;
-import com.ning.billing.util.api.TagUserApi;
-import com.ning.billing.util.dao.ObjectType;
 import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormatter;
 import org.joda.time.format.ISODateTimeFormat;
@@ -54,10 +48,15 @@ import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceUserApi;
-
+import com.ning.billing.jaxrs.json.CustomFieldJson;
 import com.ning.billing.jaxrs.json.InvoiceJsonSimple;
+import com.ning.billing.jaxrs.json.InvoiceJsonWithItems;
 import com.ning.billing.jaxrs.util.Context;
 import com.ning.billing.jaxrs.util.JaxrsUriBuilder;
+import com.ning.billing.jaxrs.util.TagHelper;
+import com.ning.billing.util.api.CustomFieldUserApi;
+import com.ning.billing.util.api.TagUserApi;
+import com.ning.billing.util.dao.ObjectType;
 
 
 @Path(JaxrsResource.INVOICES_PATH)
@@ -68,12 +67,12 @@ public class InvoiceResource extends JaxRsResourceBase {
     private static final String TAG_URI = JaxrsResource.TAGS + "/{" + ID_PARAM_NAME + ":" + UUID_PATTERN + "}";
 
     private final DateTimeFormatter DATE_TIME_FORMATTER = ISODateTimeFormat.dateTime();
-    
+
     private final AccountUserApi accountApi;
     private final InvoiceUserApi invoiceApi;
     private final Context context;
     private final JaxrsUriBuilder uriBuilder;
-    
+
     @Inject
     public InvoiceResource(final AccountUserApi accountApi,
             final InvoiceUserApi invoiceApi,
@@ -88,12 +87,12 @@ public class InvoiceResource extends JaxRsResourceBase {
         this.context = context;
         this.uriBuilder = uriBuilder;
     }
-    
+
     @GET
     @Produces(APPLICATION_JSON)
     public Response getInvoices(@QueryParam(QUERY_ACCOUNT_ID) final String accountId) {
         try {
-            
+
             Preconditions.checkNotNull(accountId, "% query parameter must be specified", QUERY_ACCOUNT_ID);
             accountApi.getAccountById(UUID.fromString(accountId));
             List<Invoice> invoices = invoiceApi.getInvoicesByAccount(UUID.fromString(accountId));
@@ -103,18 +102,25 @@ public class InvoiceResource extends JaxRsResourceBase {
             }
             return Response.status(Status.OK).entity(result).build();
         } catch (AccountApiException e) {
-            return Response.status(Status.NO_CONTENT).build();            
+            return Response.status(Status.NO_CONTENT).build();
         } catch (NullPointerException e) {
-            return Response.status(Status.BAD_REQUEST).build();            
+            return Response.status(Status.BAD_REQUEST).build();
         }
     }
 
     @GET
     @Path("/{invoiceId:\\w+-\\w+-\\w+-\\w+-\\w+}")
     @Produces(APPLICATION_JSON)
-    public Response getInvoice(@PathParam("invoiceId") String invoiceId) {
+    public Response getInvoice(@PathParam("invoiceId") String invoiceId, @QueryParam("withItems") @DefaultValue("false") boolean withItems) {
         Invoice invoice = invoiceApi.getInvoice(UUID.fromString(invoiceId));
-        InvoiceJsonSimple json = new InvoiceJsonSimple(invoice);
+        InvoiceJsonSimple json;
+
+        if (withItems) {
+            json = new InvoiceJsonWithItems(invoice);
+        }
+        else {
+            json = new InvoiceJsonSimple(invoice);
+        }
         return Response.status(Status.OK).entity(json).build();
     }
 
@@ -130,12 +136,12 @@ public class InvoiceResource extends JaxRsResourceBase {
             @HeaderParam(HDR_COMMENT) final String comment) {
 
         try {
-            
+
             Preconditions.checkNotNull(accountId, "% needs to be specified", QUERY_ACCOUNT_ID);
             Preconditions.checkNotNull(targetDate, "% needs to be specified", QUERY_TARGET_DATE);
-            
-            DateTime inputDate = (targetDate != null) ? DATE_TIME_FORMATTER.parseDateTime(targetDate) : null;        
-            
+
+            DateTime inputDate = (targetDate != null) ? DATE_TIME_FORMATTER.parseDateTime(targetDate) : null;
+
             accountApi.getAccountById(UUID.fromString(accountId));
             Invoice generatedInvoice = invoiceApi.triggerInvoiceGeneration(UUID.fromString(accountId), inputDate, dryRun.booleanValue(),
                     context.createContext(createdBy, reason, comment));
@@ -145,11 +151,11 @@ public class InvoiceResource extends JaxRsResourceBase {
                return uriBuilder.buildResponse(InvoiceResource.class, "getInvoice", generatedInvoice.getId());
             }
         } catch (AccountApiException e) {
-            return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();  
+            return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
         } catch (InvoiceApiException e) {
-            return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();  
+            return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
         } catch (NullPointerException e) {
-            return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();            
+            return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
         }
     }