/**
   * Populates the object from the XMLStreamReader, reader must be at Start element of Properties
   *
   * @param xmlr the XMLStreamReader object
   * @return the BlobProperties that was read.
   * @throws XMLStreamException if there is a parsing exception
   * @throws ParseException if a date value is not correctly encoded
   * @throws StorageException
   * @throws URISyntaxException
   */
  protected static BlobProperties readBlobProperties(final XMLStreamReader xmlr)
      throws XMLStreamException, ParseException, StorageException, URISyntaxException {
    xmlr.require(XMLStreamConstants.START_ELEMENT, null, BlobConstants.PROPERTIES);
    int eventType = xmlr.getEventType();
    final BlobProperties properties = new BlobProperties();

    while (xmlr.hasNext()) {
      eventType = xmlr.next();
      final String name = xmlr.getName().toString();

      if (eventType == XMLStreamConstants.START_ELEMENT) {
        if (name.equals(Constants.LAST_MODIFIED_ELEMENT)) {
          properties.setLastModified(
              Utility.parseRFC1123DateFromStringInGMT(
                  Utility.readElementFromXMLReader(xmlr, Constants.LAST_MODIFIED_ELEMENT)));
        } else if (name.equals(Constants.ETAG_ELEMENT)) {
          properties.setEtag(Utility.readElementFromXMLReader(xmlr, Constants.ETAG_ELEMENT));
        } else if (name.equals(Constants.HeaderConstants.CONTENT_LENGTH)) {
          final String tempString =
              Utility.readElementFromXMLReader(xmlr, Constants.HeaderConstants.CONTENT_LENGTH);
          properties.setLength(Long.parseLong(tempString));
        } else if (name.equals(Constants.HeaderConstants.CONTENT_TYPE)) {
          properties.setContentType(
              Utility.readElementFromXMLReader(xmlr, Constants.HeaderConstants.CONTENT_TYPE));
        } else if (name.equals(Constants.HeaderConstants.CONTENT_ENCODING)) {
          properties.setContentEncoding(
              Utility.readElementFromXMLReader(xmlr, Constants.HeaderConstants.CONTENT_ENCODING));
        } else if (name.equals(Constants.HeaderConstants.CONTENT_LANGUAGE)) {
          properties.setContentLanguage(
              Utility.readElementFromXMLReader(xmlr, Constants.HeaderConstants.CONTENT_LANGUAGE));
        } else if (name.equals(Constants.HeaderConstants.CONTENT_MD5)) {
          properties.setContentMD5(
              Utility.readElementFromXMLReader(xmlr, Constants.HeaderConstants.CONTENT_MD5));
        } else if (name.equals(Constants.HeaderConstants.CACHE_CONTROL)) {
          properties.setCacheControl(
              Utility.readElementFromXMLReader(xmlr, Constants.HeaderConstants.CACHE_CONTROL));
        } else if (name.equals(Constants.HeaderConstants.CACHE_CONTROL)) {
          properties.setCacheControl(
              Utility.readElementFromXMLReader(xmlr, Constants.HeaderConstants.CACHE_CONTROL));
        } else if (name.equals(BlobConstants.SEQUENCE_NUMBER)) {
          Utility.readElementFromXMLReader(xmlr, BlobConstants.SEQUENCE_NUMBER);
        } else if (name.equals(BlobConstants.BLOB_TYPE_ELEMENT)) {
          final String tempString =
              Utility.readElementFromXMLReader(xmlr, BlobConstants.BLOB_TYPE_ELEMENT);
          if (tempString.equals(BlobConstants.BLOCK_BLOB_VALUE)) {
            properties.setBlobType(BlobType.BLOCK_BLOB);
          } else if (tempString.equals(BlobConstants.PAGE_BLOB_VALUE)) {
            properties.setBlobType(BlobType.PAGE_BLOB);
          } else {
            throw new StorageException(
                StorageErrorCodeStrings.INVALID_XML_DOCUMENT,
                "The response received is invalid or improperly formatted.",
                Constants.HeaderConstants.HTTP_UNUSED_306,
                null,
                null);
          }
        } else if (name.equals(Constants.LEASE_STATUS_ELEMENT)) {
          final String tempString =
              Utility.readElementFromXMLReader(xmlr, Constants.LEASE_STATUS_ELEMENT);
          if (tempString.equals(Constants.LOCKED_VALUE.toLowerCase())) {
            properties.setLeaseStatus(LeaseStatus.LOCKED);
          } else if (tempString.equals(Constants.UNLOCKED_VALUE.toLowerCase())) {
            properties.setLeaseStatus(LeaseStatus.UNLOCKED);
          } else {
            throw new StorageException(
                StorageErrorCodeStrings.INVALID_XML_DOCUMENT,
                "The response received is invalid or improperly formatted.",
                Constants.HeaderConstants.HTTP_UNUSED_306,
                null,
                null);
          }
        } else if (name.equals(Constants.LEASE_STATE_ELEMENT)) {
          properties.setLeaseState(
              LeaseState.parse(
                  Utility.readElementFromXMLReader(xmlr, Constants.LEASE_STATE_ELEMENT)));
        } else if (name.equals(Constants.LEASE_DURATION_ELEMENT)) {
          properties.setLeaseDuration(
              LeaseDuration.parse(
                  Utility.readElementFromXMLReader(xmlr, Constants.LEASE_DURATION_ELEMENT)));
        }
      } else if (eventType == XMLStreamConstants.END_ELEMENT) {
        // expect end of properties
        xmlr.require(XMLStreamConstants.END_ELEMENT, null, BlobConstants.PROPERTIES);
        break;
      }
    }

    return properties;
  }