/* * Copyright 2014 Red Hat, Inc. and/or its affiliates. * * 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.dashbuilder.common.client; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import org.dashbuilder.json.JsonArray; import org.dashbuilder.json.JsonObject; import org.dashbuilder.json.JsonString; import org.dashbuilder.json.JsonValue; public class JsonSourceViewer extends Composite { private final static String INDENT = " "; public FlexTable table; public JsonSourceViewer() { this.table = new FlexTable(); initWidget( table ); } public void setContent(JsonObject jsonSource) { clearContent(); String jsonSourceString = formatJsonObjectAsString(jsonSource, ""); final String[] rows = jsonSourceString.split( "\n" ); for ( int i = 0; i < rows.length; i++ ) { String escaped = replaceLeadingWhitespaces( rows [ i ] ); table.setHTML( i, 0, escaped ); } } private String replaceLeadingWhitespaces( String text ) { String s = text.trim(); if ( s.length() == 0) return ""; StringBuilder sb = new StringBuilder(""); int i = 0; while ( ' ' == text.charAt( i ) ) { sb.append( " " ); i++; } sb.append(text.substring(i)); return sb.toString(); } private void clearContent() { table.removeAllRows(); } private String formatJsonValueAsString(JsonValue jsonValue, String indent) { if (jsonValue == null) { return ""; } if (jsonValue instanceof JsonObject) { return formatJsonObjectAsString((JsonObject) jsonValue, indent); } else if (jsonValue instanceof JsonArray) { return formatJsonArrayAsString((JsonArray) jsonValue, indent); } else if (jsonValue instanceof JsonString) { return "\"" + ((JsonString) jsonValue).getString() + "\""; } else { return jsonValue.asString(); } } private String formatJsonObjectAsString(JsonObject jsonObject, String indent) { if ( jsonObject == null ) return ""; String newIndent = indent + INDENT; StringBuilder sb = new StringBuilder( "{" ); String[] keys = jsonObject.keys(); for ( int i = 0; i < keys.length; i++ ) { sb.append("\n"); sb.append(newIndent).append("\"").append(keys[i]).append("\"").append(": "); sb.append(newIndent).append(formatJsonValueAsString(jsonObject.get(keys[i]), newIndent)); sb.append(i == keys.length - 1 ? "" : ",").append("\n"); } sb.append(indent).append("}"); return sb.toString(); } private String formatJsonArrayAsString(JsonArray jsonArray, String indent) { if (jsonArray == null) { return ""; } String newIndent = indent + INDENT; StringBuilder sb = new StringBuilder("["); for (int i = 0; i < jsonArray.length(); i++) { sb.append("\n"); sb.append(newIndent ).append(formatJsonValueAsString(jsonArray.get(i), newIndent )); sb.append(i == jsonArray.length() - 1 ? "\n" : ", "); } sb.append(indent).append("]"); return sb.toString(); } }