package com.github.mustachejavabenchmarks;
import com.fasterxml.jackson.core.JsonGenerator;
import com.github.mustachejava.util.CapturingMustacheVisitor;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.Stack;
/**
* Flawed implementation -- doesn't handle the case when you do a negative compare and then
* iterate. Works fine if you iterate first.
*/
public class JsonCapturer implements CapturingMustacheVisitor.Captured {
private Stack<Set<String>> seenit;
private int ignore;
private final JsonGenerator jg;
public JsonCapturer(JsonGenerator jg) {
this.jg = jg;
seenit = new Stack<>();
ignore = 0;
seenit.add(new HashSet<>());
}
@Override
public void value(String name, String value) {
if (ignore > 0) return;
try {
if (seenit.peek().add(name)) {
jg.writeStringField(name, value);
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void arrayStart(String name) {
if (ignore > 0) return;
try {
if (seenit.peek().add(name)) {
jg.writeArrayFieldStart(name);
} else {
ignore++;
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void arrayEnd() {
if (ignore > 0) {
ignore--;
return;
}
try {
jg.writeEndArray();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void objectStart() {
if (ignore > 0) return;
try {
jg.writeStartObject();
seenit.push(new HashSet<>());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void objectEnd() {
try {
jg.writeEndObject();
seenit.pop();
} catch (IOException e) {
e.printStackTrace();
}
}
}