Reattempting ledger creation when id is already assigned.
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/util/AccountingAdapter.java b/service/src/main/java/io/mifos/portfolio/service/internal/util/AccountingAdapter.java
index c513385..4bb8623 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/util/AccountingAdapter.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/util/AccountingAdapter.java
@@ -15,10 +15,7 @@
*/
package io.mifos.portfolio.service.internal.util;
-import io.mifos.accounting.api.v1.client.AccountAlreadyExistsException;
-import io.mifos.accounting.api.v1.client.AccountNotFoundException;
-import io.mifos.accounting.api.v1.client.LedgerManager;
-import io.mifos.accounting.api.v1.client.LedgerNotFoundException;
+import io.mifos.accounting.api.v1.client.*;
import io.mifos.accounting.api.v1.domain.*;
import io.mifos.core.api.util.UserContextHolder;
import io.mifos.core.lang.DateConverter;
@@ -221,8 +218,7 @@
public String createLedger(
final String customerIdentifier,
final String groupName,
- final String parentLedger) throws InterruptedException
- {
+ final String parentLedger) throws InterruptedException {
final Ledger ledger = ledgerManager.findLedger(parentLedger);
final List<Ledger> subLedgers = ledger.getSubLedgers() == null ? Collections.emptyList() : ledger.getSubLedgers();
@@ -230,21 +226,31 @@
generatedLedger.setShowAccountsInChart(true);
generatedLedger.setParentLedgerIdentifier(parentLedger);
generatedLedger.setType(ledger.getType());
- final String ledgerIdentifer = createLedgerIdentifier(customerIdentifier, groupName, subLedgers);
- generatedLedger.setIdentifier(ledgerIdentifer);
+ final IdentiferWithIndex ledgerIdentifer = createLedgerIdentifier(customerIdentifier, groupName, subLedgers);
+ generatedLedger.setIdentifier(ledgerIdentifer.getIdentifier());
generatedLedger.setDescription("Individual loan case specific ledger");
- generatedLedger.setName(ledgerIdentifer);
+ generatedLedger.setName(ledgerIdentifer.getIdentifier());
- logger.info("Creating ledger with identifier '{}'", ledgerIdentifer);
final EventExpectation expectation = accountingListener.expectLedgerCreation(generatedLedger.getIdentifier());
- ledgerManager.addSubLedger(parentLedger, generatedLedger);
+ boolean created = false;
+ while (!created) {
+ try {
+ logger.info("Attempting to create ledger with identifier '{}'", ledgerIdentifer.getIdentifier());
+ ledgerManager.addSubLedger(parentLedger, generatedLedger);
+ created = true;
+ } catch (final LedgerAlreadyExistsException e) {
+ ledgerIdentifer.incrementIndex();
+ generatedLedger.setIdentifier(ledgerIdentifer.getIdentifier());
+ generatedLedger.setName(ledgerIdentifer.getIdentifier());
+ }
+ }
final boolean ledgerCreationDetected = expectation.waitForOccurrence(5, TimeUnit.SECONDS);
if (!ledgerCreationDetected)
logger.warn("Waited 5 seconds for creation of ledger '{}', but it was not detected. This could cause subsequent " +
"account creations to fail. Is there something wrong with the accounting service? Is ActiveMQ setup properly?",
generatedLedger.getIdentifier());
- return ledgerIdentifer;
+ return ledgerIdentifer.getIdentifier();
}
public String createAccountForLedgerAssignment(final String customerIdentifier, final AccountAssignment ledgerAssignment) {
@@ -279,19 +285,37 @@
customerIdentifier, ledgerAssignment.getDesignator(), ledgerAssignment.getLedgerIdentifier()));
}
- private String createLedgerIdentifier(
+ private static class IdentiferWithIndex {
+ private long index;
+ private final String prefix;
+
+ IdentiferWithIndex(long index, String prefix) {
+ this.index = index;
+ this.prefix = prefix;
+ }
+
+ String getIdentifier() {
+ return prefix + String.format("%05d", index);
+ }
+
+ void incrementIndex() {
+ index++;
+ }
+ }
+
+ private IdentiferWithIndex createLedgerIdentifier(
final String customerIdentifier,
final String groupName,
final List<Ledger> subLedgers) {
final String partialCustomerIdentifer = StringUtils.left(customerIdentifier, 22);
final String partialGroupName = StringUtils.left(groupName, 3);
final Set<String> subLedgerIdentifiers = subLedgers.stream().map(Ledger::getIdentifier).collect(Collectors.toSet());
- long index = 0;
+ final String generatedIdentifierPrefix = partialCustomerIdentifer + "." + partialGroupName + ".";
+ final IdentiferWithIndex ret = new IdentiferWithIndex(0, generatedIdentifierPrefix);
while (true) {
- index++;
- final String generatedIdentifier = partialCustomerIdentifer + "." + partialGroupName + "." + String.format("%05d", index);
- if (!subLedgerIdentifiers.contains(generatedIdentifier))
- return generatedIdentifier;
+ ret.incrementIndex();
+ if (!subLedgerIdentifiers.contains(ret.getIdentifier()))
+ return ret;
}
}