/* * Copyright 2012-2017 the original author or authors. * * Licensed 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.springframework.boot.configurationprocessor.metadata; import java.lang.reflect.Array; import java.util.Collection; import java.util.Map; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.boot.configurationprocessor.metadata.ItemMetadata.ItemType; /** * Converter to change meta-data objects into JSON objects. * * @author Stephane Nicoll * @author Phillip Webb */ class JsonConverter { public JSONArray toJsonArray(ConfigurationMetadata metadata, ItemType itemType) throws Exception { JSONArray jsonArray = new JSONArray(); for (ItemMetadata item : metadata.getItems()) { if (item.isOfItemType(itemType)) { jsonArray.put(toJsonObject(item)); } } return jsonArray; } public JSONArray toJsonArray(Collection<ItemHint> hints) throws Exception { JSONArray jsonArray = new JSONArray(); for (ItemHint hint : hints) { jsonArray.put(toJsonObject(hint)); } return jsonArray; } public JSONObject toJsonObject(ItemMetadata item) throws Exception { JSONObject jsonObject = new JSONOrderedObject(); jsonObject.put("name", item.getName()); putIfPresent(jsonObject, "type", item.getType()); putIfPresent(jsonObject, "description", item.getDescription()); putIfPresent(jsonObject, "sourceType", item.getSourceType()); putIfPresent(jsonObject, "sourceMethod", item.getSourceMethod()); Object defaultValue = item.getDefaultValue(); if (defaultValue != null) { putDefaultValue(jsonObject, defaultValue); } ItemDeprecation deprecation = item.getDeprecation(); if (deprecation != null) { jsonObject.put("deprecated", true); // backward compatibility JSONObject deprecationJsonObject = new JSONObject(); if (deprecation.getReason() != null) { deprecationJsonObject.put("reason", deprecation.getReason()); } if (deprecation.getReplacement() != null) { deprecationJsonObject.put("replacement", deprecation.getReplacement()); } jsonObject.put("deprecation", deprecationJsonObject); } return jsonObject; } private JSONObject toJsonObject(ItemHint hint) throws Exception { JSONObject jsonObject = new JSONOrderedObject(); jsonObject.put("name", hint.getName()); if (!hint.getValues().isEmpty()) { jsonObject.put("values", getItemHintValues(hint)); } if (!hint.getProviders().isEmpty()) { jsonObject.put("providers", getItemHintProviders(hint)); } return jsonObject; } private JSONArray getItemHintValues(ItemHint hint) throws Exception { JSONArray values = new JSONArray(); for (ItemHint.ValueHint value : hint.getValues()) { values.put(getItemHintValue(value)); } return values; } private JSONObject getItemHintValue(ItemHint.ValueHint value) throws Exception { JSONObject result = new JSONOrderedObject(); putHintValue(result, value.getValue()); putIfPresent(result, "description", value.getDescription()); return result; } private JSONArray getItemHintProviders(ItemHint hint) throws Exception { JSONArray providers = new JSONArray(); for (ItemHint.ValueProvider provider : hint.getProviders()) { providers.put(getItemHintProvider(provider)); } return providers; } private JSONObject getItemHintProvider(ItemHint.ValueProvider provider) throws Exception { JSONObject result = new JSONOrderedObject(); result.put("name", provider.getName()); if (provider.getParameters() != null && !provider.getParameters().isEmpty()) { JSONObject parameters = new JSONOrderedObject(); for (Map.Entry<String, Object> entry : provider.getParameters().entrySet()) { parameters.put(entry.getKey(), extractItemValue(entry.getValue())); } result.put("parameters", parameters); } return result; } private void putIfPresent(JSONObject jsonObject, String name, Object value) throws Exception { if (value != null) { jsonObject.put(name, value); } } private void putHintValue(JSONObject jsonObject, Object value) throws Exception { Object hintValue = extractItemValue(value); jsonObject.put("value", hintValue); } private void putDefaultValue(JSONObject jsonObject, Object value) throws Exception { Object defaultValue = extractItemValue(value); jsonObject.put("defaultValue", defaultValue); } private Object extractItemValue(Object value) { Object defaultValue = value; if (value.getClass().isArray()) { JSONArray array = new JSONArray(); int length = Array.getLength(value); for (int i = 0; i < length; i++) { array.put(Array.get(value, i)); } defaultValue = array; } return defaultValue; } }