|
35 | 35 | import javax.servlet.http.HttpServletRequest; |
36 | 36 | import javax.servlet.http.HttpServletResponse; |
37 | 37 | import javax.xml.namespace.QName; |
38 | | -import javax.xml.stream.XMLEventFactory; |
39 | | -import javax.xml.stream.XMLEventReader; |
40 | | -import javax.xml.stream.XMLEventWriter; |
41 | | -import javax.xml.stream.XMLInputFactory; |
42 | 38 | import javax.xml.stream.XMLOutputFactory; |
| 39 | +import javax.xml.stream.XMLStreamException; |
43 | 40 | import javax.xml.stream.XMLStreamWriter; |
44 | | -import javax.xml.stream.events.XMLEvent; |
45 | | -import javax.xml.transform.dom.DOMSource; |
46 | 41 | import net.opengis.fes.v20.Conformance; |
47 | 42 | import net.opengis.fes.v20.FilterCapabilities; |
48 | 43 | import net.opengis.fes.v20.SpatialCapabilities; |
@@ -708,11 +703,14 @@ else if (!request.getOfferings().isEmpty()) |
708 | 703 |
|
709 | 704 | // init xml document writing |
710 | 705 | OutputStream os = new BufferedOutputStream(request.getResponseStream()); |
711 | | - XMLEventFactory xmlFactory = XMLEventFactory.newInstance(); |
712 | | - XMLEventWriter xmlWriter = XMLOutputFactory.newInstance().createXMLEventWriter(os, "UTF-8"); |
713 | | - xmlWriter.add(xmlFactory.createStartDocument()); |
714 | | - xmlWriter.add(xmlFactory.createStartElement(SOS_PREFIX, sosNsUri, "GetObservationResponse")); |
715 | | - xmlWriter.add(xmlFactory.createNamespace(SOS_PREFIX, sosNsUri)); |
| 706 | + XMLStreamWriter xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(os, "UTF-8"); |
| 707 | + xmlWriter = new IndentingXMLStreamWriter(xmlWriter); |
| 708 | + |
| 709 | + // wrap with SOAP envelope if needed |
| 710 | + xmlWriter.writeStartDocument(); |
| 711 | + startSoapEnvelope(request, xmlWriter); |
| 712 | + xmlWriter.writeStartElement(SOS_PREFIX, "GetObservationResponse", sosNsUri); |
| 713 | + xmlWriter.writeNamespace(SOS_PREFIX, sosNsUri); |
716 | 714 |
|
717 | 715 | // send obs from each selected offering |
718 | 716 | // TODO sort by time by multiplexing obs from different offerings? |
@@ -785,28 +783,21 @@ else if (result instanceof DataArray) |
785 | 783 | if (firstObs) |
786 | 784 | { |
787 | 785 | for (Entry<String, String> nsDef: dom.getXmlDocument().getNSTable().entrySet()) |
788 | | - xmlWriter.add(xmlFactory.createNamespace(nsDef.getKey(), nsDef.getValue())); |
| 786 | + xmlWriter.writeNamespace(nsDef.getKey(), nsDef.getValue()); |
789 | 787 | firstObs = false; |
790 | 788 | } |
791 | 789 |
|
792 | 790 | // serialize observation DOM tree into stream writer |
793 | | - xmlWriter.add(xmlFactory.createStartElement(SOS_PREFIX, sosNsUri, "observationData")); |
794 | | - XMLInputFactory factory = XMLImplFinder.getStaxInputFactory(); |
795 | | - XMLEventReader domReader = factory.createXMLEventReader(new DOMSource(obsElt)); |
796 | | - while (domReader.hasNext()) |
797 | | - { |
798 | | - XMLEvent event = domReader.nextEvent(); |
799 | | - if (!event.isStartDocument() && !event.isEndDocument()) |
800 | | - xmlWriter.add(event); |
801 | | - } |
802 | | - xmlWriter.add(xmlFactory.createEndElement(SOS_PREFIX, sosNsUri, "observationData")); |
| 791 | + xmlWriter.writeStartElement(SOS_PREFIX, "observationData", sosNsUri); |
| 792 | + dom.writeToStreamWriter(obsElt, xmlWriter); |
| 793 | + xmlWriter.writeEndElement(); |
803 | 794 | xmlWriter.flush(); |
804 | | - os.write('\n'); |
805 | 795 | } |
806 | 796 | } |
807 | 797 | } |
808 | 798 |
|
809 | | - xmlWriter.add(xmlFactory.createEndDocument()); |
| 799 | + // this will automatically close all open elements |
| 800 | + xmlWriter.writeEndDocument(); |
810 | 801 | xmlWriter.close(); |
811 | 802 | } |
812 | 803 | finally |
@@ -1038,13 +1029,7 @@ protected void handleRequest(final GetFeatureOfInterestRequest request) throws E |
1038 | 1029 | xmlWriter.writeStartDocument(); |
1039 | 1030 |
|
1040 | 1031 | // wrap with SOAP envelope if requested |
1041 | | - String soapUri = request.getSoapVersion(); |
1042 | | - if (soapUri != null) |
1043 | | - { |
1044 | | - xmlWriter.writeStartElement(SOAP_PREFIX, "Envelope", soapUri); |
1045 | | - xmlWriter.writeNamespace(SOAP_PREFIX, soapUri); |
1046 | | - xmlWriter.writeStartElement(SOAP_PREFIX, "Body", soapUri); |
1047 | | - } |
| 1032 | + startSoapEnvelope(request, xmlWriter); |
1048 | 1033 |
|
1049 | 1034 | // write response root element |
1050 | 1035 | String sosNsUri = OGCRegistry.getNamespaceURI(SOSUtils.SOS, DEFAULT_VERSION); |
@@ -1093,12 +1078,8 @@ protected void handleRequest(final GetFeatureOfInterestRequest request) throws E |
1093 | 1078 | } |
1094 | 1079 |
|
1095 | 1080 | // close SOAP elements |
1096 | | - if (soapUri != null) |
1097 | | - { |
1098 | | - xmlWriter.writeEndElement(); |
1099 | | - xmlWriter.writeEndElement(); |
1100 | | - } |
1101 | | - |
| 1081 | + endSoapEnvelope(request, xmlWriter); |
| 1082 | + |
1102 | 1083 | xmlWriter.writeEndDocument(); |
1103 | 1084 | xmlWriter.close(); |
1104 | 1085 | } |
@@ -1231,6 +1212,29 @@ protected void handleRequest(InsertSensorRequest request) throws Exception |
1231 | 1212 | } |
1232 | 1213 |
|
1233 | 1214 |
|
| 1215 | + protected void startSoapEnvelope(OWSRequest request, XMLStreamWriter writer) throws XMLStreamException |
| 1216 | + { |
| 1217 | + String soapUri = request.getSoapVersion(); |
| 1218 | + if (soapUri != null) |
| 1219 | + { |
| 1220 | + writer.writeStartElement(SOAP_PREFIX, "Envelope", soapUri); |
| 1221 | + writer.writeNamespace(SOAP_PREFIX, soapUri); |
| 1222 | + writer.writeStartElement(SOAP_PREFIX, "Body", soapUri); |
| 1223 | + } |
| 1224 | + } |
| 1225 | + |
| 1226 | + |
| 1227 | + protected void endSoapEnvelope(OWSRequest request, XMLStreamWriter writer) throws XMLStreamException |
| 1228 | + { |
| 1229 | + String soapUri = request.getSoapVersion(); |
| 1230 | + if (soapUri != null) |
| 1231 | + { |
| 1232 | + writer.writeEndElement(); |
| 1233 | + writer.writeEndElement(); |
| 1234 | + } |
| 1235 | + } |
| 1236 | + |
| 1237 | + |
1234 | 1238 | protected boolean writeCustomFormatStream(GetResultRequest request, ISOSDataProvider dataProvider, OutputStream os) throws Exception |
1235 | 1239 | { |
1236 | 1240 | DataComponent resultStructure = dataProvider.getResultStructure(); |
|
0 commit comments