/**
*
* 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.airavata.common.utils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import com.google.gson.stream.JsonReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Map;
import java.util.Set;
public class JSONUtil {
public static void saveJSON(JsonElement jsonElement, File file) throws IOException {
IOUtil.writeToFile(jsonElementToString(jsonElement), file);
}
public static JsonObject stringToJSONObject(String workflowString) {
JsonParser parser = new JsonParser();
return (JsonObject) parser.parse(workflowString);
}
public static JsonObject loadJSON(File file) throws IOException {
return loadJSON(new FileReader(file));
}
public static JsonObject loadJSON(Reader reader) throws IOException {
JsonParser parser = new JsonParser();
JsonElement jsonElement = parser.parse(reader);
if (jsonElement instanceof JsonObject) {
return (JsonObject) jsonElement;
} else {
throw new RuntimeException("Error while loading Json from file");
}
}
public static String jsonElementToString(JsonElement jsonElement) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
return gson.toJson(jsonElement);
}
public static boolean isEqual(JsonObject originalJsonObject, JsonObject newJsonObject) {
// TODO - Implement this method
if (originalJsonObject == null && newJsonObject == null) {
return true;
}else if (originalJsonObject == null || newJsonObject == null) {
return false;
} else {
// check the number of childs
Set<Map.Entry<String , JsonElement>> entrySetOfOriginalJson = originalJsonObject.entrySet();
Set<Map.Entry<String , JsonElement>> entrySetOfNewJson = newJsonObject.entrySet();
if (entrySetOfOriginalJson.size() != entrySetOfNewJson.size()) {
return false;
}
for (Map.Entry<String, JsonElement> keyString : entrySetOfOriginalJson) {
JsonElement valueOrig = keyString.getValue();
JsonElement valueNew = newJsonObject.get(keyString.getKey());
if (valueOrig instanceof JsonObject && valueNew instanceof JsonObject &&
!isEqual((JsonObject) valueOrig, (JsonObject) valueNew)) {
return false;
}else if (valueOrig instanceof JsonArray && valueNew instanceof JsonArray &&
!isEqual((JsonArray) valueOrig, (JsonArray) valueNew)) {
return false;
}else if (valueOrig instanceof JsonPrimitive && valueNew instanceof JsonPrimitive &&
!isEqual((JsonPrimitive) valueOrig, (JsonPrimitive) valueNew)) {
return false;
}
}
}
return true;
}
private static boolean isEqual(JsonArray arrayOriginal, JsonArray arrayNew) {
if (arrayOriginal == null && arrayNew == null) {
return true;
}else if (arrayOriginal == null || arrayNew == null) {
return false;
}else {
// check the number of element
if (arrayOriginal.size() != arrayNew.size()) {
return false;
}else if (arrayOriginal.size() == 0) {
return true;
} else {
for (int i = 0; i < arrayOriginal.size(); i++) {
JsonElement valueOrig = arrayOriginal.get(i);
JsonElement valueNew = arrayNew.get(i);
if (valueOrig instanceof JsonObject && valueNew instanceof JsonObject) {
if (!isEqual((JsonObject) valueOrig, (JsonObject) valueNew)) {
return false;
}
}else if (valueOrig instanceof JsonPrimitive && valueNew instanceof JsonPrimitive) {
if (!isEqual((JsonPrimitive) valueOrig, (JsonPrimitive) valueNew)) {
return false;
}
}
}
}
}
return true;
}
private static boolean isEqual(JsonPrimitive primitiveOrig, JsonPrimitive primitiveNew) {
if (primitiveOrig == null && primitiveNew == null) {
return true;
}else if (primitiveOrig == null || primitiveNew == null) {
return false;
} else {
if (primitiveOrig.isString() && primitiveNew.isString()){
if(!primitiveOrig.getAsString().equals(primitiveNew.getAsString())) {
return false;
}
}else if (primitiveOrig.isBoolean() && primitiveNew.isBoolean()) {
if ((Boolean.valueOf(primitiveOrig.getAsBoolean()).compareTo(primitiveNew.getAsBoolean()) != 0)) {
return false;
}
}else if (primitiveOrig.isNumber() && primitiveNew.isNumber() ) {
if (new Double(primitiveOrig.getAsDouble()).compareTo(primitiveNew.getAsDouble()) != 0) {
return false;
}
}else {
return primitiveOrig.isJsonNull() && primitiveNew.isJsonNull();
}
}
return true;
}
}