/**
   * * Loads from XML.
   *
   * @param reader the reader
   * @param localElementName the local element name
   * @throws Exception the exception
   */
  @Override
  protected void loadFromXml(EwsServiceXmlReader reader, String localElementName) throws Exception {
    reader.ensureCurrentNodeIsStartElement(XmlNamespace.Types, localElementName);

    reader.readStartElement(XmlNamespace.Types, this.getInnerCollectionXmlElementName());
    super.loadFromXml(reader, this.getInnerCollectionXmlElementName());
    reader.readEndElementIfNecessary(XmlNamespace.Types, this.getInnerCollectionXmlElementName());

    reader.read();

    if (reader.isStartElement(XmlNamespace.Types, XmlElementNames.UnknownEntries)) {
      do {
        reader.read();

        if (reader.isStartElement(XmlNamespace.Types, XmlElementNames.UnknownEntry)) {
          this.unknownEntries.add(reader.readElementValue());
        }
      } while (!reader.isEndElement(XmlNamespace.Types, XmlElementNames.UnknownEntries));
    }
  }
  /**
   * Reads response elements from XML.
   *
   * @param reader ,The reader
   * @throws Exception the exception
   */
  @Override
  protected void readElementsFromXml(EwsServiceXmlReader reader) throws Exception {
    reader.readStartElement(XmlNamespace.Messages, XmlElementNames.RootFolder);

    int totalItemsInView =
        reader.readAttributeValue(Integer.class, XmlAttributeNames.TotalItemsInView);
    boolean moreItemsAvailable =
        !reader.readAttributeValue(Boolean.class, XmlAttributeNames.IncludesLastItemInRange);

    // Ignore IndexedPagingOffset attribute if moreItemsAvailable is false.
    Integer nextPageOffset =
        moreItemsAvailable
            ? reader.readNullableAttributeValue(
                Integer.class, XmlAttributeNames.IndexedPagingOffset)
            : null;

    if (!this.isGrouped) {
      this.results = new FindItemsResults<TItem>();
      this.results.setTotalCount(totalItemsInView);
      this.results.setNextPageOffset(nextPageOffset);
      this.results.setMoreAvailable(moreItemsAvailable);
      internalReadItemsFromXml(reader, this.propertySet, this.results.getItems());
    } else {
      this.groupedFindResults = new GroupedFindItemsResults<TItem>();
      this.groupedFindResults.setTotalCount(totalItemsInView);
      this.groupedFindResults.setNextPageOffset(nextPageOffset);
      this.groupedFindResults.setMoreAvailable(moreItemsAvailable);

      reader.readStartElement(XmlNamespace.Types, XmlElementNames.Groups);

      if (!reader.isEmptyElement()) {
        do {
          reader.read();

          if (reader.isStartElement(XmlNamespace.Types, XmlElementNames.GroupedItems)) {
            String groupIndex =
                reader.readElementValue(XmlNamespace.Types, XmlElementNames.GroupIndex);

            ArrayList<TItem> itemList = new ArrayList<TItem>();
            internalReadItemsFromXml(reader, this.propertySet, itemList);

            reader.readEndElement(XmlNamespace.Types, XmlElementNames.GroupedItems);

            this.groupedFindResults.getItemGroups().add(new ItemGroup<TItem>(groupIndex, itemList));
          }
        } while (!reader.isEndElement(XmlNamespace.Types, XmlElementNames.Groups));
      } else {
        reader.read();
      }
    }

    reader.readEndElement(XmlNamespace.Messages, XmlElementNames.RootFolder);
  }