/**
   * Converts the RestoreObjectRequest to an XML fragment that can be sent to the RestoreObject
   * operation of Amazon S3.
   *
   * @param restoreObjectRequest The container which provides options for restoring an object, which
   *     was transitioned to the Glacier from S3 when it was expired, into S3 again.
   * @return A byte array containing the data
   * @throws AmazonClientException
   */
  public static byte[] convertToXmlByteArray(RestoreObjectRequest restoreObjectRequest)
      throws AmazonClientException {
    XmlWriter xml = new XmlWriter();

    xml.start("RestoreRequest");
    xml.start("Days").value(Integer.toString(restoreObjectRequest.getExpirationInDays())).end();
    xml.end();

    return xml.getBytes();
  }
  /**
   * Converts the specified list of PartETags to an XML fragment that can be sent to the
   * CompleteMultipartUpload operation of Amazon S3.
   *
   * @param partETags The list of part ETags containing the data to include in the new XML fragment.
   * @return A byte array containing the data
   */
  public static byte[] convertToXmlByteArray(List<PartETag> partETags) {
    XmlWriter xml = new XmlWriter();
    xml.start("CompleteMultipartUpload");
    if (partETags != null) {
      List<PartETag> sortedPartETags = new ArrayList<PartETag>(partETags);
      Collections.sort(
          sortedPartETags,
          new Comparator<PartETag>() {
            public int compare(PartETag tag1, PartETag tag2) {
              if (tag1.getPartNumber() < tag2.getPartNumber()) return -1;
              if (tag1.getPartNumber() > tag2.getPartNumber()) return 1;
              return 0;
            }
          });

      for (PartETag partEtag : sortedPartETags) {
        xml.start("Part");
        xml.start("PartNumber").value(Integer.toString(partEtag.getPartNumber())).end();
        xml.start("ETag").value(partEtag.getETag()).end();
        xml.end();
      }
    }
    xml.end();

    return xml.getBytes();
  }