/**
*
*/
package com.trendrr.strest.server.v2.models.json;
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.strest.server.v2.models.StrestHeader;
import com.trendrr.strest.server.v2.models.StrestPacketBase;
import com.trendrr.strest.server.v2.models.StrestHeader.Method;
import com.trendrr.strest.server.v2.models.StrestHeader.Name;
import com.trendrr.strest.server.v2.models.StrestHeader.TxnAccept;
/**
* @author Dustin Norlander
* @created May 1, 2012
*
*/
public abstract class StrestJsonBase implements StrestPacketBase {
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.strest.server.v2.models.StrestPacketBase#addHeader(java.lang.String, java.lang.String)
*/
@Override
public void addHeader(String header, String value) {
this.map.putWithDot("strest." + header.toLowerCase(), value);
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.StrestRequest#addHeader(com.trendrr.strest.server.v2.StrestHeaders, java.lang.String)
*/
@Override
public void addHeader(StrestHeader.Name header, String value) {
this.map.putWithDot("strest." + header.getJsonName(), value);
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.StrestRequest#getHeader(com.trendrr.strest.server.v2.StrestHeaders)
*/
@Override
public String getHeader(StrestHeader.Name header) {
return this.map.getString("strest." + header.getJsonName());
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.StrestRequest#getHeader(com.trendrr.strest.server.v2.StrestHeaders)
*/
@Override
public String getHeader(String header) {
return this.map.getString("strest." + header.toLowerCase());
}
/* (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);
}
/**
*
* This actually merges the content into this packet, instead of putting into a 'content' field
* This is done for backward compatibilty with cheshire requests.
*/
@Override
public void setContent(DynMap content) {
this.map.putAll(content);
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.models.StrestPacketBase#setContent(java.lang.String, java.lang.String)
*/
@Override
public void setContent(String contentType, String utf8Str) {
this.map.put("content", utf8Str);
this.addHeader(Name.CONTENT_TYPE, contentType);
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.StrestRequest#setContent(java.lang.String, java.lang.String)
*/
@Override
public void setContent(String contentType, byte[] content) {
if (content == null || content.length == 0)
return;
try {
String str = new String(content, "utf8");
if (contentType.equals("application/json") || contentType == null) {
this.map.putAll(DynMap.instance(str));
} else {
this.map.put("content", str);
}
this.addHeader(Name.CONTENT_TYPE, contentType);
} catch (UnsupportedEncodingException e) {
log.error("JSON COntent must be a UTF8 encoded string!", e);
}
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.StrestRequest#getContent()
*/
@Override
public Object getContent() {
return this.map.get("content");
}
/* (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;
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.models.StrestPacketBase#cleanup()
*/
@Override
public void cleanup() {
this.map = null;
}
}