protected void inItem() {
   if (endOfInstanceItem()) {
     refineBuilderBeforeAddingInstance();
     instances.add(builder.build());
     builder = builderProvider.get();
   }
 }
 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();
 }
  protected void refineBuilderBeforeAddingInstance() {
    String region = getRequest() != null ? AWSUtils.findRegionInArgsOrNull(getRequest()) : null;

    // Eucalyptus
    if (builder.getIpAddress() == null
        && builder.getDnsName() != null
        && builder.getDnsName().matches(".*[0-9]$")) {
      builder.ipAddress(builder.getDnsName());
      builder.dnsName(null);
    }
    if (builder.getPrivateIpAddress() == null
        && builder.getPrivateDnsName() != null
        && builder.getPrivateDnsName().matches(".*[0-9]$")) {
      builder.privateIpAddress(builder.getPrivateDnsName());
      builder.privateDnsName(null);
    }

    builder.region((region == null) ? defaultRegion.get() : region);
    builder.groupNames(groupNames);
  }