killbill-memoizeit

Details

diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
index 9cc874d..a939c1e 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/AuditedEntitlementDao.java
@@ -505,6 +505,10 @@ public class AuditedEntitlementDao implements EntitlementDao {
         final List<Subscription> bundleInput = new ArrayList<Subscription>();
         if (input.getCategory() == ProductCategory.ADD_ON) {
             final Subscription baseSubscription = getBaseSubscription(factory, input.getBundleId(), false, context);
+            if (baseSubscription == null) {
+                return null;
+            }
+
             bundleInput.add(baseSubscription);
             bundleInput.add(input);
         } else {
@@ -530,17 +534,6 @@ public class AuditedEntitlementDao implements EntitlementDao {
         Collections.sort(input, new Comparator<Subscription>() {
             @Override
             public int compare(final Subscription o1, final Subscription o2) {
-
-                //
-                // STEPH production NPE needs debugging:
-                //
-                if (o1 == null) {
-                    log.error("o1 :Unexpected null subscription in compareMethod for bundle {}, input.size() = {}", bundleId, input.size());
-                }
-                if (o2 == null) {
-                    log.error("o2 :Unexpected null subscription in compareMethod for bundle {}, input.size() = {}", bundleId, input.size());
-                }
-
                 if (o1.getCategory() == ProductCategory.BASE) {
                     return -1;
                 } else if (o2.getCategory() == ProductCategory.BASE) {
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/ExceptionMapperBase.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/ExceptionMapperBase.java
index cf1e2d0..9308d39 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/ExceptionMapperBase.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/ExceptionMapperBase.java
@@ -44,12 +44,12 @@ public abstract class ExceptionMapperBase {
 
     protected Response buildNotFoundResponse(final Exception e, final UriInfo uriInfo) {
         // Log the full stacktrace
-        log.warn("Not found", e);
+        log.info("Not found", e);
         return buildNotFoundResponse(e.toString(), uriInfo);
     }
 
     protected Response buildNotFoundResponse(final String error, final UriInfo uriInfo) {
-        log.warn("Not found for {}: {}", uriInfo.getRequestUri(), error);
+        log.info("Not found for {}: {}", uriInfo.getRequestUri(), error);
         return Response.status(Status.NOT_FOUND)
                        .entity(error)
                        .type(MediaType.TEXT_PLAIN_TYPE)
diff --git a/util/src/main/java/com/ning/billing/util/export/dao/CSVExportOutputStream.java b/util/src/main/java/com/ning/billing/util/export/dao/CSVExportOutputStream.java
index ec7fb54..333a90c 100644
--- a/util/src/main/java/com/ning/billing/util/export/dao/CSVExportOutputStream.java
+++ b/util/src/main/java/com/ning/billing/util/export/dao/CSVExportOutputStream.java
@@ -25,6 +25,7 @@ import com.ning.billing.util.api.ColumnInfo;
 import com.ning.billing.util.api.DatabaseExportOutputStream;
 
 import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.dataformat.csv.CsvMapper;
 import com.fasterxml.jackson.dataformat.csv.CsvSchema;
 import com.fasterxml.jackson.dataformat.csv.CsvSchema.ColumnType;
@@ -42,6 +43,9 @@ public class CSVExportOutputStream extends OutputStream implements DatabaseExpor
 
     public CSVExportOutputStream(final OutputStream delegate) {
         this.delegate = delegate;
+
+        // To be mysqlimport friendly with datetime type
+        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
     }
 
     @Override
diff --git a/util/src/test/java/com/ning/billing/util/export/dao/TestDatabaseExportDao.java b/util/src/test/java/com/ning/billing/util/export/dao/TestDatabaseExportDao.java
index bb5ee85..b39f204 100644
--- a/util/src/test/java/com/ning/billing/util/export/dao/TestDatabaseExportDao.java
+++ b/util/src/test/java/com/ning/billing/util/export/dao/TestDatabaseExportDao.java
@@ -88,8 +88,8 @@ public class TestDatabaseExportDao extends UtilTestSuiteWithEmbeddedDB {
         final String newDump = getDump();
         // Note: unclear why Jackson would quote the header?
         Assert.assertEquals(newDump, "-- accounts record_id,id,email,name,first_name_length,\"is_notified_for_invoices\",created_date,created_by,updated_date,updated_by,tenant_record_id" + "\n" +
-                                     String.format("%s,\"%s\",%s,%s,%s,%s,%s,%s,%s,%s,%s", internalCallContext.getAccountRecordId(), accountId, accountEmail, accountName, firstNameLength,
-                                                   isNotifiedForInvoices, createdDate.getTime(), createdBy, updatedDate.getTime(), updatedBy, internalCallContext.getTenantRecordId()) + "\n" +
+                                     String.format("%s,\"%s\",%s,%s,%s,%s,\"%s\",%s,\"%s\",%s,%s", internalCallContext.getAccountRecordId(), accountId, accountEmail, accountName, firstNameLength,
+                                                   isNotifiedForInvoices, "1970-05-24T18:33:02.000+0000", createdBy, "1982-02-18T20:03:42.000+0000", updatedBy, internalCallContext.getTenantRecordId()) + "\n" +
                                      "-- " + tableNameA + " record_id,a_column,account_record_id,tenant_record_id\n" +
                                      "1,a," + internalCallContext.getAccountRecordId() + "," + internalCallContext.getTenantRecordId() + "\n" +
                                      "-- " + tableNameB + " record_id,b_column,account_record_id,tenant_record_id\n" +