package org.swellrt.model.shared;
import java.util.Stack;
import org.swellrt.model.ReadableBoolean;
import org.swellrt.model.ReadableFile;
import org.swellrt.model.ReadableList;
import org.swellrt.model.ReadableMap;
import org.swellrt.model.ReadableModel;
import org.swellrt.model.ReadableNumber;
import org.swellrt.model.ReadableString;
import org.swellrt.model.ReadableText;
import org.swellrt.model.ReadableType;
import org.swellrt.model.ReadableTypeVisitor;
import org.waveprotocol.wave.media.model.AttachmentId;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
public class ModelToJsonVisitor implements ReadableTypeVisitor {
Stack<JsonElement> stack = new Stack<JsonElement>();
JsonParser parser = new JsonParser();
public ModelToJsonVisitor() {
stack = new Stack<JsonElement>();
}
public JsonElement getResult() {
return stack.pop();
}
@Override
public void visit(ReadableModel instance) {
instance.getRoot().accept(this);
}
@Override
public void visit(ReadableString instance) {
String text = instance.getValue();
text = text.replace("\"","").replace("'", "");
stack.push(parser.parse("\""+text+"\""));
}
@Override
public void visit(ReadableMap instance) {
JsonObject o = new JsonObject();
for(String k: instance.keySet()) {
ReadableType t = instance.get(k);
if (t == null) continue;
t.accept(this);
o.add(k, stack.pop());
}
stack.push(o);
}
@Override
public void visit(ReadableList<? extends ReadableType> instance) {
JsonArray o = new JsonArray();
for(int i = 0; i < instance.size(); i++) {
ReadableType t = instance.get(i);
if (t == null) continue;
t.accept(this);
o.add(stack.pop());
}
stack.push(o);
}
@Override
public void visit(ReadableText instance) {
String text = instance.getText(0, instance.getSize());
text = text.replace("\"","").replace("'", "");
stack.push(parser.parse("\""+text+"\""));
}
@Override
public void visit(ReadableFile instance) {
AttachmentId id = instance.getValue();
if (id != null)
stack.push(parser.parse("\""+id.serialise()+"\""));
else
stack.push(parser.parse(""));
}
@Override
public void visit(ReadableNumber instance) {
stack.push(parser.parse(instance.getValue()));
}
@Override
public void visit(ReadableBoolean instance) {
stack.push(parser.parse(Boolean.toString(instance.getValue())));
}
}