/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri Inc. 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 com.esri.gpt.server.usage.common; import java.io.Writer; import java.sql.ResultSet; import com.esri.gpt.control.rest.writer.JsonResultSetWriter; import com.esri.gpt.framework.util.Val; import com.esri.gpt.server.usage.api.IStatisticsWriter; /** * This is class is used to write json response. * */ public class JSONWriter extends JsonResultSetWriter implements IStatisticsWriter { // class variables // ============================================================= // instance variables // ========================================================== private StringBuilder sb; // constructors // ================================================================ public JSONWriter(Writer underlyingWriter, StringBuilder sb) { super(underlyingWriter); this.sb = sb; } // properties // ================================================================== // methods // ================================================================== /** * Adding spaces for pretty print. * * @param depth */ private void addSpaces(int depth) { if (depth == 0) { sb.append(getNewline()); } else { sb.append(getNewline()).append(makeTabs(depth)); } } /** * Serializes key value pair to json object. * * @param key * the key * @param value * the value * @param hasMore * true if has more elements in an JSON array * @param isNumber * true if value is number. */ @Override public void writeElement(String key, String value, boolean hasMore, boolean isNumber) { String element = "\"" + key + "\":"; if (isNumber) { element += value; } else { element += "\"" + value + "\""; } if (hasMore) { element += ","; } sb.append(element); } /** * Serializes key value pair to json object. * * @param name * the name * @param value * the value */ @Override public void writeElement(String name, String value) throws Exception { writeElement(name, value, false, false); } /** * This method is used to serialize resultset rows as json. * * @param tableName * the tableName for which rows are serialized * @param rs * the resultset * @param columnTags * the column names */ @Override public void writeResultSet(String tableName, ResultSet rs, String[] columnTags) throws Exception { sb.append("\"" + tableName + "\":{"); addSpaces(4); sb.append("\"rows\":["); addSpaces(5); boolean firstRow = true; while (rs.next()) { if (!firstRow) { sb.append(","); addSpaces(5); } sb.append("{"); int cnt = 0; for (String column : columnTags) { addSpaces(6); String value = rs.getString(column); if (cnt == columnTags.length - 1) { sb.append("\"" + column + "\":\"" + Val.escapeStrForJson(value) + "\""); } else { sb.append("\"" + column + "\":\"" + Val.escapeStrForJson(value) + "\","); } cnt++; } addSpaces(5); sb.append("}"); firstRow = false; } addSpaces(4); sb.append("]}"); } }