/* * Copyright 2016 Red Hat, Inc. and/or its affiliates * and other contributors as indicated by the @author tags. * * 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.keycloak.client.admin.cli.util; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.TextNode; import org.keycloak.util.JsonSerialization; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.Map; import static org.keycloak.client.admin.cli.util.IoUtil.printOut; /** * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a> */ public class OutputUtil { public static ObjectMapper MAPPER = new ObjectMapper(); static { MAPPER.enable(SerializationFeature.INDENT_OUTPUT); MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL); } public static JsonNode convertToJsonNode(Object object) throws IOException { if (object instanceof JsonNode) { return (JsonNode) object; } ByteArrayOutputStream buffer = new ByteArrayOutputStream(); buffer.write(JsonSerialization.writeValueAsBytes(object)); return MAPPER.readValue(buffer.toByteArray(), JsonNode.class); } public static void printAsCsv(Object object, ReturnFields fields, boolean unquoted) throws IOException { JsonNode node = convertToJsonNode(object); if (!node.isArray()) { ArrayNode listNode = MAPPER.createArrayNode(); listNode.add(node); node = listNode; } for (JsonNode item: node) { StringBuilder buffer = new StringBuilder(); printObjectAsCsv(buffer, item, fields, unquoted); printOut(buffer.length() > 0 ? buffer.substring(1) : ""); } } static void printObjectAsCsv(StringBuilder out, JsonNode node, boolean unquoted) { printObjectAsCsv(out, node, null, unquoted); } static void printObjectAsCsv(StringBuilder out, JsonNode node, ReturnFields fields, boolean unquoted) { if (node.isObject()) { if (fields == null) { Iterator<Map.Entry<String, JsonNode>> it = node.fields(); while (it.hasNext()) { printObjectAsCsv(out, it.next().getValue(), unquoted); } } else { Iterator<String> it = fields.iterator(); while (it.hasNext()) { String field = it.next(); JsonNode attr = node.get(field); printObjectAsCsv(out, attr, fields.child(field), unquoted); } } } else if (node.isArray()) { for (JsonNode item: node) { printObjectAsCsv(out, item, fields, unquoted); } } else if (node != null) { out.append(","); if (unquoted && node instanceof TextNode) { out.append(node.asText()); } else { out.append(node.toString()); } } } }