From 00411b64f6c9bd45c9918a8cbcb5439dc715dd70 Mon Sep 17 00:00:00 2001 From: jamesagnew Date: Thu, 27 Feb 2014 07:39:36 -0500 Subject: [PATCH] More work on Atom --- .../java/ca/uhn/fhir/parser/ParserState.java | 32 +++++++++++++------ .../java/ca/uhn/fhir/parser/XmlParser.java | 26 ++++++++------- .../ca/uhn/fhir/parser/XmlParserTest.java | 1 + 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/parser/ParserState.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/parser/ParserState.java index d425dbf8ad2..031f7eedf60 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/parser/ParserState.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/parser/ParserState.java @@ -23,6 +23,7 @@ import ca.uhn.fhir.model.api.ICompositeDatatype; import ca.uhn.fhir.model.api.ICompositeElement; import ca.uhn.fhir.model.api.IElement; import ca.uhn.fhir.model.api.IPrimitiveDatatype; +import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResourceBlock; import ca.uhn.fhir.model.api.ISupportsUndeclaredExtensions; import ca.uhn.fhir.model.api.ResourceReference; @@ -30,14 +31,12 @@ import ca.uhn.fhir.model.api.UndeclaredExtension; import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.model.primitive.XhtmlDt; -class ParserState { +class ParserState { private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ParserState.class); private FhirContext myContext; - - private Object myObject; - + private T myObject; private BaseState myState; private ParserState(FhirContext theContext) { @@ -60,7 +59,7 @@ class ParserState { myState.enteringNewElementExtension(theElem, theUrlAttr); } - public Object getObject() { + public T getObject() { return myObject; } @@ -82,12 +81,18 @@ class ParserState { myState = theState; } - public static ParserState getPreResourceInstance(FhirContext theContext) throws DataFormatException { - ParserState retVal = new ParserState(theContext); + public static ParserState getPreResourceInstance(FhirContext theContext) throws DataFormatException { + ParserState retVal = new ParserState(theContext); retVal.push(retVal.new PreResourceState()); return retVal; } + public static ParserState getPreAtomInstance(FhirContext theContext) throws DataFormatException { + ParserState retVal = new ParserState(theContext); + retVal.push(retVal.new PreAtomState()); + return retVal; + } + private class AtomPrimitiveState extends BaseState{ private IPrimitiveDatatype myPrimitive; @@ -156,6 +161,10 @@ class ParserState { public void enteringNewElement(StartElement theElement, String theLocalPart) throws DataFormatException { if (theLocalPart.equals("title")) { push(new AtomPrimitiveState(myInstance.getTitle())); + }else if ("id".equals(theLocalPart)) { + push(new AtomPrimitiveState(myInstance.getId())); + }else if ("link".equals(theLocalPart)) { + } } @@ -204,9 +213,10 @@ class ParserState { return null; } + @SuppressWarnings("unchecked") @Override public void wereBack() { - myObject = myInstance; + myObject = (T) myInstance; } @Override @@ -359,11 +369,12 @@ class ParserState { ourLog.debug("Ignoring attribute value: {}", theValue); } + @SuppressWarnings("unchecked") @Override public void endingElement(EndElement theElem) { pop(); if (myState == null) { - myObject = myInstance; + myObject = (T) myInstance; } } @@ -559,9 +570,10 @@ class ParserState { // ignore } + @SuppressWarnings("unchecked") @Override public void wereBack() { - myObject = myInstance; + myObject = (T) myInstance; } } diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/parser/XmlParser.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/parser/XmlParser.java index 506f14ad3c9..679c9dcbf9c 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/parser/XmlParser.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/parser/XmlParser.java @@ -7,6 +7,7 @@ import java.io.StringReader; import java.io.StringWriter; import java.util.Iterator; import java.util.List; +import java.util.Set; import javax.xml.namespace.QName; import javax.xml.stream.FactoryConfigurationError; @@ -55,6 +56,8 @@ public class XmlParser { private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(XmlParser.class); private static final String XHTML_NS = "http://www.w3.org/1999/xhtml"; + // private static final Set RESOURCE_NAMESPACES; + private FhirContext myContext; private XMLInputFactory myXmlInputFactory; private XMLOutputFactory myXmlOutputFactory; @@ -128,8 +131,7 @@ public class XmlParser { return stringWriter.toString(); } - private void encodeChildElementToStreamWriter(XMLStreamWriter theEventWriter, IElement nextValue, String childName, BaseRuntimeElementDefinition childDef, String theExtensionUrl) - throws XMLStreamException, DataFormatException { + private void encodeChildElementToStreamWriter(XMLStreamWriter theEventWriter, IElement nextValue, String childName, BaseRuntimeElementDefinition childDef, String theExtensionUrl) throws XMLStreamException, DataFormatException { switch (childDef.getChildType()) { case PRIMITIVE_DATATYPE: { theEventWriter.writeStartElement(childName); @@ -172,8 +174,7 @@ public class XmlParser { } } - private void encodeCompositeElementChildrenToStreamWriter(IElement theElement, XMLStreamWriter theEventWriter, List children) throws XMLStreamException, - DataFormatException { + private void encodeCompositeElementChildrenToStreamWriter(IElement theElement, XMLStreamWriter theEventWriter, List children) throws XMLStreamException, DataFormatException { for (BaseRuntimeChildDefinition nextChild : children) { List values = nextChild.getAccessor().getValues(theElement); if (values == null || values.isEmpty()) { @@ -204,8 +205,7 @@ public class XmlParser { } } - private void encodeCompositeElementToStreamWriter(IElement theElement, XMLStreamWriter theEventWriter, BaseRuntimeElementCompositeDefinition resDef) throws XMLStreamException, - DataFormatException { + private void encodeCompositeElementToStreamWriter(IElement theElement, XMLStreamWriter theEventWriter, BaseRuntimeElementCompositeDefinition resDef) throws XMLStreamException, DataFormatException { encodeExtensionsIfPresent(theEventWriter, theElement); encodeCompositeElementChildrenToStreamWriter(theElement, theEventWriter, resDef.getExtensions()); encodeCompositeElementChildrenToStreamWriter(theElement, theEventWriter, resDef.getChildren()); @@ -371,15 +371,17 @@ public class XmlParser { } private Bundle parseBundle(XMLEventReader theStreamReader) { - // TODO Auto-generated method stub - return null; + ParserState parserState = ParserState.getPreAtomInstance(myContext); + return doXmlLoop(theStreamReader, parserState); } - public IResource parseResource(XMLEventReader streamReader) { + public IResource parseResource(XMLEventReader theStreamReader) { + ParserState parserState = ParserState.getPreResourceInstance(myContext); + return doXmlLoop(theStreamReader, parserState); + } + private T doXmlLoop(XMLEventReader streamReader, ParserState parserState) { try { - ParserState parserState = ParserState.getPreResourceInstance(myContext); - while (streamReader.hasNext()) { XMLEvent nextEvent = streamReader.nextEvent(); if (nextEvent.isStartElement()) { @@ -426,7 +428,7 @@ public class XmlParser { parserState.endingElement(elem); if (parserState.isComplete()) { - return (IResource) parserState.getObject(); + return parserState.getObject(); } } else { parserState.otherEvent(nextEvent); diff --git a/hapi-fhir-base/src/test/java/ca/uhn/fhir/parser/XmlParserTest.java b/hapi-fhir-base/src/test/java/ca/uhn/fhir/parser/XmlParserTest.java index 39091f3aacf..7e5d7de14f5 100644 --- a/hapi-fhir-base/src/test/java/ca/uhn/fhir/parser/XmlParserTest.java +++ b/hapi-fhir-base/src/test/java/ca/uhn/fhir/parser/XmlParserTest.java @@ -82,6 +82,7 @@ public class XmlParserTest { XmlParser p = new FhirContext(ValueSet.class).newXmlParser(); Bundle bundle = p.parseBundle(msg); + assertEquals("FHIR Core Valuesets", bundle.getTitle().getValue()); }