com.gistlabs.mechanize.document.json.node.impl.AbstractJsonNode.java Source code

Java tutorial

Introduction

Here is the source code for com.gistlabs.mechanize.document.json.node.impl.AbstractJsonNode.java

Source

/**
 * Copyright (C) 2012-2014 Gist Labs, LLC. (http://gistlabs.com)
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package com.gistlabs.mechanize.document.json.node.impl;

import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

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

import com.gistlabs.mechanize.document.json.exceptions.JsonArrayException;
import com.gistlabs.mechanize.document.json.exceptions.JsonException;
import com.gistlabs.mechanize.document.json.node.JsonNode;
import com.gistlabs.mechanize.document.node.AbstractNode;
import com.gistlabs.mechanize.util.css_query.NodeSelector;

public abstract class AbstractJsonNode extends AbstractNode implements JsonNode {
    protected final String name;
    protected final JsonNode parent;

    public AbstractJsonNode(final JsonNode parent, final String name) {
        this.parent = parent;
        this.name = name;
    }

    @Override
    public String toString() {
        return String.format("%s(%s)", getName(), join(getAttributeNames(), ","));
    }

    static String join(final Collection<?> s, final String delimiter) {
        StringBuilder builder = new StringBuilder();
        Iterator<?> iter = s.iterator();
        while (iter.hasNext()) {
            builder.append(iter.next());
            if (!iter.hasNext())
                break;
            builder.append(delimiter);
        }
        return builder.toString();
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public JsonNode getParent() {
        return this.parent;
    }

    @Override
    public List<? extends JsonNode> getChildren() {
        return Collections.emptyList();
    }

    @SuppressWarnings("unchecked")
    @Override
    public NodeSelector<JsonNode> buildNodeSelector() {
        return (NodeSelector<JsonNode>) super.buildNodeSelector();
    }

    protected JsonNode factory(final JSONObject node, final String key) {
        try {
            if (!node.has(key))
                return null;

            Object obj = node.get(key);

            if (obj instanceof JSONObject)
                return new ObjectNodeImpl(this, key, (JSONObject) obj);
            else if (obj instanceof JSONArray)
                throw new JsonArrayException("Can't access a single array entry without index", (JSONArray) obj);
            else
                return new AttributeNode(this, key);
        } catch (JSONException e) {
            throw new JsonException(e);
        }
    }

    protected JsonNode factory(final String key, final Object obj, final JSONArray array, final int index) {
        if (obj instanceof JSONObject)
            return new ObjectNodeImpl(this, key, (JSONObject) obj);
        else if (obj instanceof JSONArray)
            return new ArrayNodeImpl(this, key, (JSONArray) obj);//throw new JsonArrayException("Can't access a single array entry without index", (JSONArray)obj);
        else
            return new IndexedAttributeNode(this, key, array, index);
    }
}