package org.odata4j.format.json; import java.io.Reader; import org.odata4j.core.OError; import org.odata4j.core.OErrors; import org.odata4j.format.FormatParser; import org.odata4j.format.Settings; import org.odata4j.format.json.JsonStreamReaderFactory.JsonStreamReader; import org.odata4j.format.json.JsonStreamReaderFactory.JsonStreamReader.JsonEvent; public class JsonErrorFormatParser extends JsonFormatParser implements FormatParser<OError> { public JsonErrorFormatParser(Settings settings) { super(settings); } @Override public OError parse(Reader reader) { String code = null; String message = null; String innerError = null; JsonStreamReader jsr = JsonStreamReaderFactory.createJsonStreamReader(reader); JsonEvent event = jsr.nextEvent(); try { ensureStartObject(event); ensureStartProperty(jsr.nextEvent(), "error"); ensureStartObject(jsr.nextEvent()); while (jsr.hasNext() && !event.isEndObject()) { event = jsr.nextEvent(); ensureNext(jsr); if (event.isStartProperty() && "code".equals(event.asStartProperty().getName())) { ensureEndProperty(event = jsr.nextEvent()); code = event.asEndProperty().getValue(); } else if (event.isStartProperty() && "message".equals(event.asStartProperty().getName())) { ensureStartObject(jsr.nextEvent()); while (jsr.hasNext() && !event.isEndObject()) { event = jsr.nextEvent(); ensureNext(jsr); if (event.isStartProperty() && "lang".equals(event.asStartProperty().getName())) { ensureEndProperty(event = jsr.nextEvent()); } else if (event.isStartProperty() && "value".equals(event.asStartProperty().getName())) { ensureEndProperty(event = jsr.nextEvent()); message = event.asEndProperty().getValue(); } else { ensureEndObject(event); } } ensureEndProperty(event = jsr.nextEvent()); } else if (event.isStartProperty() && "innererror".equals(event.asStartProperty().getName())) { ensureEndProperty(event = jsr.nextEvent()); innerError = event.asEndProperty().getValue(); } else { ensureEndObject(event); } } ensureEndProperty(jsr.nextEvent()); ensureEndObject(jsr.nextEvent()); } finally { jsr.close(); } return OErrors.error(code, message, innerError); } }