All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.automatiko.engine.codegen.json.JsonUtils Maven / Gradle / Ivy

The newest version!

package io.automatiko.engine.codegen.json;

import java.util.Iterator;
import java.util.Map;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.BooleanNode;
import com.fasterxml.jackson.databind.node.IntNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.TextNode;
import com.fasterxml.jackson.databind.node.ValueNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JsonUtils {
	/*
	 * see
	 * https://stackoverflow.com/questions/9895041/merging-two-json-documents-using-
	 * jackson for alternative approaches to merge
	 */
	private JsonUtils() {
	}

	private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);

	/**
	 * Merge two JSON documents.
	 * 
	 * @param src    JsonNode to be merged
	 * @param target JsonNode to merge to
	 */
	public static void merge(JsonNode src, JsonNode target) {
		Iterator> fields = src.fields();
		while (fields.hasNext()) {
			Map.Entry entry = fields.next();
			JsonNode subNode = entry.getValue();
			switch (subNode.getNodeType()) {
			case OBJECT:
				writeObject(entry, target);
				break;
			case ARRAY:
				writeArray(entry, target);
				break;
			case STRING:
				updateObject(target, new TextNode(entry.getValue().textValue()), entry);
				break;
			case NUMBER:
				updateObject(target, new IntNode(entry.getValue().intValue()), entry);
				break;
			case BOOLEAN:
				updateObject(target, BooleanNode.valueOf(entry.getValue().booleanValue()), entry);
				break;
			default:
				logger.warn("Unrecognized data type {} " + subNode.getNodeType());
			}
		}
	}

	private static void writeObject(Map.Entry srcEntry, JsonNode target) {
		boolean isNewBlock = true;
		Iterator> mergedIterator = target.fields();
		while (mergedIterator.hasNext()) {
			Map.Entry entry = mergedIterator.next();
			if (entry.getKey().equals(srcEntry.getKey())) {
				merge(srcEntry.getValue(), entry.getValue());
				isNewBlock = false;
			}
		}
		if (isNewBlock) {
			((ObjectNode) target).replace(srcEntry.getKey(), srcEntry.getValue());
		}
	}

	private static void writeArray(Map.Entry srcEntry, JsonNode target) {
		boolean newEntry = true;
		Iterator> mergedIterator = target.fields();
		while (mergedIterator.hasNext()) {
			Map.Entry entry = mergedIterator.next();
			if (entry.getKey().equals(srcEntry.getKey())) {
				entry.setValue(srcEntry.getValue());
				newEntry = false;
			}
		}
		if (newEntry) {
			((ObjectNode) target).replace(srcEntry.getKey(), srcEntry.getValue());
		}
	}

	private static void updateObject(JsonNode target, ValueNode value, Map.Entry src) {
		boolean newEntry = true;
		Iterator> iter = target.fields();
		while (iter.hasNext()) {
			Map.Entry entry = iter.next();
			if (entry.getKey().equals(src.getKey())) {
				newEntry = false;
				entry.setValue(value);
			}
		}
		if (newEntry) {
			((ObjectNode) target).replace(src.getKey(), src.getValue());
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy