killbill-memoizeit

Details

diff --git a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
index 5d10162..5675180 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -45,6 +45,7 @@ import org.killbill.billing.invoice.model.CreditAdjInvoiceItem;
 import org.killbill.billing.invoice.model.DefaultInvoice;
 import org.killbill.billing.invoice.model.ExternalChargeInvoiceItem;
 import org.killbill.billing.invoice.model.InvoiceItemFactory;
+import org.killbill.billing.invoice.template.HtmlInvoice;
 import org.killbill.billing.invoice.template.HtmlInvoiceGenerator;
 import org.killbill.billing.tag.TagInternalApi;
 import org.killbill.billing.util.api.TagApiException;
@@ -345,7 +346,8 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
             }
         }
 
-        return generator.generateInvoice(account, invoice, manualPay);
+        HtmlInvoice htmlInvoice = generator.generateInvoice(account, invoice, manualPay);
+        return htmlInvoice.getBody();
     }
 
     @Override
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/notification/EmailInvoiceNotifier.java b/invoice/src/main/java/org/killbill/billing/invoice/notification/EmailInvoiceNotifier.java
index 723ca8f..ae7f044 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/notification/EmailInvoiceNotifier.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/notification/EmailInvoiceNotifier.java
@@ -27,6 +27,7 @@ import org.killbill.billing.account.api.AccountEmail;
 import org.killbill.billing.invoice.api.Invoice;
 import org.killbill.billing.invoice.api.InvoiceApiException;
 import org.killbill.billing.invoice.api.InvoiceNotifier;
+import org.killbill.billing.invoice.template.HtmlInvoice;
 import org.killbill.billing.invoice.template.HtmlInvoiceGenerator;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.callcontext.InternalTenantContext;
@@ -85,18 +86,22 @@ public class EmailInvoiceNotifier implements InvoiceNotifier {
             }
         }
 
-        final String htmlBody;
+        final HtmlInvoice htmlInvoice;
         try {
-            htmlBody = generator.generateInvoice(account, invoice, manualPay);
+            htmlInvoice = generator.generateInvoice(account, invoice, manualPay);
         } catch (IOException e) {
             throw new InvoiceApiException(e, ErrorCode.EMAIL_SENDING_FAILED);
         }
 
