/*
* 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() + "[]";
}
}