blob: 62a4485632788248a51ee6ded46eb5a7f4320a94 [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.geode.rest.internal.web.util;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
import org.springframework.hateoas.Link;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.CollectionUtils;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.query.Struct;
import org.apache.geode.cache.query.internal.StructImpl;
import org.apache.geode.pdx.PdxInstance;
import org.apache.geode.pdx.internal.EnumInfo;
import org.apache.geode.pdx.internal.EnumInfo.PdxInstanceEnumInfo;
/**
* The JsonWriter class is an utility to write various java types as a JSON string.
* <p/>
*
* @since GemFire 8.0
*/
public class JsonWriter {
public static void writeLinkAsJson(JsonGenerator generator, Link value, String pdxField)
throws JsonGenerationException, IOException {
generator.writeArrayFieldStart("links");
generator.writeStartObject();
generator.writeFieldName("rel");
generator.writeString(value.getRel());
generator.writeFieldName("href");
generator.writeString(value.getHref());
generator.writeFieldName("type");
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON);
List<Charset> arg = new ArrayList<Charset>();
arg.add(Charset.defaultCharset());
header.setAcceptCharset(arg);
generator.writeString(
header.getContentType() + ", charset=" + header.getAcceptCharset().get(0).displayName());
generator.writeEndObject();
generator.writeEndArray();
}
public static void writeQueryListAsJson(JsonGenerator generator, String pdxField,
Region<String, String> region) throws JsonGenerationException, IOException {
generator.writeStartObject();
generator.writeFieldName(pdxField);
generator.writeStartArray();
for (Map.Entry<String, String> entry : region.entrySet()) {
generator.writeStartObject();
generator.writeFieldName("id");
generator.writeString(entry.getKey());
generator.writeFieldName("oql");
generator.writeString(entry.getValue());
generator.writeEndObject();
}
generator.writeEndArray();
generator.writeEndObject();
}
public static void writeQueryAsJson(JsonGenerator generator, String queryId, String query)
throws JsonGenerationException, IOException {
generator.writeStartObject();
generator.writeFieldName("id");
generator.writeString(queryId);
generator.writeFieldName("oql");
generator.writeString(query);
generator.writeEndObject();
}
public static void writeListAsJson(JsonGenerator generator, Map map, String name,
String fieldName) throws JsonGenerationException, IOException {
generator.writeStartObject();
generator.writeFieldName(name);
// introspect the Map and write its value into desired format
generator.writeStartArray();
Iterator iter = (Iterator) map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
generator.writeStartObject();
// Iterate over Map and write key-value
generator.writeFieldName(fieldName);
generator.writeString(entry.getKey().toString());
writeValueAsJson(generator, entry.getValue(), name);
generator.writeEndObject();
}
generator.writeEndArray();
generator.writeEndObject();
}
public static void writeCollectionAsJson(JsonGenerator generator, /* List */ Collection<?> coll)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (Object obj : coll) {
writeValueAsJson(generator, obj, null);
}
generator.writeEndArray();
}
public static void writeStructAsJson(JsonGenerator generator, StructImpl element)
throws JsonGenerationException, IOException {
generator.writeStartObject();
String[] fieldNames = element.getFieldNames();
for (int fieldNamesIndex = 0; fieldNamesIndex < fieldNames.length; fieldNamesIndex++) {
// Iterate over Map and write key-value
generator.writeFieldName(fieldNames[fieldNamesIndex]); // write Key in a Map
Object value = element.get(fieldNames[fieldNamesIndex]);
writeValueAsJson(generator, value, null); // write value in a Map
}
generator.writeEndObject();
}
public static String writePdxInstanceAsJson(JsonGenerator generator, PdxInstance pdxInstance)
throws JsonGenerationException, IOException {
generator.writeStartObject();
List<String> pdxFields = pdxInstance.getFieldNames();
for (String pdxField : pdxFields) {
Object value = pdxInstance.getField(pdxField);
generator.writeFieldName(pdxField);
writeValueAsJson(generator, value, pdxField);
}
generator.writeEndObject();
return null;
}
public static void writeArrayAsJson(JsonGenerator generator, Object value, String pdxField)
throws JsonGenerationException, IOException {
if (value.getClass().getName().equals("[Z")) {
writePrimitiveBoolArrayAsJson(generator, (boolean[]) value);
} else if (value.getClass().getName().equals("[B")) {
writePrimitiveByteArrayAsJson(generator, (byte[]) value);
} else if (value.getClass().getName().equals("[S")) {
writePrimitiveShortArrayAsJson(generator, (short[]) value);
} else if (value.getClass().getName().equals("[I")) {
writePrimitiveIntArrayAsJson(generator, (int[]) value);
} else if (value.getClass().getName().equals("[J")) {
writePrimitiveLongArrayAsJson(generator, (long[]) value);
} else if (value.getClass().getName().equals("[F")) {
writePrimitiveFloatArrayAsJson(generator, (float[]) value);
} else if (value.getClass().getName().equals("[D")) {
writePrimitiveDoubleArrayAsJson(generator, (double[]) value);
} else if (value.getClass().equals(Boolean[].class)) {
writeWrapperBoolArrayAsJson(generator, (Boolean[]) value);
} else if (value.getClass().equals(Byte[].class)) {
writeWrapperByteArrayAsJson(generator, (Byte[]) value);
} else if (value.getClass().equals(Short[].class)) {
writeWrapperShortArrayAsJson(generator, (Short[]) value);
} else if (value.getClass().equals(Integer[].class)) {
writeWrapperIntArrayAsJson(generator, (Integer[]) value);
} else if (value.getClass().equals(Long[].class)) {
writeWrapperLongArrayAsJson(generator, (Long[]) value);
} else if (value.getClass().equals(Float[].class)) {
writeWrapperFloatArrayAsJson(generator, (Float[]) value);
} else if (value.getClass().equals(Double[].class)) {
writeWrapperDoubleArrayAsJson(generator, (Double[]) value);
} else if (value.getClass().equals(BigInteger[].class)) {
writeBigIntArrayAsJson(generator, (BigInteger[]) value);
} else if (value.getClass().equals(BigDecimal[].class)) {
writeBigDecimalArrayAsJson(generator, (BigDecimal[]) value);
} else if (value.getClass().equals(String[].class)) {
writeStringArrayAsJson(generator, (String[]) value);
} else if (value.getClass().equals(Object[].class)) {
writeObjectArrayAsJson(generator, (Object[]) value, pdxField);
} else {
throw new IllegalStateException(
"PdxInstance returns unknwon pdxfield " + pdxField + " for type " + value);
}
}
public static void writePrimitiveBoolArrayAsJson(JsonGenerator generator, boolean[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (boolean obj : array) {
generator.writeBoolean(obj);
}
generator.writeEndArray();
}
public static void writePrimitiveByteArrayAsJson(JsonGenerator generator, byte[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (byte obj : array) {
generator.writeNumber(obj);
}
generator.writeEndArray();
}
public static void writePrimitiveShortArrayAsJson(JsonGenerator generator, short[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (short obj : array) {
generator.writeNumber(obj);
}
generator.writeEndArray();
}
public static void writePrimitiveIntArrayAsJson(JsonGenerator generator, int[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (int obj : array) {
generator.writeNumber(obj);
}
generator.writeEndArray();
}
public static void writePrimitiveLongArrayAsJson(JsonGenerator generator, long[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (long obj : array) {
generator.writeNumber(obj);
}
generator.writeEndArray();
}
public static void writePrimitiveFloatArrayAsJson(JsonGenerator generator, float[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (float obj : array) {
generator.writeNumber(obj);
}
generator.writeEndArray();
}
public static void writePrimitiveDoubleArrayAsJson(JsonGenerator generator, double[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (double obj : array) {
generator.writeNumber(obj);
}
generator.writeEndArray();
}
public static void writeWrapperBoolArrayAsJson(JsonGenerator generator, Boolean[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (Boolean obj : array) {
generator.writeBoolean(obj.booleanValue());
}
generator.writeEndArray();
}
public static void writeWrapperByteArrayAsJson(JsonGenerator generator, Byte[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (Byte obj : array) {
generator.writeNumber(obj.byteValue());
}
generator.writeEndArray();
}
public static void writeWrapperShortArrayAsJson(JsonGenerator generator, Short[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (Short obj : array) {
generator.writeNumber(obj.shortValue());
}
generator.writeEndArray();
}
public static void writeWrapperIntArrayAsJson(JsonGenerator generator, Integer[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (Integer obj : array) {
generator.writeNumber(obj.intValue());
}
generator.writeEndArray();
}
public static void writeWrapperLongArrayAsJson(JsonGenerator generator, Long[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (Long obj : array) {
generator.writeNumber(obj.longValue());
}
generator.writeEndArray();
}
public static void writeWrapperFloatArrayAsJson(JsonGenerator generator, Float[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (Float obj : array) {
generator.writeNumber(obj.floatValue());
}
generator.writeEndArray();
}
public static void writeWrapperDoubleArrayAsJson(JsonGenerator generator, Double[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (Double obj : array) {
generator.writeNumber(obj.doubleValue());
}
generator.writeEndArray();
}
public static void writeBigIntArrayAsJson(JsonGenerator generator, BigInteger[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (BigInteger obj : array) {
generator.writeNumber(obj);
}
generator.writeEndArray();
}
public static void writeBigDecimalArrayAsJson(JsonGenerator generator, BigDecimal[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (BigDecimal obj : array) {
generator.writeNumber(obj);
}
generator.writeEndArray();
}
public static void writeStringArrayAsJson(JsonGenerator generator, String[] array)
throws JsonGenerationException, IOException {
generator.writeStartArray();
for (String obj : array) {
generator.writeString(obj);
}
generator.writeEndArray();
}
public static void writeObjectArrayAsJson(JsonGenerator generator, Object[] array,
String pdxField) throws JsonGenerationException, IOException {
generator.writeStartArray();
if (ArrayUtils.isNotEmpty(array)) {
for (Object obj : array) {
writeValueAsJson(generator, obj, pdxField);
}
}
generator.writeEndArray();
}
public static void writeRegionDetailsAsJson(JsonGenerator generator, Region<?, ?> region)
throws JsonGenerationException, IOException {
generator.writeStartObject();
generator.writeFieldName("name");
generator.writeString(region.getName());
generator.writeFieldName("type");
if (region.getAttributes().getDataPolicy() != null) {
generator.writeString(region.getAttributes().getDataPolicy().toString());
} else {
generator.writeNull();
}
generator.writeFieldName("key-constraint");
if (region.getAttributes().getKeyConstraint() != null) {
generator.writeString(region.getAttributes().getKeyConstraint().getName());
} else {
generator.writeNull();
}
generator.writeFieldName("value-constraint");
if (region.getAttributes().getValueConstraint() != null) {
generator.writeString(region.getAttributes().getValueConstraint().getName());
} else {
generator.writeNull();
}
generator.writeEndObject();
}
public static void writeRegionSetAsJson(JsonGenerator generator, Set<Region<?, ?>> regions)
throws JsonGenerationException, IOException {
generator.writeStartArray();
if (!CollectionUtils.isEmpty(regions)) {
for (final Region<?, ?> region : regions) {
writeRegionDetailsAsJson(generator, region);
}
}
generator.writeEndArray();
}
public static void writeMapAsJson(JsonGenerator generator, Map map, String pdxField)
throws JsonGenerationException, IOException {
generator.writeStartObject();
Iterator iter = (Iterator) map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
// Iterate over Map and write key-value
generator.writeFieldName(entry.getKey().toString()); // write Key in a Map
writeValueAsJson(generator, entry.getValue(), pdxField); // write value in a Map
}
generator.writeEndObject();
}
public static void writeValueAsJson(JsonGenerator generator, Object value, String pdxField)
throws JsonGenerationException, IOException {
if (value == null) {
generator.writeNull();
} else if (value.getClass().equals(Boolean.class)) {
boolean b = (Boolean) value;
generator.writeBoolean(b);
} else if (value.getClass().equals(Byte.class)) {
Byte b = (Byte) value;
generator.writeNumber(b);
} else if (value.getClass().equals(Short.class)) {
Short b = (Short) value;
generator.writeNumber(b);
} else if (value.getClass().equals(Integer.class)) {
int i = (Integer) value;
generator.writeNumber(i);
} else if (value.getClass().equals(Long.class)) {
long i = (Long) value;
generator.writeNumber(i);
} else if (value.getClass().equals(BigInteger.class)) {
BigInteger i = (BigInteger) value;
generator.writeNumber(i);
} else if (value.getClass().equals(Float.class)) {
float i = (Float) value;
generator.writeNumber(i);
} else if (value.getClass().equals(BigDecimal.class)) {
BigDecimal i = (BigDecimal) value;
generator.writeNumber(i);
} else if (value.getClass().equals(Double.class)) {
double d = (Double) value;
generator.writeNumber(d);
} else if (value.getClass().equals(String.class)) {
String s = (String) value;
generator.writeString(s);
} else if (value.getClass().isArray()) {
writeArrayAsJson(generator, value, pdxField);
} else if (value.getClass().equals(Link.class)) {
writeLinkAsJson(generator, (Link) value, pdxField);
// } else if (value.getClass().equals(Date.class)) {
// generator.writeObject((Date) value);
} else if (value.getClass().equals(EnumInfo.class)) {
/*
* try { generator.writeString(((EnumInfo)value).getEnum().name()); } catch
* (ClassNotFoundException e) { throw new
* IllegalStateException("PdxInstance returns unknwon pdxfield " + pdxField + " for type " +
* value); }
*/
generator.writeString(value.toString());
} else if (value.getClass().equals(PdxInstanceEnumInfo.class)) {
generator.writeString(value.toString());
} else {
if (value instanceof Struct) {
writeStructAsJson(generator, (StructImpl) value);
} else if (value instanceof PdxInstance) {
writePdxInstanceAsJson(generator, (PdxInstance) value);
} else if (value instanceof Collection) {
writeCollectionAsJson(generator, (Collection<?>) value);
} else if (value instanceof Map) {
writeMapAsJson(generator, (Map) value, pdxField);
} else {
generator.writeObject(value);
}
}
}
}