blob: af2507f936f49d8b78eed720c23aafa97b824527 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.infrastructure.core.serialization;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.fineract.infrastructure.core.exception.InvalidJsonException;
import org.apache.fineract.infrastructure.core.exception.UnsupportedParameterException;
import org.joda.time.LocalDate;
import org.joda.time.MonthDay;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
@Primary
@Component
public class FromJsonHelper {
private final Gson gsonConverter;
private final JsonParserHelper helperDelegator;
private final JsonParser parser;
public FromJsonHelper() {
this.gsonConverter = new Gson();
this.helperDelegator = new JsonParserHelper();
this.parser = new JsonParser();
}
public Map<String, Boolean> extractMap(final Type typeOfMap, final String json) {
return this.gsonConverter.fromJson(json, typeOfMap);
}
public Map<String, String> extractDataMap(final Type typeOfMap, final String json) {
return this.gsonConverter.fromJson(json, typeOfMap);
}
public Map<String, Object> extractObjectMap(final Type typeOfMap, final String json) {
return this.gsonConverter.fromJson(json, typeOfMap);
}
public <T> T fromJson(final String json, final Class<T> classOfT) {
return this.gsonConverter.fromJson(json, classOfT);
}
public String toJson(final JsonElement jsonElement) {
return this.gsonConverter.toJson(jsonElement);
}
public String toJson(final Object object) {
return this.gsonConverter.toJson(object);
}
public void checkForUnsupportedParameters(final Type typeOfMap, final String json, final Set<String> supportedParams) {
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
final Map<String, Object> requestMap = this.gsonConverter.fromJson(json, typeOfMap);
final List<String> unsupportedParameterList = new ArrayList<>();
for (final String providedParameter : requestMap.keySet()) {
if (!supportedParams.contains(providedParameter)) {
unsupportedParameterList.add(providedParameter);
}
}
if (!unsupportedParameterList.isEmpty()) { throw new UnsupportedParameterException(unsupportedParameterList); }
}
public void checkForUnsupportedParameters(final JsonObject object, final Set<String> supportedParams) {
if (object == null) { throw new InvalidParameterException(); }
final Set<Entry<String, JsonElement>> entries = object.entrySet();
final List<String> unsupportedParameterList = new ArrayList<>();
for (final Entry<String, JsonElement> providedParameter : entries) {
if (!supportedParams.contains(providedParameter.getKey())) {
unsupportedParameterList.add(providedParameter.getKey());
}
}
if (!unsupportedParameterList.isEmpty()) { throw new UnsupportedParameterException(unsupportedParameterList); }
}
/**
* @param parentPropertyName
* The full json path to this property,the value is appended to
* the parameter name while generating an error message <br/>
* Ex: property "name" in Object "person" would be named as
* "person.name"
* @param object
* @param supportedParams
*/
public void checkForUnsupportedNestedParameters(final String parentPropertyName, final JsonObject object,
final Set<String> supportedParams) {
try {
checkForUnsupportedParameters(object, supportedParams);
} catch (UnsupportedParameterException exception) {
List<String> unsupportedParameters = exception.getUnsupportedParameters();
List<String> updatedUnsupportedParameters = new ArrayList<>();
for (String unsupportedParameter : unsupportedParameters) {
String updatedUnsupportedParameter = parentPropertyName + "." + unsupportedParameter;
updatedUnsupportedParameters.add(updatedUnsupportedParameter);
}
throw new UnsupportedParameterException(updatedUnsupportedParameters);
}
}
public JsonElement parse(final String json) {
JsonElement parsedElement = null;
if (StringUtils.isNotBlank(json)) {
parsedElement = this.parser.parse(json);
}
return parsedElement;
}
public boolean parameterExists(final String parameterName, final JsonElement element) {
return this.helperDelegator.parameterExists(parameterName, element);
}
public String extractStringNamed(final String parameterName, final JsonElement element) {
return this.helperDelegator.extractStringNamed(parameterName, element, new HashSet<String>());
}
public String extractStringNamed(final String parameterName, final JsonElement element, final Set<String> parametersPassedInRequest) {
return this.helperDelegator.extractStringNamed(parameterName, element, parametersPassedInRequest);
}
public Long extractLongNamed(final String parameterName, final JsonElement element) {
return this.helperDelegator.extractLongNamed(parameterName, element, new HashSet<String>());
}
public Long extractLongNamed(final String parameterName, final JsonElement element, final Set<String> parametersPassedInRequest) {
return this.helperDelegator.extractLongNamed(parameterName, element, parametersPassedInRequest);
}
public JsonArray extractJsonArrayNamed(final String parameterName, final JsonElement element) {
return this.helperDelegator.extractJsonArrayNamed(parameterName, element);
}
public String[] extractArrayNamed(final String parameterName, final JsonElement element) {
return this.helperDelegator.extractArrayNamed(parameterName, element, new HashSet<String>());
}
public String[] extractArrayNamed(final String parameterName, final JsonElement element, final Set<String> parametersPassedInRequest) {
return this.helperDelegator.extractArrayNamed(parameterName, element, parametersPassedInRequest);
}
public Boolean extractBooleanNamed(final String parameterName, final JsonElement element) {
return this.helperDelegator.extractBooleanNamed(parameterName, element, new HashSet<String>());
}
public Boolean extractBooleanNamed(final String parameterName, final JsonElement element, final Set<String> parametersPassedInRequest) {
return this.helperDelegator.extractBooleanNamed(parameterName, element, parametersPassedInRequest);
}
public MonthDay extractMonthDayNamed(final String parameterName, final JsonElement element) {
return this.helperDelegator.extractMonthDayNamed(parameterName, element);
}
public MonthDay extractMonthDayNamed(final String parameterName, final JsonObject object, final String dateFormat,
final Locale clientApplicationLocale) {
return this.helperDelegator.extractMonthDayNamed(parameterName, object, dateFormat, clientApplicationLocale);
}
public LocalDate extractLocalDateNamed(final String parameterName, final JsonElement element) {
return this.helperDelegator.extractLocalDateNamed(parameterName, element, new HashSet<String>());
}
public LocalDate extractLocalDateNamed(final String parameterName, final JsonElement element, final String dateFormat,
final Locale locale) {
return this.helperDelegator.extractLocalDateNamed(parameterName, element.getAsJsonObject(), dateFormat, locale,
new HashSet<String>());
}
public LocalDate extractLocalDateNamed(final String parameterName, final JsonElement element,
final Set<String> parametersPassedInRequest) {
return this.helperDelegator.extractLocalDateNamed(parameterName, element, parametersPassedInRequest);
}
public LocalDate extractLocalDateAsArrayNamed(final String parameterName, final JsonElement element,
final Set<String> parametersPassedInRequest) {
return this.helperDelegator.extractLocalDateAsArrayNamed(parameterName, element, parametersPassedInRequest);
}
public BigDecimal extractBigDecimalWithLocaleNamed(final String parameterName, final JsonElement element) {
return this.helperDelegator.extractBigDecimalWithLocaleNamed(parameterName, element, new HashSet<String>());
}
public BigDecimal extractBigDecimalWithLocaleNamed(final String parameterName, final JsonElement element,
final Set<String> parametersPassedInRequest) {
return this.helperDelegator.extractBigDecimalWithLocaleNamed(parameterName, element, parametersPassedInRequest);
}
public BigDecimal extractBigDecimalNamed(final String parameterName, final JsonElement element, final Locale locale) {
return this.helperDelegator.extractBigDecimalNamed(parameterName, element.getAsJsonObject(), locale, new HashSet<String>());
}
public BigDecimal extractBigDecimalNamed(final String parameterName, final JsonElement element,
final Set<String> parametersPassedInRequest) {
return this.helperDelegator.extractBigDecimalNamed(parameterName, element.getAsJsonObject(), Locale.US, parametersPassedInRequest);
}
public Integer extractIntegerWithLocaleNamed(final String parameterName, final JsonElement element) {
return this.helperDelegator.extractIntegerWithLocaleNamed(parameterName, element.getAsJsonObject(), new HashSet<String>());
}
public Integer extractIntegerSansLocaleNamed(final String parameterName, final JsonElement element) {
return this.helperDelegator.extractIntegerSansLocaleNamed(parameterName, element.getAsJsonObject(), new HashSet<String>());
}
public Integer extractIntegerWithLocaleNamed(final String parameterName, final JsonElement element,
final Set<String> parametersPassedInRequest) {
return this.helperDelegator.extractIntegerWithLocaleNamed(parameterName, element.getAsJsonObject(), parametersPassedInRequest);
}
public Integer extractIntegerNamed(final String parameterName, final JsonElement element, final Locale locale) {
return this.helperDelegator.extractIntegerNamed(parameterName, element.getAsJsonObject(), locale, new HashSet<String>());
}
public Integer extractIntegerNamed(final String parameterName, final JsonElement element, final Set<String> parametersPassedInRequest) {
return this.helperDelegator.extractIntegerNamed(parameterName, element.getAsJsonObject(), Locale.US, parametersPassedInRequest);
}
public Locale extractLocaleParameter(final JsonObject element) {
return this.helperDelegator.extractLocaleParameter(element);
}
public String extractDateFormatParameter(final JsonObject element) {
return this.helperDelegator.extractDateFormatParameter(element);
}
public String extractMonthDayFormatParameter(final JsonObject element) {
return this.helperDelegator.extractMonthDayFormatParameter(element);
}
public Gson getGsonConverter() {
return this.gsonConverter;
}
}