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

org.javers.repository.mongo.DocumentConverter Maven / Gradle / Ivy

package org.javers.repository.mongo;

import com.google.gson.*;
import org.bson.Document;
import org.bson.types.ObjectId;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author bartosz.walacik
 */
class DocumentConverter {
    static Document toDocument(JsonObject jsonObject) {
        Document document = new Document();

        for(Map.Entry e : jsonObject.entrySet()) {
            document.append(e.getKey(), fromJsonElement(e.getValue()));
        }
        return document;
    }

    static JsonElement fromDocument(Document document) {
        JsonObject jsonObject = new JsonObject();
        for(Map.Entry e : document.entrySet()) {
            jsonObject.add(e.getKey(), createJsonElement(e.getValue()) );
        }
        return jsonObject;
    }

    private static Object fromJsonElement(JsonElement jsonElement) {
        if (jsonElement == JsonNull.INSTANCE) {
            return null;
        }

        if (jsonElement instanceof JsonObject) {
            return toDocument((JsonObject) jsonElement);
        }

        if (jsonElement instanceof JsonPrimitive) {
            JsonPrimitive jsonPrimitive = (JsonPrimitive) jsonElement;

            if (jsonPrimitive.isString()) {
                return jsonElement.getAsString();
            }

            if (jsonPrimitive.isNumber() && jsonElement.getAsNumber() instanceof BigDecimal) {
                BigDecimal value = ((BigDecimal) jsonElement.getAsNumber());
                try {
                    return value.longValueExact();
                } catch (ArithmeticException e){
                    return value.doubleValue();
                }
            }

            if (jsonPrimitive.isNumber()) {
                return jsonElement.getAsNumber();
            }

            if (jsonPrimitive.isBoolean()) {
                return jsonElement.getAsBoolean();
            }
        }

        if (jsonElement instanceof JsonArray) {
            List list = new ArrayList();
            for (JsonElement e : ((JsonArray)jsonElement)) {
                list.add(fromJsonElement(e));
            }
            return list;
        }

        throw new IllegalArgumentException("unsupported JsonElement type - " + jsonElement.getClass().getSimpleName());
    }

    private static JsonElement createJsonElement(Object dbObject) {
        if (dbObject == null) {
            return JsonNull.INSTANCE;
        }

        if (dbObject instanceof Document) {
            return fromDocument((Document) dbObject);
        }

        if (dbObject instanceof String) {
            return new JsonPrimitive((String)dbObject);
        }

        if (dbObject instanceof Number) {
            return new JsonPrimitive((Number)dbObject);
        }

        if (dbObject instanceof Boolean) {
            return new JsonPrimitive((Boolean) dbObject);
        }

        if (dbObject instanceof List) {
            JsonArray array = new JsonArray();
            for (Object e : (List) dbObject) {
                array.add(createJsonElement(e));
            }
            return array;
        }

        if (dbObject instanceof ObjectId) {
            JsonObject id = new JsonObject();
            id.addProperty("$oid",dbObject.toString());
            return id;
        }

        throw new IllegalArgumentException("unsupported dbObject type - " + dbObject.getClass().getSimpleName());
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy