MIFOSX-97: tidy up serialization of commands for clients and client identifiers.

This commit is contained in:
Keith Woodlock
2012-12-05 01:08:59 +00:00
parent 26470d026d
commit 311477a87b
25 changed files with 799 additions and 603 deletions
@@ -6,9 +6,9 @@ import java.util.List;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.mifosplatform.commands.domain.CommandSource; import org.mifosplatform.commands.domain.CommandSource;
import org.mifosplatform.commands.service.ChangeDetectionService; import org.mifosplatform.commands.service.ChangeDetectionService;
import org.mifosplatform.infrastructure.core.api.PortfolioCommandDeserializerService;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand; import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand;
import org.mifosplatform.portfolio.charge.serialization.ChargeCommandFromCommandJsonDeserializer;
import org.mifosplatform.portfolio.charge.service.ChargeWritePlatformService; import org.mifosplatform.portfolio.charge.service.ChargeWritePlatformService;
import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException;
import org.mifosplatform.useradministration.domain.AppUser; import org.mifosplatform.useradministration.domain.AppUser;
@@ -20,15 +20,16 @@ public class ChargeDefinitionCommandHandler implements CommandSourceHandler {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final ChangeDetectionService changeDetectionService; private final ChangeDetectionService changeDetectionService;
private final PortfolioCommandDeserializerService commandDeserializerService; private final ChargeCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer;
private final ChargeWritePlatformService writePlatformService; private final ChargeWritePlatformService writePlatformService;
@Autowired @Autowired
public ChargeDefinitionCommandHandler(final PlatformSecurityContext context, final ChangeDetectionService changeDetectionService, public ChargeDefinitionCommandHandler(final PlatformSecurityContext context, final ChangeDetectionService changeDetectionService,
final PortfolioCommandDeserializerService commandDeserializerService, final ChargeWritePlatformService writePlatformService) { final ChargeCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer,
final ChargeWritePlatformService writePlatformService) {
this.context = context; this.context = context;
this.changeDetectionService = changeDetectionService; this.changeDetectionService = changeDetectionService;
this.commandDeserializerService = commandDeserializerService; this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer;
this.writePlatformService = writePlatformService; this.writePlatformService = writePlatformService;
} }
@@ -41,8 +42,8 @@ public class ChargeDefinitionCommandHandler implements CommandSourceHandler {
CommandSource commandSourceResult = commandSource.copy(); CommandSource commandSourceResult = commandSource.copy();
final Long resourceId = commandSource.resourceId(); final Long resourceId = commandSource.resourceId();
final ChargeDefinitionCommand command = this.commandDeserializerService.deserializeChargeDefinitionCommand(resourceId, final ChargeDefinitionCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson(resourceId,
commandSourceResult.json(), false); commandSourceResult.json());
if (commandSource.isCreate()) { if (commandSource.isCreate()) {
try { try {
@@ -58,9 +59,8 @@ public class ChargeDefinitionCommandHandler implements CommandSourceHandler {
commandSource.resourceId(), commandSource.json()); commandSource.resourceId(), commandSource.json());
commandSourceResult.updateJsonTo(jsonOfChangesOnly); commandSourceResult.updateJsonTo(jsonOfChangesOnly);
final ChargeDefinitionCommand changesOnly = this.commandDeserializerService.deserializeChargeDefinitionCommand(resourceId, final ChargeDefinitionCommand changesOnly = this.commandFromCommandJsonDeserializer.commandFromCommandJson(resourceId,
jsonOfChangesOnly, false); jsonOfChangesOnly);
this.writePlatformService.updateCharge(changesOnly); this.writePlatformService.updateCharge(changesOnly);
commandSourceResult.markAsChecked(maker, asToday); commandSourceResult.markAsChecked(maker, asToday);
@@ -85,7 +85,7 @@ public class ChargeDefinitionCommandHandler implements CommandSourceHandler {
final AppUser checker = context.authenticatedUser(); final AppUser checker = context.authenticatedUser();
Long resourceId = commandSourceResult.resourceId(); Long resourceId = commandSourceResult.resourceId();
final ChargeDefinitionCommand command = this.commandDeserializerService.deserializeChargeDefinitionCommand(resourceId, final ChargeDefinitionCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson(resourceId,
commandSourceResult.json(), true); commandSourceResult.json(), true);
if (commandSourceResult.isCreate()) { if (commandSourceResult.isCreate()) {
@@ -6,10 +6,10 @@ import java.util.List;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.mifosplatform.commands.domain.CommandSource; import org.mifosplatform.commands.domain.CommandSource;
import org.mifosplatform.commands.service.ChangeDetectionService; import org.mifosplatform.commands.service.ChangeDetectionService;
import org.mifosplatform.infrastructure.core.api.PortfolioCommandDeserializerService;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier; import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.client.command.ClientCommand; import org.mifosplatform.portfolio.client.command.ClientCommand;
import org.mifosplatform.portfolio.client.serialization.ClientCommandFromCommandJsonDeserializer;
import org.mifosplatform.portfolio.client.service.ClientWritePlatformService; import org.mifosplatform.portfolio.client.service.ClientWritePlatformService;
import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException;
import org.mifosplatform.useradministration.domain.AppUser; import org.mifosplatform.useradministration.domain.AppUser;
@@ -21,16 +21,16 @@ public class ClientCommandHandler implements CommandSourceHandler {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final ChangeDetectionService changeDetectionService; private final ChangeDetectionService changeDetectionService;
private final ClientCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer;
private final ClientWritePlatformService clientWritePlatformService; private final ClientWritePlatformService clientWritePlatformService;
private final PortfolioCommandDeserializerService commandDeserializerService;
@Autowired @Autowired
public ClientCommandHandler(final PlatformSecurityContext context, final ChangeDetectionService changeDetectionService, public ClientCommandHandler(final PlatformSecurityContext context, final ChangeDetectionService changeDetectionService,
final PortfolioCommandDeserializerService commandDeserializerService, final ClientCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer,
final ClientWritePlatformService clientWritePlatformService) { final ClientWritePlatformService clientWritePlatformService) {
this.context = context; this.context = context;
this.changeDetectionService = changeDetectionService; this.changeDetectionService = changeDetectionService;
this.commandDeserializerService = commandDeserializerService; this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer;
this.clientWritePlatformService = clientWritePlatformService; this.clientWritePlatformService = clientWritePlatformService;
} }
@@ -40,8 +40,8 @@ public class ClientCommandHandler implements CommandSourceHandler {
final AppUser maker = context.authenticatedUser(); final AppUser maker = context.authenticatedUser();
final LocalDate asToday = new LocalDate(); final LocalDate asToday = new LocalDate();
final ClientCommand command = this.commandDeserializerService.deserializeClientCommand(commandSource.resourceId(), final ClientCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson(commandSource.resourceId(),
commandSource.json(), false); commandSource.json());
CommandSource commandSourceResult = commandSource.copy(); CommandSource commandSourceResult = commandSource.copy();
Long newResourceId = null; Long newResourceId = null;
@@ -60,9 +60,8 @@ public class ClientCommandHandler implements CommandSourceHandler {
commandSource.resourceId(), commandSource.json()); commandSource.resourceId(), commandSource.json());
commandSourceResult.updateJsonTo(jsonOfChangesOnly); commandSourceResult.updateJsonTo(jsonOfChangesOnly);
final ClientCommand changesOnly = this.commandDeserializerService.deserializeClientCommand(commandSource.resourceId(), final ClientCommand changesOnly = this.commandFromCommandJsonDeserializer.commandFromCommandJson(
jsonOfChangesOnly, false); commandSource.resourceId(), jsonOfChangesOnly);
EntityIdentifier result = this.clientWritePlatformService.updateClientDetails(changesOnly); EntityIdentifier result = this.clientWritePlatformService.updateClientDetails(changesOnly);
newResourceId = result.getEntityId(); newResourceId = result.getEntityId();
@@ -88,8 +87,7 @@ public class ClientCommandHandler implements CommandSourceHandler {
final AppUser checker = context.authenticatedUser(); final AppUser checker = context.authenticatedUser();
Long resourceId = null; final ClientCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson(commandSourceResult.resourceId(),
final ClientCommand command = this.commandDeserializerService.deserializeClientCommand(commandSourceResult.resourceId(),
commandSourceResult.json(), true); commandSourceResult.json(), true);
if (commandSourceResult.isCreate()) { if (commandSourceResult.isCreate()) {
@@ -97,7 +95,7 @@ public class ClientCommandHandler implements CommandSourceHandler {
"CREATE_CLIENT_CHECKER"); "CREATE_CLIENT_CHECKER");
context.authenticatedUser().validateHasPermissionTo("CREATE_CLIENT_CHECKER", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("CREATE_CLIENT_CHECKER", allowedPermissions);
resourceId = this.clientWritePlatformService.createClient(command); Long resourceId = this.clientWritePlatformService.createClient(command);
commandSourceResult.updateResourceId(resourceId); commandSourceResult.updateResourceId(resourceId);
commandSourceResult.markAsChecked(checker, new LocalDate()); commandSourceResult.markAsChecked(checker, new LocalDate());
} else if (commandSourceResult.isUpdate()) { } else if (commandSourceResult.isUpdate()) {
@@ -105,16 +103,14 @@ public class ClientCommandHandler implements CommandSourceHandler {
"UPDATE_CLIENT_CHECKER"); "UPDATE_CLIENT_CHECKER");
context.authenticatedUser().validateHasPermissionTo("UPDATE_CLIENT_CHECKER", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("UPDATE_CLIENT_CHECKER", allowedPermissions);
EntityIdentifier result = this.clientWritePlatformService.updateClientDetails(command); this.clientWritePlatformService.updateClientDetails(command);
resourceId = result.getEntityId();
commandSourceResult.markAsChecked(checker, new LocalDate()); commandSourceResult.markAsChecked(checker, new LocalDate());
} else if (commandSourceResult.isDelete()) { } else if (commandSourceResult.isDelete()) {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "PORTFOLIO_MANAGEMENT_SUPER_USER", final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "PORTFOLIO_MANAGEMENT_SUPER_USER",
"DELETE_CLIENT_CHECKER"); "DELETE_CLIENT_CHECKER");
context.authenticatedUser().validateHasPermissionTo("DELETE_CLIENT_CHECKER", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("DELETE_CLIENT_CHECKER", allowedPermissions);
EntityIdentifier result = this.clientWritePlatformService.deleteClient(command); this.clientWritePlatformService.deleteClient(command);
resourceId = result.getEntityId();
commandSourceResult.markAsChecked(checker, new LocalDate()); commandSourceResult.markAsChecked(checker, new LocalDate());
} }
@@ -6,10 +6,9 @@ import java.util.List;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.mifosplatform.commands.domain.CommandSource; import org.mifosplatform.commands.domain.CommandSource;
import org.mifosplatform.commands.service.ChangeDetectionService; import org.mifosplatform.commands.service.ChangeDetectionService;
import org.mifosplatform.infrastructure.core.api.PortfolioCommandDeserializerService;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.client.command.ClientIdentifierCommand; import org.mifosplatform.portfolio.client.command.ClientIdentifierCommand;
import org.mifosplatform.portfolio.client.serialization.ClientIdentifierCommandFromCommandJsonDeserializer;
import org.mifosplatform.portfolio.client.service.ClientWritePlatformService; import org.mifosplatform.portfolio.client.service.ClientWritePlatformService;
import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException;
import org.mifosplatform.useradministration.domain.AppUser; import org.mifosplatform.useradministration.domain.AppUser;
@@ -22,15 +21,15 @@ public class ClientIdentifierCommandHandler implements CommandSourceHandler {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final ChangeDetectionService changeDetectionService; private final ChangeDetectionService changeDetectionService;
private final ClientWritePlatformService clientWritePlatformService; private final ClientWritePlatformService clientWritePlatformService;
private final PortfolioCommandDeserializerService commandDeserializerService; private final ClientIdentifierCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer;
@Autowired @Autowired
public ClientIdentifierCommandHandler(final PlatformSecurityContext context, final ChangeDetectionService changeDetectionService, public ClientIdentifierCommandHandler(final PlatformSecurityContext context, final ChangeDetectionService changeDetectionService,
final PortfolioCommandDeserializerService commandDeserializerService, final ClientIdentifierCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer,
final ClientWritePlatformService clientWritePlatformService) { final ClientWritePlatformService clientWritePlatformService) {
this.context = context; this.context = context;
this.changeDetectionService = changeDetectionService; this.changeDetectionService = changeDetectionService;
this.commandDeserializerService = commandDeserializerService; this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer;
this.clientWritePlatformService = clientWritePlatformService; this.clientWritePlatformService = clientWritePlatformService;
} }
@@ -40,15 +39,13 @@ public class ClientIdentifierCommandHandler implements CommandSourceHandler {
final AppUser maker = context.authenticatedUser(); final AppUser maker = context.authenticatedUser();
final LocalDate asToday = new LocalDate(); final LocalDate asToday = new LocalDate();
final ClientIdentifierCommand command = this.commandDeserializerService.deserializeClientIdentifierCommand( final ClientIdentifierCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson(commandSource.resourceId(),
commandSource.resourceId(), null, commandSource.json(), false); commandSource.json());
CommandSource commandSourceResult = commandSource.copy(); CommandSource commandSourceResult = commandSource.copy();
Long newResourceId = null;
if (commandSource.isCreate()) { if (commandSource.isCreate()) {
try { try {
newResourceId = this.clientWritePlatformService.addClientIdentifier(command); Long newResourceId = this.clientWritePlatformService.addClientIdentifier(command);
commandSourceResult.markAsChecked(maker, asToday); commandSourceResult.markAsChecked(maker, asToday);
commandSourceResult.updateResourceId(newResourceId); commandSourceResult.updateResourceId(newResourceId);
} catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) { } catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) {
@@ -60,20 +57,17 @@ public class ClientIdentifierCommandHandler implements CommandSourceHandler {
commandSource.resourceId(), commandSource.json()); commandSource.resourceId(), commandSource.json());
commandSourceResult.updateJsonTo(jsonOfChangesOnly); commandSourceResult.updateJsonTo(jsonOfChangesOnly);
final ClientIdentifierCommand changesOnly = this.commandDeserializerService.deserializeClientIdentifierCommand( final ClientIdentifierCommand changesOnly = this.commandFromCommandJsonDeserializer.commandFromCommandJson(
commandSource.resourceId(), null, jsonOfChangesOnly, false); commandSource.resourceId(), jsonOfChangesOnly);
EntityIdentifier result = this.clientWritePlatformService.updateClientIdentifier(changesOnly);
newResourceId = result.getEntityId();
this.clientWritePlatformService.updateClientIdentifier(changesOnly);
commandSourceResult.markAsChecked(maker, asToday); commandSourceResult.markAsChecked(maker, asToday);
} catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) { } catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) {
// swallow this rollback transaction by design // swallow this rollback transaction by design
} }
} else if (commandSource.isDelete()) { } else if (commandSource.isDelete()) {
try { try {
EntityIdentifier result = this.clientWritePlatformService.deleteClientIdentifier(command); this.clientWritePlatformService.deleteClientIdentifier(command);
newResourceId = result.getEntityId();
commandSourceResult.markAsChecked(maker, asToday); commandSourceResult.markAsChecked(maker, asToday);
} catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) { } catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) {
// swallow this rollback transaction by design // swallow this rollback transaction by design
@@ -88,16 +82,14 @@ public class ClientIdentifierCommandHandler implements CommandSourceHandler {
final AppUser checker = context.authenticatedUser(); final AppUser checker = context.authenticatedUser();
Long resourceId = null; final ClientIdentifierCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson(
final ClientIdentifierCommand command = this.commandDeserializerService.deserializeClientIdentifierCommand( commandSourceResult.resourceId(), commandSourceResult.json(), true);
commandSourceResult.resourceId(), null, commandSourceResult.json(), true);
if (commandSourceResult.isCreate()) { if (commandSourceResult.isCreate()) {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "PORTFOLIO_MANAGEMENT_SUPER_USER", final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "PORTFOLIO_MANAGEMENT_SUPER_USER",
"CREATE_CLIENTIDENTIFIER_CHECKER"); "CREATE_CLIENTIDENTIFIER_CHECKER");
context.authenticatedUser().validateHasPermissionTo("CREATE_CLIENTIDENTIFIER_CHECKER", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("CREATE_CLIENTIDENTIFIER_CHECKER", allowedPermissions);
resourceId = this.clientWritePlatformService.addClientIdentifier(command); Long resourceId = this.clientWritePlatformService.addClientIdentifier(command);
commandSourceResult.updateResourceId(resourceId); commandSourceResult.updateResourceId(resourceId);
commandSourceResult.markAsChecked(checker, new LocalDate()); commandSourceResult.markAsChecked(checker, new LocalDate());
} else if (commandSourceResult.isUpdate()) { } else if (commandSourceResult.isUpdate()) {
@@ -105,16 +97,14 @@ public class ClientIdentifierCommandHandler implements CommandSourceHandler {
"UPDATE_CLIENTIDENTIFIER_CHECKER"); "UPDATE_CLIENTIDENTIFIER_CHECKER");
context.authenticatedUser().validateHasPermissionTo("UPDATE_CLIENTIDENTIFIER_CHECKER", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("UPDATE_CLIENTIDENTIFIER_CHECKER", allowedPermissions);
EntityIdentifier result = this.clientWritePlatformService.updateClientIdentifier(command); this.clientWritePlatformService.updateClientIdentifier(command);
resourceId = result.getEntityId();
commandSourceResult.markAsChecked(checker, new LocalDate()); commandSourceResult.markAsChecked(checker, new LocalDate());
} else if (commandSourceResult.isDelete()) { } else if (commandSourceResult.isDelete()) {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "PORTFOLIO_MANAGEMENT_SUPER_USER", final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "PORTFOLIO_MANAGEMENT_SUPER_USER",
"DELETE_CLIENTIDENTIFIER_CHECKER"); "DELETE_CLIENTIDENTIFIER_CHECKER");
context.authenticatedUser().validateHasPermissionTo("DELETE_CLIENTIDENTIFIER_CHECKER", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("DELETE_CLIENTIDENTIFIER_CHECKER", allowedPermissions);
EntityIdentifier result = this.clientWritePlatformService.deleteClientIdentifier(command); this.clientWritePlatformService.deleteClientIdentifier(command);
resourceId = result.getEntityId();
commandSourceResult.markAsChecked(checker, new LocalDate()); commandSourceResult.markAsChecked(checker, new LocalDate());
} }
@@ -7,11 +7,11 @@ import org.joda.time.LocalDate;
import org.mifosplatform.commands.domain.CommandSource; import org.mifosplatform.commands.domain.CommandSource;
import org.mifosplatform.commands.exception.UnsupportedCommandException; import org.mifosplatform.commands.exception.UnsupportedCommandException;
import org.mifosplatform.commands.service.ChangeDetectionService; import org.mifosplatform.commands.service.ChangeDetectionService;
import org.mifosplatform.infrastructure.core.api.PortfolioCommandDeserializerService;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier; import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException;
import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand; import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand;
import org.mifosplatform.portfolio.loanproduct.serialization.LoanProductCommandFromCommandJsonDeserializer;
import org.mifosplatform.portfolio.loanproduct.service.LoanProductWritePlatformService; import org.mifosplatform.portfolio.loanproduct.service.LoanProductWritePlatformService;
import org.mifosplatform.useradministration.domain.AppUser; import org.mifosplatform.useradministration.domain.AppUser;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -22,15 +22,16 @@ public class LoanProductCommandHandler implements CommandSourceHandler {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final ChangeDetectionService changeDetectionService; private final ChangeDetectionService changeDetectionService;
private final PortfolioCommandDeserializerService commandDeserializerService; private final LoanProductCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer;
private final LoanProductWritePlatformService writePlatformService; private final LoanProductWritePlatformService writePlatformService;
@Autowired @Autowired
public LoanProductCommandHandler(final PlatformSecurityContext context, final ChangeDetectionService changeDetectionService, public LoanProductCommandHandler(final PlatformSecurityContext context, final ChangeDetectionService changeDetectionService,
final PortfolioCommandDeserializerService commandDeserializerService, final LoanProductWritePlatformService writePlatformService) { final LoanProductCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer,
final LoanProductWritePlatformService writePlatformService) {
this.context = context; this.context = context;
this.changeDetectionService = changeDetectionService; this.changeDetectionService = changeDetectionService;
this.commandDeserializerService = commandDeserializerService; this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer;
this.writePlatformService = writePlatformService; this.writePlatformService = writePlatformService;
} }
@@ -41,9 +42,7 @@ public class LoanProductCommandHandler implements CommandSourceHandler {
final LocalDate asToday = new LocalDate(); final LocalDate asToday = new LocalDate();
final Long resourceId = commandSource.resourceId(); final Long resourceId = commandSource.resourceId();
final LoanProductCommand command = this.commandDeserializerService.deserializeLoanProductCommand(resourceId, commandSource.json(), final LoanProductCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson(resourceId, commandSource.json());
false);
CommandSource commandSourceResult = commandSource.copy(); CommandSource commandSourceResult = commandSource.copy();
if (commandSource.isCreate()) { if (commandSource.isCreate()) {
@@ -60,9 +59,8 @@ public class LoanProductCommandHandler implements CommandSourceHandler {
commandSource.resourceId(), commandSource.json()); commandSource.resourceId(), commandSource.json());
commandSourceResult.updateJsonTo(jsonOfChangesOnly); commandSourceResult.updateJsonTo(jsonOfChangesOnly);
final LoanProductCommand changesOnly = this.commandDeserializerService.deserializeLoanProductCommand(resourceId, final LoanProductCommand changesOnly = this.commandFromCommandJsonDeserializer.commandFromCommandJson(resourceId,
jsonOfChangesOnly, false); jsonOfChangesOnly);
this.writePlatformService.updateLoanProduct(changesOnly); this.writePlatformService.updateLoanProduct(changesOnly);
commandSourceResult.markAsChecked(maker, asToday); commandSourceResult.markAsChecked(maker, asToday);
@@ -80,7 +78,7 @@ public class LoanProductCommandHandler implements CommandSourceHandler {
final AppUser checker = context.authenticatedUser(); final AppUser checker = context.authenticatedUser();
Long resourceId = commandSourceResult.resourceId(); Long resourceId = commandSourceResult.resourceId();
final LoanProductCommand command = this.commandDeserializerService.deserializeLoanProductCommand(resourceId, final LoanProductCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson(resourceId,
commandSourceResult.json(), true); commandSourceResult.json(), true);
if (commandSourceResult.isCreate()) { if (commandSourceResult.isCreate()) {
@@ -1,9 +1,7 @@
package org.mifosplatform.infrastructure.core.api; package org.mifosplatform.infrastructure.core.api;
import org.mifosplatform.organisation.staff.command.BulkTransferLoanOfficerCommand; import org.mifosplatform.organisation.staff.command.BulkTransferLoanOfficerCommand;
import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand;
import org.mifosplatform.portfolio.client.command.ClientCommand; import org.mifosplatform.portfolio.client.command.ClientCommand;
import org.mifosplatform.portfolio.client.command.ClientIdentifierCommand;
import org.mifosplatform.portfolio.client.command.NoteCommand; import org.mifosplatform.portfolio.client.command.NoteCommand;
import org.mifosplatform.portfolio.client.data.ClientData; import org.mifosplatform.portfolio.client.data.ClientData;
import org.mifosplatform.portfolio.group.command.GroupCommand; import org.mifosplatform.portfolio.group.command.GroupCommand;
@@ -13,7 +11,6 @@ import org.mifosplatform.portfolio.loanaccount.command.LoanChargeCommand;
import org.mifosplatform.portfolio.loanaccount.command.LoanStateTransitionCommand; import org.mifosplatform.portfolio.loanaccount.command.LoanStateTransitionCommand;
import org.mifosplatform.portfolio.loanaccount.command.LoanTransactionCommand; import org.mifosplatform.portfolio.loanaccount.command.LoanTransactionCommand;
import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommand; import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommand;
import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand;
import org.mifosplatform.portfolio.savingsaccount.command.SavingAccountCommand; import org.mifosplatform.portfolio.savingsaccount.command.SavingAccountCommand;
import org.mifosplatform.portfolio.savingsaccountproduct.command.SavingProductCommand; import org.mifosplatform.portfolio.savingsaccountproduct.command.SavingProductCommand;
import org.mifosplatform.portfolio.savingsdepositaccount.command.DepositAccountCommand; import org.mifosplatform.portfolio.savingsdepositaccount.command.DepositAccountCommand;
@@ -25,16 +22,10 @@ import org.mifosplatform.portfolio.savingsdepositproduct.command.DepositProductC
public interface PortfolioApiDataConversionService { public interface PortfolioApiDataConversionService {
ChargeDefinitionCommand convertApiRequestJsonToChargeDefinitionCommand(Long resourceIdentifier, String json);
LoanProductCommand convertApiRequestJsonToLoanProductCommand(Long resourceIdentifier, String json);
SavingProductCommand convertJsonToSavingProductCommand(Long resourceIdentifier, String json); SavingProductCommand convertJsonToSavingProductCommand(Long resourceIdentifier, String json);
DepositProductCommand convertJsonToDepositProductCommand(Long resourceIdentifier, String json); DepositProductCommand convertJsonToDepositProductCommand(Long resourceIdentifier, String json);
ClientCommand convertApiRequestJsonToClientCommand(Long resourceIdentifier, String json);
ClientData convertInternalJsonFormatToClientDataChange(Long clientId, String json); ClientData convertInternalJsonFormatToClientDataChange(Long clientId, String json);
ClientCommand detectChanges(Long resourceId, String baseJson, String workingJson); ClientCommand detectChanges(Long resourceId, String baseJson, String workingJson);
@@ -67,8 +58,6 @@ public interface PortfolioApiDataConversionService {
DepositAccountWithdrawInterestCommand convertJsonToDepositAccountWithdrawInterestCommand(Long resourceIdentifier, String json); DepositAccountWithdrawInterestCommand convertJsonToDepositAccountWithdrawInterestCommand(Long resourceIdentifier, String json);
ClientIdentifierCommand convertApiRequestJsonToClientIdentifierCommand(Long resourceIdentifier, Long clientId, String json);
SavingAccountCommand convertJsonToSavingAccountCommand(Long resourceIdentifier, String json); SavingAccountCommand convertJsonToSavingAccountCommand(Long resourceIdentifier, String json);
GuarantorCommand convertJsonToGuarantorCommand(Long resourceIdentifier, Long loanId, String json); GuarantorCommand convertJsonToGuarantorCommand(Long resourceIdentifier, Long loanId, String json);
@@ -23,11 +23,10 @@ import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidation
import org.mifosplatform.infrastructure.core.exception.UnsupportedParameterException; import org.mifosplatform.infrastructure.core.exception.UnsupportedParameterException;
import org.mifosplatform.infrastructure.core.serialization.JsonParserHelper; import org.mifosplatform.infrastructure.core.serialization.JsonParserHelper;
import org.mifosplatform.organisation.staff.command.BulkTransferLoanOfficerCommand; import org.mifosplatform.organisation.staff.command.BulkTransferLoanOfficerCommand;
import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand;
import org.mifosplatform.portfolio.client.command.ClientCommand; import org.mifosplatform.portfolio.client.command.ClientCommand;
import org.mifosplatform.portfolio.client.command.ClientIdentifierCommand;
import org.mifosplatform.portfolio.client.command.NoteCommand; import org.mifosplatform.portfolio.client.command.NoteCommand;
import org.mifosplatform.portfolio.client.data.ClientData; import org.mifosplatform.portfolio.client.data.ClientData;
import org.mifosplatform.portfolio.client.serialization.ClientCommandFromCommandJsonDeserializer;
import org.mifosplatform.portfolio.group.command.GroupCommand; import org.mifosplatform.portfolio.group.command.GroupCommand;
import org.mifosplatform.portfolio.loanaccount.command.AdjustLoanTransactionCommand; import org.mifosplatform.portfolio.loanaccount.command.AdjustLoanTransactionCommand;
import org.mifosplatform.portfolio.loanaccount.command.LoanApplicationCommand; import org.mifosplatform.portfolio.loanaccount.command.LoanApplicationCommand;
@@ -35,7 +34,6 @@ import org.mifosplatform.portfolio.loanaccount.command.LoanChargeCommand;
import org.mifosplatform.portfolio.loanaccount.command.LoanStateTransitionCommand; import org.mifosplatform.portfolio.loanaccount.command.LoanStateTransitionCommand;
import org.mifosplatform.portfolio.loanaccount.command.LoanTransactionCommand; import org.mifosplatform.portfolio.loanaccount.command.LoanTransactionCommand;
import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommand; import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommand;
import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand;
import org.mifosplatform.portfolio.savingsaccount.command.SavingAccountCommand; import org.mifosplatform.portfolio.savingsaccount.command.SavingAccountCommand;
import org.mifosplatform.portfolio.savingsaccountproduct.command.SavingProductCommand; import org.mifosplatform.portfolio.savingsaccountproduct.command.SavingProductCommand;
import org.mifosplatform.portfolio.savingsdepositaccount.command.DepositAccountCommand; import org.mifosplatform.portfolio.savingsdepositaccount.command.DepositAccountCommand;
@@ -58,62 +56,17 @@ import com.google.gson.reflect.TypeToken;
@Service @Service
public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataConversionService { public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataConversionService {
/**
* Used in places where the support json of the api request is not any
* different to that of the json of a serialized command object.
*/
private final PortfolioCommandDeserializerService portfolioCommandDeserializerService;
/** /**
* Google-gson class for converting to and from json. * Google-gson class for converting to and from json.
*/ */
private final Gson gsonConverter; private final Gson gsonConverter;
/** private final ClientCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer;
* Google-gson class for parsing json.
*/
// private final JsonParser parser;
@Autowired @Autowired
public PortfolioApiDataConversionServiceImpl(final PortfolioCommandDeserializerService portfolioCommandDeserializerService) { public PortfolioApiDataConversionServiceImpl(final ClientCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer) {
this.portfolioCommandDeserializerService = portfolioCommandDeserializerService; this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer;
this.gsonConverter = new Gson(); this.gsonConverter = new Gson();
// this.parser = new JsonParser();
}
@Override
public ChargeDefinitionCommand convertApiRequestJsonToChargeDefinitionCommand(final Long resourceIdentifier, final String json) {
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
final Type typeOfMap = new TypeToken<Map<String, String>>() {}.getType();
final Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
final Set<String> supportedParams = new HashSet<String>(Arrays.asList("name", "amount", "locale", "currencyCode",
"currencyOptions", "chargeAppliesTo", "chargeTimeType", "chargeCalculationType", "chargeCalculationTypeOptions", "penalty",
"active"));
checkForUnsupportedParameters(requestMap, supportedParams);
final JsonParserHelper helper = new JsonParserHelper();
JsonParser parser = new JsonParser();
final JsonElement element = parser.parse(json);
final Set<String> parametersPassedInRequest = new HashSet<String>();
final String name = helper.extractStringNamed("name", element, parametersPassedInRequest);
final String currencyCode = helper.extractStringNamed("currencyCode", element, parametersPassedInRequest);
final BigDecimal amount = helper.extractBigDecimalWithLocaleNamed("amount", element.getAsJsonObject(), parametersPassedInRequest);
final Integer chargeTimeType = helper.extractIntegerWithLocaleNamed("chargeTimeType", element, parametersPassedInRequest);
final Integer chargeAppliesTo = helper.extractIntegerWithLocaleNamed("chargeAppliesTo", element, parametersPassedInRequest);
final Integer chargeCalculationType = helper.extractIntegerWithLocaleNamed("chargeCalculationType", element,
parametersPassedInRequest);
final Boolean penalty = helper.extractBooleanNamed("penalty", element, parametersPassedInRequest);
final Boolean active = helper.extractBooleanNamed("active", element, parametersPassedInRequest);
return new ChargeDefinitionCommand(parametersPassedInRequest, false, resourceIdentifier, name, amount, currencyCode,
chargeTimeType, chargeAppliesTo, chargeCalculationType, penalty, active);
} }
@Override @Override
@@ -293,38 +246,10 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo
return differenceExists; return differenceExists;
} }
@Override
public ClientCommand convertApiRequestJsonToClientCommand(final Long resourceIdentifier, final String json) {
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
final Type typeOfMap = new TypeToken<Map<String, String>>() {}.getType();
final Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
final Set<String> supportedParams = new HashSet<String>(Arrays.asList("id", "externalId", "firstname", "lastname",
"clientOrBusinessName", "officeId", "joiningDate", "locale", "dateFormat"));
checkForUnsupportedParameters(requestMap, supportedParams);
final JsonParser parser = new JsonParser();
final JsonElement element = parser.parse(json);
final JsonParserHelper helper = new JsonParserHelper();
final Set<String> parametersPassedInRequest = new HashSet<String>();
final Long officeId = helper.extractLongNamed("officeId", element, parametersPassedInRequest);
final String externalId = helper.extractStringNamed("externalId", element, parametersPassedInRequest);
final String firstname = helper.extractStringNamed("firstname", element, parametersPassedInRequest);
final String lastname = helper.extractStringNamed("lastname", element, parametersPassedInRequest);
final String clientOrBusinessName = helper.extractStringNamed("clientOrBusinessName", element, parametersPassedInRequest);
final LocalDate joiningDate = helper.extractLocalDateNamed("joiningDate", element, parametersPassedInRequest);
return new ClientCommand(parametersPassedInRequest, resourceIdentifier, externalId, firstname, lastname, clientOrBusinessName,
officeId, joiningDate, false);
}
@Override @Override
public ClientData convertInternalJsonFormatToClientDataChange(final Long resourceIdentifier, final String json) { public ClientData convertInternalJsonFormatToClientDataChange(final Long resourceIdentifier, final String json) {
final ClientCommand command = this.portfolioCommandDeserializerService.deserializeClientCommand(resourceIdentifier, json, false); final ClientCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson(resourceIdentifier, json);
return ClientData.dataChangeInstance(resourceIdentifier, command.getOfficeId(), command.getExternalId(), command.getFirstname(), return ClientData.dataChangeInstance(resourceIdentifier, command.getOfficeId(), command.getExternalId(), command.getFirstname(),
command.getLastname(), command.getClientOrBusinessName(), command.getJoiningDate()); command.getLastname(), command.getClientOrBusinessName(), command.getJoiningDate());
@@ -368,78 +293,6 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo
return new GroupCommand(modifiedParameters, resourceIdentifier, externalId, name, officeId, clientMembers); return new GroupCommand(modifiedParameters, resourceIdentifier, externalId, name, officeId, clientMembers);
} }
@Override
public LoanProductCommand convertApiRequestJsonToLoanProductCommand(final Long resourceIdentifier, final String json) {
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
final Map<String, Object> requestMap = gsonConverter.fromJson(json, typeOfMap);
final Set<String> supportedParams = new HashSet<String>(Arrays.asList("name", "description", "fundId",
"transactionProcessingStrategyId", "currencyCode", "digitsAfterDecimal", "principal", "inArrearsTolerance",
"interestRatePerPeriod", "repaymentEvery", "numberOfRepayments", "repaymentFrequencyType", "interestRateFrequencyType",
"amortizationType", "interestType", "interestCalculationPeriodType", "charges", "locale"));
checkForUnsupportedParameters(requestMap, supportedParams);
final JsonParser parser = new JsonParser();
final JsonElement element = parser.parse(json);
final JsonParserHelper helper = new JsonParserHelper();
final Set<String> modifiedParameters = new HashSet<String>();
final String name = helper.extractStringNamed("name", element, modifiedParameters);
final String description = helper.extractStringNamed("description", element, modifiedParameters);
final Long fundId = helper.extractLongNamed("fundId", element, modifiedParameters);
final Long transactionProcessingStrategyId = helper
.extractLongNamed("transactionProcessingStrategyId", element, modifiedParameters);
final String currencyCode = helper.extractStringNamed("currencyCode", element, modifiedParameters);
final Integer digitsAfterDecimal = helper.extractIntegerWithLocaleNamed("digitsAfterDecimal", element, modifiedParameters);
final BigDecimal principal = helper.extractBigDecimalWithLocaleNamed("principal", element, modifiedParameters);
final BigDecimal inArrearsTolerance = helper.extractBigDecimalWithLocaleNamed("inArrearsTolerance", element, modifiedParameters);
final BigDecimal interestRatePerPeriod = helper.extractBigDecimalWithLocaleNamed("interestRatePerPeriod", element,
modifiedParameters);
final Integer repaymentEvery = helper.extractIntegerWithLocaleNamed("repaymentEvery", element, modifiedParameters);
final Integer numberOfRepayments = helper.extractIntegerWithLocaleNamed("numberOfRepayments", element, modifiedParameters);
final Integer repaymentFrequencyType = helper.extractIntegerWithLocaleNamed("repaymentFrequencyType", element, modifiedParameters);
// FIXME - A - LoanProduct - KW - should loan term fields be part of
// product also as are basic part of 'loan terms'
// final Integer loanTermFrequency =
// helper.extractIntegerNamed("loanTermFrequency", element,
// modifiedParameters);
// final Integer loanTermFrequencyType =
// helper.extractIntegerNamed("loanTermFrequencyType", element,
// modifiedParameters);
final Integer interestRateFrequencyType = helper.extractIntegerWithLocaleNamed("interestRateFrequencyType", element,
modifiedParameters);
final Integer amortizationType = helper.extractIntegerWithLocaleNamed("amortizationType", element, modifiedParameters);
final Integer interestType = helper.extractIntegerWithLocaleNamed("interestType", element, modifiedParameters);
final Integer interestCalculationPeriodType = helper.extractIntegerWithLocaleNamed("interestCalculationPeriodType", element,
modifiedParameters);
String[] charges = null;
if (element.isJsonObject()) {
JsonObject object = element.getAsJsonObject();
if (object.has("charges")) {
modifiedParameters.add("charges");
JsonArray array = object.get("charges").getAsJsonArray();
charges = new String[array.size()];
for (int i = 0; i < array.size(); i++) {
charges[i] = array.get(i).getAsString();
}
}
}
return new LoanProductCommand(modifiedParameters, false, resourceIdentifier, name, description, fundId,
transactionProcessingStrategyId, currencyCode, digitsAfterDecimal, principal, inArrearsTolerance, numberOfRepayments,
repaymentEvery, interestRatePerPeriod, repaymentFrequencyType, interestRateFrequencyType, amortizationType, interestType,
interestCalculationPeriodType, charges);
}
@Override @Override
public LoanApplicationCommand convertApiRequestJsonToLoanApplicationCommand(final Long resourceIdentifier, final String json) { public LoanApplicationCommand convertApiRequestJsonToLoanApplicationCommand(final Long resourceIdentifier, final String json) {
@@ -1337,21 +1190,6 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo
return new DepositAccountWithdrawInterestCommand(resourceIdentifier, amount, note); return new DepositAccountWithdrawInterestCommand(resourceIdentifier, amount, note);
} }
@Override
public ClientIdentifierCommand convertApiRequestJsonToClientIdentifierCommand(final Long resourceIdentifier, final Long clientId,
final String json) {
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
Type typeOfMap = new TypeToken<Map<String, String>>() {}.getType();
Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
Set<String> supportedParams = new HashSet<String>(Arrays.asList("clientId", "documentTypeId", "documentKey", "description"));
checkForUnsupportedParameters(requestMap, supportedParams);
return this.portfolioCommandDeserializerService.deserializeClientIdentifierCommand(resourceIdentifier, clientId, json, false);
}
@Override @Override
public SavingAccountCommand convertJsonToSavingAccountCommand(Long resourceIdentifier, String json) { public SavingAccountCommand convertJsonToSavingAccountCommand(Long resourceIdentifier, String json) {
@@ -1365,7 +1203,7 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo
"digitsAfterDecimal", "savingsDepositAmountPerPeriod", "recurringInterestRate", "savingInterestRate", "tenure", "digitsAfterDecimal", "savingsDepositAmountPerPeriod", "recurringInterestRate", "savingInterestRate", "tenure",
"commencementDate", "locale", "dateFormat", "isLockinPeriodAllowed", "lockinPeriod", "lockinPeriodType", "commencementDate", "locale", "dateFormat", "isLockinPeriodAllowed", "lockinPeriod", "lockinPeriodType",
"savingProductType", "tenureType", "frequency", "interestType", "interestCalculationMethod", "minimumBalanceForWithdrawal", "savingProductType", "tenureType", "frequency", "interestType", "interestCalculationMethod", "minimumBalanceForWithdrawal",
"isPartialDepositAllowed","payEvery")); "isPartialDepositAllowed", "payEvery"));
checkForUnsupportedParameters(requestMap, supportedParams); checkForUnsupportedParameters(requestMap, supportedParams);
Set<String> modifiedParameters = new HashSet<String>(); Set<String> modifiedParameters = new HashSet<String>();
@@ -1396,7 +1234,7 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo
return new SavingAccountCommand(modifiedParameters, resourceIdentifier, clientId, productId, externalId, currencyCode, return new SavingAccountCommand(modifiedParameters, resourceIdentifier, clientId, productId, externalId, currencyCode,
digitsAfterDecimalValue, savingsDepositAmount, recurringInterestRate, savingInterestRate, tenure, commencementDate, digitsAfterDecimalValue, savingsDepositAmount, recurringInterestRate, savingInterestRate, tenure, commencementDate,
savingProductType, tenureType, frequency, interestType, minimumBalanceForWithdrawal, interestCalculationMethod, savingProductType, tenureType, frequency, interestType, minimumBalanceForWithdrawal, interestCalculationMethod,
isLockinPeriodAllowed, isPartialDepositAllowed, lockinPeriod, lockinPeriodType,payEvery); isLockinPeriodAllowed, isPartialDepositAllowed, lockinPeriod, lockinPeriodType, payEvery);
} }
@Override @Override
@@ -1,165 +0,0 @@
package org.mifosplatform.infrastructure.core.api;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
import org.mifosplatform.infrastructure.core.serialization.JsonParserHelper;
import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand;
import org.mifosplatform.portfolio.client.command.ClientCommand;
import org.mifosplatform.portfolio.client.command.ClientIdentifierCommand;
import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand;
import org.springframework.stereotype.Service;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
/**
* Implementation of {@link PortfolioCommandDeserializerService} that
* de-serializes JSON of commands into Java object representation using
* google-gson.
*/
@Service
public class PortfolioCommandDeerializerServiceGoogleGson implements PortfolioCommandDeserializerService {
private final JsonParser parser;
public PortfolioCommandDeerializerServiceGoogleGson() {
parser = new JsonParser();
}
@Override
public ChargeDefinitionCommand deserializeChargeDefinitionCommand(final Long chargeDefinitionId, final String commandAsJson,
final boolean makerCheckerApproval) {
if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); }
final JsonParserHelper helper = new JsonParserHelper();
final JsonElement element = parser.parse(commandAsJson);
final Set<String> parametersPassedInRequest = new HashSet<String>();
final String name = helper.extractStringNamed("name", element, parametersPassedInRequest);
final String currencyCode = helper.extractStringNamed("currencyCode", element, parametersPassedInRequest);
final BigDecimal amount = helper.extractBigDecimalNamed("amount", element.getAsJsonObject(), Locale.US, parametersPassedInRequest);
final Integer chargeTimeType = helper.extractIntegerNamed("chargeTimeType", element, Locale.US, parametersPassedInRequest);
final Integer chargeAppliesTo = helper.extractIntegerNamed("chargeAppliesTo", element, Locale.US, parametersPassedInRequest);
final Integer chargeCalculationType = helper.extractIntegerNamed("chargeCalculationType", element, Locale.US,
parametersPassedInRequest);
final Boolean penalty = helper.extractBooleanNamed("penalty", element, parametersPassedInRequest);
final Boolean active = helper.extractBooleanNamed("active", element, parametersPassedInRequest);
return new ChargeDefinitionCommand(parametersPassedInRequest, makerCheckerApproval, chargeDefinitionId, name, amount, currencyCode,
chargeTimeType, chargeAppliesTo, chargeCalculationType, penalty, active);
}
@Override
public ClientCommand deserializeClientCommand(final Long clientId, final String commandAsJson, final boolean makerCheckerApproval) {
if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); }
final JsonParserHelper helper = new JsonParserHelper();
final JsonElement element = parser.parse(commandAsJson);
final Set<String> parametersPassedInRequest = new HashSet<String>();
final Long officeId = helper.extractLongNamed("officeId", element, parametersPassedInRequest);
final String externalId = helper.extractStringNamed("externalId", element, parametersPassedInRequest);
final String firstname = helper.extractStringNamed("firstname", element, parametersPassedInRequest);
final String lastname = helper.extractStringNamed("lastname", element, parametersPassedInRequest);
final String clientOrBusinessName = helper.extractStringNamed("clientOrBusinessName", element, parametersPassedInRequest);
final LocalDate joiningDate = helper.extractLocalDateAsArrayNamed("joiningDate", element, parametersPassedInRequest);
return new ClientCommand(parametersPassedInRequest, clientId, externalId, firstname, lastname, clientOrBusinessName, officeId,
joiningDate, makerCheckerApproval);
}
@Override
public LoanProductCommand deserializeLoanProductCommand(final Long loanProductId, final String commandAsJson,
final boolean makerCheckerApproval) {
if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); }
final JsonParserHelper helper = new JsonParserHelper();
final JsonElement element = parser.parse(commandAsJson);
final Set<String> parametersPassedInRequest = new HashSet<String>();
final String name = helper.extractStringNamed("name", element, parametersPassedInRequest);
final String description = helper.extractStringNamed("description", element, parametersPassedInRequest);
final Long fundId = helper.extractLongNamed("fundId", element, parametersPassedInRequest);
final Long transactionProcessingStrategyId = helper.extractLongNamed("transactionProcessingStrategyId", element,
parametersPassedInRequest);
final String currencyCode = helper.extractStringNamed("currencyCode", element, parametersPassedInRequest);
final Integer digitsAfterDecimal = helper.extractIntegerNamed("digitsAfterDecimal", element, Locale.US, parametersPassedInRequest);
final BigDecimal principal = helper.extractBigDecimalNamed("principal", element.getAsJsonObject(), Locale.US,
parametersPassedInRequest);
final BigDecimal inArrearsTolerance = helper.extractBigDecimalNamed("inArrearsTolerance", element.getAsJsonObject(), Locale.US,
parametersPassedInRequest);
final BigDecimal interestRatePerPeriod = helper.extractBigDecimalNamed("interestRatePerPeriod", element.getAsJsonObject(),
Locale.US, parametersPassedInRequest);
final Integer repaymentEvery = helper.extractIntegerNamed("repaymentEvery", element, Locale.US, parametersPassedInRequest);
final Integer numberOfRepayments = helper.extractIntegerNamed("numberOfRepayments", element, Locale.US, parametersPassedInRequest);
final Integer repaymentFrequencyType = helper.extractIntegerNamed("repaymentFrequencyType", element, Locale.US,
parametersPassedInRequest);
final Integer interestRateFrequencyType = helper.extractIntegerNamed("interestRateFrequencyType", element, Locale.US,
parametersPassedInRequest);
final Integer amortizationType = helper.extractIntegerNamed("amortizationType", element, Locale.US, parametersPassedInRequest);
final Integer interestType = helper.extractIntegerNamed("interestType", element, Locale.US, parametersPassedInRequest);
final Integer interestCalculationPeriodType = helper.extractIntegerNamed("interestCalculationPeriodType", element, Locale.US,
parametersPassedInRequest);
String[] charges = null;
if (element.isJsonObject()) {
JsonObject object = element.getAsJsonObject();
if (object.has("charges")) {
parametersPassedInRequest.add("charges");
JsonArray array = object.get("charges").getAsJsonArray();
charges = new String[array.size()];
for (int i = 0; i < array.size(); i++) {
charges[i] = array.get(i).getAsString();
}
}
}
return new LoanProductCommand(parametersPassedInRequest, makerCheckerApproval, loanProductId, name, description, fundId,
transactionProcessingStrategyId, currencyCode, digitsAfterDecimal, principal, inArrearsTolerance, numberOfRepayments,
repaymentEvery, interestRatePerPeriod, repaymentFrequencyType, interestRateFrequencyType, amortizationType, interestType,
interestCalculationPeriodType, charges);
}
@Override
public ClientIdentifierCommand deserializeClientIdentifierCommand(final Long clientIdentifierId, final Long clientId,
final String commandAsJson, final boolean makerCheckerApproval) {
if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); }
final JsonParserHelper helper = new JsonParserHelper();
final JsonElement element = parser.parse(commandAsJson);
final Set<String> parametersPassedInRequest = new HashSet<String>();
Long actualClientId = clientId;
final Long clientIdInternal = helper.extractLongNamed("clientId", element, parametersPassedInRequest);
if (clientIdInternal != null) {
actualClientId = clientIdInternal;
}
final Long documentTypeId = helper.extractLongNamed("documentTypeId", element, parametersPassedInRequest);
final String documentKey = helper.extractStringNamed("documentKey", element, parametersPassedInRequest);
final String documentDescription = helper.extractStringNamed("documentDescription", element, parametersPassedInRequest);
return new ClientIdentifierCommand(parametersPassedInRequest, makerCheckerApproval, clientIdentifierId, actualClientId,
documentTypeId, documentKey, documentDescription);
}
}
@@ -1,28 +0,0 @@
package org.mifosplatform.infrastructure.core.api;
import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand;
import org.mifosplatform.portfolio.client.command.ClientCommand;
import org.mifosplatform.portfolio.client.command.ClientIdentifierCommand;
import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand;
/**
* Service for de-serializing JSON for a command into the platforms internal
* Java object representation of the command.
*
* <p>
* Known implementations:
* </p>
*
* @see PortfolioCommandDeerializerServiceGoogleGson
*/
public interface PortfolioCommandDeserializerService {
ChargeDefinitionCommand deserializeChargeDefinitionCommand(Long chargeDefinitionId, String commandAsJson, boolean makerCheckerApproval);
ClientCommand deserializeClientCommand(Long clientId, String commandAsJson, boolean makerCheckerApproval);
LoanProductCommand deserializeLoanProductCommand(Long loanProductId, String commandAsJson, boolean makerCheckerApproval);
ClientIdentifierCommand deserializeClientIdentifierCommand(Long clientIdentifierId, Long clientId, String commandAsJson,
boolean makerCheckerApproval);
}
@@ -93,4 +93,14 @@ public class FromJsonHelper {
final Set<String> parametersPassedInRequest) { final Set<String> parametersPassedInRequest) {
return helperDelegator.extractBigDecimalNamed(parameterName, element.getAsJsonObject(), Locale.US, parametersPassedInRequest); return helperDelegator.extractBigDecimalNamed(parameterName, element.getAsJsonObject(), Locale.US, parametersPassedInRequest);
} }
public Integer extractIntegerWithLocaleNamed(final String parameterName, final JsonElement element,
final Set<String> parametersPassedInRequest) {
return helperDelegator.extractIntegerWithLocaleNamed(parameterName, element.getAsJsonObject(), parametersPassedInRequest);
}
public Integer extractIntegerNamed(final String parameterName, final JsonElement element,
final Set<String> parametersPassedInRequest) {
return helperDelegator.extractIntegerNamed(parameterName, element.getAsJsonObject(), Locale.US, parametersPassedInRequest);
}
} }
@@ -20,14 +20,12 @@ import javax.ws.rs.core.UriInfo;
import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService; import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService;
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper; import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
import org.mifosplatform.infrastructure.core.api.PortfolioApiDataConversionService;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier; import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.mifosplatform.infrastructure.core.serialization.CommandSerializer;
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand;
import org.mifosplatform.portfolio.charge.data.ChargeData; import org.mifosplatform.portfolio.charge.data.ChargeData;
import org.mifosplatform.portfolio.charge.serialization.ChargeDefinitionCommandFromApiJsonDeserializer;
import org.mifosplatform.portfolio.charge.service.ChargeReadPlatformService; import org.mifosplatform.portfolio.charge.service.ChargeReadPlatformService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
@@ -38,8 +36,8 @@ import org.springframework.stereotype.Component;
@Scope("singleton") @Scope("singleton")
public class ChargesApiResource { public class ChargesApiResource {
private final Set<String> CHARGES_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("id", "name", "amount", "currency", private final Set<String> CHARGES_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("id", "name", "amount", "currency", "penalty",
"penalty", "active", "chargeAppliesTo", "chargeTimeType", "chargeCalculationType", "chargeCalculationTypeOptions", "active", "chargeAppliesTo", "chargeTimeType", "chargeCalculationType", "chargeCalculationTypeOptions",
"chargeAppliesToOptions", "chargeTimeTypeOptions", "currencyOptions")); "chargeAppliesToOptions", "chargeTimeTypeOptions", "currencyOptions"));
private final String resourceNameForPermissions = "CHARGE"; private final String resourceNameForPermissions = "CHARGE";
@@ -48,25 +46,19 @@ public class ChargesApiResource {
private final ChargeReadPlatformService readPlatformService; private final ChargeReadPlatformService readPlatformService;
private final DefaultToApiJsonSerializer<ChargeData> toApiJsonSerializer; private final DefaultToApiJsonSerializer<ChargeData> toApiJsonSerializer;
private final ApiRequestParameterHelper apiRequestParameterHelper; private final ApiRequestParameterHelper apiRequestParameterHelper;
private final ChargeDefinitionCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final PortfolioApiDataConversionService apiDataConversionService;
private final CommandSerializer commandSerializerService;
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
@Autowired @Autowired
public ChargesApiResource(final PlatformSecurityContext context, public ChargesApiResource(final PlatformSecurityContext context, final ChargeReadPlatformService readPlatformService,
final ChargeReadPlatformService readPlatformService, final ChargeDefinitionCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final DefaultToApiJsonSerializer<ChargeData> toApiJsonSerializer, final DefaultToApiJsonSerializer<ChargeData> toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper,
final ApiRequestParameterHelper apiRequestParameterHelper,
final PortfolioApiDataConversionService apiDataConversionService,
final CommandSerializer commandSerializerService,
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
this.context = context; this.context = context;
this.readPlatformService = readPlatformService; this.readPlatformService = readPlatformService;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.toApiJsonSerializer = toApiJsonSerializer; this.toApiJsonSerializer = toApiJsonSerializer;
this.apiRequestParameterHelper = apiRequestParameterHelper; this.apiRequestParameterHelper = apiRequestParameterHelper;
this.apiDataConversionService = apiDataConversionService;
this.commandSerializerService = commandSerializerService;
this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
} }
@@ -124,10 +116,10 @@ public class ChargesApiResource {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", "CREATE_CHARGE"); final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", "CREATE_CHARGE");
context.authenticatedUser().validateHasPermissionTo("CREATE_CHARGE", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("CREATE_CHARGE", allowedPermissions);
final ChargeDefinitionCommand command = this.apiDataConversionService.convertApiRequestJsonToChargeDefinitionCommand(null, apiRequestBodyAsJson); final String commandSerializedAsJson = this.fromApiJsonDeserializer.serializedCommandJsonFromApiJson(apiRequestBodyAsJson);
final String commandSerializedAsJson = this.commandSerializerService.serializeCommandToJson(command);
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("CREATE", "charges", null, commandSerializedAsJson); final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("CREATE", "charges", null,
commandSerializedAsJson);
return this.toApiJsonSerializer.serialize(result); return this.toApiJsonSerializer.serialize(result);
} }
@@ -141,10 +133,11 @@ public class ChargesApiResource {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", "UPDATE_CHARGE"); final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "ORGANISATION_ADMINISTRATION_SUPER_USER", "UPDATE_CHARGE");
context.authenticatedUser().validateHasPermissionTo("UPDATE_CHARGE", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("UPDATE_CHARGE", allowedPermissions);
final ChargeDefinitionCommand command = this.apiDataConversionService.convertApiRequestJsonToChargeDefinitionCommand(chargeId, apiRequestBodyAsJson); final String commandSerializedAsJson = this.fromApiJsonDeserializer
final String commandSerializedAsJson = this.commandSerializerService.serializeCommandToJson(command); .serializedCommandJsonFromApiJson(chargeId, apiRequestBodyAsJson);
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", "charges", chargeId, commandSerializedAsJson); final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", "charges", chargeId,
commandSerializedAsJson);
return this.toApiJsonSerializer.serialize(result); return this.toApiJsonSerializer.serialize(result);
} }
@@ -17,30 +17,19 @@ public class ChargeDefinitionCommand {
private final String name; private final String name;
private final BigDecimal amount; private final BigDecimal amount;
private final String currencyCode; private final String currencyCode;
private final Integer chargeTimeType; private final Integer chargeTimeType;
private final Integer chargeAppliesTo; private final Integer chargeAppliesTo;
private final Integer chargeCalculationType; private final Integer chargeCalculationType;
private final Boolean penalty;
private final Boolean active;
private final boolean penalty; private final transient Set<String> parametersPassedInRequest;
private final boolean active;
private final transient Set<String> modifiedParameters;
private final transient boolean makerCheckerApproval; private final transient boolean makerCheckerApproval;
private final transient Long id; private final transient Long id;
public ChargeDefinitionCommand( public ChargeDefinitionCommand(final Set<String> parametersPassedInRequest, final boolean makerCheckerApproval, final Long id,
final Set<String> modifiedParameters, final String name, final BigDecimal amount, final String currencyCode, final Integer chargeTimeType,
final boolean makerCheckerApproval, final Integer chargeAppliesTo, final Integer chargeCalculationType, final Boolean penalty, final Boolean active) {
final Long id,
final String name,
final BigDecimal amount,
final String currencyCode,
final Integer chargeTimeType,
final Integer chargeAppliesTo,
final Integer chargeCalculationType,
final boolean penalty,
final boolean active) {
this.makerCheckerApproval = makerCheckerApproval; this.makerCheckerApproval = makerCheckerApproval;
this.id = id; this.id = id;
this.name = name; this.name = name;
@@ -49,7 +38,7 @@ public class ChargeDefinitionCommand {
this.chargeTimeType = chargeTimeType; this.chargeTimeType = chargeTimeType;
this.chargeAppliesTo = chargeAppliesTo; this.chargeAppliesTo = chargeAppliesTo;
this.chargeCalculationType = chargeCalculationType; this.chargeCalculationType = chargeCalculationType;
this.modifiedParameters = modifiedParameters; this.parametersPassedInRequest = parametersPassedInRequest;
this.penalty = penalty; this.penalty = penalty;
this.active = active; this.active = active;
} }
@@ -67,7 +56,7 @@ public class ChargeDefinitionCommand {
} }
public Set<String> getModifiedParameters() { public Set<String> getModifiedParameters() {
return modifiedParameters; return parametersPassedInRequest;
} }
public String getCurrencyCode() { public String getCurrencyCode() {
@@ -87,47 +76,47 @@ public class ChargeDefinitionCommand {
} }
public boolean isPenalty() { public boolean isPenalty() {
return penalty; return penalty;
} }
public boolean isFee() { public boolean isFee() {
return !penalty; return !penalty;
} }
public boolean isActive() { public boolean isActive() {
return active; return active;
} }
public boolean isNameChanged(){ public boolean isNameChanged() {
return this.modifiedParameters.contains("name"); return this.parametersPassedInRequest.contains("name");
} }
public boolean isAmountChanged(){ public boolean isAmountChanged() {
return this.modifiedParameters.contains("amount"); return this.parametersPassedInRequest.contains("amount");
} }
public boolean isCurrencyCodeChanged(){ public boolean isCurrencyCodeChanged() {
return this.modifiedParameters.contains("currencyCode"); return this.parametersPassedInRequest.contains("currencyCode");
} }
public boolean isChargeTimeTypeChanged(){ public boolean isChargeTimeTypeChanged() {
return this.modifiedParameters.contains("chargeTimeType"); return this.parametersPassedInRequest.contains("chargeTimeType");
} }
public boolean isChargeAppliesToChanged(){ public boolean isChargeAppliesToChanged() {
return this.modifiedParameters.contains("chargeAppliesTo"); return this.parametersPassedInRequest.contains("chargeAppliesTo");
} }
public boolean isChargeCalculationTypeChanged(){ public boolean isChargeCalculationTypeChanged() {
return this.modifiedParameters.contains("chargeCalculationType"); return this.parametersPassedInRequest.contains("chargeCalculationType");
} }
public boolean isPenaltyChanged(){ public boolean isPenaltyChanged() {
return this.modifiedParameters.contains("penalty"); return this.parametersPassedInRequest.contains("penalty");
} }
public boolean isActiveChanged(){ public boolean isActiveChanged() {
return this.modifiedParameters.contains("active"); return this.parametersPassedInRequest.contains("active");
} }
public boolean isApprovedByChecker() { public boolean isApprovedByChecker() {
@@ -147,12 +136,11 @@ public class ChargeDefinitionCommand {
baseDataValidator.reset().parameter("chargeCalculationType").value(this.chargeCalculationType).notNull().inMinMaxRange(1, 4); baseDataValidator.reset().parameter("chargeCalculationType").value(this.chargeCalculationType).notNull().inMinMaxRange(1, 4);
if (this.penalty && this.chargeTimeType.equals(Integer.valueOf(1))) { if (this.penalty && this.chargeTimeType.equals(Integer.valueOf(1))) {
// FIXME - KW - cannot have penalty charge at time of disbursement // FIXME - KW - cannot have penalty charge at time of disbursement
} }
if (!dataValidationErrors.isEmpty()) { if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist",
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); "Validation errors exist.", dataValidationErrors); }
}
} }
public void validateForUpdate() { public void validateForUpdate() {
@@ -166,10 +154,10 @@ public class ChargeDefinitionCommand {
baseDataValidator.reset().parameter("currencyCode").value(this.currencyCode).ignoreIfNull().notBlank(); baseDataValidator.reset().parameter("currencyCode").value(this.currencyCode).ignoreIfNull().notBlank();
baseDataValidator.reset().parameter("chargeAppliesTo").value(this.chargeAppliesTo).ignoreIfNull().notNull().inMinMaxRange(1, 1); baseDataValidator.reset().parameter("chargeAppliesTo").value(this.chargeAppliesTo).ignoreIfNull().notNull().inMinMaxRange(1, 1);
baseDataValidator.reset().parameter("chargeTimeType").value(this.chargeTimeType).ignoreIfNull().notNull().inMinMaxRange(1, 2); baseDataValidator.reset().parameter("chargeTimeType").value(this.chargeTimeType).ignoreIfNull().notNull().inMinMaxRange(1, 2);
baseDataValidator.reset().parameter("chargeCalculationType").value(this.chargeCalculationType).ignoreIfNull().notNull().inMinMaxRange(1, 4); baseDataValidator.reset().parameter("chargeCalculationType").value(this.chargeCalculationType).ignoreIfNull().notNull()
.inMinMaxRange(1, 4);
if (!dataValidationErrors.isEmpty()) { if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist",
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); "Validation errors exist.", dataValidationErrors); }
}
} }
} }
@@ -0,0 +1,59 @@
package org.mifosplatform.portfolio.charge.serialization;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
import org.mifosplatform.infrastructure.core.serialization.FromCommandJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.JsonElement;
@Component
public final class ChargeCommandFromCommandJsonDeserializer implements FromCommandJsonDeserializer<ChargeDefinitionCommand> {
private final FromJsonHelper fromJsonHelper;
@Autowired
public ChargeCommandFromCommandJsonDeserializer(final FromJsonHelper fromApiJsonHelper) {
this.fromJsonHelper = fromApiJsonHelper;
}
@Override
public ChargeDefinitionCommand commandFromCommandJson(final String commandAsJson) {
return commandFromCommandJson(null, commandAsJson);
}
@Override
public ChargeDefinitionCommand commandFromCommandJson(final Long chargeDefinitionId, final String commandAsJson) {
return commandFromCommandJson(chargeDefinitionId, commandAsJson, false);
}
@Override
public ChargeDefinitionCommand commandFromCommandJson(final Long chargeDefinitionId, final String commandAsJson,
final boolean makerCheckerApproval) {
if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); }
final Set<String> parametersPassedInRequest = new HashSet<String>();
final JsonElement element = fromJsonHelper.parse(commandAsJson);
final String name = fromJsonHelper.extractStringNamed("name", element, parametersPassedInRequest);
final String currencyCode = fromJsonHelper.extractStringNamed("currencyCode", element, parametersPassedInRequest);
final BigDecimal amount = fromJsonHelper.extractBigDecimalNamed("amount", element.getAsJsonObject(), parametersPassedInRequest);
final Integer chargeTimeType = fromJsonHelper.extractIntegerNamed("chargeTimeType", element, parametersPassedInRequest);
final Integer chargeAppliesTo = fromJsonHelper.extractIntegerNamed("chargeAppliesTo", element, parametersPassedInRequest);
final Integer chargeCalculationType = fromJsonHelper.extractIntegerNamed("chargeCalculationType", element,
parametersPassedInRequest);
final Boolean penalty = fromJsonHelper.extractBooleanNamed("penalty", element, parametersPassedInRequest);
final Boolean active = fromJsonHelper.extractBooleanNamed("active", element, parametersPassedInRequest);
return new ChargeDefinitionCommand(parametersPassedInRequest, makerCheckerApproval, chargeDefinitionId, name, amount, currencyCode,
chargeTimeType, chargeAppliesTo, chargeCalculationType, penalty, active);
}
}
@@ -0,0 +1,90 @@
package org.mifosplatform.portfolio.charge.serialization;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.mifosplatform.infrastructure.core.serialization.CommandSerializer;
import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.portfolio.charge.command.ChargeDefinitionCommand;
import org.mifosplatform.portfolio.fund.command.FundCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;
/**
* Implementation of {@link FromApiJsonDeserializer} for {@link FundCommand}'s.
*/
@Component
public final class ChargeDefinitionCommandFromApiJsonDeserializer implements FromApiJsonDeserializer<ChargeDefinitionCommand> {
/**
* The parameters supported for this command.
*/
private final Set<String> supportedParameters = new HashSet<String>(Arrays.asList("name", "amount", "locale", "currencyCode",
"currencyOptions", "chargeAppliesTo", "chargeTimeType", "chargeCalculationType", "chargeCalculationTypeOptions", "penalty",
"active"));
private final FromJsonHelper fromApiJsonHelper;
private final CommandSerializer commandSerializerService;
@Autowired
public ChargeDefinitionCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper,
final CommandSerializer commandSerializerService) {
this.fromApiJsonHelper = fromApiJsonHelper;
this.commandSerializerService = commandSerializerService;
}
@Override
public ChargeDefinitionCommand commandFromApiJson(final String json) {
return commandFromApiJson(null, json);
}
@Override
public ChargeDefinitionCommand commandFromApiJson(final Long chargeId, final String json) {
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters);
final Set<String> parametersPassedInRequest = new HashSet<String>();
final JsonElement element = fromApiJsonHelper.parse(json);
final String name = fromApiJsonHelper.extractStringNamed("name", element, parametersPassedInRequest);
final String currencyCode = fromApiJsonHelper.extractStringNamed("currencyCode", element, parametersPassedInRequest);
final BigDecimal amount = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("amount", element.getAsJsonObject(),
parametersPassedInRequest);
final Integer chargeTimeType = fromApiJsonHelper
.extractIntegerWithLocaleNamed("chargeTimeType", element, parametersPassedInRequest);
final Integer chargeAppliesTo = fromApiJsonHelper.extractIntegerWithLocaleNamed("chargeAppliesTo", element,
parametersPassedInRequest);
final Integer chargeCalculationType = fromApiJsonHelper.extractIntegerWithLocaleNamed("chargeCalculationType", element,
parametersPassedInRequest);
final Boolean penalty = fromApiJsonHelper.extractBooleanNamed("penalty", element, parametersPassedInRequest);
final Boolean active = fromApiJsonHelper.extractBooleanNamed("active", element, parametersPassedInRequest);
return new ChargeDefinitionCommand(parametersPassedInRequest, false, chargeId, name, amount, currencyCode, chargeTimeType,
chargeAppliesTo, chargeCalculationType, penalty, active);
}
@Override
public String serializedCommandJsonFromApiJson(final String json) {
final ChargeDefinitionCommand command = commandFromApiJson(json);
return this.commandSerializerService.serializeCommandToJson(command);
}
@Override
public String serializedCommandJsonFromApiJson(final Long roleId, final String json) {
final ChargeDefinitionCommand command = commandFromApiJson(roleId, json);
return this.commandSerializerService.serializeCommandToJson(command);
}
}
@@ -22,16 +22,14 @@ import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformSer
import org.mifosplatform.infrastructure.codes.data.CodeValueData; import org.mifosplatform.infrastructure.codes.data.CodeValueData;
import org.mifosplatform.infrastructure.codes.service.CodeValueReadPlatformService; import org.mifosplatform.infrastructure.codes.service.CodeValueReadPlatformService;
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper; import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
import org.mifosplatform.infrastructure.core.api.PortfolioApiDataConversionService;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier; import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.mifosplatform.infrastructure.core.serialization.CommandSerializer;
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.client.command.ClientIdentifierCommand;
import org.mifosplatform.portfolio.client.data.ClientData; import org.mifosplatform.portfolio.client.data.ClientData;
import org.mifosplatform.portfolio.client.data.ClientIdentifierData; import org.mifosplatform.portfolio.client.data.ClientIdentifierData;
import org.mifosplatform.portfolio.client.exception.DuplicateClientIdentifierException; import org.mifosplatform.portfolio.client.exception.DuplicateClientIdentifierException;
import org.mifosplatform.portfolio.client.serialization.ClientIdentifierCommandFromApiJsonDeserializer;
import org.mifosplatform.portfolio.client.service.ClientReadPlatformService; import org.mifosplatform.portfolio.client.service.ClientReadPlatformService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
@@ -50,26 +48,24 @@ public class ClientIdentifiersApiResource {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final ClientReadPlatformService clientReadPlatformService; private final ClientReadPlatformService clientReadPlatformService;
private final CodeValueReadPlatformService codeValueReadPlatformService; private final CodeValueReadPlatformService codeValueReadPlatformService;
private final ClientIdentifierCommandFromApiJsonDeserializer commandFromApiJsonDeserializer;
private final DefaultToApiJsonSerializer<ClientIdentifierData> toApiJsonSerializer; private final DefaultToApiJsonSerializer<ClientIdentifierData> toApiJsonSerializer;
private final ApiRequestParameterHelper apiRequestParameterHelper; private final ApiRequestParameterHelper apiRequestParameterHelper;
private final PortfolioApiDataConversionService apiDataConversionService;
private final CommandSerializer commandSerializerService;
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
@Autowired @Autowired
public ClientIdentifiersApiResource(final PlatformSecurityContext context, final ClientReadPlatformService readPlatformService, public ClientIdentifiersApiResource(final PlatformSecurityContext context, final ClientReadPlatformService readPlatformService,
final CodeValueReadPlatformService codeValueReadPlatformService, final CodeValueReadPlatformService codeValueReadPlatformService,
final ClientIdentifierCommandFromApiJsonDeserializer commandFromApiJsonDeserializer,
final DefaultToApiJsonSerializer<ClientIdentifierData> toApiJsonSerializer, final DefaultToApiJsonSerializer<ClientIdentifierData> toApiJsonSerializer,
final ApiRequestParameterHelper apiRequestParameterHelper, final PortfolioApiDataConversionService apiDataConversionService, final ApiRequestParameterHelper apiRequestParameterHelper,
final CommandSerializer commandSerializerService,
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
this.context = context; this.context = context;
this.clientReadPlatformService = readPlatformService; this.clientReadPlatformService = readPlatformService;
this.codeValueReadPlatformService = codeValueReadPlatformService; this.codeValueReadPlatformService = codeValueReadPlatformService;
this.commandFromApiJsonDeserializer = commandFromApiJsonDeserializer;
this.toApiJsonSerializer = toApiJsonSerializer; this.toApiJsonSerializer = toApiJsonSerializer;
this.apiRequestParameterHelper = apiRequestParameterHelper; this.apiRequestParameterHelper = apiRequestParameterHelper;
this.apiDataConversionService = apiDataConversionService;
this.commandSerializerService = commandSerializerService;
this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
} }
@@ -111,9 +107,8 @@ public class ClientIdentifiersApiResource {
"CREATE_CLIENTIDENTIFIER"); "CREATE_CLIENTIDENTIFIER");
context.authenticatedUser().validateHasPermissionTo("CREATE_CLIENTIDENTIFIER", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("CREATE_CLIENTIDENTIFIER", allowedPermissions);
final ClientIdentifierCommand command = this.apiDataConversionService.convertApiRequestJsonToClientIdentifierCommand(null, final String commandSerializedAsJson = this.commandFromApiJsonDeserializer.serializedCommandJsonFromApiJsonWithSubResource(
clientId, apiRequestBodyAsJson); apiRequestBodyAsJson, clientId);
final String commandSerializedAsJson = this.commandSerializerService.serializeCommandToJson(command);
final String resourceUrl = "clients/" + clientId + "/identifiers"; final String resourceUrl = "clients/" + clientId + "/identifiers";
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("CREATE", resourceUrl, null, final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("CREATE", resourceUrl, null,
@@ -165,9 +160,8 @@ public class ClientIdentifiersApiResource {
"UPDATE_CLIENTIDENTIFIER"); "UPDATE_CLIENTIDENTIFIER");
context.authenticatedUser().validateHasPermissionTo("UPDATE_CLIENTIDENTIFIER", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("UPDATE_CLIENTIDENTIFIER", allowedPermissions);
final ClientIdentifierCommand command = this.apiDataConversionService.convertApiRequestJsonToClientIdentifierCommand( final String commandSerializedAsJson = this.commandFromApiJsonDeserializer.serializedCommandJsonFromApiJsonWithSubResource(
clientIdentifierId, clientId, apiRequestBodyAsJson); clientIdentifierId, apiRequestBodyAsJson, clientId);
final String commandSerializedAsJson = this.commandSerializerService.serializeCommandToJson(command);
final String resourceUrl = "clients/" + clientId + "/identifiers"; final String resourceUrl = "clients/" + clientId + "/identifiers";
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", resourceUrl, final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", resourceUrl,
@@ -34,18 +34,17 @@ import org.mifosplatform.infrastructure.core.api.PortfolioApiJsonSerializerServi
import org.mifosplatform.infrastructure.core.data.EntityIdentifier; import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.infrastructure.core.domain.Base64EncodedImage; import org.mifosplatform.infrastructure.core.domain.Base64EncodedImage;
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.mifosplatform.infrastructure.core.serialization.CommandSerializer;
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.mifosplatform.infrastructure.core.service.FileUtils; import org.mifosplatform.infrastructure.core.service.FileUtils;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.organisation.office.data.OfficeLookup; import org.mifosplatform.organisation.office.data.OfficeLookup;
import org.mifosplatform.organisation.office.service.OfficeReadPlatformService; import org.mifosplatform.organisation.office.service.OfficeReadPlatformService;
import org.mifosplatform.portfolio.client.command.ClientCommand;
import org.mifosplatform.portfolio.client.command.NoteCommand; import org.mifosplatform.portfolio.client.command.NoteCommand;
import org.mifosplatform.portfolio.client.data.ClientAccountSummaryCollectionData; import org.mifosplatform.portfolio.client.data.ClientAccountSummaryCollectionData;
import org.mifosplatform.portfolio.client.data.ClientData; import org.mifosplatform.portfolio.client.data.ClientData;
import org.mifosplatform.portfolio.client.data.NoteData; import org.mifosplatform.portfolio.client.data.NoteData;
import org.mifosplatform.portfolio.client.exception.ImageNotFoundException; import org.mifosplatform.portfolio.client.exception.ImageNotFoundException;
import org.mifosplatform.portfolio.client.serialization.ClientCommandFromApiJsonDeserializer;
import org.mifosplatform.portfolio.client.service.ClientReadPlatformService; import org.mifosplatform.portfolio.client.service.ClientReadPlatformService;
import org.mifosplatform.portfolio.client.service.ClientWritePlatformService; import org.mifosplatform.portfolio.client.service.ClientWritePlatformService;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -73,10 +72,10 @@ public class ClientsApiResource {
private final ClientReadPlatformService clientReadPlatformService; private final ClientReadPlatformService clientReadPlatformService;
private final ClientWritePlatformService clientWritePlatformService; private final ClientWritePlatformService clientWritePlatformService;
private final OfficeReadPlatformService officeReadPlatformService; private final OfficeReadPlatformService officeReadPlatformService;
private final ClientCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final DefaultToApiJsonSerializer<ClientData> toApiJsonSerializer; private final DefaultToApiJsonSerializer<ClientData> toApiJsonSerializer;
private final ApiRequestParameterHelper apiRequestParameterHelper; private final ApiRequestParameterHelper apiRequestParameterHelper;
private final PortfolioApiDataConversionService apiDataConversionService; private final PortfolioApiDataConversionService apiDataConversionService;
private final CommandSerializer commandSerializerService;
private final PortfolioApiJsonSerializerService apiJsonSerializerService; private final PortfolioApiJsonSerializerService apiJsonSerializerService;
private final PortfolioCommandsReadPlatformService commandSourceReadPlatformService; private final PortfolioCommandsReadPlatformService commandSourceReadPlatformService;
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
@@ -84,8 +83,9 @@ public class ClientsApiResource {
@Autowired @Autowired
public ClientsApiResource(final PlatformSecurityContext context, final ClientReadPlatformService readPlatformService, public ClientsApiResource(final PlatformSecurityContext context, final ClientReadPlatformService readPlatformService,
final ClientWritePlatformService clientWritePlatformService, final OfficeReadPlatformService officeReadPlatformService, final ClientWritePlatformService clientWritePlatformService, final OfficeReadPlatformService officeReadPlatformService,
final ClientCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final DefaultToApiJsonSerializer<ClientData> toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper, final DefaultToApiJsonSerializer<ClientData> toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper,
final PortfolioApiDataConversionService apiDataConversionService, final CommandSerializer commandSerializerService, final PortfolioApiDataConversionService apiDataConversionService,
final PortfolioApiJsonSerializerService apiJsonSerializerService, final PortfolioApiJsonSerializerService apiJsonSerializerService,
final PortfolioCommandsReadPlatformService commandsReadPlatformService, final PortfolioCommandsReadPlatformService commandsReadPlatformService,
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
@@ -93,10 +93,10 @@ public class ClientsApiResource {
this.clientReadPlatformService = readPlatformService; this.clientReadPlatformService = readPlatformService;
this.clientWritePlatformService = clientWritePlatformService; this.clientWritePlatformService = clientWritePlatformService;
this.officeReadPlatformService = officeReadPlatformService; this.officeReadPlatformService = officeReadPlatformService;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.toApiJsonSerializer = toApiJsonSerializer; this.toApiJsonSerializer = toApiJsonSerializer;
this.apiRequestParameterHelper = apiRequestParameterHelper; this.apiRequestParameterHelper = apiRequestParameterHelper;
this.apiDataConversionService = apiDataConversionService; this.apiDataConversionService = apiDataConversionService;
this.commandSerializerService = commandSerializerService;
this.apiJsonSerializerService = apiJsonSerializerService; this.apiJsonSerializerService = apiJsonSerializerService;
this.commandSourceReadPlatformService = commandsReadPlatformService; this.commandSourceReadPlatformService = commandsReadPlatformService;
this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
@@ -243,8 +243,7 @@ public class ClientsApiResource {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "PORTFOLIO_MANAGEMENT_SUPER_USER", "CREATE_CLIENT"); final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "PORTFOLIO_MANAGEMENT_SUPER_USER", "CREATE_CLIENT");
context.authenticatedUser().validateHasPermissionTo("CREATE_CLIENT", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("CREATE_CLIENT", allowedPermissions);
final ClientCommand command = this.apiDataConversionService.convertApiRequestJsonToClientCommand(null, apiRequestBodyAsJson); final String commandSerializedAsJson = this.fromApiJsonDeserializer.serializedCommandJsonFromApiJson(apiRequestBodyAsJson);
final String commandSerializedAsJson = this.commandSerializerService.serializeCommandToJson(command);
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("CREATE", "clients", null, final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("CREATE", "clients", null,
commandSerializedAsJson); commandSerializedAsJson);
@@ -261,8 +260,7 @@ public class ClientsApiResource {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "PORTFOLIO_MANAGEMENT_SUPER_USER", "UPDATE_CLIENT"); final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "PORTFOLIO_MANAGEMENT_SUPER_USER", "UPDATE_CLIENT");
context.authenticatedUser().validateHasPermissionTo("UPDATE_CLIENT", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("UPDATE_CLIENT", allowedPermissions);
final ClientCommand command = this.apiDataConversionService.convertApiRequestJsonToClientCommand(clientId, apiRequestBodyAsJson); final String commandSerializedAsJson = this.fromApiJsonDeserializer.serializedCommandJsonFromApiJson(clientId, apiRequestBodyAsJson);
final String commandSerializedAsJson = this.commandSerializerService.serializeCommandToJson(command);
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", "clients", clientId, final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", "clients", clientId,
commandSerializedAsJson); commandSerializedAsJson);
@@ -18,6 +18,10 @@ public class ClientIdentifierCommand {
private final transient boolean makerCheckerApproval; private final transient boolean makerCheckerApproval;
private final transient Long id; private final transient Long id;
public static ClientIdentifierCommand clientSubResource(final ClientIdentifierCommand command, final Long providedClientId) {
return new ClientIdentifierCommand(command.modifiedParameters, command.makerCheckerApproval, command.id, providedClientId, command.documentTypeId, command.documentKey, command.description);
}
public ClientIdentifierCommand(final Set<String> modifiedParameters, final boolean makerCheckerApproval, final Long id, final Long clientId, final Long documentTypeId, public ClientIdentifierCommand(final Set<String> modifiedParameters, final boolean makerCheckerApproval, final Long id, final Long clientId, final Long documentTypeId,
final String documentKey, final String description) { final String documentKey, final String description) {
this.modifiedParameters = modifiedParameters; this.modifiedParameters = modifiedParameters;
@@ -0,0 +1,80 @@
package org.mifosplatform.portfolio.client.serialization;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.core.serialization.CommandSerializer;
import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.portfolio.client.command.ClientCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;
/**
* Implementation of {@link FromApiJsonDeserializer} for {@link ClientCommand}
* 's.
*/
@Component
public final class ClientCommandFromApiJsonDeserializer implements FromApiJsonDeserializer<ClientCommand> {
/**
* The parameters supported for this command.
*/
private final Set<String> supportedParameters = new HashSet<String>(Arrays.asList("id", "externalId", "firstname", "lastname",
"clientOrBusinessName", "officeId", "joiningDate", "locale", "dateFormat"));
private final FromJsonHelper fromApiJsonHelper;
private final CommandSerializer commandSerializerService;
@Autowired
public ClientCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper, final CommandSerializer commandSerializerService) {
this.fromApiJsonHelper = fromApiJsonHelper;
this.commandSerializerService = commandSerializerService;
}
@Override
public ClientCommand commandFromApiJson(final String json) {
return commandFromApiJson(null, json);
}
@Override
public ClientCommand commandFromApiJson(final Long clientId, final String json) {
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters);
final Set<String> parametersPassedInRequest = new HashSet<String>();
final JsonElement element = fromApiJsonHelper.parse(json);
final Long officeId = fromApiJsonHelper.extractLongNamed("officeId", element, parametersPassedInRequest);
final String externalId = fromApiJsonHelper.extractStringNamed("externalId", element, parametersPassedInRequest);
final String firstname = fromApiJsonHelper.extractStringNamed("firstname", element, parametersPassedInRequest);
final String lastname = fromApiJsonHelper.extractStringNamed("lastname", element, parametersPassedInRequest);
final String clientOrBusinessName = fromApiJsonHelper
.extractStringNamed("clientOrBusinessName", element, parametersPassedInRequest);
final LocalDate joiningDate = fromApiJsonHelper.extractLocalDateNamed("joiningDate", element, parametersPassedInRequest);
return new ClientCommand(parametersPassedInRequest, clientId, externalId, firstname, lastname, clientOrBusinessName, officeId,
joiningDate, false);
}
@Override
public String serializedCommandJsonFromApiJson(final String json) {
final ClientCommand command = commandFromApiJson(json);
return this.commandSerializerService.serializeCommandToJson(command);
}
@Override
public String serializedCommandJsonFromApiJson(final Long fundId, final String json) {
final ClientCommand command = commandFromApiJson(fundId, json);
return this.commandSerializerService.serializeCommandToJson(command);
}
}
@@ -0,0 +1,54 @@
package org.mifosplatform.portfolio.client.serialization;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
import org.mifosplatform.infrastructure.core.serialization.FromCommandJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.portfolio.client.command.ClientCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.JsonElement;
@Component
public final class ClientCommandFromCommandJsonDeserializer implements FromCommandJsonDeserializer<ClientCommand> {
private final FromJsonHelper fromJsonHelper;
@Autowired
public ClientCommandFromCommandJsonDeserializer(final FromJsonHelper fromApiJsonHelper) {
this.fromJsonHelper = fromApiJsonHelper;
}
@Override
public ClientCommand commandFromCommandJson(final String commandAsJson) {
return commandFromCommandJson(null, commandAsJson);
}
@Override
public ClientCommand commandFromCommandJson(final Long clientId, final String commandAsJson) {
return commandFromCommandJson(clientId, commandAsJson, false);
}
@Override
public ClientCommand commandFromCommandJson(final Long clientId, final String commandAsJson, final boolean makerCheckerApproval) {
if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); }
final Set<String> parametersPassedInRequest = new HashSet<String>();
final JsonElement element = fromJsonHelper.parse(commandAsJson);
final Long officeId = fromJsonHelper.extractLongNamed("officeId", element, parametersPassedInRequest);
final String externalId = fromJsonHelper.extractStringNamed("externalId", element, parametersPassedInRequest);
final String firstname = fromJsonHelper.extractStringNamed("firstname", element, parametersPassedInRequest);
final String lastname = fromJsonHelper.extractStringNamed("lastname", element, parametersPassedInRequest);
final String clientOrBusinessName = fromJsonHelper.extractStringNamed("clientOrBusinessName", element, parametersPassedInRequest);
final LocalDate joiningDate = fromJsonHelper.extractLocalDateAsArrayNamed("joiningDate", element, parametersPassedInRequest);
return new ClientCommand(parametersPassedInRequest, clientId, externalId, firstname, lastname, clientOrBusinessName, officeId,
joiningDate, makerCheckerApproval);
}
}
@@ -0,0 +1,82 @@
package org.mifosplatform.portfolio.client.serialization;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.mifosplatform.infrastructure.core.serialization.CommandSerializer;
import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.portfolio.client.command.ClientCommand;
import org.mifosplatform.portfolio.client.command.ClientIdentifierCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.reflect.TypeToken;
/**
* Implementation of {@link FromApiJsonDeserializer} for {@link ClientCommand}
* 's.
*/
@Component
public final class ClientIdentifierCommandFromApiJsonDeserializer implements FromApiJsonDeserializer<ClientIdentifierCommand> {
/**
* The parameters supported for this command.
*/
private final Set<String> supportedParameters = new HashSet<String>(Arrays.asList("clientId", "documentTypeId", "documentKey",
"description"));
private final FromJsonHelper fromApiJsonHelper;
private final CommandSerializer commandSerializerService;
private final ClientIdentifierCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer;
@Autowired
public ClientIdentifierCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper,
final ClientIdentifierCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer,
final CommandSerializer commandSerializerService) {
this.fromApiJsonHelper = fromApiJsonHelper;
this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer;
this.commandSerializerService = commandSerializerService;
}
@Override
public ClientIdentifierCommand commandFromApiJson(final String json) {
return commandFromApiJson(null, json);
}
@Override
public ClientIdentifierCommand commandFromApiJson(final Long clientId, final String json) {
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters);
return this.commandFromCommandJsonDeserializer.commandFromCommandJson(clientId, json);
}
@Override
public String serializedCommandJsonFromApiJson(final String json) {
final ClientIdentifierCommand command = commandFromApiJson(json);
return this.commandSerializerService.serializeCommandToJson(command);
}
@Override
public String serializedCommandJsonFromApiJson(final Long clientIdentifierId, final String json) {
final ClientIdentifierCommand command = commandFromApiJson(clientIdentifierId, json);
return this.commandSerializerService.serializeCommandToJson(command);
}
public String serializedCommandJsonFromApiJsonWithSubResource(final String json, final Long clientId) {
return serializedCommandJsonFromApiJsonWithSubResource(null, json, clientId);
}
public String serializedCommandJsonFromApiJsonWithSubResource(final Long clientIdentifierId, final String json, final Long clientId) {
final ClientIdentifierCommand command = commandFromApiJson(clientIdentifierId, json);
final ClientIdentifierCommand commandWithSubResource = ClientIdentifierCommand.clientSubResource(command, clientId);
return this.commandSerializerService.serializeCommandToJson(commandWithSubResource);
}
}
@@ -0,0 +1,56 @@
package org.mifosplatform.portfolio.client.serialization;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
import org.mifosplatform.infrastructure.core.serialization.FromCommandJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.portfolio.client.command.ClientIdentifierCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.JsonElement;
@Component
public final class ClientIdentifierCommandFromCommandJsonDeserializer implements FromCommandJsonDeserializer<ClientIdentifierCommand> {
private final FromJsonHelper fromJsonHelper;
@Autowired
public ClientIdentifierCommandFromCommandJsonDeserializer(final FromJsonHelper fromApiJsonHelper) {
this.fromJsonHelper = fromApiJsonHelper;
}
@Override
public ClientIdentifierCommand commandFromCommandJson(final String commandAsJson) {
return commandFromCommandJson(null, commandAsJson);
}
@Override
public ClientIdentifierCommand commandFromCommandJson(final Long clientIdentifierId, final String commandAsJson) {
return commandFromCommandJson(clientIdentifierId, commandAsJson, false);
}
@Override
public ClientIdentifierCommand commandFromCommandJson(final Long clientIdentifierId, final String commandAsJson,
final boolean makerCheckerApproval) {
if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); }
final Set<String> parametersPassedInRequest = new HashSet<String>();
final JsonElement element = fromJsonHelper.parse(commandAsJson);
Long actualClientId = null; // FIXME - kw -clientId
final Long clientIdInternal = fromJsonHelper.extractLongNamed("clientId", element, parametersPassedInRequest);
if (clientIdInternal != null) {
actualClientId = clientIdInternal;
}
final Long documentTypeId = fromJsonHelper.extractLongNamed("documentTypeId", element, parametersPassedInRequest);
final String documentKey = fromJsonHelper.extractStringNamed("documentKey", element, parametersPassedInRequest);
final String documentDescription = fromJsonHelper.extractStringNamed("documentDescription", element, parametersPassedInRequest);
return new ClientIdentifierCommand(parametersPassedInRequest, makerCheckerApproval, clientIdentifierId, actualClientId,
documentTypeId, documentKey, documentDescription);
}
}
@@ -44,13 +44,13 @@ public final class FundCommandFromApiJsonDeserializer implements FromApiJsonDese
} }
@Override @Override
public FundCommand commandFromApiJson(final Long roleId, final String json) { public FundCommand commandFromApiJson(final Long fundId, final String json) {
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType(); final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters); fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters);
return this.fromCommandJsonDeserializer.commandFromCommandJson(roleId, json); return this.fromCommandJsonDeserializer.commandFromCommandJson(fundId, json);
} }
@Override @Override
@@ -60,8 +60,8 @@ public final class FundCommandFromApiJsonDeserializer implements FromApiJsonDese
} }
@Override @Override
public String serializedCommandJsonFromApiJson(final Long roleId, final String json) { public String serializedCommandJsonFromApiJson(final Long fundId, final String json) {
final FundCommand command = commandFromApiJson(roleId, json); final FundCommand command = commandFromApiJson(fundId, json);
return this.commandSerializerService.serializeCommandToJson(command); return this.commandSerializerService.serializeCommandToJson(command);
} }
} }
@@ -19,11 +19,9 @@ import javax.ws.rs.core.UriInfo;
import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService; import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService;
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper; import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
import org.mifosplatform.infrastructure.core.api.PortfolioApiDataConversionService;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier; import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.infrastructure.core.data.EnumOptionData;
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.mifosplatform.infrastructure.core.serialization.CommandSerializer;
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.organisation.monetary.data.CurrencyData; import org.mifosplatform.organisation.monetary.data.CurrencyData;
@@ -32,9 +30,9 @@ import org.mifosplatform.portfolio.charge.data.ChargeData;
import org.mifosplatform.portfolio.charge.service.ChargeReadPlatformService; import org.mifosplatform.portfolio.charge.service.ChargeReadPlatformService;
import org.mifosplatform.portfolio.fund.data.FundData; import org.mifosplatform.portfolio.fund.data.FundData;
import org.mifosplatform.portfolio.fund.service.FundReadPlatformService; import org.mifosplatform.portfolio.fund.service.FundReadPlatformService;
import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand;
import org.mifosplatform.portfolio.loanproduct.data.LoanProductData; import org.mifosplatform.portfolio.loanproduct.data.LoanProductData;
import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData; import org.mifosplatform.portfolio.loanproduct.data.TransactionProcessingStrategyData;
import org.mifosplatform.portfolio.loanproduct.serialization.LoanProductCommandFromApiJsonDeserializer;
import org.mifosplatform.portfolio.loanproduct.service.LoanDropdownReadPlatformService; import org.mifosplatform.portfolio.loanproduct.service.LoanDropdownReadPlatformService;
import org.mifosplatform.portfolio.loanproduct.service.LoanProductReadPlatformService; import org.mifosplatform.portfolio.loanproduct.service.LoanProductReadPlatformService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -61,20 +59,19 @@ public class LoanProductsApiResource {
private final ChargeReadPlatformService chargeReadPlatformService; private final ChargeReadPlatformService chargeReadPlatformService;
private final CurrencyReadPlatformService currencyReadPlatformService; private final CurrencyReadPlatformService currencyReadPlatformService;
private final FundReadPlatformService fundReadPlatformService; private final FundReadPlatformService fundReadPlatformService;
private final LoanProductCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final DefaultToApiJsonSerializer<LoanProductData> toApiJsonSerializer; private final DefaultToApiJsonSerializer<LoanProductData> toApiJsonSerializer;
private final ApiRequestParameterHelper apiRequestParameterHelper; private final ApiRequestParameterHelper apiRequestParameterHelper;
private final LoanDropdownReadPlatformService dropdownReadPlatformService; private final LoanDropdownReadPlatformService dropdownReadPlatformService;
private final PortfolioApiDataConversionService apiDataConversionService;
private final CommandSerializer commandSerializerService;
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
@Autowired @Autowired
public LoanProductsApiResource(final PlatformSecurityContext context, final LoanProductReadPlatformService readPlatformService, public LoanProductsApiResource(final PlatformSecurityContext context, final LoanProductReadPlatformService readPlatformService,
final ChargeReadPlatformService chargeReadPlatformService, final CurrencyReadPlatformService currencyReadPlatformService, final ChargeReadPlatformService chargeReadPlatformService, final CurrencyReadPlatformService currencyReadPlatformService,
final FundReadPlatformService fundReadPlatformService, final LoanDropdownReadPlatformService dropdownReadPlatformService, final FundReadPlatformService fundReadPlatformService, final LoanDropdownReadPlatformService dropdownReadPlatformService,
final LoanProductCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final DefaultToApiJsonSerializer<LoanProductData> toApiJsonSerializer, final DefaultToApiJsonSerializer<LoanProductData> toApiJsonSerializer,
final ApiRequestParameterHelper apiRequestParameterHelper, final PortfolioApiDataConversionService apiDataConversionService, final ApiRequestParameterHelper apiRequestParameterHelper,
final CommandSerializer commandSerializerService,
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
this.context = context; this.context = context;
this.loanProductReadPlatformService = readPlatformService; this.loanProductReadPlatformService = readPlatformService;
@@ -82,10 +79,9 @@ public class LoanProductsApiResource {
this.currencyReadPlatformService = currencyReadPlatformService; this.currencyReadPlatformService = currencyReadPlatformService;
this.fundReadPlatformService = fundReadPlatformService; this.fundReadPlatformService = fundReadPlatformService;
this.dropdownReadPlatformService = dropdownReadPlatformService; this.dropdownReadPlatformService = dropdownReadPlatformService;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.toApiJsonSerializer = toApiJsonSerializer; this.toApiJsonSerializer = toApiJsonSerializer;
this.apiRequestParameterHelper = apiRequestParameterHelper; this.apiRequestParameterHelper = apiRequestParameterHelper;
this.apiDataConversionService = apiDataConversionService;
this.commandSerializerService = commandSerializerService;
this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
} }
@@ -98,9 +94,7 @@ public class LoanProductsApiResource {
"CREATE_LOANPRODUCT"); "CREATE_LOANPRODUCT");
context.authenticatedUser().validateHasPermissionTo("CREATE_LOANPRODUCT", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("CREATE_LOANPRODUCT", allowedPermissions);
final LoanProductCommand command = this.apiDataConversionService.convertApiRequestJsonToLoanProductCommand(null, final String commandSerializedAsJson = this.fromApiJsonDeserializer.serializedCommandJsonFromApiJson(apiRequestBodyAsJson);
apiRequestBodyAsJson);
final String commandSerializedAsJson = this.commandSerializerService.serializeCommandToJson(command);
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("CREATE", "loanproducts", null, final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("CREATE", "loanproducts", null,
commandSerializedAsJson); commandSerializedAsJson);
@@ -164,11 +158,10 @@ public class LoanProductsApiResource {
"UPDATE_LOANPRODUCT"); "UPDATE_LOANPRODUCT");
context.authenticatedUser().validateHasPermissionTo("UPDATE_LOANPRODUCT", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("UPDATE_LOANPRODUCT", allowedPermissions);
final LoanProductCommand command = this.apiDataConversionService.convertApiRequestJsonToLoanProductCommand(productId, final String commandSerializedAsJson = this.fromApiJsonDeserializer.serializedCommandJsonFromApiJson(productId,
apiRequestBodyAsJson); apiRequestBodyAsJson);
final String commandSerializedAsJson = this.commandSerializerService.serializeCommandToJson(command);
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", "loanproducts", null, final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", "loanproducts", productId,
commandSerializedAsJson); commandSerializedAsJson);
return this.toApiJsonSerializer.serialize(result); return this.toApiJsonSerializer.serialize(result);
@@ -8,43 +8,35 @@ import java.util.Set;
*/ */
public class LoanProductCommand { public class LoanProductCommand {
private final String name; private final String name;
private final String description; private final String description;
private final Long fundId; private final Long fundId;
private final Long transactionProcessingStrategyId; private final Long transactionProcessingStrategyId;
private final String currencyCode; private final String currencyCode;
private final Integer digitsAfterDecimal; private final Integer digitsAfterDecimal;
private final BigDecimal principal; private final BigDecimal principal;
private final BigDecimal inArrearsTolerance; private final BigDecimal inArrearsTolerance;
private final Integer numberOfRepayments; private final Integer numberOfRepayments;
private final Integer repaymentEvery; private final Integer repaymentEvery;
private final BigDecimal interestRatePerPeriod; private final BigDecimal interestRatePerPeriod;
private final Integer repaymentFrequencyType; private final Integer repaymentFrequencyType;
private final Integer interestRateFrequencyType; private final Integer interestRateFrequencyType;
private final Integer amortizationType; private final Integer amortizationType;
private final Integer interestType; private final Integer interestType;
private final Integer interestCalculationPeriodType; private final Integer interestCalculationPeriodType;
private final String[] charges; private final String[] charges;
private final transient Set<String> modifiedParameters; private final transient Set<String> parametersPassedInRequest;
private final transient boolean makerCheckerApproval; private final transient boolean makerCheckerApproval;
private final transient Long id; private final transient Long id;
public LoanProductCommand(final Set<String> modifiedParameters, public LoanProductCommand(final Set<String> parametersPassedInRequest, final boolean makerCheckerApproval, final Long id,
final boolean makerCheckerApproval, final Long id, final String name, final String description, final String name, final String description, final Long fundId, final Long transactionProcessingStrategyId,
final Long fundId, final Long transactionProcessingStrategyId, final String currencyCode, final Integer digitsAfterDecimal, final String currencyCode, final Integer digitsAfterDecimal, final BigDecimal principal, final BigDecimal inArrearsTolerance,
final BigDecimal principal, final BigDecimal inArrearsTolerance, final Integer numberOfRepayments, final Integer numberOfRepayments, final Integer repaymentEvery, final BigDecimal interestRatePerPeriod,
final Integer repaymentEvery, final BigDecimal interestRatePerPeriod, final Integer repaymentFrequencyType, final Integer repaymentFrequencyType, final Integer interestRateFrequencyType, final Integer amortizationType,
final Integer interestRateFrequencyType, final Integer amortizationType, final Integer interestType, final Integer interestType, final Integer interestCalculationPeriodType, final String[] charges) {
final Integer interestCalculationPeriodType, final String[] charges) { this.parametersPassedInRequest = parametersPassedInRequest;
this.modifiedParameters = modifiedParameters;
this.makerCheckerApproval = makerCheckerApproval; this.makerCheckerApproval = makerCheckerApproval;
this.id = id; this.id = id;
this.name = name; this.name = name;
@@ -143,71 +135,71 @@ public class LoanProductCommand {
} }
public boolean isNameChanged() { public boolean isNameChanged() {
return this.modifiedParameters.contains("name"); return this.parametersPassedInRequest.contains("name");
} }
public boolean isDescriptionChanged() { public boolean isDescriptionChanged() {
return this.modifiedParameters.contains("description"); return this.parametersPassedInRequest.contains("description");
} }
public boolean isFundChanged() { public boolean isFundChanged() {
return this.modifiedParameters.contains("fundId"); return this.parametersPassedInRequest.contains("fundId");
} }
public boolean isTransactionProcessingStrategyChanged() { public boolean isTransactionProcessingStrategyChanged() {
return this.modifiedParameters.contains("transactionProcessingStrategyId"); return this.parametersPassedInRequest.contains("transactionProcessingStrategyId");
} }
public boolean isCurrencyCodeChanged() { public boolean isCurrencyCodeChanged() {
return this.modifiedParameters.contains("currencyCode"); return this.parametersPassedInRequest.contains("currencyCode");
} }
public boolean isDigitsAfterDecimalChanged() { public boolean isDigitsAfterDecimalChanged() {
return this.modifiedParameters.contains("digitsAfterDecimal"); return this.parametersPassedInRequest.contains("digitsAfterDecimal");
} }
public boolean isPrincipalChanged() { public boolean isPrincipalChanged() {
return this.modifiedParameters.contains("principal"); return this.parametersPassedInRequest.contains("principal");
} }
public boolean isInArrearsToleranceChanged() { public boolean isInArrearsToleranceChanged() {
return this.modifiedParameters.contains("inArrearsTolerance"); return this.parametersPassedInRequest.contains("inArrearsTolerance");
} }
public boolean isNumberOfRepaymentsChanged() { public boolean isNumberOfRepaymentsChanged() {
return this.modifiedParameters.contains("numberOfRepayments"); return this.parametersPassedInRequest.contains("numberOfRepayments");
} }
public boolean isRepaymentEveryChanged() { public boolean isRepaymentEveryChanged() {
return this.modifiedParameters.contains("repaymentEvery"); return this.parametersPassedInRequest.contains("repaymentEvery");
} }
public boolean isRepaymentFrequencyTypeChanged() { public boolean isRepaymentFrequencyTypeChanged() {
return this.modifiedParameters.contains("repaymentFrequencyType"); return this.parametersPassedInRequest.contains("repaymentFrequencyType");
} }
public boolean isAmortizationTypeChanged() { public boolean isAmortizationTypeChanged() {
return this.modifiedParameters.contains("amortizationType"); return this.parametersPassedInRequest.contains("amortizationType");
} }
public boolean isInterestTypeChanged() { public boolean isInterestTypeChanged() {
return this.modifiedParameters.contains("interestType"); return this.parametersPassedInRequest.contains("interestType");
} }
public boolean isInterestRatePerPeriodChanged() { public boolean isInterestRatePerPeriodChanged() {
return this.modifiedParameters.contains("interestRatePerPeriod"); return this.parametersPassedInRequest.contains("interestRatePerPeriod");
} }
public boolean isInterestRateFrequencyTypeChanged() { public boolean isInterestRateFrequencyTypeChanged() {
return this.modifiedParameters.contains("interestRateFrequencyType"); return this.parametersPassedInRequest.contains("interestRateFrequencyType");
} }
public boolean isInterestCalculationPeriodTypeChanged() { public boolean isInterestCalculationPeriodTypeChanged() {
return this.modifiedParameters.contains("interestCalculationPeriodType"); return this.parametersPassedInRequest.contains("interestCalculationPeriodType");
} }
public boolean isChargesChanged() { public boolean isChargesChanged() {
return this.modifiedParameters.contains("charges"); return this.parametersPassedInRequest.contains("charges");
} }
public boolean isApprovedByChecker() { public boolean isApprovedByChecker() {
@@ -0,0 +1,108 @@
package org.mifosplatform.portfolio.loanproduct.serialization;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.mifosplatform.infrastructure.core.serialization.CommandSerializer;
import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;
/**
* Implementation of {@link FromApiJsonDeserializer} for
* {@link LoanProductCommand}'s.
*/
@Component
public final class LoanProductCommandFromApiJsonDeserializer implements FromApiJsonDeserializer<LoanProductCommand> {
/**
* The parameters supported for this command.
*/
private final Set<String> supportedParameters = new HashSet<String>(Arrays.asList("name", "description", "fundId",
"transactionProcessingStrategyId", "currencyCode", "digitsAfterDecimal", "principal", "inArrearsTolerance",
"interestRatePerPeriod", "repaymentEvery", "numberOfRepayments", "repaymentFrequencyType", "interestRateFrequencyType",
"amortizationType", "interestType", "interestCalculationPeriodType", "charges", "locale"));
private final FromJsonHelper fromApiJsonHelper;
private final CommandSerializer commandSerializerService;
@Autowired
public LoanProductCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper,
final CommandSerializer commandSerializerService) {
this.fromApiJsonHelper = fromApiJsonHelper;
this.commandSerializerService = commandSerializerService;
}
@Override
public LoanProductCommand commandFromApiJson(final String json) {
return commandFromApiJson(null, json);
}
@Override
public LoanProductCommand commandFromApiJson(final Long loanProductId, final String json) {
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters);
final Set<String> parametersPassedInRequest = new HashSet<String>();
final JsonElement element = fromApiJsonHelper.parse(json);
final String name = fromApiJsonHelper.extractStringNamed("name", element, parametersPassedInRequest);
final String description = fromApiJsonHelper.extractStringNamed("description", element, parametersPassedInRequest);
final Long fundId = fromApiJsonHelper.extractLongNamed("fundId", element, parametersPassedInRequest);
final Long transactionProcessingStrategyId = fromApiJsonHelper.extractLongNamed("transactionProcessingStrategyId", element,
parametersPassedInRequest);
final String currencyCode = fromApiJsonHelper.extractStringNamed("currencyCode", element, parametersPassedInRequest);
final Integer digitsAfterDecimal = fromApiJsonHelper.extractIntegerWithLocaleNamed("digitsAfterDecimal", element,
parametersPassedInRequest);
final BigDecimal principal = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("principal", element, parametersPassedInRequest);
final BigDecimal inArrearsTolerance = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("inArrearsTolerance", element,
parametersPassedInRequest);
final BigDecimal interestRatePerPeriod = fromApiJsonHelper.extractBigDecimalWithLocaleNamed("interestRatePerPeriod", element,
parametersPassedInRequest);
final Integer repaymentEvery = fromApiJsonHelper
.extractIntegerWithLocaleNamed("repaymentEvery", element, parametersPassedInRequest);
final Integer numberOfRepayments = fromApiJsonHelper.extractIntegerWithLocaleNamed("numberOfRepayments", element,
parametersPassedInRequest);
final Integer repaymentFrequencyType = fromApiJsonHelper.extractIntegerWithLocaleNamed("repaymentFrequencyType", element,
parametersPassedInRequest);
final Integer interestRateFrequencyType = fromApiJsonHelper.extractIntegerWithLocaleNamed("interestRateFrequencyType", element,
parametersPassedInRequest);
final Integer amortizationType = fromApiJsonHelper.extractIntegerWithLocaleNamed("amortizationType", element,
parametersPassedInRequest);
final Integer interestType = fromApiJsonHelper.extractIntegerWithLocaleNamed("interestType", element, parametersPassedInRequest);
final Integer interestCalculationPeriodType = fromApiJsonHelper.extractIntegerWithLocaleNamed("interestCalculationPeriodType",
element, parametersPassedInRequest);
final String[] charges = fromApiJsonHelper.extractArrayNamed("charges", element, parametersPassedInRequest);
return new LoanProductCommand(parametersPassedInRequest, false, loanProductId, name, description, fundId,
transactionProcessingStrategyId, currencyCode, digitsAfterDecimal, principal, inArrearsTolerance, numberOfRepayments,
repaymentEvery, interestRatePerPeriod, repaymentFrequencyType, interestRateFrequencyType, amortizationType, interestType,
interestCalculationPeriodType, charges);
}
@Override
public String serializedCommandJsonFromApiJson(final String json) {
final LoanProductCommand command = commandFromApiJson(json);
return this.commandSerializerService.serializeCommandToJson(command);
}
@Override
public String serializedCommandJsonFromApiJson(final Long loanProductId, final String json) {
final LoanProductCommand command = commandFromApiJson(loanProductId, json);
return this.commandSerializerService.serializeCommandToJson(command);
}
}
@@ -0,0 +1,77 @@
package org.mifosplatform.portfolio.loanproduct.serialization;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
import org.mifosplatform.infrastructure.core.serialization.FromCommandJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.portfolio.loanproduct.command.LoanProductCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.JsonElement;
@Component
public final class LoanProductCommandFromCommandJsonDeserializer implements FromCommandJsonDeserializer<LoanProductCommand> {
private final FromJsonHelper fromJsonHelper;
@Autowired
public LoanProductCommandFromCommandJsonDeserializer(final FromJsonHelper fromApiJsonHelper) {
this.fromJsonHelper = fromApiJsonHelper;
}
@Override
public LoanProductCommand commandFromCommandJson(final String commandAsJson) {
return commandFromCommandJson(null, commandAsJson);
}
@Override
public LoanProductCommand commandFromCommandJson(final Long loanProductId, final String commandAsJson) {
return commandFromCommandJson(loanProductId, commandAsJson, false);
}
@Override
public LoanProductCommand commandFromCommandJson(final Long loanProductId, final String commandAsJson,
final boolean makerCheckerApproval) {
if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); }
final Set<String> parametersPassedInRequest = new HashSet<String>();
final JsonElement element = fromJsonHelper.parse(commandAsJson);
final String name = fromJsonHelper.extractStringNamed("name", element, parametersPassedInRequest);
final String description = fromJsonHelper.extractStringNamed("description", element, parametersPassedInRequest);
final Long fundId = fromJsonHelper.extractLongNamed("fundId", element, parametersPassedInRequest);
final Long transactionProcessingStrategyId = fromJsonHelper.extractLongNamed("transactionProcessingStrategyId", element,
parametersPassedInRequest);
final String currencyCode = fromJsonHelper.extractStringNamed("currencyCode", element, parametersPassedInRequest);
final Integer digitsAfterDecimal = fromJsonHelper.extractIntegerNamed("digitsAfterDecimal", element, parametersPassedInRequest);
final BigDecimal principal = fromJsonHelper.extractBigDecimalNamed("principal", element.getAsJsonObject(),
parametersPassedInRequest);
final BigDecimal inArrearsTolerance = fromJsonHelper.extractBigDecimalNamed("inArrearsTolerance", element.getAsJsonObject(),
parametersPassedInRequest);
final BigDecimal interestRatePerPeriod = fromJsonHelper.extractBigDecimalNamed("interestRatePerPeriod", element.getAsJsonObject(),
parametersPassedInRequest);
final Integer repaymentEvery = fromJsonHelper.extractIntegerNamed("repaymentEvery", element, parametersPassedInRequest);
final Integer numberOfRepayments = fromJsonHelper.extractIntegerNamed("numberOfRepayments", element, parametersPassedInRequest);
final Integer repaymentFrequencyType = fromJsonHelper.extractIntegerNamed("repaymentFrequencyType", element,
parametersPassedInRequest);
final Integer interestRateFrequencyType = fromJsonHelper.extractIntegerNamed("interestRateFrequencyType", element,
parametersPassedInRequest);
final Integer amortizationType = fromJsonHelper.extractIntegerNamed("amortizationType", element, parametersPassedInRequest);
final Integer interestType = fromJsonHelper.extractIntegerNamed("interestType", element, parametersPassedInRequest);
final Integer interestCalculationPeriodType = fromJsonHelper.extractIntegerNamed("interestCalculationPeriodType", element,
parametersPassedInRequest);
final String[] charges = fromJsonHelper.extractArrayNamed("charges", element, parametersPassedInRequest);
return new LoanProductCommand(parametersPassedInRequest, makerCheckerApproval, loanProductId, name, description, fundId,
transactionProcessingStrategyId, currencyCode, digitsAfterDecimal, principal, inArrearsTolerance, numberOfRepayments,
repaymentEvery, interestRatePerPeriod, repaymentFrequencyType, interestRateFrequencyType, amortizationType, interestType,
interestCalculationPeriodType, charges);
}
}