/** * Reads the SOAP fault. * * @param reader The reader. * @return SOAP fault details. */ private SoapFaultDetails readSoapFault(EwsXmlReader reader) { SoapFaultDetails soapFaultDetails = null; try { reader.read(); if (reader.getNodeType().getNodeType() == XmlNodeType.START_DOCUMENT) { reader.read(); } if (!reader.isStartElement() || (!reader.getLocalName().equals(XmlElementNames.SOAPEnvelopeElementName))) { return null; } // Get the namespace URI from the envelope element and use it for // the rest of the parsing. // If it's not 1.1 or 1.2, we can't continue. XmlNamespace soapNamespace = EwsUtilities.getNamespaceFromUri(reader.getNamespaceUri()); if (soapNamespace == XmlNamespace.NotSpecified) { return null; } reader.read(); // Skip SOAP header. if (reader.isStartElement(soapNamespace, XmlElementNames.SOAPHeaderElementName)) { do { reader.read(); } while (!reader.isEndElement(soapNamespace, XmlElementNames.SOAPHeaderElementName)); // Queue up the next read reader.read(); } // Parse the fault element contained within the SOAP body. if (reader.isStartElement(soapNamespace, XmlElementNames.SOAPBodyElementName)) { do { reader.read(); // Parse Fault element if (reader.isStartElement(soapNamespace, XmlElementNames.SOAPFaultElementName)) { soapFaultDetails = SoapFaultDetails.parse(reader, soapNamespace); } } while (!reader.isEndElement(soapNamespace, XmlElementNames.SOAPBodyElementName)); } reader.readEndElement(soapNamespace, XmlElementNames.SOAPEnvelopeElementName); } catch (Exception e) { // If response doesn't contain a valid SOAP fault, just ignore // exception and // return null for SOAP fault details. e.printStackTrace(); } return soapFaultDetails; }
/** * Read ServerVersionInfo SOAP header. * * @param reader EwsXmlReader. * @return ExchangeServerInfo ExchangeServerInfo object * @throws Exception the exception */ private ExchangeServerInfo readServerVersionInfo(EwsXmlReader reader) throws Exception { ExchangeServerInfo serverInfo = new ExchangeServerInfo(); do { reader.read(); if (reader.isStartElement()) { if (reader.getLocalName().equals(XmlElementNames.MajorVersion)) { serverInfo.setMajorVersion(reader.readElementValue(Integer.class)); } else if (reader.getLocalName().equals(XmlElementNames.MinorVersion)) { serverInfo.setMinorVersion(reader.readElementValue(Integer.class)); } else if (reader.getLocalName().equals(XmlElementNames.MajorBuildNumber)) { serverInfo.setMajorBuildNumber(reader.readElementValue(Integer.class)); } else if (reader.getLocalName().equals(XmlElementNames.MinorBuildNumber)) { serverInfo.setMinorBuildNumber(reader.readElementValue(Integer.class)); } else if (reader.getLocalName().equals(XmlElementNames.Version)) { serverInfo.setVersionString(reader.readElementValue()); } } } while (!reader.isEndElement(XmlNamespace.Autodiscover, XmlElementNames.ServerVersionInfo)); return serverInfo; }
/** * Parses the message xml. * * @param reader the reader * @throws Exception the exception * @throws ServiceXmlDeserializationException the service xml deserialization exception */ private void parseMessageXml(EwsXmlReader reader) throws Exception, ServiceXmlDeserializationException, Exception { // E14:172881: E12 and E14 return the MessageXml element in different // namespaces (types namespace for E12, errors namespace in E14). To // avoid this problem, the parser will match the namespace from the // start and end elements. XmlNamespace elementNS = EwsUtilities.getNamespaceFromUri(reader.getNamespaceUri()); if (!reader.isEmptyElement()) { do { reader.read(); if (reader.isStartElement() && !reader.isEmptyElement()) { String localName = reader.getLocalName(); if (localName.equals(XmlElementNames.Value)) { this.errorDetails.put( reader.readAttributeValue(XmlAttributeNames.Name), reader.readElementValue()); } } } while (!reader.isEndElement(elementNS, XmlElementNames.MessageXml)); } else { reader.read(); } }
/** * Reads a single SOAP header. * * @param reader EwsXmlReader * @throws Exception */ protected void readSoapHeader(EwsXmlReader reader) throws Exception { // Is this the ServerVersionInfo? if (reader.isStartElement(XmlNamespace.Autodiscover, XmlElementNames.ServerVersionInfo)) { this.service.setServerInfo(this.readServerVersionInfo(reader)); } }