Merge pull request #28 from myrle-krantz/develop

Fixed NPE.
diff --git a/api/src/test/java/io/mifos/portfolio/api/v1/domain/CommandTest.java b/api/src/test/java/io/mifos/portfolio/api/v1/domain/CommandTest.java
index 5e4430b..1372188 100644
--- a/api/src/test/java/io/mifos/portfolio/api/v1/domain/CommandTest.java
+++ b/api/src/test/java/io/mifos/portfolio/api/v1/domain/CommandTest.java
@@ -52,6 +52,9 @@
     ret.add(new ValidationTestCase<Command>("validAccountAssignment")
             .adjustment(x -> x.setOneTimeAccountAssignments(Collections.singletonList(new AccountAssignment(PROCESSING_FEE_ID, "7534"))))
             .valid(true));
+    ret.add(new ValidationTestCase<Command>("nullAccountAssignment")
+            .adjustment(x -> x.setOneTimeAccountAssignments(null))
+            .valid(true));
     return ret;
   }
 }
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestCommands.java b/component-test/src/main/java/io/mifos/portfolio/TestCommands.java
index 08186c7..22b3b33 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestCommands.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestCommands.java
@@ -39,29 +39,29 @@
     checkNextActionsCorrect(product.getIdentifier(), customerCase.getIdentifier(), Action.OPEN);
 
 
-    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.OPEN, Collections.emptyList(), OPEN_INDIVIDUALLOAN_CASE, Case.State.PENDING);
+    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.OPEN, null, OPEN_INDIVIDUALLOAN_CASE, Case.State.PENDING);
     checkNextActionsCorrect(product.getIdentifier(), customerCase.getIdentifier(), Action.APPROVE, Action.DENY);
 
 
-    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.APPROVE, Collections.emptyList(), APPROVE_INDIVIDUALLOAN_CASE, Case.State.APPROVED);
+    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.APPROVE, null, APPROVE_INDIVIDUALLOAN_CASE, Case.State.APPROVED);
     checkNextActionsCorrect(product.getIdentifier(), customerCase.getIdentifier(), Action.DISBURSE, Action.CLOSE);
 
 
-    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.DISBURSE, Collections.emptyList(), DISBURSE_INDIVIDUALLOAN_CASE, Case.State.ACTIVE);
+    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.DISBURSE, null, DISBURSE_INDIVIDUALLOAN_CASE, Case.State.ACTIVE);
     checkNextActionsCorrect(product.getIdentifier(), customerCase.getIdentifier(),
             Action.APPLY_INTEREST, Action.MARK_LATE, Action.ACCEPT_PAYMENT, Action.DISBURSE, Action.WRITE_OFF, Action.CLOSE);
 
 
-    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.ACCEPT_PAYMENT, Collections.emptyList(), ACCEPT_PAYMENT_INDIVIDUALLOAN_CASE, Case.State.ACTIVE);
+    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.ACCEPT_PAYMENT, null, ACCEPT_PAYMENT_INDIVIDUALLOAN_CASE, Case.State.ACTIVE);
     checkNextActionsCorrect(product.getIdentifier(), customerCase.getIdentifier(),
             Action.APPLY_INTEREST, Action.MARK_LATE, Action.ACCEPT_PAYMENT, Action.DISBURSE, Action.WRITE_OFF, Action.CLOSE);
 
 
-    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.ACCEPT_PAYMENT, Collections.emptyList(), ACCEPT_PAYMENT_INDIVIDUALLOAN_CASE, Case.State.ACTIVE);
+    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.ACCEPT_PAYMENT, null, ACCEPT_PAYMENT_INDIVIDUALLOAN_CASE, Case.State.ACTIVE);
     checkNextActionsCorrect(product.getIdentifier(), customerCase.getIdentifier(),
             Action.APPLY_INTEREST, Action.MARK_LATE, Action.ACCEPT_PAYMENT, Action.DISBURSE, Action.WRITE_OFF, Action.CLOSE);
 
