More json parser work

This commit is contained in:
jamesagnew 2014-03-14 16:35:43 -04:00
parent f2ba56af2f
commit be7a31c4c5
2 changed files with 102 additions and 31 deletions

View File

@ -6,6 +6,7 @@ import java.io.IOException;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import javax.xml.stream.XMLInputFactory;
@ -123,6 +124,14 @@ public class JsonParser implements IParser {
encodeCompositeElementChildrenToStreamWriter(theElement, theEventWriter, resDef.getChildren());
}
private class HeldExtension {
public HeldExtension(UndeclaredExtension theUndeclaredExtension) {
}
}
private void encodeCompositeElementChildrenToStreamWriter(IElement theElement, JsonWriter theEventWriter, List<? extends BaseRuntimeChildDefinition> theChildren) throws IOException {
for (BaseRuntimeChildDefinition nextChild : theChildren) {
List<? extends IElement> values = nextChild.getAccessor().getValues(theElement);
@ -132,64 +141,116 @@ public class JsonParser implements IParser {
String currentChildName = null;
boolean inArray = false;
IElement[] extensions = new IElement[values.size()];
IElement[] modifierExtensions = new IElement[values.size()];
boolean haveExtensions = false;
boolean haveModifierExtensions = false;
ArrayList<ArrayList<HeldExtension>> extensions = new ArrayList<ArrayList<HeldExtension>>(0);
ArrayList<ArrayList<HeldExtension>> modifierExtensions = new ArrayList<ArrayList<HeldExtension>>(0);
int valueIdx = 0;
for (IElement nextValue : values) {
if (nextValue == null || nextValue.isEmpty()) {
continue;
}
Class<? extends IElement> type = nextValue.getClass();
String childName = nextChild.getChildNameByDatatype(type);
String extensionUrl = nextChild.getExtensionUrl();
BaseRuntimeElementDefinition<?> childDef = nextChild.getChildElementDefinitionByDatatype(type);
if (childDef == null) {
throw new IllegalStateException(nextChild + " has no child of type " + type);
}
if (extensionUrl != null && childName.equals("extension") == false) {
RuntimeChildDeclaredExtensionDefinition extDef = (RuntimeChildDeclaredExtensionDefinition) nextChild;
if (extDef.isModifier()) {
theEventWriter.name("modifierExtension");
} else {
theEventWriter.name("extension");
}
if (nextChild instanceof RuntimeChildDeclaredExtensionDefinition) {
theEventWriter.beginObject();
theEventWriter.name("url");
theEventWriter.value(extensionUrl);
theEventWriter.name(childName);
encodeChildElementToStreamWriter(theEventWriter, nextValue, childName, childDef);
theEventWriter.endObject();
// TODO: hold and return
RuntimeChildDeclaredExtensionDefinition extDef = (RuntimeChildDeclaredExtensionDefinition) nextChild;
if (extDef.isModifier()) {
theEventWriter.name("modifierExtension");
} else {
theEventWriter.name("extension");
}
theEventWriter.beginObject();
theEventWriter.name("url");
String extensionUrl = nextChild.getExtensionUrl();
theEventWriter.value(extensionUrl);
theEventWriter.name(childName);
encodeChildElementToStreamWriter(theEventWriter, nextValue, childName, childDef);
theEventWriter.endObject();
} else {
if (currentChildName == null || !currentChildName.equals(childName)) {
if (inArray) {
theEventWriter.endArray();
}
theEventWriter.name(childName);
if (nextChild.getMax() > 1 || nextChild.getMax() == Child.MAX_UNLIMITED){
if (nextChild.getMax() > 1 || nextChild.getMax() == Child.MAX_UNLIMITED) {
theEventWriter.beginArray();
inArray = true;
}
currentChildName = childName;
}
encodeChildElementToStreamWriter(theEventWriter, nextValue, childName, childDef);
if (nextValue instanceof ISupportsUndeclaredExtensions) {
List<UndeclaredExtension> ext = ((ISupportsUndeclaredExtensions) nextValue).getUndeclaredExtensions();
addToHeldExtensions(valueIdx, ext, extensions);
ext = ((ISupportsUndeclaredExtensions) nextValue).getUndeclaredModifierExtensions();
addToHeldExtensions(valueIdx, ext, modifierExtensions);
}
}
valueIdx++;
}
if (inArray) {
theEventWriter.endArray();
}
String extType = "extension";
if (extensions.size() > 0 || modifierExtensions.size() > 0) {
theEventWriter.name('_' + currentChildName);
theEventWriter.beginObject();
if (extensions.size() > 0) {
theEventWriter.name(extType);
theEventWriter.beginArray();
for (ArrayList<HeldExtension> next : extensions) {
if (next == null || next.isEmpty()) {
theEventWriter.nullValue();
}else {
theEventWriter.beginArray();
// next.write(theEventWriter);
theEventWriter.endArray();
}
}
for (int i = extensions.size(); i < valueIdx; i++) {
theEventWriter.nullValue();
}
theEventWriter.endArray();
}
theEventWriter.endObject();
}
}
}
private void addToHeldExtensions(int valueIdx, List<UndeclaredExtension> ext, ArrayList<ArrayList<HeldExtension>> list) {
if (ext.size() > 0) {
list.ensureCapacity(valueIdx);
while (list.size() <= valueIdx) {
list.add(null);
}
if (list.get(valueIdx) == null) {
list.set(valueIdx, new ArrayList<JsonParser.HeldExtension>());
}
for (UndeclaredExtension next : ext) {
list.get(valueIdx).add(new HeldExtension(next));
}
}
}
@ -260,7 +321,7 @@ public class JsonParser implements IParser {
case RESOURCE_REF: {
ResourceReferenceDt value = (ResourceReferenceDt) theValue;
theWriter.beginObject();
if (value.getReference().isEmpty()==false) {
if (value.getReference().isEmpty() == false) {
theWriter.name("resource");
theWriter.value(value.getReference().getValueAsString());
}
@ -278,9 +339,9 @@ public class JsonParser implements IParser {
}
case UNDECL_EXT:
default:
throw new IllegalStateException("Should not have this state here: "+theChildDef.getChildType().name());
throw new IllegalStateException("Should not have this state here: " + theChildDef.getChildType().name());
}
}
@Override

View File

@ -1,11 +1,15 @@
package ca.uhn.fhir.parser;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.UndeclaredExtension;
import ca.uhn.fhir.model.dstu.resource.Observation;
import ca.uhn.fhir.model.dstu.resource.Patient;
@ -21,7 +25,13 @@ public class JsonParserTest {
Patient obs = ctx.newXmlParser().parseResource(Patient.class, IOUtils.toString(JsonParser.class.getResourceAsStream(name)));
String encoded = ctx.newJsonParser().encodeResourceToString(obs);
List<UndeclaredExtension> undeclaredExtensions = obs.getContact().get(0).getName().getFamily().get(0).getUndeclaredExtensions();
UndeclaredExtension undeclaredExtension = undeclaredExtensions.get(0);
assertEquals("http://hl7.org/fhir/Profile/iso-21090#qualifier", undeclaredExtension.getUrl());
ourLog.info(encoded);
}
}