package org.odata4j.format.xml; import java.io.Reader; import java.util.Iterator; import org.odata4j.core.OComplexObject; import org.odata4j.core.OComplexObject.Builder; import org.odata4j.core.OComplexObjects; import org.odata4j.core.OProperty; import org.odata4j.edm.EdmComplexType; import org.odata4j.edm.EdmDataServices; import org.odata4j.format.FormatParser; import org.odata4j.format.Settings; import org.odata4j.stax2.Attribute2; import org.odata4j.stax2.StartElement2; import org.odata4j.stax2.XMLEvent2; import org.odata4j.stax2.XMLEventReader2; import org.odata4j.stax2.util.StaxUtil; /** * * Copyright 2013 Halliburton * @author <a href="mailto:peng.chen@halliburton.com">Kevin Chen</a> * */ public class AtomComplexFormatParser implements FormatParser<OComplexObject>{ Settings settings; public AtomComplexFormatParser(EdmDataServices md, EdmComplexType complexType) { settings = new Settings(null, md, null, null, null, true, complexType); } public AtomComplexFormatParser(Settings settings) { this.settings = settings; } /** * Parse a complex type from function/action response. */ @Override public OComplexObject parse(Reader reader) { XMLEvent2 event; XMLEventReader2 xmlReader = StaxUtil.newXMLEventReader(reader); xmlReader.nextEvent(); // start document; event = xmlReader.nextEvent(); // start element String name = event.asStartElement().getName().getLocalPart(); Attribute2 typeAttribute = event.asStartElement().getAttributeByName(XmlFormatParser.M_TYPE); Attribute2 nullAttribute = event.asStartElement().getAttributeByName(XmlFormatParser.M_NULL); boolean isNull = nullAttribute != null && "true".equals(nullAttribute.getValue()); if (isNull) { return null; } System.out.println("the complex type name is:"+name); Iterable<OProperty<?>> props = AtomFeedFormatParser.parseProperties(xmlReader, event.asStartElement(), settings.metadata, (EdmComplexType) settings.parseType); return createCT(props, (EdmComplexType) this.settings.parseType); } /** * this parse an complex object within another element */ public static OComplexObject parse(XMLEventReader2 reader, StartElement2 propertiesElement, EdmDataServices metadata, EdmComplexType ctType) { Attribute2 nullAttribute = propertiesElement.getAttributeByName(XmlFormatParser.M_NULL); boolean isNull = nullAttribute != null && "true".equals(nullAttribute.getValue()); if (isNull) { return null; } Iterable<OProperty<?>> props = AtomFeedFormatParser.parseProperties(reader, propertiesElement, metadata, ctType); return createCT(props, ctType); } private static OComplexObject createCT(Iterable<OProperty<?>> props, EdmComplexType type) { Builder builder = OComplexObjects.newBuilder(type); Iterator<OProperty<?>> it = props.iterator(); while (it.hasNext()) { OProperty<?> o = it.next(); builder.add(o); } return builder.build(); } }