Package com.almende.eve.transform.rpc.formats

Source Code of com.almende.eve.transform.rpc.formats.JSONRequest

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

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

import com.almende.util.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 IOException
   *             Signals that an I/O exception has occurred.
   */
  public JSONRequest(final String json) throws IOException {
    final ObjectMapper mapper = JOM.getInstance();
    init(mapper.readTree(json));
  }
 
  /**
   * Instantiates a new jSON request.
   *
   * @param request
   *            the request
   */
  public JSONRequest(final JsonNode request) {
    init(request);
  }
 
  /**
   * Inits the.
   *
   * @param request
   *            the request
   */
  public void init(final JsonNode request) {
    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) {
    this.setRequest(true);
    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.transform.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);
  }
 
}
TOP

Related Classes of com.almende.eve.transform.rpc.formats.JSONRequest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.