killbill-uncached

Merge branch 'integration' of github.com:ning/killbill

6/19/2012 10:57:19 PM

Details

diff --git a/api/src/main/java/com/ning/billing/ErrorCode.java b/api/src/main/java/com/ning/billing/ErrorCode.java
index 2678afc..9e17323 100644
--- a/api/src/main/java/com/ning/billing/ErrorCode.java
+++ b/api/src/main/java/com/ning/billing/ErrorCode.java
@@ -182,6 +182,7 @@ public enum ErrorCode {
     INVOICE_NO_ACCOUNT_ID_FOR_SUBSCRIPTION_ID(4003, "No account id was retrieved for subscription id %s"),
     INVOICE_INVALID_DATE_SEQUENCE(4004, "Date sequence was invalid. Start Date: %s; End Date: %s; Target Date: %s"),
     INVOICE_TARGET_DATE_TOO_FAR_IN_THE_FUTURE(4005, "The target date was too far in the future. Target Date: %s"),
+    INVOICE_NOT_FOUND(4006, "No invoice could be found for id %s."),
 
     /*
      *
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
index 9c32e46..d95f56d 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
@@ -53,5 +53,5 @@ public interface InvoiceUserApi {
     public InvoiceItem insertCredit(UUID accountId, BigDecimal amount, DateTime effectiveDate,
                                     Currency currency, CallContext context) throws InvoiceApiException;
 
-    public String getInvoiceAsHTML(UUID invoiceId) throws AccountApiException, IOException;
+    public String getInvoiceAsHTML(UUID invoiceId) throws AccountApiException, IOException, InvoiceApiException;
 }
diff --git a/api/src/main/java/com/ning/billing/util/template/translation/TranslatorConfig.java b/api/src/main/java/com/ning/billing/util/template/translation/TranslatorConfig.java
index a72d778..14dacf5 100644
--- a/api/src/main/java/com/ning/billing/util/template/translation/TranslatorConfig.java
+++ b/api/src/main/java/com/ning/billing/util/template/translation/TranslatorConfig.java
@@ -19,6 +19,8 @@ package com.ning.billing.util.template.translation;
 import org.skife.config.Config;
 import org.skife.config.Default;
 
+import com.ning.billing.invoice.api.formatters.InvoiceFormatterFactory;
+
 public interface TranslatorConfig {
     @Config("killbill.template.default.locale")
     @Default("en_US")
@@ -31,4 +33,8 @@ public interface TranslatorConfig {
     @Config("killbill.template.name")
     @Default("com/ning/billing/util/email/templates/HtmlInvoiceTemplate.mustache")
     String getTemplateName();
+
+    @Config("killbill.template.invoiceFormatterFactoryClass")
+    @Default("com.ning.billing.invoice.template.formatters.DefaultInvoiceFormatterFactory")
+    Class<? extends InvoiceFormatterFactory> getInvoiceFormatterFactoryClass();
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
index 8228898..850f2c4 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -24,6 +24,7 @@ import java.util.UUID;
 import org.joda.time.DateTime;
 
 import com.google.inject.Inject;
+import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.AccountUserApi;
@@ -113,8 +114,12 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
     }
 
     @Override
-    public String getInvoiceAsHTML(final UUID invoiceId) throws AccountApiException, IOException {
+    public String getInvoiceAsHTML(final UUID invoiceId) throws AccountApiException, IOException, InvoiceApiException {
         final Invoice invoice = getInvoice(invoiceId);
+        if (invoice == null) {
+            throw new InvoiceApiException(ErrorCode.INVOICE_NOT_FOUND, invoiceId);
+        }
+
         final Account account = accountUserApi.getAccountById(invoice.getAccountId());
         return generator.generateInvoice(account, invoice);
     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java b/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
index 85b009b..918bfa2 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
@@ -88,7 +88,7 @@ public class DefaultInvoiceModule extends AbstractModule implements InvoiceModul
         bind(NextBillingDatePoster.class).to(DefaultNextBillingDatePoster.class).asEagerSingleton();
         final TranslatorConfig config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
         bind(TranslatorConfig.class).toInstance(config);
-        bind(InvoiceFormatterFactory.class).to(DefaultInvoiceFormatterFactory.class).asEagerSingleton();
+        bind(InvoiceFormatterFactory.class).to(config.getInvoiceFormatterFactoryClass()).asEagerSingleton();
     }
 
     protected void installInvoiceNotifier() {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
index 098bde8..6ed5713 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
@@ -179,4 +179,22 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
     public UUID getId() {
         return invoice.getId();
     }
+
+    // Expose the fields for children classes. This is useful for further customization of the invoices
+
+    protected TranslatorConfig getConfig() {
+        return config;
+    }
+
+    protected DateTimeFormatter getDateFormatter() {
+        return dateFormatter;
+    }
+
+    protected Locale getLocale() {
+        return locale;
+    }
+
+    protected Invoice getInvoice() {
+        return invoice;
+    }
 }
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 d70840d..dc2d8e9 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
@@ -141,6 +141,8 @@ public class InvoiceResource extends JaxRsResourceBase {
             return Response.status(Status.NO_CONTENT).build();
         } catch (IOException e) {
             return Response.status(Status.INTERNAL_SERVER_ERROR).build();
+        } catch (InvoiceApiException e) {
+            return Response.status(Status.NO_CONTENT).build();
         }
     }
 

pom.xml 2(+1 -1)

diff --git a/pom.xml b/pom.xml
index c5264f7..b3fbb33 100644
--- a/pom.xml
+++ b/pom.xml
@@ -290,7 +290,7 @@
             <dependency>
                 <groupId>org.skife.config</groupId>
                 <artifactId>config-magic</artifactId>
-                <version>0.13</version>
+                <version>0.14</version>
             </dependency>
             <dependency>
                 <groupId>org.slf4j</groupId>
diff --git a/util/src/main/java/com/ning/billing/util/email/DefaultEmailSender.java b/util/src/main/java/com/ning/billing/util/email/DefaultEmailSender.java
index f399dae..b89cdcb 100644
--- a/util/src/main/java/com/ning/billing/util/email/DefaultEmailSender.java
+++ b/util/src/main/java/com/ning/billing/util/email/DefaultEmailSender.java
@@ -24,6 +24,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.inject.Inject;
+import com.ning.billing.ErrorCode;
 
 public class DefaultEmailSender implements EmailSender {
     private final Logger log = LoggerFactory.getLogger(EmailSender.class);
@@ -62,10 +63,10 @@ public class DefaultEmailSender implements EmailSender {
                 }
             }
 
-            email.setSSL(true);
+            email.setSSL(config.useSSL());
             email.send();
         } catch (EmailException ee) {
-            log.warn("Failed to send e-mail", ee);
+            throw new EmailApiException(ee, ErrorCode.EMAIL_SENDING_FAILED);
         }
     }
 }
diff --git a/util/src/main/java/com/ning/billing/util/email/EmailConfig.java b/util/src/main/java/com/ning/billing/util/email/EmailConfig.java
index e972382..2d9a583 100644
--- a/util/src/main/java/com/ning/billing/util/email/EmailConfig.java
+++ b/util/src/main/java/com/ning/billing/util/email/EmailConfig.java
@@ -46,4 +46,8 @@ public interface EmailConfig extends KillbillConfig {
     @Config("killbill.mail.from")
     @Default("support@example.com")
     String getDefaultFrom();
+
+    @Config("killbill.mail.useSSL")
+    @Default("false")
+    boolean useSSL();
 }
diff --git a/util/src/main/java/com/ning/billing/util/template/translation/DefaultTranslatorBase.java b/util/src/main/java/com/ning/billing/util/template/translation/DefaultTranslatorBase.java
index 71c87fc..2b3f62e 100644
--- a/util/src/main/java/com/ning/billing/util/template/translation/DefaultTranslatorBase.java
+++ b/util/src/main/java/com/ning/billing/util/template/translation/DefaultTranslatorBase.java
@@ -97,7 +97,11 @@ public abstract class DefaultTranslatorBase implements Translator {
     private ResourceBundle getBundleFromPropertiesFile(final String propertiesFileName) {
         try {
             final InputStream inputStream = UriAccessor.accessUri(propertiesFileName);
-            return new PropertyResourceBundle(inputStream);
+            if (inputStream == null) {
+                return null;
+            } else {
+                return new PropertyResourceBundle(inputStream);
+            }
         } catch (MissingResourceException mrex) {
             return null;
         } catch (URISyntaxException e) {
diff --git a/util/src/test/java/com/ning/billing/mock/MockInvoiceFormatterFactory.java b/util/src/test/java/com/ning/billing/mock/MockInvoiceFormatterFactory.java
new file mode 100644
index 0000000..30282b7
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/mock/MockInvoiceFormatterFactory.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2010-2012 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.mock;
+
+import java.util.Locale;
+
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.formatters.InvoiceFormatter;
+import com.ning.billing.invoice.api.formatters.InvoiceFormatterFactory;
+import com.ning.billing.util.template.translation.TranslatorConfig;
+
+public class MockInvoiceFormatterFactory implements InvoiceFormatterFactory {
+    @Override
+    public InvoiceFormatter createInvoiceFormatter(final TranslatorConfig config, final Invoice invoice, final Locale locale) {
+        return null;
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/email/DefaultCatalogTranslationTest.java b/util/src/test/java/com/ning/billing/util/email/DefaultCatalogTranslationTest.java
index 99c53f3..d092a5a 100644
--- a/util/src/test/java/com/ning/billing/util/email/DefaultCatalogTranslationTest.java
+++ b/util/src/test/java/com/ning/billing/util/email/DefaultCatalogTranslationTest.java
@@ -15,11 +15,14 @@ package com.ning.billing.util.email;/*
  */
 
 import java.util.Locale;
+import java.util.Map;
 
+import org.skife.config.ConfigSource;
 import org.skife.config.ConfigurationObjectFactory;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import com.google.common.collect.ImmutableMap;
 import com.ning.billing.util.template.translation.DefaultCatalogTranslator;
 import com.ning.billing.util.template.translation.Translator;
 import com.ning.billing.util.template.translation.TranslatorConfig;
@@ -32,7 +35,17 @@ public class DefaultCatalogTranslationTest {
 
     @BeforeClass(groups = {"fast", "email"})
     public void setup() {
-        final TranslatorConfig config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
+        final ConfigSource configSource = new ConfigSource() {
+            private final Map<String, String> properties = ImmutableMap.<String, String>of("killbill.template.invoiceFormatterFactoryClass",
+                                                                                           "com.ning.billing.mock.MockInvoiceFormatterFactory");
+
+            @Override
+            public String getString(final String propertyName) {
+                return properties.get(propertyName);
+            }
+        };
+
+        final TranslatorConfig config = new ConfigurationObjectFactory(configSource).build(TranslatorConfig.class);
         translation = new DefaultCatalogTranslator(config);
     }