package com.fourspaces.featherdb.document;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import java.util.Set;
import org.json.JSONObject;
@ContentTypes({Document.DEFAULT_CONTENT_TYPE,"text/javascript"})
public class JSONDocument extends Document {
public JSONDocument() {}
public JSONDocument(JSONObject source) throws DocumentCreationException {
setRevisionData(source);
}
@Override
public void setRevisionData(InputStream dataInput) throws DocumentCreationException {
try {
metaData = JSONObject.read(dataInput);
} catch (IOException e) {
throw new DocumentCreationException(e);
}
}
public void setRevisionData(JSONObject source) throws DocumentCreationException {
for (String key:source.keySet()) {
if (key.startsWith("_") && !key.equals(REV) && !key.equals(REV_DATE) && !key.equals(REV_USER)) {
commonData.put(key, source.get(key));
} else {
metaData.put(key, source.get(key));
}
}
}
@Override
public void writeRevisionData(OutputStream dataOutput) throws IOException {
// does nothing since all JSON data is stored in the MetaData stream
}
@Override
public void sendDocument(OutputStream dataOutput,Map<String,String[]> params) throws IOException {
boolean pretty=false;
if (params.containsKey("pretty")) {
String[] values = params.get("pretty");
for (String value:values) {
if (value.equals("true")) {
pretty=true;
}
}
}
for (String key: params.keySet()) {
log.debug("{} => {}",key,params.get(key));
int i=0;
for (String value:params.get(key)) {
log.debug("[{}] => ", i++,value);
}
}
log.info("pretty? = {}", pretty);
Writer writer = new OutputStreamWriter(dataOutput);
if (pretty) {
writer.write(toString(2));
} else {
writer.write(toString());
}
writer.close();
}
public void put(String key,Object value) {
if (key.startsWith("_")) {
commonDirty=true;
commonData.put(key, value);
} else {
dataDirty=true;
metaData.put(key, value);
}
}
public Object get(String key) {
if (key.startsWith("_")) {
return commonData.get(key);
}
return metaData.get(key);
}
public Set<String> keys() {
return metaData.keySet();
}
@Override
public boolean writesRevisionData() {
return false;
}
}