com.almende.eve.rpc.jsonrpc.JSONRequest.java Source code

Java tutorial

Introduction

Here is the source code for com.almende.eve.rpc.jsonrpc.JSONRequest.java

Source

/*
 * Copyright: Almende B.V. (2014), Rotterdam, The Netherlands
 * License: The Apache Software License, Version 2.0
 */
package com.almende.eve.rpc.jsonrpc;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.almende.eve.rpc.jsonrpc.jackson.JOM;
import com.almende.util.uuid.UUID;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

/**
 * The Class JSONRequest.
 */
public final class JSONRequest extends JSONMessage {
    private static final Logger LOG = Logger.getLogger(JSONRequest.class.getCanonicalName());
    private static final long serialVersionUID = 1970046457233622444L;
    private ObjectNode req = JOM.createObjectNode();

    /**
     * Instantiates a new jSON request.
     */
    public JSONRequest() {
        init(null, null, null);
    }

    /**
     * Instantiates a new jSON request.
     *
     * @param json the json
     * @throws JSONRPCException the jSONRPC exception
     * @throws IOException Signals that an I/O exception has occurred.
     */
    public JSONRequest(final String json) throws JSONRPCException, IOException {
        final ObjectMapper mapper = JOM.getInstance();
        init(mapper.readTree(json));
    }

    /**
     * Instantiates a new jSON request.
     *
     * @param request the request
     * @throws JSONRPCException the jSONRPC exception
     */
    public JSONRequest(final JsonNode request) throws JSONRPCException {
        init(request);
    }

    /**
     * Inits the.
     *
     * @param request the request
     * @throws JSONRPCException the jSONRPC exception
     */
    public void init(final JsonNode request) throws JSONRPCException {
        if (request == null || request.isNull()) {
            throw new JSONRPCException(JSONRPCException.CODE.INVALID_REQUEST, "Request is null");
        }
        if (request.has(JSONRPC) && request.get(JSONRPC).isTextual()
                && !request.get(JSONRPC).asText().equals(VERSION)) {
            throw new JSONRPCException(JSONRPCException.CODE.INVALID_REQUEST,
                    "Value of member 'jsonrpc' is not equal to '2.0'");
        }
        if (!request.has(METHOD)) {
            throw new JSONRPCException(JSONRPCException.CODE.INVALID_REQUEST, "Member 'method' missing in request");
        }
        if (!(request.get(METHOD).isTextual())) {
            throw new JSONRPCException(JSONRPCException.CODE.INVALID_REQUEST, "Member 'method' is no String");
        }
        if (request.has(PARAMS) && !(request.get(PARAMS).isObject())) {
            throw new JSONRPCException(JSONRPCException.CODE.INVALID_REQUEST, "Member 'params' is no ObjectNode");
        }

        init(request.get(ID), request.get(METHOD).asText(), (ObjectNode) request.get(PARAMS));
    }

    /**
     * Instantiates a new jSON request.
     *
     * @param method the method
     * @param params the params
     */
    public JSONRequest(final String method, final ObjectNode params) {
        init(null, method, params);
    }

    /**
     * Instantiates a new jSON request.
     *
     * @param id the id
     * @param method the method
     * @param params the params
     */
    public JSONRequest(final JsonNode id, final String method, final ObjectNode params) {
        init(id, method, params);
    }

    /**
     * Instantiates a new jSON request.
     *
     * @param method the method
     * @param params the params
     * @param callbackUrl the callback url
     * @param callbackMethod the callback method
     */
    public JSONRequest(final String method, final ObjectNode params, final String callbackUrl,
            final String callbackMethod) {
        init(null, method, params);
        setCallback(callbackUrl, callbackMethod);
    }

    /**
     * Instantiates a new jSON request.
     *
     * @param id the id
     * @param method the method
     * @param params the params
     * @param callbackUrl the callback url
     * @param callbackMethod the callback method
     */
    public JSONRequest(final JsonNode id, final String method, final ObjectNode params, final String callbackUrl,
            final String callbackMethod) {
        init(id, method, params);
        setCallback(callbackUrl, callbackMethod);
    }

    /**
     * Inits the.
     *
     * @param id the id
     * @param method the method
     * @param params the params
     */
    private void init(final JsonNode id, final String method, final ObjectNode params) {
        setVersion();
        setId(id);
        setMethod(method);
        setParams(params);
    }