-        final String subject = config.getInvoiceEmailSubject();
+        // take localized subject, or the configured one if the localized one is not available
+        String subject = htmlInvoice.getSubject();
+        if (subject == null) {
+            subject = config.getInvoiceEmailSubject();
+        }
 
         final EmailSender sender = new DefaultEmailSender(config);
         try {
-            sender.sendHTMLEmail(to, cc, subject, htmlBody);
+            sender.sendHTMLEmail(to, cc, subject, htmlInvoice.getBody());
         } catch (EmailApiException e) {
             throw new InvoiceApiException(e, ErrorCode.EMAIL_SENDING_FAILED);
         } catch (IOException e) {
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/template/HtmlInvoice.java b/invoice/src/main/java/org/killbill/billing/invoice/template/HtmlInvoice.java
new file mode 100644
index 0000000..5d88db1
--- /dev/null
+++ b/invoice/src/main/java/org/killbill/billing/invoice/template/HtmlInvoice.java
@@ -0,0 +1,38 @@
+/*
+ * 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 org.killbill.billing.invoice.template;
+
+public class HtmlInvoice {
+    private String subject;
+    private String body;
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(final String subject) {
+        this.subject = subject;
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(final String body) {
+        this.body = body;
+    }
+}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/template/HtmlInvoiceGenerator.java b/invoice/src/main/java/org/killbill/billing/invoice/template/HtmlInvoiceGenerator.java
index cd95a16..e04a8f1 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/template/HtmlInvoiceGenerator.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/template/HtmlInvoiceGenerator.java
@@ -52,12 +52,13 @@ public class HtmlInvoiceGenerator {
         this.currencyConversionApi = currencyConversionApi;
     }
 
-    public String generateInvoice(final Account account, @Nullable final Invoice invoice, final boolean manualPay) throws IOException {
+    public HtmlInvoice generateInvoice(final Account account, @Nullable final Invoice invoice, final boolean manualPay) throws IOException {
         // Don't do anything if the invoice is null
         if (invoice == null) {
             return null;
         }
 
+        HtmlInvoice invoiceData = new HtmlInvoice();
         final Map<String, Object> data = new HashMap<String, Object>();
         final DefaultInvoiceTranslator invoiceTranslator = new DefaultInvoiceTranslator(config);
         final String accountLocale = Strings.emptyToNull(account.getLocale());
@@ -70,10 +71,14 @@ public class HtmlInvoiceGenerator {
         final InvoiceFormatter formattedInvoice = factory.createInvoiceFormatter(config, invoice, locale, currencyConversionApi);
         data.put("invoice", formattedInvoice);
 
+        invoiceData.setSubject(invoiceTranslator.getInvoiceEmailSubject());
+
         if (manualPay) {
-            return templateEngine.executeTemplate(config.getManualPayTemplateName(), data);
+            invoiceData.setBody(templateEngine.executeTemplate(config.getManualPayTemplateName(), data));
         } else {
-            return templateEngine.executeTemplate(config.getTemplateName(), data);
+            invoiceData.setBody(templateEngine.executeTemplate(config.getTemplateName(), data));
         }
+
+        return invoiceData;
     }
 }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/template/translator/DefaultInvoiceTranslator.java b/invoice/src/main/java/org/killbill/billing/invoice/template/translator/DefaultInvoiceTranslator.java
index 8c644d3..4bb5ef1 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/template/translator/DefaultInvoiceTranslator.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/template/translator/DefaultInvoiceTranslator.java
@@ -47,6 +47,12 @@ public class DefaultInvoiceTranslator extends DefaultTranslatorBase implements I
     }
 
     @Override
+    public String getInvoiceEmailSubject() {
+        String subject = getTranslation(locale, "invoiceEmailSubject");
+        return (!"invoiceEmailSubject".equals(subject)) ? subject : null;
+    }
+
+    @Override
     public String getInvoiceTitle() {
         return getTranslation(locale, "invoiceTitle");
     }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/template/translator/InvoiceStrings.java b/invoice/src/main/java/org/killbill/billing/invoice/template/translator/InvoiceStrings.java
index 624ff76..e98faf4 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/template/translator/InvoiceStrings.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/template/translator/InvoiceStrings.java
@@ -18,6 +18,8 @@ package org.killbill.billing.invoice.template.translator;
 
 public interface InvoiceStrings {
 
+    String getInvoiceEmailSubject();
+
     String getInvoiceTitle();
 
     String getInvoiceDate();
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java b/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java
index 2ad6780..c40c594 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java
@@ -29,6 +29,7 @@ import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.invoice.api.Invoice;
 import org.killbill.billing.invoice.api.InvoiceItem;
 import org.killbill.billing.invoice.api.formatters.InvoiceFormatterFactory;
+import org.killbill.billing.invoice.template.HtmlInvoice;
 import org.killbill.billing.invoice.template.HtmlInvoiceGenerator;
 import org.killbill.billing.invoice.template.formatters.DefaultInvoiceFormatterFactory;
 import org.killbill.billing.util.email.templates.MustacheTemplateEngine;
@@ -56,20 +57,24 @@ public class TestHtmlInvoiceGenerator extends InvoiceTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testGenerateInvoice() throws Exception {
-        final String output = g.generateInvoice(createAccount(), createInvoice(), false);
+        final HtmlInvoice output = g.generateInvoice(createAccount(), createInvoice(), false);
         Assert.assertNotNull(output);
+        Assert.assertNotNull(output.getBody());
+        Assert.assertEquals(output.getSubject(), "Your invoice");
     }
 
     @Test(groups = "fast")
     public void testGenerateEmptyInvoice() throws Exception {
         final Invoice invoice = Mockito.mock(Invoice.class);
-        final String output = g.generateInvoice(createAccount(), invoice, false);
+        final HtmlInvoice output = g.generateInvoice(createAccount(), invoice, false);
         Assert.assertNotNull(output);
+        Assert.assertNotNull(output.getBody());
+        Assert.assertEquals(output.getSubject(), "Your invoice");
     }
 
     @Test(groups = "fast")
     public void testGenerateNullInvoice() throws Exception {
-        final String output = g.generateInvoice(createAccount(), null, false);
+        final HtmlInvoice output = g.generateInvoice(createAccount(), null, false);
         Assert.assertNull(output);
     }
 
diff --git a/invoice/src/test/resources/org/killbill/billing/util/template/translation/InvoiceTranslation_en_US.properties b/invoice/src/test/resources/org/killbill/billing/util/template/translation/InvoiceTranslation_en_US.properties
index 02d074a..823dc54 100644
--- a/invoice/src/test/resources/org/killbill/billing/util/template/translation/InvoiceTranslation_en_US.properties
+++ b/invoice/src/test/resources/org/killbill/billing/util/template/translation/InvoiceTranslation_en_US.properties
@@ -1,3 +1,4 @@
+invoiceEmailSubject=Your invoice
 invoiceTitle=INVOICE
 invoiceDate=Date:
 invoiceNumber=Invoice #