wip data tables

This commit is contained in:
John Woodlock
2012-09-23 23:10:24 +10:00
parent 5dd2bd8859
commit 2d2ff222fc
3 changed files with 633 additions and 393 deletions
@@ -29,6 +29,7 @@ import org.mifosng.platform.api.commands.DepositStateTransitionApprovalCommand;
import org.mifosng.platform.api.commands.DepositStateTransitionCommand; import org.mifosng.platform.api.commands.DepositStateTransitionCommand;
import org.mifosng.platform.api.commands.FundCommand; import org.mifosng.platform.api.commands.FundCommand;
import org.mifosng.platform.api.commands.GroupCommand; import org.mifosng.platform.api.commands.GroupCommand;
import org.mifosng.platform.api.commands.LoanApplicationCommand;
import org.mifosng.platform.api.commands.LoanChargeCommand; import org.mifosng.platform.api.commands.LoanChargeCommand;
import org.mifosng.platform.api.commands.LoanProductCommand; import org.mifosng.platform.api.commands.LoanProductCommand;
import org.mifosng.platform.api.commands.LoanStateTransitionCommand; import org.mifosng.platform.api.commands.LoanStateTransitionCommand;
@@ -39,13 +40,11 @@ import org.mifosng.platform.api.commands.OrganisationCurrencyCommand;
import org.mifosng.platform.api.commands.RoleCommand; import org.mifosng.platform.api.commands.RoleCommand;
import org.mifosng.platform.api.commands.SavingProductCommand; import org.mifosng.platform.api.commands.SavingProductCommand;
import org.mifosng.platform.api.commands.StaffCommand; import org.mifosng.platform.api.commands.StaffCommand;
import org.mifosng.platform.api.commands.LoanApplicationCommand;
import org.mifosng.platform.api.commands.UserCommand; import org.mifosng.platform.api.commands.UserCommand;
import org.mifosng.platform.api.data.ApiParameterError; import org.mifosng.platform.api.data.ApiParameterError;
import org.mifosng.platform.api.errorhandling.InvalidJsonException; import org.mifosng.platform.api.errorhandling.InvalidJsonException;
import org.mifosng.platform.api.errorhandling.UnsupportedParameterException; import org.mifosng.platform.api.errorhandling.UnsupportedParameterException;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException; import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.format.number.NumberFormatter; import org.springframework.format.number.NumberFormatter;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -161,7 +160,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap); Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
Set<String> supportedParams = new HashSet<String>( Set<String> supportedParams = new HashSet<String>(
Arrays.asList("name", "externalId", "parentId", "openingDate", "dateFormat") Arrays.asList("name", "externalId", "parentId", "openingDate", "locale", "dateFormat")
); );
checkForUnsupportedParameters(requestMap, supportedParams); checkForUnsupportedParameters(requestMap, supportedParams);
@@ -312,7 +311,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap); Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
Set<String> supportedParams = new HashSet<String>( Set<String> supportedParams = new HashSet<String>(
Arrays.asList("externalId", "firstname", "lastname", "clientOrBusinessName", "officeId", "joiningDate", "dateFormat") Arrays.asList("externalId", "firstname", "lastname", "clientOrBusinessName", "officeId", "joiningDate", "locale", "dateFormat")
); );
checkForUnsupportedParameters(requestMap, supportedParams); checkForUnsupportedParameters(requestMap, supportedParams);
@@ -559,7 +558,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
Map<String, Object> requestMap = gsonConverter.fromJson(json, typeOfMap); Map<String, Object> requestMap = gsonConverter.fromJson(json, typeOfMap);
Set<String> supportedParams = new HashSet<String>( Set<String> supportedParams = new HashSet<String>(
Arrays.asList("eventDate", "note", "dateFormat") Arrays.asList("eventDate", "note", "locale", "dateFormat")
); );
checkForUnsupportedParameters(requestMap, supportedParams); checkForUnsupportedParameters(requestMap, supportedParams);
@@ -763,7 +762,8 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
String valueAsString = (String) requestMap.get(paramName); String valueAsString = (String) requestMap.get(paramName);
if (StringUtils.isNotBlank(valueAsString)) { if (StringUtils.isNotBlank(valueAsString)) {
final String dateFormat = (String) requestMap.get("dateFormat"); final String dateFormat = (String) requestMap.get("dateFormat");
paramValue = convertFrom(valueAsString, paramName, dateFormat); final Locale locale = new Locale((String) requestMap.get("locale"));
paramValue = convertFrom(valueAsString, paramName, dateFormat, locale);
} }
modifiedParameters.add(paramName); modifiedParameters.add(paramName);
} }
@@ -780,6 +780,222 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
return clientApplicationLocale; return clientApplicationLocale;
} }
private LocalDate convertFrom(final String dateAsString,
final String parameterName, final String dateFormat,
final Locale clientApplicationLocale) {
if (StringUtils.isBlank(dateFormat) || clientApplicationLocale == null) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
if (StringUtils.isBlank(dateFormat)) {
String defaultMessage = new StringBuilder(
"The parameter '"
+ parameterName
+ "' requires a 'dateFormat' parameter to be passed with it.")
.toString();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.missing.dateFormat.parameter",
defaultMessage, parameterName);
dataValidationErrors.add(error);
}
if (clientApplicationLocale == null) {
String defaultMessage = new StringBuilder(
"The parameter '"
+ parameterName
+ "' requires a 'locale' parameter to be passed with it.")
.toString();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.missing.locale.parameter",
defaultMessage, parameterName);
dataValidationErrors.add(error);
}
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
LocalDate eventLocalDate = null;
if (StringUtils.isNotBlank(dateAsString)) {
try {
// Locale locale = LocaleContextHolder.getLocale();
eventLocalDate = DateTimeFormat
.forPattern(dateFormat)
.withLocale(clientApplicationLocale)
.parseLocalDate(
dateAsString
.toLowerCase(clientApplicationLocale));
} catch (IllegalArgumentException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.invalid.date.format", "The parameter "
+ parameterName
+ " is invalid based on the dateFormat: '"
+ dateFormat + "' and locale: '"
+ clientApplicationLocale + "' provided:",
parameterName, dateAsString, dateFormat);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
}
return eventLocalDate;
}
private Integer convertToInteger(final String numericalValueFormatted,
final String parameterName, final Locale clientApplicationLocale) {
if (clientApplicationLocale == null) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
String defaultMessage = new StringBuilder("The parameter '"
+ parameterName
+ "' requires a 'locale' parameter to be passed with it.")
.toString();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.missing.locale.parameter", defaultMessage,
parameterName);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
try {
Integer number = null;
if (StringUtils.isNotBlank(numericalValueFormatted)) {
String source = numericalValueFormatted.trim();
NumberFormat format = NumberFormat
.getInstance(clientApplicationLocale);
DecimalFormat df = (DecimalFormat) format;
DecimalFormatSymbols symbols = df.getDecimalFormatSymbols();
df.setParseBigDecimal(true);
// http://bugs.sun.com/view_bug.do?bug_id=4510618
char groupingSeparator = symbols.getGroupingSeparator();
if (groupingSeparator == '\u00a0') {
source = source.replaceAll(" ",
Character.toString('\u00a0'));
}
Number parsedNumber = df.parse(source);
double parsedNumberDouble = parsedNumber.doubleValue();
int parsedNumberInteger = parsedNumber.intValue();
if (source.contains(Character.toString(symbols
.getDecimalSeparator()))) {
throw new ParseException(source, 0);
}
if (!Double.valueOf(parsedNumberDouble).equals(
Double.valueOf(Integer.valueOf(parsedNumberInteger)))) {
throw new ParseException(source, 0);
}
number = parsedNumber.intValue();
}
return number;
} catch (ParseException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError
.parameterError(
"validation.msg.invalid.integer.format",
"The parameter "
+ parameterName
+ " has value: "
+ numericalValueFormatted
+ " which is invalid integer value for provided locale of ["
+ clientApplicationLocale.toString() + "].",
parameterName, numericalValueFormatted,
clientApplicationLocale);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
}
private BigDecimal convertFrom(final String numericalValueFormatted,
final String parameterName, final Locale clientApplicationLocale) {
if (clientApplicationLocale == null) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
String defaultMessage = new StringBuilder("The parameter '"
+ parameterName
+ "' requires a 'locale' parameter to be passed with it.")
.toString();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.missing.locale.parameter", defaultMessage,
parameterName);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
try {
BigDecimal number = null;
if (StringUtils.isNotBlank(numericalValueFormatted)) {
String source = numericalValueFormatted.trim();
NumberFormat format = NumberFormat
.getNumberInstance(clientApplicationLocale);
DecimalFormat df = (DecimalFormat) format;
DecimalFormatSymbols symbols = df.getDecimalFormatSymbols();
// http://bugs.sun.com/view_bug.do?bug_id=4510618
char groupingSeparator = symbols.getGroupingSeparator();
if (groupingSeparator == '\u00a0') {
source = source.replaceAll(" ",
Character.toString('\u00a0'));
}
NumberFormatter numberFormatter = new NumberFormatter();
Number parsedNumber = numberFormatter.parse(source,
clientApplicationLocale);
number = BigDecimal.valueOf(Double.valueOf(parsedNumber
.doubleValue()));
}
return number;
} catch (ParseException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError
.parameterError(
"validation.msg.invalid.decimal.format",
"The parameter "
+ parameterName
+ " has value: "
+ numericalValueFormatted
+ " which is invalid decimal value for provided locale of ["
+ clientApplicationLocale.toString() + "].",
parameterName, numericalValueFormatted,
clientApplicationLocale);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
}
/*
private LocalDate convertFrom(final String dateAsString, final String parameterName, final String dateFormat) { private LocalDate convertFrom(final String dateAsString, final String parameterName, final String dateFormat) {
if (StringUtils.isBlank(dateFormat)) { if (StringUtils.isBlank(dateFormat)) {
@@ -940,7 +1156,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
"Validation errors exist.", dataValidationErrors); "Validation errors exist.", dataValidationErrors);
} }
} }
*/
private Locale localeFromString(final String localeAsString) { private Locale localeFromString(final String localeAsString) {
if (StringUtils.isBlank(localeAsString)) { if (StringUtils.isBlank(localeAsString)) {
@@ -1130,7 +1346,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
Type typeOfMap = new TypeToken<Map<String, Object>>(){}.getType(); Type typeOfMap = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, Object> requestMap = gsonConverter.fromJson(json, typeOfMap); Map<String, Object> requestMap = gsonConverter.fromJson(json, typeOfMap);
Set<String> supportedParams = new HashSet<String>( Arrays.asList("eventDate", "dateFormat", "note")); Set<String> supportedParams = new HashSet<String>( Arrays.asList("eventDate", "locale", "dateFormat", "note"));
checkForUnsupportedParameters(requestMap, supportedParams); checkForUnsupportedParameters(requestMap, supportedParams);
@@ -1153,7 +1369,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
Type typeOfMap = new TypeToken<Map<String, String>>(){}.getType(); Type typeOfMap = new TypeToken<Map<String, String>>(){}.getType();
Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap); Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
Set<String> supportedParams = new HashSet<String>(Arrays.asList("locale","commencementDate", "dateFormat", "tenureInMonths", "deposit", "interestCompoundedEveryPeriodType", "productId","interestCompoundedEvery","note")); Set<String> supportedParams = new HashSet<String>(Arrays.asList("locale","commencementDate", "locale", "dateFormat", "tenureInMonths", "deposit", "interestCompoundedEveryPeriodType", "productId","interestCompoundedEvery","note"));
checkForUnsupportedParameters(requestMap, supportedParams); checkForUnsupportedParameters(requestMap, supportedParams);
@@ -16,7 +16,6 @@ import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormat;
import org.mifosng.platform.api.data.ApiParameterError; import org.mifosng.platform.api.data.ApiParameterError;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException; import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.format.number.NumberFormatter; import org.springframework.format.number.NumberFormatter;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
@@ -28,13 +27,16 @@ import com.google.gson.JsonPrimitive;
*/ */
public class JsonParserHelper { public class JsonParserHelper {
public Long extractLongNamed(final String parameterName, final JsonElement element, final Set<String> modifiedParameters) { public Long extractLongNamed(final String parameterName,
final JsonElement element, final Set<String> modifiedParameters) {
Long longValue = null; Long longValue = null;
if (element.isJsonObject()) { if (element.isJsonObject()) {
JsonObject object = element.getAsJsonObject(); JsonObject object = element.getAsJsonObject();
if (object.has(parameterName) && object.get(parameterName).isJsonPrimitive()) { if (object.has(parameterName)
&& object.get(parameterName).isJsonPrimitive()) {
modifiedParameters.add(parameterName); modifiedParameters.add(parameterName);
JsonPrimitive primitive = object.get(parameterName).getAsJsonPrimitive(); JsonPrimitive primitive = object.get(parameterName)
.getAsJsonPrimitive();
final String stringValue = primitive.getAsString(); final String stringValue = primitive.getAsString();
if (StringUtils.isNotBlank(stringValue)) { if (StringUtils.isNotBlank(stringValue)) {
longValue = Long.valueOf(stringValue); longValue = Long.valueOf(stringValue);
@@ -44,13 +46,16 @@ public class JsonParserHelper {
return longValue; return longValue;
} }
public String extractStringNamed(final String parameterName, final JsonElement element, final Set<String> modifiedParameters) { public String extractStringNamed(final String parameterName,
final JsonElement element, final Set<String> modifiedParameters) {
String stringValue = null; String stringValue = null;
if (element.isJsonObject()) { if (element.isJsonObject()) {
JsonObject object = element.getAsJsonObject(); JsonObject object = element.getAsJsonObject();
if (object.has(parameterName) && object.get(parameterName).isJsonPrimitive()) { if (object.has(parameterName)
&& object.get(parameterName).isJsonPrimitive()) {
modifiedParameters.add(parameterName); modifiedParameters.add(parameterName);
JsonPrimitive primitive = object.get(parameterName).getAsJsonPrimitive(); JsonPrimitive primitive = object.get(parameterName)
.getAsJsonPrimitive();
if (StringUtils.isNotBlank(stringValue)) { if (StringUtils.isNotBlank(stringValue)) {
stringValue = primitive.getAsString(); stringValue = primitive.getAsString();
} }
@@ -59,56 +64,80 @@ public class JsonParserHelper {
return stringValue; return stringValue;
} }
public BigDecimal extractBigDecimalNamed(final String parameterName, final JsonElement element, final Set<String> modifiedParameters) { public BigDecimal extractBigDecimalNamed(final String parameterName,
final JsonElement element, final Set<String> modifiedParameters) {
BigDecimal value = null; BigDecimal value = null;
if (element.isJsonObject()) { if (element.isJsonObject()) {
JsonObject object = element.getAsJsonObject(); JsonObject object = element.getAsJsonObject();
if (object.has(parameterName) && object.get(parameterName).isJsonPrimitive()) { if (object.has(parameterName)
&& object.get(parameterName).isJsonPrimitive()) {
modifiedParameters.add(parameterName); modifiedParameters.add(parameterName);
JsonPrimitive primitive = object.get(parameterName).getAsJsonPrimitive(); JsonPrimitive primitive = object.get(parameterName)
.getAsJsonPrimitive();
String valueAsString = primitive.getAsString(); String valueAsString = primitive.getAsString();
if (StringUtils.isNotBlank(valueAsString)) { if (StringUtils.isNotBlank(valueAsString)) {
value = convertFrom(valueAsString, parameterName, extractLocaleValue(object)); value = convertFrom(valueAsString, parameterName,
extractLocaleValue(object));
} }
} }
} }
return value; return value;
} }
public Integer extractIntegerNamed(final String parameterName, final JsonElement element, final Set<String> modifiedParameters) { public Integer extractIntegerNamed(final String parameterName,
final JsonElement element, final Set<String> modifiedParameters) {
Integer value = null; Integer value = null;
if (element.isJsonObject()) { if (element.isJsonObject()) {
JsonObject object = element.getAsJsonObject(); JsonObject object = element.getAsJsonObject();
if (object.has(parameterName) && object.get(parameterName).isJsonPrimitive()) { if (object.has(parameterName)
&& object.get(parameterName).isJsonPrimitive()) {
modifiedParameters.add(parameterName); modifiedParameters.add(parameterName);
JsonPrimitive primitive = object.get(parameterName).getAsJsonPrimitive(); JsonPrimitive primitive = object.get(parameterName)
.getAsJsonPrimitive();
String valueAsString = primitive.getAsString(); String valueAsString = primitive.getAsString();
if (StringUtils.isNotBlank(valueAsString)) { if (StringUtils.isNotBlank(valueAsString)) {
value = convertToInteger(valueAsString, parameterName, extractLocaleValue(object)); value = convertToInteger(valueAsString, parameterName,
extractLocaleValue(object));
} }
} }
} }
return value; return value;
} }
public LocalDate extractLocalDateNamed(final String parameterName, final JsonElement element, final Set<String> modifiedParameters) { public LocalDate extractLocalDateNamed(final String parameterName,
final JsonElement element, final Set<String> modifiedParameters) {
LocalDate value = null; LocalDate value = null;
if (element.isJsonObject()) { if (element.isJsonObject()) {
JsonObject object = element.getAsJsonObject(); JsonObject object = element.getAsJsonObject();
String dateFormat = null; String dateFormat = null;
final String dateFormatParameter = "dateFormat"; final String dateFormatParameter = "dateFormat";
if (object.has(dateFormatParameter) && object.get(dateFormatParameter).isJsonPrimitive()) { if (object.has(dateFormatParameter)
JsonPrimitive primitive = object.get(dateFormatParameter).getAsJsonPrimitive(); && object.get(dateFormatParameter).isJsonPrimitive()) {
JsonPrimitive primitive = object.get(dateFormatParameter)
.getAsJsonPrimitive();
dateFormat = primitive.getAsString(); dateFormat = primitive.getAsString();
} }
String locale = null;
Locale clientApplicationLocale = null;
final String localeParameter = "locale";
if (object.has(localeParameter)
&& object.get(localeParameter).isJsonPrimitive()) {
JsonPrimitive primitive = object.get(localeParameter)
.getAsJsonPrimitive();
locale = primitive.getAsString();
clientApplicationLocale = localeFromString(locale);
}
if (object.has(parameterName) && object.get(parameterName).isJsonPrimitive()) { if (object.has(parameterName)
&& object.get(parameterName).isJsonPrimitive()) {
modifiedParameters.add(parameterName); modifiedParameters.add(parameterName);
JsonPrimitive primitive = object.get(parameterName).getAsJsonPrimitive(); JsonPrimitive primitive = object.get(parameterName)
.getAsJsonPrimitive();
final String valueAsString = primitive.getAsString(); final String valueAsString = primitive.getAsString();
if (StringUtils.isNotBlank(valueAsString)) { if (StringUtils.isNotBlank(valueAsString)) {
value = convertFrom(valueAsString, parameterName, dateFormat); value = convertFrom(valueAsString, parameterName,
dateFormat, clientApplicationLocale);
} }
} }
@@ -116,15 +145,35 @@ public class JsonParserHelper {
return value; return value;
} }
private LocalDate convertFrom(final String dateAsString, final String parameterName, final String dateFormat) { public LocalDate convertFrom(final String dateAsString,
final String parameterName, final String dateFormat,
final Locale clientApplicationLocale) {
if (StringUtils.isBlank(dateFormat)) { if (StringUtils.isBlank(dateFormat) || clientApplicationLocale == null) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>(); List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
String defaultMessage = new StringBuilder("The parameter '" + parameterName + "' requires a 'dateFormat' parameter to be passed with it.").toString(); if (StringUtils.isBlank(dateFormat)) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.missing.dateFormat.parameter", defaultMessage, parameterName); String defaultMessage = new StringBuilder(
dataValidationErrors.add(error); "The parameter '"
+ parameterName
+ "' requires a 'dateFormat' parameter to be passed with it.")
.toString();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.missing.dateFormat.parameter",
defaultMessage, parameterName);
dataValidationErrors.add(error);
}
if (clientApplicationLocale == null) {
String defaultMessage = new StringBuilder(
"The parameter '"
+ parameterName
+ "' requires a 'locale' parameter to be passed with it.")
.toString();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.missing.locale.parameter",
defaultMessage, parameterName);
dataValidationErrors.add(error);
}
throw new PlatformApiDataValidationException( throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist", "validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors); "Validation errors exist.", dataValidationErrors);
@@ -133,20 +182,22 @@ public class JsonParserHelper {
LocalDate eventLocalDate = null; LocalDate eventLocalDate = null;
if (StringUtils.isNotBlank(dateAsString)) { if (StringUtils.isNotBlank(dateAsString)) {
try { try {
Locale locale = LocaleContextHolder.getLocale(); // Locale locale = LocaleContextHolder.getLocale();
eventLocalDate = DateTimeFormat.forPattern(dateFormat) eventLocalDate = DateTimeFormat
.withLocale(locale) .forPattern(dateFormat)
.parseLocalDate(dateAsString.toLowerCase(locale)); .withLocale(clientApplicationLocale)
.parseLocalDate(
dateAsString
.toLowerCase(clientApplicationLocale));
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>(); List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError ApiParameterError error = ApiParameterError.parameterError(
.parameterError( "validation.msg.invalid.date.format", "The parameter "
"validation.msg.invalid.date.format", + parameterName
"The parameter " + " is invalid based on the dateFormat: '"
+ parameterName + dateFormat + "' and locale: '"
+ " is invalid based on the dateFormat provided:" + clientApplicationLocale + "' provided:",
+ dateFormat, parameterName, parameterName, dateAsString, dateFormat);
dateAsString, dateFormat);
dataValidationErrors.add(error); dataValidationErrors.add(error);
throw new PlatformApiDataValidationException( throw new PlatformApiDataValidationException(
@@ -158,66 +209,19 @@ public class JsonParserHelper {
return eventLocalDate; return eventLocalDate;
} }
private BigDecimal convertFrom(final String numericalValueFormatted, final String parameterName, final Locale clientApplicationLocale) { public Integer convertToInteger(final String numericalValueFormatted,
final String parameterName, final Locale clientApplicationLocale) {
if (clientApplicationLocale == null) { if (clientApplicationLocale == null) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>(); List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
String defaultMessage = new StringBuilder("The parameter '" + parameterName + "' requires a 'locale' parameter to be passed with it.").toString(); String defaultMessage = new StringBuilder("The parameter '"
ApiParameterError error = ApiParameterError.parameterError("validation.msg.missing.locale.parameter", defaultMessage, parameterName); + parameterName
dataValidationErrors.add(error); + "' requires a 'locale' parameter to be passed with it.")
.toString();
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
try {
BigDecimal number = null;
if (StringUtils.isNotBlank(numericalValueFormatted)) {
String source = numericalValueFormatted.trim();
NumberFormat format = NumberFormat.getNumberInstance(clientApplicationLocale);
DecimalFormat df = (DecimalFormat) format;
DecimalFormatSymbols symbols = df.getDecimalFormatSymbols();
// http://bugs.sun.com/view_bug.do?bug_id=4510618
char groupingSeparator = symbols.getGroupingSeparator();
if (groupingSeparator == '\u00a0') {
source = source.replaceAll(" ", Character.toString('\u00a0'));
}
NumberFormatter numberFormatter = new NumberFormatter();
Number parsedNumber = numberFormatter.parse(source, clientApplicationLocale);
number = BigDecimal.valueOf(Double.valueOf(parsedNumber.doubleValue()));
}
return number;
} catch (ParseException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError( ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.invalid.decimal.format", "The parameter " "validation.msg.missing.locale.parameter", defaultMessage,
+ parameterName + " has value: " + numericalValueFormatted + " which is invalid decimal value for provided locale of [" parameterName);
+ clientApplicationLocale.toString() + "].",
parameterName, numericalValueFormatted,
clientApplicationLocale);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
}
private Integer convertToInteger(final String numericalValueFormatted, final String parameterName, final Locale clientApplicationLocale) {
if (clientApplicationLocale == null) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
String defaultMessage = new StringBuilder("The parameter '" + parameterName + "' requires a 'locale' parameter to be passed with it.").toString();
ApiParameterError error = ApiParameterError.parameterError("validation.msg.missing.locale.parameter", defaultMessage, parameterName);
dataValidationErrors.add(error); dataValidationErrors.add(error);
throw new PlatformApiDataValidationException( throw new PlatformApiDataValidationException(
@@ -232,7 +236,8 @@ private Integer convertToInteger(final String numericalValueFormatted, final Str
String source = numericalValueFormatted.trim(); String source = numericalValueFormatted.trim();
NumberFormat format = NumberFormat.getInstance(clientApplicationLocale); NumberFormat format = NumberFormat
.getInstance(clientApplicationLocale);
DecimalFormat df = (DecimalFormat) format; DecimalFormat df = (DecimalFormat) format;
DecimalFormatSymbols symbols = df.getDecimalFormatSymbols(); DecimalFormatSymbols symbols = df.getDecimalFormatSymbols();
df.setParseBigDecimal(true); df.setParseBigDecimal(true);
@@ -240,19 +245,22 @@ private Integer convertToInteger(final String numericalValueFormatted, final Str
// http://bugs.sun.com/view_bug.do?bug_id=4510618 // http://bugs.sun.com/view_bug.do?bug_id=4510618
char groupingSeparator = symbols.getGroupingSeparator(); char groupingSeparator = symbols.getGroupingSeparator();
if (groupingSeparator == '\u00a0') { if (groupingSeparator == '\u00a0') {
source = source.replaceAll(" ", Character.toString('\u00a0')); source = source.replaceAll(" ",
} Character.toString('\u00a0'));
}
Number parsedNumber = df.parse(source); Number parsedNumber = df.parse(source);
double parsedNumberDouble = parsedNumber.doubleValue(); double parsedNumberDouble = parsedNumber.doubleValue();
int parsedNumberInteger = parsedNumber.intValue(); int parsedNumberInteger = parsedNumber.intValue();
if (source.contains(Character.toString(symbols.getDecimalSeparator()))) { if (source.contains(Character.toString(symbols
.getDecimalSeparator()))) {
throw new ParseException(source, 0); throw new ParseException(source, 0);
} }
if (!Double.valueOf(parsedNumberDouble).equals(Double.valueOf(Integer.valueOf(parsedNumberInteger)))) { if (!Double.valueOf(parsedNumberDouble).equals(
Double.valueOf(Integer.valueOf(parsedNumberInteger)))) {
throw new ParseException(source, 0); throw new ParseException(source, 0);
} }
@@ -263,12 +271,17 @@ private Integer convertToInteger(final String numericalValueFormatted, final Str
} catch (ParseException e) { } catch (ParseException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>(); List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError( ApiParameterError error = ApiParameterError
"validation.msg.invalid.integer.format", "The parameter " .parameterError(
+ parameterName + " has value: " + numericalValueFormatted + " which is invalid integer value for provided locale of [" "validation.msg.invalid.integer.format",
+ clientApplicationLocale.toString() + "].", "The parameter "
parameterName, numericalValueFormatted, + parameterName
clientApplicationLocale); + " has value: "
+ numericalValueFormatted
+ " which is invalid integer value for provided locale of ["
+ clientApplicationLocale.toString() + "].",
parameterName, numericalValueFormatted,
clientApplicationLocale);
dataValidationErrors.add(error); dataValidationErrors.add(error);
throw new PlatformApiDataValidationException( throw new PlatformApiDataValidationException(
@@ -277,11 +290,232 @@ private Integer convertToInteger(final String numericalValueFormatted, final Str
} }
} }
public BigDecimal convertFrom(final String numericalValueFormatted,
final String parameterName, final Locale clientApplicationLocale) {
if (clientApplicationLocale == null) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
String defaultMessage = new StringBuilder("The parameter '"
+ parameterName
+ "' requires a 'locale' parameter to be passed with it.")
.toString();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.missing.locale.parameter", defaultMessage,
parameterName);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
try {
BigDecimal number = null;
if (StringUtils.isNotBlank(numericalValueFormatted)) {
String source = numericalValueFormatted.trim();
NumberFormat format = NumberFormat
.getNumberInstance(clientApplicationLocale);
DecimalFormat df = (DecimalFormat) format;
DecimalFormatSymbols symbols = df.getDecimalFormatSymbols();
// http://bugs.sun.com/view_bug.do?bug_id=4510618
char groupingSeparator = symbols.getGroupingSeparator();
if (groupingSeparator == '\u00a0') {
source = source.replaceAll(" ",
Character.toString('\u00a0'));
}
NumberFormatter numberFormatter = new NumberFormatter();
Number parsedNumber = numberFormatter.parse(source,
clientApplicationLocale);
number = BigDecimal.valueOf(Double.valueOf(parsedNumber
.doubleValue()));
}
return number;
} catch (ParseException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError
.parameterError(
"validation.msg.invalid.decimal.format",
"The parameter "
+ parameterName
+ " has value: "
+ numericalValueFormatted
+ " which is invalid decimal value for provided locale of ["
+ clientApplicationLocale.toString() + "].",
parameterName, numericalValueFormatted,
clientApplicationLocale);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
}
/*
* private LocalDate convertFrom(final String dateAsString, final String
* parameterName, final String dateFormat) {
*
* if (StringUtils.isBlank(dateFormat)) {
*
* List<ApiParameterError> dataValidationErrors = new
* ArrayList<ApiParameterError>(); String defaultMessage = new
* StringBuilder("The parameter '" + parameterName +
* "' requires a 'dateFormat' parameter to be passed with it.").toString();
* ApiParameterError error = ApiParameterError.parameterError(
* "validation.msg.missing.dateFormat.parameter", defaultMessage,
* parameterName); dataValidationErrors.add(error);
*
* throw new PlatformApiDataValidationException(
* "validation.msg.validation.errors.exist", "Validation errors exist.",
* dataValidationErrors); }
*
* LocalDate eventLocalDate = null; if
* (StringUtils.isNotBlank(dateAsString)) { try { Locale locale =
* LocaleContextHolder.getLocale(); eventLocalDate =
* DateTimeFormat.forPattern(dateFormat) .withLocale(locale)
* .parseLocalDate(dateAsString.toLowerCase(locale)); } catch
* (IllegalArgumentException e) { List<ApiParameterError>
* dataValidationErrors = new ArrayList<ApiParameterError>();
* ApiParameterError error = ApiParameterError .parameterError(
* "validation.msg.invalid.date.format", "The parameter " + parameterName +
* " is invalid based on the dateFormat provided:" + dateFormat,
* parameterName, dateAsString, dateFormat);
* dataValidationErrors.add(error);
*
* throw new PlatformApiDataValidationException(
* "validation.msg.validation.errors.exist", "Validation errors exist.",
* dataValidationErrors); } }
*
* return eventLocalDate; }
*
* private BigDecimal convertFrom(final String numericalValueFormatted,
* final String parameterName, final Locale clientApplicationLocale) {
*
* if (clientApplicationLocale == null) {
*
* List<ApiParameterError> dataValidationErrors = new
* ArrayList<ApiParameterError>(); String defaultMessage = new
* StringBuilder("The parameter '" + parameterName +
* "' requires a 'locale' parameter to be passed with it.").toString();
* ApiParameterError error =
* ApiParameterError.parameterError("validation.msg.missing.locale.parameter"
* , defaultMessage, parameterName); dataValidationErrors.add(error);
*
* throw new PlatformApiDataValidationException(
* "validation.msg.validation.errors.exist", "Validation errors exist.",
* dataValidationErrors); }
*
* try { BigDecimal number = null;
*
* if (StringUtils.isNotBlank(numericalValueFormatted)) {
*
* String source = numericalValueFormatted.trim();
*
* NumberFormat format =
* NumberFormat.getNumberInstance(clientApplicationLocale); DecimalFormat df
* = (DecimalFormat) format; DecimalFormatSymbols symbols =
* df.getDecimalFormatSymbols(); //
* http://bugs.sun.com/view_bug.do?bug_id=4510618 char groupingSeparator =
* symbols.getGroupingSeparator(); if (groupingSeparator == '\u00a0') {
* source = source.replaceAll(" ", Character.toString('\u00a0')); }
*
* NumberFormatter numberFormatter = new NumberFormatter(); Number
* parsedNumber = numberFormatter.parse(source, clientApplicationLocale);
* number = BigDecimal.valueOf(Double.valueOf(parsedNumber.doubleValue()));
* }
*
* return number; } catch (ParseException e) {
*
* List<ApiParameterError> dataValidationErrors = new
* ArrayList<ApiParameterError>(); ApiParameterError error =
* ApiParameterError.parameterError(
* "validation.msg.invalid.decimal.format", "The parameter " + parameterName
* + " has value: " + numericalValueFormatted +
* " which is invalid decimal value for provided locale of [" +
* clientApplicationLocale.toString() + "].", parameterName,
* numericalValueFormatted, clientApplicationLocale);
* dataValidationErrors.add(error);
*
* throw new PlatformApiDataValidationException(
* "validation.msg.validation.errors.exist", "Validation errors exist.",
* dataValidationErrors); } }
*
* private Integer convertToInteger(final String numericalValueFormatted,
* final String parameterName, final Locale clientApplicationLocale) {
*
* if (clientApplicationLocale == null) {
*
* List<ApiParameterError> dataValidationErrors = new
* ArrayList<ApiParameterError>(); String defaultMessage = new
* StringBuilder("The parameter '" + parameterName +
* "' requires a 'locale' parameter to be passed with it.").toString();
* ApiParameterError error =
* ApiParameterError.parameterError("validation.msg.missing.locale.parameter"
* , defaultMessage, parameterName); dataValidationErrors.add(error);
*
* throw new PlatformApiDataValidationException(
* "validation.msg.validation.errors.exist", "Validation errors exist.",
* dataValidationErrors); }
*
* try { Integer number = null;
*
* if (StringUtils.isNotBlank(numericalValueFormatted)) {
*
* String source = numericalValueFormatted.trim();
*
* NumberFormat format = NumberFormat.getInstance(clientApplicationLocale);
* DecimalFormat df = (DecimalFormat) format; DecimalFormatSymbols symbols =
* df.getDecimalFormatSymbols(); df.setParseBigDecimal(true);
*
* // http://bugs.sun.com/view_bug.do?bug_id=4510618 char groupingSeparator
* = symbols.getGroupingSeparator(); if (groupingSeparator == '\u00a0') {
* source = source.replaceAll(" ", Character.toString('\u00a0')); }
*
* Number parsedNumber = df.parse(source);
*
* double parsedNumberDouble = parsedNumber.doubleValue(); int
* parsedNumberInteger = parsedNumber.intValue();
*
* if (source.contains(Character.toString(symbols.getDecimalSeparator()))) {
* throw new ParseException(source, 0); }
*
* if
* (!Double.valueOf(parsedNumberDouble).equals(Double.valueOf(Integer.valueOf
* (parsedNumberInteger)))) { throw new ParseException(source, 0); }
*
* number = parsedNumber.intValue(); }
*
* return number; } catch (ParseException e) {
*
* List<ApiParameterError> dataValidationErrors = new
* ArrayList<ApiParameterError>(); ApiParameterError error =
* ApiParameterError.parameterError(
* "validation.msg.invalid.integer.format", "The parameter " + parameterName
* + " has value: " + numericalValueFormatted +
* " which is invalid integer value for provided locale of [" +
* clientApplicationLocale.toString() + "].", parameterName,
* numericalValueFormatted, clientApplicationLocale);
* dataValidationErrors.add(error);
*
* throw new PlatformApiDataValidationException(
* "validation.msg.validation.errors.exist", "Validation errors exist.",
* dataValidationErrors); } }
*/
private Locale localeFromString(final String localeAsString) { private Locale localeFromString(final String localeAsString) {
if (StringUtils.isBlank(localeAsString)) { if (StringUtils.isBlank(localeAsString)) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>(); List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError("validation.msg.invalid.locale.format", "The parameter locale is invalid. It cannot be blank.", "locale"); ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.invalid.locale.format",
"The parameter locale is invalid. It cannot be blank.",
"locale");
dataValidationErrors.add(error); dataValidationErrors.add(error);
throw new PlatformApiDataValidationException( throw new PlatformApiDataValidationException(
@@ -313,20 +547,28 @@ private Integer convertToInteger(final String numericalValueFormatted, final Str
return localeFrom(languageCode, courntryCode, variantCode); return localeFrom(languageCode, courntryCode, variantCode);
} }
private Locale localeFrom(final String languageCode, final String courntryCode, final String variantCode) { private Locale localeFrom(final String languageCode,
final String courntryCode, final String variantCode) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>(); List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
List<String> allowedLanguages = Arrays.asList(Locale.getISOLanguages()); List<String> allowedLanguages = Arrays.asList(Locale.getISOLanguages());
if (!allowedLanguages.contains(languageCode.toLowerCase())) { if (!allowedLanguages.contains(languageCode.toLowerCase())) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.invalid.locale.format", "The parameter locale has an invalid language value " + languageCode + " .", "locale", languageCode); ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.invalid.locale.format",
"The parameter locale has an invalid language value "
+ languageCode + " .", "locale", languageCode);
dataValidationErrors.add(error); dataValidationErrors.add(error);
} }
if (StringUtils.isNotBlank(courntryCode.toUpperCase())) { if (StringUtils.isNotBlank(courntryCode.toUpperCase())) {
List<String> allowedCountries = Arrays.asList(Locale.getISOCountries()); List<String> allowedCountries = Arrays.asList(Locale
.getISOCountries());
if (!allowedCountries.contains(courntryCode)) { if (!allowedCountries.contains(courntryCode)) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.invalid.locale.format", "The parameter locale has an invalid country value " + courntryCode + " .", "locale", courntryCode); ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.invalid.locale.format",
"The parameter locale has an invalid country value "
+ courntryCode + " .", "locale", courntryCode);
dataValidationErrors.add(error); dataValidationErrors.add(error);
} }
} }
@@ -337,12 +579,13 @@ private Integer convertToInteger(final String numericalValueFormatted, final Str
"Validation errors exist.", dataValidationErrors); "Validation errors exist.", dataValidationErrors);
} }
return new Locale(languageCode.toLowerCase(), courntryCode.toUpperCase(), variantCode); return new Locale(languageCode.toLowerCase(),
courntryCode.toUpperCase(), variantCode);
} }
private Locale extractLocaleValue(final JsonObject object) { private Locale extractLocaleValue(final JsonObject object) {
Locale clientApplicationLocale = null; Locale clientApplicationLocale = null;
String locale = null; String locale = null;
if (object.has("locale") && object.get("locale").isJsonPrimitive()) { if (object.has("locale") && object.get("locale").isJsonPrimitive()) {
JsonPrimitive primitive = object.get("locale").getAsJsonPrimitive(); JsonPrimitive primitive = object.get("locale").getAsJsonPrimitive();
locale = primitive.getAsString(); locale = primitive.getAsString();
@@ -1,12 +1,7 @@
package org.mifosng.platform.noncore; package org.mifosng.platform.noncore;
import java.math.BigDecimal;
import java.sql.ResultSetMetaData; import java.sql.ResultSetMetaData;
import java.sql.SQLException; import java.sql.SQLException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -17,14 +12,13 @@ import java.util.Set;
import javax.sql.rowset.CachedRowSet; import javax.sql.rowset.CachedRowSet;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.mifosng.platform.api.data.ApiParameterError; import org.mifosng.platform.api.data.ApiParameterError;
import org.mifosng.platform.api.data.DatatableData; import org.mifosng.platform.api.data.DatatableData;
import org.mifosng.platform.api.data.GenericResultsetData; import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.data.ResultsetColumnHeader; import org.mifosng.platform.api.data.ResultsetColumnHeader;
import org.mifosng.platform.api.data.ResultsetColumnValue; import org.mifosng.platform.api.data.ResultsetColumnValue;
import org.mifosng.platform.api.data.ResultsetDataRow; import org.mifosng.platform.api.data.ResultsetDataRow;
import org.mifosng.platform.api.infrastructure.JsonParserHelper;
import org.mifosng.platform.exceptions.DataTableNotFoundException; import org.mifosng.platform.exceptions.DataTableNotFoundException;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException; import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.mifosng.platform.exceptions.PlatformDataIntegrityException; import org.mifosng.platform.exceptions.PlatformDataIntegrityException;
@@ -33,7 +27,6 @@ import org.mifosng.platform.user.domain.AppUser;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.number.NumberFormatter;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
@@ -821,22 +814,23 @@ public class ReadWriteNonCoreDataServiceImpl implements
+ " (neither varchar nor int)"); + " (neither varchar nor int)");
} }
JsonParserHelper helper = new JsonParserHelper();
if (columnHeader.getColumnDisplayTypeNew().equals("DATE")) if (columnHeader.getColumnDisplayTypeNew().equals("DATE"))
paramValue = convertFrom(paramValue, paramValue = helper.convertFrom(paramValue,
columnHeader.getColumnName(), dateFormat, columnHeader.getColumnName(), dateFormat,
clientApplicationLocale).toString(); clientApplicationLocale).toString();
if (columnHeader.getColumnDisplayTypeNew().equals("INTEGER")) if (columnHeader.getColumnDisplayTypeNew().equals("INTEGER"))
paramValue = convertToInteger(paramValue, paramValue = helper.convertToInteger(paramValue,
columnHeader.getColumnName(), clientApplicationLocale) columnHeader.getColumnName(), clientApplicationLocale)
.toString(); .toString();
if (columnHeader.getColumnDisplayTypeNew().equals("DECIMAL")) if (columnHeader.getColumnDisplayTypeNew().equals("DECIMAL"))
paramValue = convertFrom(paramValue, paramValue = helper.convertFrom(paramValue,
columnHeader.getColumnName(), clientApplicationLocale) columnHeader.getColumnName(), clientApplicationLocale)
.toString(); .toString();
//logger.info("Converted Value: " + paramValue + " - was: " + pValue);
logger.info("Converted Value: " + paramValue + " - was: " + pValue);
} }
@@ -873,217 +867,4 @@ public class ReadWriteNonCoreDataServiceImpl implements
return true; return true;
} }
private LocalDate convertFrom(final String dateAsString,
final String parameterName, final String dateFormat,
final Locale clientApplicationLocale) {
if (StringUtils.isBlank(dateFormat) || clientApplicationLocale == null) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
if (StringUtils.isBlank(dateFormat)) {
String defaultMessage = new StringBuilder(
"The parameter '"
+ parameterName
+ "' requires a 'dateFormat' parameter to be passed with it.")
.toString();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.missing.dateFormat.parameter",
defaultMessage, parameterName);
dataValidationErrors.add(error);
}
if (clientApplicationLocale == null) {
String defaultMessage = new StringBuilder(
"The parameter '"
+ parameterName
+ "' requires a 'locale' parameter to be passed with it.")
.toString();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.missing.locale.parameter",
defaultMessage, parameterName);
dataValidationErrors.add(error);
}
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
LocalDate eventLocalDate = null;
if (StringUtils.isNotBlank(dateAsString)) {
try {
// Locale locale = LocaleContextHolder.getLocale();
eventLocalDate = DateTimeFormat
.forPattern(dateFormat)
.withLocale(clientApplicationLocale)
.parseLocalDate(
dateAsString
.toLowerCase(clientApplicationLocale));
} catch (IllegalArgumentException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.invalid.date.format", "The parameter "
+ parameterName
+ " is invalid based on the dateFormat: '"
+ dateFormat + "' and locale: '"
+ clientApplicationLocale + "' provided:",
parameterName, dateAsString, dateFormat);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
}
return eventLocalDate;
}
private Integer convertToInteger(final String numericalValueFormatted,
final String parameterName, final Locale clientApplicationLocale) {
if (clientApplicationLocale == null) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
String defaultMessage = new StringBuilder("The parameter '"
+ parameterName
+ "' requires a 'locale' parameter to be passed with it.")
.toString();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.missing.locale.parameter", defaultMessage,
parameterName);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
try {
Integer number = null;
if (StringUtils.isNotBlank(numericalValueFormatted)) {
String source = numericalValueFormatted.trim();
NumberFormat format = NumberFormat
.getInstance(clientApplicationLocale);
DecimalFormat df = (DecimalFormat) format;
DecimalFormatSymbols symbols = df.getDecimalFormatSymbols();
df.setParseBigDecimal(true);
// http://bugs.sun.com/view_bug.do?bug_id=4510618
char groupingSeparator = symbols.getGroupingSeparator();
if (groupingSeparator == '\u00a0') {
source = source.replaceAll(" ",
Character.toString('\u00a0'));
}
Number parsedNumber = df.parse(source);
double parsedNumberDouble = parsedNumber.doubleValue();
int parsedNumberInteger = parsedNumber.intValue();
if (source.contains(Character.toString(symbols
.getDecimalSeparator()))) {
throw new ParseException(source, 0);
}
if (!Double.valueOf(parsedNumberDouble).equals(
Double.valueOf(Integer.valueOf(parsedNumberInteger)))) {
throw new ParseException(source, 0);
}
number = parsedNumber.intValue();
}
return number;
} catch (ParseException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError
.parameterError(
"validation.msg.invalid.integer.format",
"The parameter "
+ parameterName
+ " has value: "
+ numericalValueFormatted
+ " which is invalid integer value for provided locale of ["
+ clientApplicationLocale.toString() + "].",
parameterName, numericalValueFormatted,
clientApplicationLocale);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
}
private BigDecimal convertFrom(final String numericalValueFormatted,
final String parameterName, final Locale clientApplicationLocale) {
if (clientApplicationLocale == null) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
String defaultMessage = new StringBuilder("The parameter '"
+ parameterName
+ "' requires a 'locale' parameter to be passed with it.")
.toString();
ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.missing.locale.parameter", defaultMessage,
parameterName);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
try {
BigDecimal number = null;
if (StringUtils.isNotBlank(numericalValueFormatted)) {
String source = numericalValueFormatted.trim();
NumberFormat format = NumberFormat
.getNumberInstance(clientApplicationLocale);
DecimalFormat df = (DecimalFormat) format;
DecimalFormatSymbols symbols = df.getDecimalFormatSymbols();
// http://bugs.sun.com/view_bug.do?bug_id=4510618
char groupingSeparator = symbols.getGroupingSeparator();
if (groupingSeparator == '\u00a0') {
source = source.replaceAll(" ",
Character.toString('\u00a0'));
}
NumberFormatter numberFormatter = new NumberFormatter();
Number parsedNumber = numberFormatter.parse(source,
clientApplicationLocale);
number = BigDecimal.valueOf(Double.valueOf(parsedNumber
.doubleValue()));
}
return number;
} catch (ParseException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError
.parameterError(
"validation.msg.invalid.decimal.format",
"The parameter "
+ parameterName
+ " has value: "
+ numericalValueFormatted
+ " which is invalid decimal value for provided locale of ["
+ clientApplicationLocale.toString() + "].",
parameterName, numericalValueFormatted,
clientApplicationLocale);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException(
"validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors);
}
}
} }