com.leanengine.JsonEncode.java Source code

Java tutorial

Introduction

Here is the source code for com.leanengine.JsonEncode.java

Source

/*
 * This software is released under the GNU Lesser General Public License v3.
 * For more information see http://www.gnu.org/licenses/lgpl.html
 *
 * Copyright (c) 2011, Peter Knego & Matjaz Tercelj
 * All rights reserved.
 */

package com.leanengine;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Internal utility class for encoding REST messages.
 */
public class JsonEncode {

    static JSONObject entityToJson(LeanEntity entity) throws LeanException {
        try {
            JSONObject json = new JSONObject();
            if (entity.id != null)
                json.put("_id", entity.id);
            json.put("_kind", entity.kind);
            // no need to put in '_account` as this is automatically set on server from current users accountID
            for (Map.Entry<String, Object> prop : entity.properties.entrySet()) {
                addTypedNode(json, prop.getKey(), prop.getValue());
            }
            return json;
        } catch (JSONException e) {
            // this should not happen under normal circumstances
            throw new IllegalStateException(e);
        }
    }

    static JSONObject entityListToJson(List<LeanEntity> entityList) throws LeanException {
        JSONObject rootNode = new JSONObject();
        JSONArray resultsArray = new JSONArray();

        for (LeanEntity entity : entityList) {
            resultsArray.put(entityToJson(entity));
        }
        try {
            rootNode.put("result", resultsArray);
        } catch (JSONException e) {
            // this should not happen under normal circumstances
            throw new IllegalStateException(e);
        }
        return rootNode;
    }

    static JSONObject queryToJson(LeanQuery query) throws LeanException {
        JSONObject json = new JSONObject();
        try {
            json.put("kind", query.getKind());
            JSONObject jsonFilters = new JSONObject();
            for (QueryFilter filter : query.getFilters()) {
                JSONObject jsonFilter;
                if (jsonFilters.has(filter.getProperty())) {
                    jsonFilter = jsonFilters.getJSONObject(filter.getProperty());
                } else {
                    jsonFilter = new JSONObject();
                }
                addTypedNode(jsonFilter, filter.getOperator().toJSON(), filter.getValue());
                jsonFilters.put(filter.getProperty(), jsonFilter);
            }
            json.put("filter", jsonFilters);

            JSONObject jsonSorts = new JSONObject();
            for (QuerySort sort : query.getSorts()) {
                jsonSorts.put(sort.getProperty(), sort.getDirection().toJSON());
            }
            json.put("sort", jsonSorts);

            json.put("limit", query.getLimit());
            if (query.getOffset() != 0)
                json.put("offset", query.getOffset());
            if (query.getCursor() != null)
                json.put("cursor", query.getCursor());

            return json;
        } catch (JSONException e) {
            // this should not happen under normal circumstances
            throw new IllegalStateException(e);
        }
    }

    static void addTypedNode(JSONObject node, String key, Object value) throws LeanException, JSONException {
        if (value instanceof List) {
            List list = (List) value;
            JSONArray arrayNode = new JSONArray();
            for (Object listItem : list) {
                addTypedValueToArray(arrayNode, listItem);
            }
            node.put(key, arrayNode);
        } else {
            addTypedValue(node, key, value);
        }
    }

    private static void addTypedValueToArray(JSONArray node, Object value) throws JSONException {
        if (value instanceof Date) {
            node.put(getDateNode((Date) value));
        } else if (value instanceof LeanText) {
            node.put(getLeanTextNode((LeanText) value));
        } else {
            node.put(value);
        }
    }

    private static void addTypedValue(JSONObject node, String key, Object value) throws JSONException {
        if (value instanceof Date) {
            node.put(key, getDateNode((Date) value));
        } else if (value instanceof LeanText) {
            node.put(key, getLeanTextNode((LeanText) value));
        } else {
            node.put(key, value);
        }
    }

    private static JSONObject getDateNode(Date date) throws JSONException {
        JSONObject dateNode = new JSONObject();
        dateNode.put("type", "date");
        dateNode.put("value", date.getTime());
        return dateNode;
    }

    private static JSONObject getLeanTextNode(LeanText text) throws JSONException {
        JSONObject dateNode = new JSONObject();
        dateNode.put("type", "text");
        dateNode.put("value", text.getValue());
        return dateNode;
    }
}