/*
* Copyright 2016 MovingBlocks
*
* 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.terasology.rendering.nui.widgets.treeView;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import java.util.Map;
/**
* A utility class that converts a {@link JsonElement} to a {@link JsonTree} and vice versa.
*/
public final class JsonTreeConverter {
private JsonTreeConverter() {
}
/**
* @param json The {@link JsonElement} to be converted to a {@link JsonTree}.
* @return A tree representation of the JSON hierarchy.
*/
public static JsonTree serialize(JsonElement json) {
return serialize(null, json);
}
/**
* @param name The name to be given to this node (if null, is replaced by a default name).
* @param json The {@link JsonElement} to be converted to a {@link JsonTree}.
* @return A tree representation of the JSON hierarchy.
*/
private static JsonTree serialize(String name, JsonElement json) {
if (json.isJsonPrimitive()) {
JsonPrimitive primitive = json.getAsJsonPrimitive();
if (primitive.isBoolean()) {
return new JsonTree(new JsonTreeValue(name, json.getAsBoolean(),
name != null ? JsonTreeValue.Type.KEY_VALUE_PAIR : JsonTreeValue.Type.VALUE));
} else if (primitive.isNumber()) {
return new JsonTree(new JsonTreeValue(name, json.getAsNumber(),
name != null ? JsonTreeValue.Type.KEY_VALUE_PAIR : JsonTreeValue.Type.VALUE));
} else if (primitive.isString()) {
return new JsonTree(new JsonTreeValue(name, json.getAsString(),
name != null ? JsonTreeValue.Type.KEY_VALUE_PAIR : JsonTreeValue.Type.VALUE));
} else {
return new JsonTree(new JsonTreeValue(name, null, name != null ? JsonTreeValue.Type.KEY_VALUE_PAIR : JsonTreeValue.Type.VALUE));
}
} else if (json.isJsonArray()) {
JsonTree tree = new JsonTree(new JsonTreeValue(name, null, JsonTreeValue.Type.ARRAY));
JsonArray array = json.getAsJsonArray();
for (int i = 0; i < array.size(); i++) {
tree.addChild(serialize(array.get(i)));
}
return tree;
} else if (json.isJsonObject()) {
JsonTree tree = new JsonTree(new JsonTreeValue(name, null, JsonTreeValue.Type.OBJECT));
JsonObject object = json.getAsJsonObject();
for (Map.Entry<String, JsonElement> entry : object.entrySet()) {
tree.addChild(serialize(entry.getKey(), entry.getValue()));
}
return tree;
} else {
return new JsonTree(new JsonTreeValue(name, null, JsonTreeValue.Type.NULL));
}
}
/**
* @param tree A tree hierarchy based on a {@link JsonElement} as generated by the serialize() method.
* @return The initial {@link JsonElement} reconstructed from the tree.
*/
public static JsonElement deserialize(Tree<JsonTreeValue> tree) {
JsonTreeValue value = tree.getValue();
if (value.getType() == JsonTreeValue.Type.KEY_VALUE_PAIR || value.getType() == JsonTreeValue.Type.VALUE) {
Object primitive = value.getValue();
if (primitive instanceof Boolean) {
return new JsonPrimitive((Boolean) primitive);
} else if (primitive instanceof Number) {
return new JsonPrimitive((Number) primitive);
} else if (primitive instanceof String) {
return new JsonPrimitive((String) primitive);
} else {
return JsonNull.INSTANCE;
}
} else if (value.getType() == JsonTreeValue.Type.ARRAY) {
JsonArray array = new JsonArray();
for (Tree<JsonTreeValue> child : tree.getChildren()) {
array.add(deserialize(child));
}
return array;
} else if (value.getType() == JsonTreeValue.Type.OBJECT) {
JsonObject object = new JsonObject();
for (Tree<JsonTreeValue> child : tree.getChildren()) {
object.add(child.getValue().getKey(), deserialize(child));
}
return object;
} else {
return JsonNull.INSTANCE;
}
}
}