blob: f9f628a092508740d9c62079683285ee24211fa8 [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.camel.catalog;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public final class JSonSchemaHelper {
private static final Pattern PATTERN = Pattern.compile("\"(.+?)\"|\\[(.+)\\]");
private static final String QUOT = """;
private JSonSchemaHelper() {
}
/**
* Parses the json schema to split it into a list or rows, where each row contains key value pairs with the metadata
*
* @param group the group to parse from such as <tt>component</tt>, <tt>componentProperties</tt>, or <tt>properties</tt>.
* @param json the json
* @return a list of all the rows, where each row is a set of key value pairs with metadata
*/
public static List<Map<String, String>> parseJsonSchema(String group, String json, boolean parseProperties) {
List<Map<String, String>> answer = new ArrayList<Map<String, String>>();
if (json == null) {
return answer;
}
boolean found = false;
// parse line by line
String[] lines = json.split("\n");
for (String line : lines) {
// we need to find the group first
if (!found) {
String s = line.trim();
found = s.startsWith("\"" + group + "\":");
continue;
}
// we should stop when we end the group
if (line.equals(" },") || line.equals(" }")) {
break;
}
// need to safe encode \" so we can parse the line
line = line.replaceAll("\"\\\\\"\"", '"' + QUOT + '"');
Map<String, String> row = new LinkedHashMap<String, String>();
Matcher matcher = PATTERN.matcher(line);
String key;
if (parseProperties) {
// when parsing properties the first key is given as name, so the first parsed token is the value of the name
key = "name";
} else {
key = null;
}
while (matcher.find()) {
if (key == null) {
key = matcher.group(1);
} else {
String value = matcher.group(1);
if (value == null) {
value = matcher.group(2);
// its an enum so strip out " and trim spaces after comma
value = value.replaceAll("\"", "");
value = value.replaceAll(", ", ",");
}
if (value != null) {
value = value.trim();
// decode
value = value.replaceAll(QUOT, "\"");
value = decodeJson(value);
}
row.put(key, value);
// reset
key = null;
}
}
if (!row.isEmpty()) {
answer.add(row);
}
}
return answer;
}
private static String decodeJson(String value) {
// json encodes a \ as \\ so we need to decode from \\ back to \
if ("\\\\".equals(value)) {
value = "\\";
}
return value;
}
public static boolean isPropertyRequired(List<Map<String, String>> rows, String name) {
for (Map<String, String> row : rows) {
boolean required = false;
boolean found = false;
if (row.containsKey("name")) {
found = name.equals(row.get("name"));
}
if (row.containsKey("required")) {
required = "true".equals(row.get("required"));
}
if (found) {
return required;
}
}
return false;
}
public static String getPropertyDefaultValue(List<Map<String, String>> rows, String name) {
for (Map<String, String> row : rows) {
String defaultValue = null;
boolean found = false;
if (row.containsKey("name")) {
found = name.equals(row.get("name"));
}
if (row.containsKey("defaultValue")) {
defaultValue = row.get("defaultValue");
}
if (found) {
return defaultValue;
}
}
return null;
}
}