/**
*
*/
package com.trendrr.oss.strest.models.json;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Collection;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.trendrr.oss.DynMap;
import com.trendrr.oss.DynMapConvertable;
import com.trendrr.oss.exceptions.TrendrrException;
import com.trendrr.oss.strest.models.StrestHeader;
import com.trendrr.oss.strest.models.StrestHeader.ContentEncoding;
import com.trendrr.oss.strest.models.StrestPacketBase;
import com.trendrr.oss.strest.models.StrestHeader.Method;
import com.trendrr.oss.strest.models.StrestHeader.Name;
import com.trendrr.oss.strest.models.StrestHeader.TxnAccept;
/**
* @author Dustin Norlander
* @created May 1, 2012
*
*/
public abstract class StrestJsonBase implements StrestPacketBase, DynMapConvertable {
protected static Log log = LogFactory.getLog(StrestJsonBase.class);
DynMap map = new DynMap();
public StrestJsonBase(DynMap map) {
this.map = map;
}
public StrestJsonBase() {
}
/**
* gets the DynMap this packet is based on.
* @return
*/
public DynMap getMap() {
return this.map;
}
/* (non-Javadoc)
* @see com.trendrr.oss.DynMapConvertable#toDynMap()
*/
@Override
public DynMap toDynMap() {
return this.map;
}
// public void addHeader(String header, String value) {
// this.map.putWithDot("strest." + header.toLowerCase(), value);
//
// }
public void addHeader(StrestHeader.Name header, String value) {
this.map.putWithDot("strest." + header.getJsonName(), value);
}
public String getHeader(StrestHeader.Name header) {
return this.map.getString("strest." + header.getJsonName());
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.StrestRequest#setStrestProtocolVersion(java.lang.String)
*/
@Override
public void setProtocol(String protocol, float version) {
this.map.putWithDot("strest.v", version);
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.StrestRequest#getStrestProtocolVersion()
*/
@Override
public float getProtocolVersion() {
return this.map.getDouble("strest.v", 0d).floatValue();
}
public String getProtocolName() {
return "strest";
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.StrestRequest#setTxnId(java.lang.String)
*/
@Override
public void setTxnId(String id) {
this.addHeader(StrestHeader.Name.TXN_ID, id);
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.StrestRequest#getTxnId()
*/
@Override
public String getTxnId() {
return this.getHeader(Name.TXN_ID);
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.StrestRequest#toByteArray()
*/
@Override
public byte[] toByteArray() {
try {
return this.map.toJSONString().getBytes("utf8");
} catch (UnsupportedEncodingException e) {
log.error("Caught", e);
}
return null;
}
@Override
public String toString() {
return this.map.toJSONString();
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.models.StrestPacketBase#cleanup()
*/
@Override
public void cleanup() {
this.map = null;
}
/* (non-Javadoc)
* @see com.trendrr.oss.strest.models.StrestPacketBase#setContent(java.lang.String, long, java.io.InputStream)
*/
@Override
public void setContent(ContentEncoding contentEncoding, int contentLength,
InputStream stream) throws Exception {
if (contentLength < 1) {
return; //do nothing..
}
System.out.println(contentEncoding);
this.map.putWithDot("content_encoding", contentEncoding);
byte[] bytes = new byte[(int)contentLength];
DataInputStream dataIs = new DataInputStream(stream);
dataIs.readFully(bytes);
if (contentEncoding == ContentEncoding.STRING) {
this.map.put("content", new String(bytes, "utf8"));
return;
}
throw new TrendrrException("Json request only supports string encoding atm");
}
/* (non-Javadoc)
* @see com.trendrr.oss.strest.models.StrestPacketBase#getContent()
*/
@Override
public InputStream getContent() throws Exception {
return new ByteArrayInputStream(this.map.getString("content", "").getBytes("utf8"));
}
/* (non-Javadoc)
* @see com.trendrr.oss.strest.models.StrestPacketBase#getContentEncoding()
*/
@Override
public ContentEncoding getContentEncoding() {
return ContentEncoding.STRING;
}
/* (non-Javadoc)
* @see com.trendrr.oss.strest.models.StrestPacketBase#getContentLength()
*/
@Override
public int getContentLength() {
// TODO Auto-generated method stub
return 0;
}
}