public void endElement(String uri, String name, String qName) {
   if (qName.equals("volumeId")) {
     if (inAttachmentSet) {
       volumeId = currentText.toString().trim();
     } else {
       id = currentText.toString().trim();
     }
   } else if (qName.equals("size")) {
     size = Integer.parseInt(currentText.toString().trim());
   } else if (qName.equals("availabilityZone")) {
     availabilityZone = currentText.toString().trim();
   } else if (qName.equals("volumeId")) {
     if (inAttachmentSet) {
       volumeId = currentText.toString().trim();
     } else {
       id = currentText.toString().trim();
     }
   } else if (qName.equals("status")) {
     if (inAttachmentSet) {
       attachmentStatus = Attachment.Status.fromValue(currentText.toString().trim());
     } else {
       volumeStatus = Volume.Status.fromValue(currentText.toString().trim());
     }
   } else if (qName.equals("createTime")) {
     createTime = dateCodec.toDate(currentText.toString().trim());
   } else if (qName.equals("attachmentSet")) {
     inAttachmentSet = false;
   } else if (qName.equals("instanceId")) {
     instanceId = currentText.toString().trim();
   } else if (qName.equals("snapshotId")) {
     snapshotId = currentText.toString().trim();
     if (snapshotId.equals("")) snapshotId = null;
   } else if (qName.equals("device")) {
     device = currentText.toString().trim();
   } else if (qName.equals("attachTime")) {
     attachTime = dateCodec.toDate(currentText.toString().trim());
   } else if (qName.equals("item")) {
     if (inAttachmentSet) {
       attachments.add(
           new Attachment(region, volumeId, instanceId, device, attachmentStatus, attachTime));
       volumeId = null;
       instanceId = null;
       device = null;
       attachmentStatus = null;
       attachTime = null;
     }
   }
   currentText = new StringBuilder();
 }
  /**
   * returns a {@link RetryAfterException} if parameter {@code retryAfter} corresponds to known
   * formats.
   *
   * @see <a href="https://tools.ietf.org/html/rfc2616#section-14.37">Retry-After format</a>
   */
  public Optional<RetryAfterException> tryCreateRetryAfterException(
      Throwable in, String retryAfter) {
    checkNotNull(in, "throwable");
    checkNotNull(retryAfter, "retryAfter");

    if (retryAfter.matches("^[0-9]+$"))
      return Optional.of(new RetryAfterException(in, Integer.parseInt(retryAfter)));
    try {
      long retryTimeMillis = dateCodec.toDate(retryAfter).getTime();
      long currentTimeMillis = NANOSECONDS.toMillis(ticker.read());
      return Optional.of(
          new RetryAfterException(
              in, (int) MILLISECONDS.toSeconds(retryTimeMillis - currentTimeMillis)));
    } catch (IllegalArgumentException e) {
      // ignored
    }
    return Optional.absent();
  }
 protected final Date textToIso8601Date() {
   return dateCodec.toDate(textToStringValue());
 }
 public void endElement(String uri, String name, String qName) {
   if (equalsOrSuffix(qName, "item")) {
     inItem();
     itemDepth--;
   } else if (equalsOrSuffix(qName, "instancesSet")) {
     inInstancesSet = false;
   } else if (equalsOrSuffix(qName, "productCodes")) {
     inProductCodes = false;
   } else if (equalsOrSuffix(qName, "groupSet")) {
     inGroupSet = false;
   } else if (equalsOrSuffix(qName, "groupId")) {
     groupNames.add(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "ownerId")) {
     ownerId = currentOrNull(currentText);
   } else if (equalsOrSuffix(qName, "requesterId")) {
     requesterId = currentOrNull(currentText);
   } else if (equalsOrSuffix(qName, "reservationId")) {
     reservationId = currentOrNull(currentText);
   } else if (equalsOrSuffix(qName, "amiLaunchIndex")) {
     builder.amiLaunchIndex(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "dnsName")) {
     String dnsName = currentOrNull(currentText);
     // Eucalyptus
     if (!"0.0.0.0".equals(dnsName)) builder.dnsName(dnsName);
   } else if (equalsOrSuffix(qName, "imageId")) {
     builder.imageId(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "instanceId")) {
     builder.instanceId(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "name")) {
     String rawState = currentOrNull(currentText);
     if (rawState != null) {
       builder.rawState(rawState);
       builder.instanceState(InstanceState.fromValue(rawState));
     }
   } else if (equalsOrSuffix(qName, "instanceType")) {
     builder.instanceType(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "ipAddress")) {
     builder.ipAddress(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "kernelId")) {
     builder.kernelId(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "keyName")) {
     builder.keyName(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "launchTime")) {
     builder.launchTime(dateCodec.toDate(currentOrNull(currentText)));
   } else if (equalsOrSuffix(qName, "availabilityZone")) {
     builder.availabilityZone(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "virtualizationType")) {
     builder.virtualizationType(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "platform")) {
     builder.platform(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "privateDnsName")) {
     String privateDnsName = currentOrNull(currentText);
     // Eucalyptus
     if (!"0.0.0.0".equals(privateDnsName)) builder.privateDnsName(privateDnsName);
   } else if (equalsOrSuffix(qName, "privateIpAddress")) {
     builder.privateIpAddress(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "ramdiskId")) {
     builder.ramdiskId(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "reason")) {
     builder.reason(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "rootDeviceType")) {
     builder.rootDeviceType(RootDeviceType.fromValue(currentOrNull(currentText)));
   } else if (equalsOrSuffix(qName, "rootDeviceName")) {
     builder.rootDeviceName(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "deviceName")) {
     deviceName = currentOrNull(currentText);
   } else if (equalsOrSuffix(qName, "volumeId")) {
     volumeId = currentOrNull(currentText);
   } else if (equalsOrSuffix(qName, "status")) {
     attachmentStatus = Attachment.Status.fromValue(currentText.toString().trim());
   } else if (equalsOrSuffix(qName, "attachTime")) {
     attachTime = dateCodec.toDate(currentOrNull(currentText));
   } else if (equalsOrSuffix(qName, "deleteOnTermination")) {
     deleteOnTermination = Boolean.parseBoolean(currentText.toString().trim());
   } else if (equalsOrSuffix(qName, "ebs")) {
     builder.device(
         deviceName, new BlockDevice(volumeId, attachmentStatus, attachTime, deleteOnTermination));
     this.deviceName = null;
     this.volumeId = null;
     this.attachmentStatus = null;
     this.attachTime = null;
     this.deleteOnTermination = true;
   }
   currentText = new StringBuilder();
 }