| /* |
| * 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.quarkus.maven; |
| |
| import java.util.ArrayList; |
| import java.util.LinkedHashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.stream.Collectors; |
| |
| import org.apache.camel.util.json.JsonObject; |
| import org.apache.camel.util.json.Jsoner; |
| |
| public final class JSonSchemaHelper { |
| |
| 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<>(); |
| if (json == null) { |
| return answer; |
| } |
| |
| // convert into a List<Map<String, String>> structure which is expected as output from this parser |
| try { |
| JsonObject output = (JsonObject) Jsoner.deserialize(json); |
| for (String key : output.keySet()) { |
| Map<?, ?> row = output.getMap(key); |
| if (key.equals(group)) { |
| if (parseProperties) { |
| // flattern each entry in the row with name as they key, and its value as the content (its a map also) |
| for (Object obj : row.entrySet()) { |
| Map.Entry<?, ?> entry = (Map.Entry<?, ?>) obj; |
| Map<String, String> newRow = new LinkedHashMap<>(); |
| newRow.put("name", entry.getKey().toString()); |
| |
| Map<String, String> newData = transformMap((Map<?, ?>) entry.getValue()); |
| newRow.putAll(newData); |
| answer.add(newRow); |
| } |
| } else { |
| // flattern each entry in the row as a list of single Map<key, value> elements |
| Map<?, ?> newData = transformMap(row); |
| for (Object obj : newData.entrySet()) { |
| Map.Entry<?, ?> entry = (Map.Entry<?, ?>) obj; |
| Map<String, String> newRow = new LinkedHashMap<>(); |
| newRow.put(entry.getKey().toString(), entry.getValue().toString()); |
| answer.add(newRow); |
| } |
| } |
| } |
| } |
| } catch (Exception e) { |
| // wrap parsing exceptions as runtime |
| throw new RuntimeException("Cannot parse json", e); |
| } |
| |
| return answer; |
| } |
| |
| private static Map<String, String> transformMap(Map<?, ?> jsonMap) { |
| Map<String, String> answer = new LinkedHashMap<>(); |
| |
| for (Object rowObj : jsonMap.entrySet()) { |
| Map.Entry<?, ?> rowEntry = (Map.Entry<?, ?>) rowObj; |
| // if its a list type then its an enum, and we need to parse it as a single line separated with comma |
| // to be backwards compatible |
| Object newValue = rowEntry.getValue(); |
| if (newValue instanceof List) { |
| List<?> list = (List<?>) newValue; |
| newValue = list.stream().map(Object::toString) |
| .collect(Collectors.joining(",")); |
| } |
| // ensure value is escaped |
| String value = escapeJson(newValue.toString()); |
| answer.put(rowEntry.getKey().toString(), value); |
| } |
| |
| return answer; |
| } |
| |
| private static String escapeJson(String value) { |
| // need to safe encode \r as \\r so its escaped |
| // need to safe encode \n as \\n so its escaped |
| // need to safe encode \t as \\t so its escaped |
| return value |
| .replaceAll("\\\\r", "\\\\\\r") |
| .replaceAll("\\\\n", "\\\\\\n") |
| .replaceAll("\\\\t", "\\\\\\t"); |
| } |
| |
| /** |
| * Gets the value with the key in a safe way, eg returning an empty string if there was no value for the key. |
| */ |
| public static String getSafeValue(String key, List<Map<String, String>> rows) { |
| for (Map<String, String> row : rows) { |
| String value = row.get(key); |
| if (value != null) { |
| return value; |
| } |
| } |
| return ""; |
| } |
| |
| /** |
| * Gets the value with the key in a safe way, eg returning an empty string if there was no value for the key. |
| */ |
| public static String getSafeValue(String key, Map<String, String> rows) { |
| String value = rows.get(key); |
| if (value != null) { |
| return value; |
| } |
| return ""; |
| } |
| |
| 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; |
| } |
| |
| public static String getPropertyDescriptionValue(List<Map<String, String>> rows, String name) { |
| for (Map<String, String> row : rows) { |
| String description = null; |
| boolean found = false; |
| if (row.containsKey("name")) { |
| found = name.equals(row.get("name")); |
| } |
| if (row.containsKey("description")) { |
| description = row.get("description"); |
| } |
| if (found) { |
| return description; |
| } |
| } |
| return null; |
| } |
| |
| public static String getPropertyJavaType(List<Map<String, String>> rows, String name) { |
| for (Map<String, String> row : rows) { |
| String javaType = null; |
| boolean found = false; |
| if (row.containsKey("name")) { |
| found = name.equals(row.get("name")); |
| } |
| if (row.containsKey("javaType")) { |
| javaType = row.get("javaType"); |
| } |
| if (found) { |
| return javaType; |
| } |
| } |
| return null; |
| } |
| |
| public static String getPropertyType(List<Map<String, String>> rows, String name) { |
| for (Map<String, String> row : rows) { |
| String type = null; |
| boolean found = false; |
| if (row.containsKey("name")) { |
| found = name.equals(row.get("name")); |
| } |
| if (row.containsKey("type")) { |
| type = row.get("type"); |
| } |
| if (found) { |
| return type; |
| } |
| } |
| return null; |
| } |
| |
| } |