-    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.CLOSE, Collections.emptyList(), CLOSE_INDIVIDUALLOAN_CASE, Case.State.CLOSED);
+    checkStateTransfer(product.getIdentifier(), customerCase.getIdentifier(), Action.CLOSE, null, CLOSE_INDIVIDUALLOAN_CASE, Case.State.CLOSED);
     checkNextActionsCorrect(product.getIdentifier(), customerCase.getIdentifier());
   }
 
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java b/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java
index be997ee..1376692 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/CostComponentService.java
@@ -32,6 +32,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Nullable;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.ZoneId;
@@ -68,7 +69,7 @@
   public DataContextOfAction checkedGetDataContext(
           final String productIdentifier,
           final String caseIdentifier,
-          final List<AccountAssignment> oneTimeAccountAssignments) {
+          final @Nullable List<AccountAssignment> oneTimeAccountAssignments) {
 
     final ProductEntity product =
             productRepository.findByIdentifier(productIdentifier)
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/DataContextOfAction.java b/service/src/main/java/io/mifos/individuallending/internal/service/DataContextOfAction.java
index 7687b3c..962efb2 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/DataContextOfAction.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/DataContextOfAction.java
@@ -20,6 +20,9 @@
 import io.mifos.portfolio.service.internal.repository.CaseEntity;
 import io.mifos.portfolio.service.internal.repository.ProductEntity;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -31,29 +34,29 @@
   private final CaseParameters caseParameters;
   private final List<AccountAssignment> oneTimeAccountAssignments;
 
-  DataContextOfAction(final ProductEntity product,
-                      final CaseEntity customerCase,
-                      final CaseParameters caseParameters,
-                      final List<AccountAssignment> oneTimeAccountAssignments) {
+  DataContextOfAction(final @Nonnull ProductEntity product,
+                      final @Nonnull CaseEntity customerCase,
+                      final @Nonnull CaseParameters caseParameters,
+                      final @Nullable List<AccountAssignment> oneTimeAccountAssignments) {
     this.product = product;
     this.customerCase = customerCase;
     this.caseParameters = caseParameters;
-    this.oneTimeAccountAssignments = oneTimeAccountAssignments;
+    this.oneTimeAccountAssignments = oneTimeAccountAssignments == null ? Collections.emptyList() : oneTimeAccountAssignments;
   }
 
-  public ProductEntity getProduct() {
+  public @Nonnull ProductEntity getProduct() {
     return product;
   }
 
-  public CaseEntity getCustomerCase() {
+  public @Nonnull CaseEntity getCustomerCase() {
     return customerCase;
   }
 
-  public CaseParameters getCaseParameters() {
+  public @Nonnull CaseParameters getCaseParameters() {
     return caseParameters;
   }
 
-  public List<AccountAssignment> getOneTimeAccountAssignments() {
+  public @Nonnull List<AccountAssignment> getOneTimeAccountAssignments() {
     return oneTimeAccountAssignments;
   }
 }
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/DesignatorToAccountIdentifierMapper.java b/service/src/main/java/io/mifos/individuallending/internal/service/DesignatorToAccountIdentifierMapper.java
index e082f9b..5b2fb94 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/DesignatorToAccountIdentifierMapper.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/DesignatorToAccountIdentifierMapper.java
@@ -23,6 +23,7 @@
 import io.mifos.portfolio.service.internal.repository.CaseAccountAssignmentEntity;
 import io.mifos.portfolio.service.internal.repository.ProductAccountAssignmentEntity;
 
+import javax.annotation.Nonnull;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Stream;
@@ -31,11 +32,11 @@
  * @author Myrle Krantz
  */
 public class DesignatorToAccountIdentifierMapper {
-  private final Set<ProductAccountAssignmentEntity> productAccountAssignments;
-  private final Set<CaseAccountAssignmentEntity> caseAccountAssignments;
-  private final List<AccountAssignment> oneTimeAccountAssignments;
+  private final @Nonnull Set<ProductAccountAssignmentEntity> productAccountAssignments;
+  private final @Nonnull Set<CaseAccountAssignmentEntity> caseAccountAssignments;
+  private final @Nonnull List<AccountAssignment> oneTimeAccountAssignments;
 
-  public DesignatorToAccountIdentifierMapper(final DataContextOfAction dataContextOfAction) {
+  public DesignatorToAccountIdentifierMapper(final @Nonnull DataContextOfAction dataContextOfAction) {
     this.productAccountAssignments = dataContextOfAction.getProduct().getAccountAssignments();
     this.caseAccountAssignments = dataContextOfAction.getCustomerCase().getAccountAssignments();
     this.oneTimeAccountAssignments = dataContextOfAction.getOneTimeAccountAssignments();
@@ -50,7 +51,7 @@
             productAccountAssignments.stream().map(ProductMapper::mapAccountAssignmentEntity));
   }
 
-  public String mapOrThrow(final String accountDesignator) {
+  public String mapOrThrow(final @Nonnull String accountDesignator) {
     return allAccountAssignmentsAsStream()
             .filter(x -> x.getDesignator().equals(accountDesignator))
             .findFirst()
@@ -63,4 +64,4 @@
             .filter(x -> !x.getDesignator().equals(AccountDesignators.ENTRY))
             .filter(x -> (x.getAccountIdentifier() == null) && (x.getLedgerIdentifier() != null));
   }
-}
+}
\ No newline at end of file