Package com.caucho.jsmp

Source Code of com.caucho.jsmp.JsmpWriter

/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT.  See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
*   Free Software Foundation, Inc.
*   59 Temple Place, Suite 330
*   Boston, MA 02111-1307  USA
*
* @author Scott Ferguson
*/

package com.caucho.jsmp;

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

import com.caucho.bam.BamError;
import com.caucho.bam.ProtocolException;
import com.caucho.json.JsonOutput;

/**
* JmtpWriteStream writes JMTP packets to an OutputStream.
*/
public class JsmpWriter
{
  private static final Logger log
  = Logger.getLogger(JsmpWriter.class.getName());

  private JsonOutput _out = new JsonOutput();

  public JsmpWriter()
  {
  }

  //
  // message
  //

  /**
   * JMTP unidirectional message
   *
   * <code><pre>
   * ["message",
   *  "to@to-host.com",
   *  "from@from-host.com",
   *  "message-class",
   *  "json-payload"]
   * </pre></code>
   */
  public void message(PrintWriter os,
                      String to,
                      String from,
                      Serializable value)
  {
    try {
      JsonOutput out = _out;
     
      if (out == null)
        return;
     
      out.init(os);
     
      if (log.isLoggable(Level.FINER)) {
        log.finer(this + " message " + value
                  + " {to:" + to + ", from:" + from + "}");
      }
     

      os.print("[\"message\"");
     
      if (to != null) {
        os.print(",\"");
        os.print(to);
        os.print("\"");
      }
      else {
        os.print(",null");
      }
       
      if (from != null) {
        os.print(",\"");
        os.print(from);
        os.print("\"");
      }
      else {
        os.print(",null");
      }
     
      os.print(",\"");
      writeType(os, value);
      os.print("\"");

      os.print(",");
      out.writeObject(value);
      out.flushBuffer();
      os.write("]");
    } catch (IOException e) {
      throw new ProtocolException(e);
    }
  }

  /**
   * JMTP unidirectional message
   *
   * <code><pre>
   * ["message_error",
   *  "to@to-host.com",
   *  "from@from-host.com",
   *  "com.example.MessageType",
   *  json-payload,
   *  json-error]
   * </pre></code>
   */
  public void messageError(PrintWriter os,
                           String to,
                           String from,
                           Serializable value,
                           BamError error)
  {
    try {
      JsonOutput out = _out;

      if (out == null)
        return;
     
      out.init(os);
     
      if (log.isLoggable(Level.FINER)) {
        log.finer(this + " messageError " + value
                  + " {to:" + to + ", from:" + from + "}");
      }

      os.print("[\"message_error\",\"");

      os.print(to);
       
      os.write("\",\"");

      os.print(from);
     
      os.write("\",\"");

      writeType(os, value);
       
      os.write("\",");

      out.writeObject(value);
      out.flushBuffer();
      os.write(",");
      out.writeObject(error);
      out.flushBuffer();
      os.write("]");
    } catch (IOException e) {
      throw new ProtocolException(e);
    }
  }

  //
  // query
  //

  /**
   * Low-level query
   */
  public void query(PrintWriter os,
                    long id,
                    String to,
                    String from,
                    Serializable value)
  {
    try {
      JsonOutput out = _out;

      if (out == null)
        return;
     
      out.init(os);
     
      if (log.isLoggable(Level.FINER)) {
        log.finer(this + " query " + value
                  + " {id: " + id + ", to:" + to + ", from:" + from + "}");
      }

      os.print("[\"query\"");
       
      if (to != null) {
        os.print(",\"");
        os.print(to);
        os.print("\"");
      }
      else {
        os.print(",null");
      }

      if (from != null) {
        os.print(",\"");
        os.print(from);
        os.print("\"");
      }
      else {
        os.print(",null");
      }

      os.print(",");
      os.print(id);
     
      os.write(",\"");
      writeType(os, value);

      os.print("\",");
      out.writeObject(value);
      out.flushBuffer();

      os.print("]");
    } catch (IOException e) {
      throw new ProtocolException(e);
    }
  }

  /**
   * Low-level query
   */
  public void queryResult(PrintWriter os,
                          long id,
                          String to,
                          String from,
                          Serializable value)
  {
    try {
      JsonOutput out = _out;

      if (out == null)
        return;
     
      out.init(os);
     
      if (log.isLoggable(Level.FINER)) {
        log.finer(this + " result " + value
                  + " {id: " + id + ", to:" + to + ", from:" + from + "}");
      }

      os.print("[\"result\"");

      if (to != null) {
        os.print(",\"");
        os.print(to);
        os.print("\"");
      }
      else {
        os.print(",null");
      }

      if (from != null) {
        os.print(",\"");
        os.print(from);
        os.print("\"");
      }
      else {
        os.print(",null");
      }

      os.print(",");
      os.print(id);

      os.write(",\"");
      writeType(os, value);
     
      os.print("\",");
      out.writeObject(value);
      out.flushBuffer();

      os.print("]");
    } catch (IOException e) {
      throw new ProtocolException(e);
    }
  }

  /**
   * Low-level query
   */
  public void queryError(PrintWriter os,
                         long id,
                         String to,
                         String from,
                         Serializable payload,
                         BamError error)
  {
    try {
      JsonOutput out = _out;

      if (out == null)
        return;
     
      out.init(os);
     
      if (log.isLoggable(Level.FINER)) {
        log.finer(this + " query_error " + error + "\n  " + payload + "\n  "
                  + " {id: " + id + ", to:" + to + ", from:" + from + "}");
      }

      os.print("[\"query_error\"");

      if (to != null) {
        os.print(",\"");
        os.print(to);
        os.print("\"");
      }
      else {
        os.print(",null");
      }

      if (from != null) {
        os.print(",\"");
        os.print(from);
        os.print("\"");
      }

      os.print(",");
      os.print(id);


      os.write(",\"");
      writeType(os, payload);
     
      os.print("\",");
      out.writeObject(payload);
      out.flushBuffer();

      os.print(",");
      out.writeObject(error);
      out.flushBuffer();

      os.print("]");
    } catch (IOException e) {
      throw new ProtocolException(e);
    }
  }

  private void writeType(PrintWriter os, Object value)
    throws IOException
  {
    if (value == null) {
      os.print("null");
      return;
    }

    Class<?> cl = value.getClass();

    if (cl == String.class) {
      os.print("String");
    }
    else if (cl.getName().startsWith("java.")) {
      os.print("Object\n");
    }
    else {
      os.print(value.getClass().getName());
    }
  }

  public void flush()
    throws IOException
  {
    JsonOutput out = _out;

    if (out != null) {
      out.flush();
    }
  }

  @Override
  public String toString()
  {
    return getClass().getSimpleName() + "[]";
  }
}
TOP

Related Classes of com.caucho.jsmp.JsmpWriter

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.