killbill-uncached
Changes
invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java 18(+18 -0)
pom.xml 2(+1 -1)
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);
}