    /**
     * Sets the id.
     *
     * @param id the new id
     */
    public void setId(final JsonNode id) {
        if (id == null || id.isNull()) {
            req.put(ID, new UUID().toString());
        } else {
            req.put(ID, id);
        }
    }

    /* (non-Javadoc)
     * @see com.almende.eve.rpc.jsonrpc.JSONMessage#getId()
     */
    @Override
    public JsonNode getId() {
        return req.get(ID);
    }

    /**
     * Sets the method.
     *
     * @param method the new method
     */
    public void setMethod(final String method) {
        req.put(METHOD, method);
    }

    /**
     * Gets the method.
     *
     * @return the method
     */
    public String getMethod() {
        if (req.has(METHOD)) {
            return req.get(METHOD).asText();
        }
        return null;
    }

    /**
     * Sets the params.
     *
     * @param params the new params
     */
    public void setParams(final ObjectNode params) {
        final ObjectNode newParams = JOM.createObjectNode();
        if (params != null) {
            newParams.setAll(params);
        }
        req.put(PARAMS, newParams);
    }

    /**
     * Gets the params.
     *
     * @return the params
     */
    public ObjectNode getParams() {
        return (ObjectNode) req.get(PARAMS);
    }

    /**
     * Put param.
     *
     * @param name the name
     * @param value the value
     */
    public void putParam(final String name, final Object value) {
        final ObjectMapper mapper = JOM.getInstance();
        req.with(PARAMS).put(name, mapper.convertValue(value, JsonNode.class));
    }

    /**
     * Gets the param.
     *
     * @param name the name
     * @return the param
     */
    public Object getParam(final String name) {
        final ObjectMapper mapper = JOM.getInstance();
        final ObjectNode params = req.with(PARAMS);
        if (params.has(name)) {
            return mapper.convertValue(params.get(name), Object.class);
        }
        return null;
    }

    /**
     * Checks for param.
     *
     * @param name the name
     * @return the object
     */
    public Object hasParam(final String name) {
        return req.get(PARAMS).has(name);
    }

    /**
     * Sets the version.
     */
    private void setVersion() {
        req.put(JSONRPC, VERSION);
    }

    /**
     * Sets the callback.
     *
     * @param url the url
     * @param method the method
     */
    public void setCallback(final String url, final String method) {
        final ObjectNode callback = JOM.createObjectNode();
        callback.put(URL, url);
        callback.put(METHOD, method);
        req.put(CALLBACK, callback);
    }

    /**
     * Gets the callback url.
     *
     * @return the callback url
     */
    public String getCallbackUrl() {
        final JsonNode callback = req.get(CALLBACK);
        if (callback != null && callback.isObject() && callback.has(URL) && callback.get(URL).isTextual()) {
            return callback.get(URL).asText();
        }
        return null;
    }

    /**
     * Gets the callback method.
     *
     * @return the callback method
     */
    public String getCallbackMethod() {
        final JsonNode callback = req.get(CALLBACK);
        if (callback != null && callback.isObject() && callback.has(METHOD) && callback.get(METHOD).isTextual()) {
            return callback.get(METHOD).asText();
        }
        return null;
    }

    /**
     * Checks for callback.
     *
     * @return true, if successful
     */
    public boolean hasCallback() {
        return req.has(CALLBACK);
    }

    /**
     * Gets the object node.
     *
     * @return the object node
     */
    @JsonIgnore
    public ObjectNode getObjectNode() {
        return req;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        final ObjectMapper mapper = JOM.getInstance();
        try {
            return mapper.writeValueAsString(req);
        } catch (final Exception e) {
            LOG.log(Level.WARNING, "", e);
        }
        return null;
    }

    /**
     * Write object.
     *
     * @param out the out
     * @throws IOException Signals that an I/O exception has occurred.
     */
    private void writeObject(final java.io.ObjectOutputStream out) throws IOException {
        final ObjectMapper mapper = new ObjectMapper();
        mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
        mapper.writeValue(out, req);
    }

    /**
     * Read object.
     *
     * @param in the in
     * @throws IOException Signals that an I/O exception has occurred.
     * @throws ClassNotFoundException the class not found exception
     */
    private void readObject(final java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
        final ObjectMapper mapper = new ObjectMapper();
        mapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, false);
        req = mapper.readValue(in, ObjectNode.class);
    }

}