All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.qcloud.cos.internal.XmlResponsesSaxParser Maven / Gradle / Ivy

There is a newer version: 5.6.238.2
Show newest version
package com.qcloud.cos.internal;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.model.AccessControlList;
import com.qcloud.cos.model.COSObjectSummary;
import com.qcloud.cos.model.CompleteMultipartUploadResult;
import com.qcloud.cos.model.CopyObjectResult;
import com.qcloud.cos.model.Grantee;
import com.qcloud.cos.model.InitiateMultipartUploadResult;
import com.qcloud.cos.model.MultipartUpload;
import com.qcloud.cos.model.MultipartUploadListing;
import com.qcloud.cos.model.ObjectListing;
import com.qcloud.cos.model.Owner;
import com.qcloud.cos.model.PartListing;
import com.qcloud.cos.model.PartSummary;
import com.qcloud.cos.model.Permission;
import com.qcloud.cos.utils.DateUtils;
import com.qcloud.cos.utils.ServiceUtils;
import com.qcloud.cos.utils.StringUtils;


/**
 * XML Sax parser to read XML documents returned by COS via the REST interface, converting these
 * documents into objects.
 */
public class XmlResponsesSaxParser {
    private static final Logger log = LoggerFactory.getLogger(XmlResponsesSaxParser.class);

    private XMLReader xr = null;

    private boolean sanitizeXmlDocument = true;

    /**
     * Constructs the XML SAX parser.
     *
     * @throws CosClientException
     */
    public XmlResponsesSaxParser() throws CosClientException {
        // Ensure we can load the XML Reader.
        try {
            xr = XMLReaderFactory.createXMLReader();
        } catch (SAXException e) {
            throw new CosClientException("Couldn't initialize a SAX driver to create an XMLReader",
                    e);
        }
    }

    /**
     * Parses an XML document from an input stream using a document handler.
     *
     * @param handler the handler for the XML document
     * @param inputStream an input stream containing the XML document to parse
     *
     * @throws IOException on error reading from the input stream (ie connection reset)
     * @throws CosClientException on error with malformed XML, etc
     */
    protected void parseXmlInputStream(DefaultHandler handler, InputStream inputStream)
            throws IOException {
        try {

            if (log.isDebugEnabled()) {
                log.debug("Parsing XML response document with handler: " + handler.getClass());
            }

            BufferedReader breader =
                    new BufferedReader(new InputStreamReader(inputStream, StringUtils.UTF8));
            xr.setContentHandler(handler);
            xr.setErrorHandler(handler);
            xr.parse(new InputSource(breader));

        } catch (IOException e) {
            throw e;

        } catch (Throwable t) {
            try {
                inputStream.close();
            } catch (IOException e) {
                if (log.isErrorEnabled()) {
                    log.error("Unable to close response InputStream up after XML parse failure", e);
                }
            }
            throw new CosClientException(
                    "Failed to parse XML document with handler " + handler.getClass(), t);
        }
    }

    protected InputStream sanitizeXmlDocument(DefaultHandler handler, InputStream inputStream)
            throws IOException {

        if (!sanitizeXmlDocument) {
            // No sanitizing will be performed, return the original input stream unchanged.
            return inputStream;
        } else {
            if (log.isDebugEnabled()) {
                log.debug("Sanitizing XML document destined for handler " + handler.getClass());
            }

            InputStream sanitizedInputStream = null;

            try {

                /*
                 * Read object listing XML document from input stream provided into a string buffer,
                 * so we can replace troublesome characters before sending the document to the XML
                 * parser.
                 */
                StringBuilder listingDocBuffer = new StringBuilder();
                BufferedReader br =
                        new BufferedReader(new InputStreamReader(inputStream, StringUtils.UTF8));

                char[] buf = new char[8192];
                int read = -1;
                while ((read = br.read(buf)) != -1) {
                    listingDocBuffer.append(buf, 0, read);
                }
                br.close();

                /*
                 * Replace any carriage return (\r) characters with explicit XML character entities,
                 * to prevent the SAX parser from misinterpreting 0x0D characters as 0x0A and being
                 * unable to parse the XML.
                 */
                String listingDoc = listingDocBuffer.toString().replaceAll("\r", "
");

                sanitizedInputStream =
                        new ByteArrayInputStream(listingDoc.getBytes(StringUtils.UTF8));

            } catch (IOException e) {
                throw e;

            } catch (Throwable t) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    if (log.isErrorEnabled()) {
                        log.error(
                                "Unable to close response InputStream after failure sanitizing XML document",
                                e);
                    }
                }
                throw new CosClientException("Failed to sanitize XML document destined for handler "
                        + handler.getClass(), t);
            }
            return sanitizedInputStream;
        }
    }

    /**
     * Checks if the specified string is empty or null and if so, returns null. Otherwise simply
     * returns the string.
     *
     * @param s The string to check.
     * @return Null if the specified string was null, or empty, otherwise returns the string the
     *         caller passed in.
     */
    private static String checkForEmptyString(String s) {
        if (s == null)
            return null;
        if (s.length() == 0)
            return null;

        return s;
    }

    /**
     * Safely parses the specified string as an integer and returns the value. If a
     * NumberFormatException occurs while parsing the integer, an error is logged and -1 is
     * returned.
     *
     * @param s The string to parse and return as an integer.
     *
     * @return The integer value of the specified string, otherwise -1 if there were any problems
     *         parsing the string as an integer.
     */
    private static int parseInt(String s) {
        try {
            return Integer.parseInt(s);
        } catch (NumberFormatException nfe) {
            log.error("Unable to parse integer value '" + s + "'", nfe);
        }

        return -1;
    }

    /**
     * Safely parses the specified string as a long and returns the value. If a
     * NumberFormatException occurs while parsing the long, an error is logged and -1 is returned.
     *
     * @param s The string to parse and return as a long.
     *
     * @return The long value of the specified string, otherwise -1 if there were any problems
     *         parsing the string as a long.
     */
    private static long parseLong(String s) {
        try {
            return Long.parseLong(s);
        } catch (NumberFormatException nfe) {
            log.error("Unable to parse long value '" + s + "'", nfe);
        }

        return -1;
    }

    /**
     * Parses a ListBucket response XML document from an input stream.
     *
     * @param inputStream XML data input stream.
     * @return the XML handler object populated with data parsed from the XML stream.
     * @throws CosClientException
     */
    public ListBucketHandler parseListBucketObjectsResponse(InputStream inputStream)
            throws IOException {
        ListBucketHandler handler = new ListBucketHandler();
        parseXmlInputStream(handler, sanitizeXmlDocument(handler, inputStream));
        return handler;
    }

    //
    // /**
    // * Parses a ListVersions response XML document from an input stream.
    // *
    // * @param inputStream XML data input stream.
    // * @return the XML handler object populated with data parsed from the XML stream.
    // * @throws CosClientException
    // */
    // public ListVersionsHandler parseListVersionsResponse(InputStream inputStream)
    // throws IOException {
    // ListVersionsHandler handler = new ListVersionsHandler();
    // parseXmlInputStream(handler, sanitizeXmlDocument(handler, inputStream));
    // return handler;
    // }
    //
    // /**
    // * Parses a ListAllMyBuckets response XML document from an input stream.
    // *
    // * @param inputStream XML data input stream.
    // * @return the XML handler object populated with data parsed from the XML stream.
    // * @throws CosClientException
    // */
    // public ListAllMyBucketsHandler parseListMyBucketsResponse(InputStream inputStream)
    // throws IOException {
    // ListAllMyBucketsHandler handler = new ListAllMyBucketsHandler();
    // parseXmlInputStream(handler, sanitizeXmlDocument(handler, inputStream));
    // return handler;
    // }
    //
    // /**
    // * Parses an AccessControlListHandler response XML document from an input stream.
    // *
    // * @param inputStream XML data input stream.
    // * @return the XML handler object populated with data parsed from the XML stream.
    // *
    // * @throws CosClientException
    // */
    // public AccessControlListHandler parseAccessControlListResponse(InputStream inputStream)
    // throws IOException {
    // AccessControlListHandler handler = new AccessControlListHandler();
    // parseXmlInputStream(handler, inputStream);
    // return handler;
    // }
    //
    // /**
    // * Parses a LoggingStatus response XML document for a bucket from an input stream.
    // *
    // * @param inputStream XML data input stream.
    // * @return the XML handler object populated with data parsed from the XML stream.
    // *
    // * @throws CosClientException
    // */
    // public BucketLoggingConfigurationHandler parseLoggingStatusResponse(InputStream inputStream)
    // throws IOException {
    // BucketLoggingConfigurationHandler handler = new BucketLoggingConfigurationHandler();
    // parseXmlInputStream(handler, inputStream);
    // return handler;
    // }
    //
    // public BucketLifecycleConfigurationHandler parseBucketLifecycleConfigurationResponse(
    // InputStream inputStream) throws IOException {
    // BucketLifecycleConfigurationHandler handler = new BucketLifecycleConfigurationHandler();
    // parseXmlInputStream(handler, inputStream);
    // return handler;
    // }
    //
    // public BucketCrossOriginConfigurationHandler parseBucketCrossOriginConfigurationResponse(
    // InputStream inputStream) throws IOException {
    // BucketCrossOriginConfigurationHandler handler = new BucketCrossOriginConfigurationHandler();
    // parseXmlInputStream(handler, inputStream);
    // return handler;
    // }
    //
    // public String parseBucketLocationResponse(InputStream inputStream) throws IOException {
    // BucketLocationHandler handler = new BucketLocationHandler();
    // parseXmlInputStream(handler, inputStream);
    // return handler.getLocation();
    // }
    //
    // public BucketVersioningConfigurationHandler parseVersioningConfigurationResponse(
    // InputStream inputStream) throws IOException {
    // BucketVersioningConfigurationHandler handler = new BucketVersioningConfigurationHandler();
    // parseXmlInputStream(handler, inputStream);
    // return handler;
    // }
    //
    // public BucketWebsiteConfigurationHandler parseWebsiteConfigurationResponse(
    // InputStream inputStream) throws IOException {
    // BucketWebsiteConfigurationHandler handler = new BucketWebsiteConfigurationHandler();
    // parseXmlInputStream(handler, inputStream);
    // return handler;
    // }
    //
    //
    // public BucketReplicationConfigurationHandler parseReplicationConfigurationResponse(
    // InputStream inputStream) throws IOException {
    // BucketReplicationConfigurationHandler handler = new BucketReplicationConfigurationHandler();
    // parseXmlInputStream(handler, inputStream);
    // return handler;
    // }
    //
    // public BucketTaggingConfigurationHandler parseTaggingConfigurationResponse(
    // InputStream inputStream) throws IOException {
    // BucketTaggingConfigurationHandler handler = new BucketTaggingConfigurationHandler();
    // parseXmlInputStream(handler, inputStream);
    // return handler;
    // }
    //
    // public DeleteObjectsHandler parseDeletedObjectsResult(InputStream inputStream)
    // throws IOException {
    // DeleteObjectsHandler handler = new DeleteObjectsHandler();
    // parseXmlInputStream(handler, inputStream);
    // return handler;
    // }
    //
    public CopyObjectResultHandler parseCopyObjectResponse(InputStream inputStream)
            throws IOException {
        CopyObjectResultHandler handler = new CopyObjectResultHandler();
        parseXmlInputStream(handler, inputStream);
        return handler;
    }

    public CompleteMultipartUploadHandler parseCompleteMultipartUploadResponse(
            InputStream inputStream) throws IOException {
        CompleteMultipartUploadHandler handler = new CompleteMultipartUploadHandler();
        parseXmlInputStream(handler, inputStream);
        return handler;
    }

    public InitiateMultipartUploadHandler parseInitiateMultipartUploadResponse(
            InputStream inputStream) throws IOException {
        InitiateMultipartUploadHandler handler = new InitiateMultipartUploadHandler();
        parseXmlInputStream(handler, inputStream);
        return handler;
    }

    public ListMultipartUploadsHandler parseListMultipartUploadsResponse(InputStream inputStream)
            throws IOException {
        ListMultipartUploadsHandler handler = new ListMultipartUploadsHandler();
        parseXmlInputStream(handler, inputStream);
        return handler;
    }

    public ListPartsHandler parseListPartsResponse(InputStream inputStream) throws IOException {
        ListPartsHandler handler = new ListPartsHandler();
        parseXmlInputStream(handler, inputStream);
        return handler;
    }


    /**
     * @param inputStream
     *
     * @return true if the bucket's is configured as Requester Pays, false if it is configured as
     *         Owner pays.
     *
     * @throws CosClientException
     */
    // public RequestPaymentConfigurationHandler parseRequestPaymentConfigurationResponse(
    // InputStream inputStream) throws IOException {
    // RequestPaymentConfigurationHandler handler = new RequestPaymentConfigurationHandler();
    // parseXmlInputStream(handler, inputStream);
    // return handler;
    // }

    // ////////////
    // Handlers //
    // ////////////

    /**
     * Handler for ListBucket response XML documents. //
     */
    public static class ListBucketHandler extends AbstractHandler {
        private final ObjectListing objectListing = new ObjectListing();

        private COSObjectSummary currentObject = null;
        private Owner currentOwner = null;
        private String lastKey = null;

        public ObjectListing getObjectListing() {
            return objectListing;
        }

        @Override
        protected void doStartElement(String uri, String name, String qName, Attributes attrs) {

            if (in("ListBucketResult")) {
                if (name.equals("Contents")) {
                    currentObject = new COSObjectSummary();
                    currentObject.setBucketName(objectListing.getBucketName());
                }
            }

            else if (in("ListBucketResult", "Contents")) {
                if (name.equals("Owner")) {
                    currentOwner = new Owner();
                }
            }
        }

        @Override
        protected void doEndElement(String uri, String name, String qName) {
            if (atTopLevel()) {
                if (name.equals("ListBucketResult")) {
                    /*
                     * COS only includes the NextMarker XML element if the request specified a
                     * delimiter, but for consistency we'd like to always give easy access to the
                     * next marker if we're returning a list of results that's truncated.
                     */
                    if (objectListing.isTruncated() && objectListing.getNextMarker() == null) {

                        String nextMarker = null;
                        if (!objectListing.getObjectSummaries().isEmpty()) {
                            nextMarker = objectListing.getObjectSummaries()
                                    .get(objectListing.getObjectSummaries().size() - 1).getKey();

                        } else if (!objectListing.getCommonPrefixes().isEmpty()) {
                            nextMarker = objectListing.getCommonPrefixes()
                                    .get(objectListing.getCommonPrefixes().size() - 1);
                        } else {
                            log.error("COS response indicates truncated results, "
                                    + "but contains no object summaries or " + "common prefixes.");
                        }

                        objectListing.setNextMarker(nextMarker);
                    }
                }
            }

            else if (in("ListBucketResult")) {
                if (name.equals("Name")) {
                    objectListing.setBucketName(getText());
                    if (log.isDebugEnabled()) {
                        log.debug("Examining listing for bucket: " + objectListing.getBucketName());
                    }

                } else if (name.equals("Prefix")) {
                    objectListing.setPrefix(checkForEmptyString(getText()));

                } else if (name.equals("Marker")) {
                    objectListing.setMarker(checkForEmptyString(getText()));

                } else if (name.equals("NextMarker")) {
                    objectListing.setNextMarker(getText());

                } else if (name.equals("MaxKeys")) {
                    objectListing.setMaxKeys(parseInt(getText()));

                } else if (name.equals("Delimiter")) {
                    objectListing.setDelimiter(checkForEmptyString(getText()));

                } else if (name.equals("EncodingType")) {
                    objectListing.setEncodingType(checkForEmptyString(getText()));

                } else if (name.equals("IsTruncated")) {
                    String isTruncatedStr = getText().toLowerCase(Locale.getDefault());

                    if (isTruncatedStr.startsWith("false")) {
                        objectListing.setTruncated(false);
                    } else if (isTruncatedStr.startsWith("true")) {
                        objectListing.setTruncated(true);
                    } else {
                        throw new IllegalStateException(
                                "Invalid value for IsTruncated field: " + isTruncatedStr);
                    }

                } else if (name.equals("Contents")) {
                    objectListing.getObjectSummaries().add(currentObject);
                    currentObject = null;
                }
            }

            else if (in("ListBucketResult", "Contents")) {
                if (name.equals("Key")) {
                    lastKey = getText();
                    currentObject.setKey(lastKey);

                } else if (name.equals("LastModified")) {
                    currentObject.setLastModified(DateUtils.parseISO8601Date(getText()));

                } else if (name.equals("ETag")) {
                    currentObject.setETag(StringUtils.removeQuotes(getText()));

                } else if (name.equals("Size")) {
                    currentObject.setSize(parseLong(getText()));

                } else if (name.equals("StorageClass")) {
                    currentObject.setStorageClass(getText());

                } else if (name.equals("Owner")) {
                    currentObject.setOwner(currentOwner);
                    currentOwner = null;
                }
            }

            else if (in("ListBucketResult", "Contents", "Owner")) {
                if (name.equals("ID")) {
                    currentOwner.setId(getText());

                } else if (name.equals("DisplayName")) {
                    currentOwner.setDisplayName(getText());
                }
            }

            else if (in("ListBucketResult", "CommonPrefixes")) {
                if (name.equals("Prefix")) {
                    objectListing.getCommonPrefixes().add(getText());
                }
            }
        }
    }

    // /**
    // * Handler for ListAllMyBuckets response XML documents. The document is
    // * parsed into {@link Bucket}s available via the {@link #getBuckets()}
    // * method.
    // */
    // public static class ListAllMyBucketsHandler extends AbstractHandler {
    //
    // private final List buckets = new ArrayList();
    // private Owner bucketsOwner = null;
    //
    // private Bucket currentBucket = null;
    //
    // /**
    // * @return the buckets listed in the document.
    // */
    // public List getBuckets() {
    // return buckets;
    // }
    //
    // /**
    // * @return the owner of the buckets.
    // */
    // public Owner getOwner() {
    // return bucketsOwner;
    // }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // if (in("ListAllMyBucketsResult")) {
    // if (name.equals("Owner")) {
    // bucketsOwner = new Owner();
    // }
    // } else if (in("ListAllMyBucketsResult", "Buckets")) {
    // if (name.equals("Bucket")) {
    // currentBucket = new Bucket();
    // currentBucket.setOwner(bucketsOwner);
    // }
    // }
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (in("ListAllMyBucketsResult", "Owner")) {
    // if (name.equals("ID")) {
    // bucketsOwner.setId(getText());
    //
    // } else if (name.equals("DisplayName")) {
    // bucketsOwner.setDisplayName(getText());
    // }
    // }
    //
    // else if (in("ListAllMyBucketsResult", "Buckets")) {
    // if (name.equals("Bucket")) {
    // buckets.add(currentBucket);
    // currentBucket = null;
    // }
    // }
    //
    // else if (in("ListAllMyBucketsResult", "Buckets", "Bucket")) {
    // if (name.equals("Name")) {
    // currentBucket.setName(getText());
    //
    // } else if (name.equals("CreationDate")) {
    // Date creationDate = DateUtils.parseISO8601Date(getText());
    // currentBucket.setCreationDate(creationDate);
    // }
    // }
    // }
    // }

    /**
     * Handler for AccessControlList response XML documents. The document is parsed into an
     * {@link AccessControlList} object available via the {@link #getAccessControlList()} method.
     */
    // public static class AccessControlListHandler extends AbstractHandler {
    //
    // private final AccessControlList accessControlList =
    // new AccessControlList();
    //
    // private Grantee currentGrantee = null;
    // private Permission currentPermission = null;
    //
    // /**
    // * @return an object representing the ACL document.
    // */
    // public AccessControlList getAccessControlList() {
    // return accessControlList;
    // }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // if (in("AccessControlPolicy")) {
    // if (name.equals("Owner")) {
    // accessControlList.setOwner(new Owner());
    //
    // }
    // }
    //
    // else if (in("AccessControlPolicy", "AccessControlList", "Grant")) {
    // if (name.equals("Grantee")) {
    // String type = XmlResponsesSaxParser
    // .findAttributeValue( "xsi:type", attrs );
    //
    // if ("CanonicalUser".equals(type)) {
    // currentGrantee = new CanonicalGrantee(null);
    // } else if ("Group".equals(type)) {
    // /*
    // * Nothing to do for GroupGrantees here since we
    // * can't construct an empty enum value early.
    // */
    // }
    // }
    // }
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (in("AccessControlPolicy", "Owner")) {
    // if (name.equals("ID")) {
    // accessControlList.getOwner().setId(getText());
    // } else if (name.equals("DisplayName")) {
    // accessControlList.getOwner().setDisplayName(getText());
    // }
    // }
    //
    // else if (in("AccessControlPolicy", "AccessControlList")) {
    // if (name.equals("Grant")) {
    // accessControlList.grantPermission(
    // currentGrantee, currentPermission);
    //
    // currentGrantee = null;
    // currentPermission = null;
    // }
    // }
    //
    // else if (in("AccessControlPolicy", "AccessControlList", "Grant")) {
    // if (name.equals("Permission")) {
    // currentPermission = Permission.parsePermission(getText());
    // }
    // }
    //
    // else if (in("AccessControlPolicy", "AccessControlList", "Grant", "Grantee")) {
    // if (name.equals("ID")) {
    // currentGrantee.setIdentifier(getText());
    //
    // } else if (name.equals("EmailAddress")) {
    // currentGrantee.setIdentifier(getText());
    //
    // } else if (name.equals("URI")) {
    // /*
    // * Only GroupGrantees contain an URI element in them, and we
    // * can't construct currentGrantee during startElement for a
    // * GroupGrantee since it's an enum.
    // */
    // currentGrantee = GroupGrantee.parseGroupGrantee(getText());
    //
    // } else if (name.equals("DisplayName")) {
    // ((CanonicalGrantee) currentGrantee)
    // .setDisplayName(getText());
    // }
    // }
    // }
    // }

    /**
     * Handler for LoggingStatus response XML documents for a bucket. The document is parsed into an
     * {@link BucketLoggingConfiguration} object available via the
     * {@link #getBucketLoggingConfiguration()} method.
     */
    // public static class BucketLoggingConfigurationHandler extends AbstractHandler {
    //
    // private final BucketLoggingConfiguration bucketLoggingConfiguration =
    // new BucketLoggingConfiguration();
    //
    // /**
    // * @return
    // * an object representing the bucket's LoggingStatus document.
    // */
    // public BucketLoggingConfiguration getBucketLoggingConfiguration() {
    // return bucketLoggingConfiguration;
    // }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (in("BucketLoggingStatus", "LoggingEnabled")) {
    // if (name.equals("TargetBucket")) {
    // bucketLoggingConfiguration
    // .setDestinationBucketName(getText());
    //
    // } else if (name.equals("TargetPrefix")) {
    // bucketLoggingConfiguration
    // .setLogFilePrefix(getText());
    // }
    // }
    // }
    // }

    /**
     * Handler for CreateBucketConfiguration response XML documents for a bucket. The document is
     * parsed into a String representing the bucket's location, available via the
     * {@link #getLocation()} method.
     */
    // public static class BucketLocationHandler extends AbstractHandler {
    //
    // private String location = null;
    //
    // /**
    // * @return
    // * the bucket's location.
    // */
    // public String getLocation() {
    // return location;
    // }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (atTopLevel()) {
    // if (name.equals("LocationConstraint")) {
    // String elementText = getText();
    // if (elementText.length() == 0) {
    // location = null;
    // } else {
    // location = elementText;
    // }
    // }
    // }
    // }
    // }

    public static class CopyObjectResultHandler extends AbstractSSEHandler
            implements ObjectExpirationResult {

        // Data items for successful copy
        private final CopyObjectResult result = new CopyObjectResult();

        // Data items for failed copy
        private String errorCode = null;
        private String errorMessage = null;
        private String errorRequestId = null;
        private String errorHostId = null;
        private boolean receivedErrorResponse = false;

        @Override
        protected ServerSideEncryptionResult sseResult() {
            return result;
        }

        public Date getLastModified() {
            return result.getLastModifiedDate();
        }

        public String getVersionId() {
            return result.getVersionId();
        }

        public void setVersionId(String versionId) {
            result.setVersionId(versionId);
        }

        @Override
        public Date getExpirationTime() {
            return result.getExpirationTime();
        }

        @Override
        public void setExpirationTime(Date expirationTime) {
            result.setExpirationTime(expirationTime);
        }

        @Override
        public String getExpirationTimeRuleId() {
            return result.getExpirationTimeRuleId();
        }

        @Override
        public void setExpirationTimeRuleId(String expirationTimeRuleId) {
            result.setExpirationTimeRuleId(expirationTimeRuleId);
        }

        public String getETag() {
            return result.getETag();
        }

        public String getErrorCode() {
            return errorCode;
        }

        public String getErrorHostId() {
            return errorHostId;
        }

        public String getErrorMessage() {
            return errorMessage;
        }

        public String getErrorRequestId() {
            return errorRequestId;
        }

        public boolean isErrorResponse() {
            return receivedErrorResponse;
        }

        @Override
        protected void doStartElement(String uri, String name, String qName, Attributes attrs) {

            if (atTopLevel()) {
                if (name.equals("CopyObjectResult") || name.equals("CopyPartResult")) {
                    receivedErrorResponse = false;
                } else if (name.equals("Error")) {
                    receivedErrorResponse = true;
                }
            }
        }

        @Override
        protected void doEndElement(String uri, String name, String qName) {
            if (in("CopyObjectResult") || in("CopyPartResult")) {
                if (name.equals("LastModified")) {
//                    result.setLastModifiedDate(DateUtils.parseISO8601Date(getText()));
                } else if (name.equals("ETag")) {
                    result.setETag(StringUtils.removeQuotes(getText()));
                }
            }

            else if (in("Error")) {
                if (name.equals("Code")) {
                    errorCode = getText();
                } else if (name.equals("Message")) {
                    errorMessage = getText();
                } else if (name.equals("RequestId")) {
                    errorRequestId = getText();
                } else if (name.equals("HostId")) {
                    errorHostId = getText();
                }
            }
        }
    }

    // /**
    // * Handler for parsing RequestPaymentConfiguration XML response associated
    // * with an Qcloud COS bucket. The XML response is parsed into a
    // * RequestPaymentConfiguration object.
    // */
    // public static class RequestPaymentConfigurationHandler extends AbstractHandler {
    //
    // private String payer = null;
    //
    // public RequestPaymentConfiguration getConfiguration(){
    // return new RequestPaymentConfiguration(Payer.valueOf(payer));
    // }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (in("RequestPaymentConfiguration")) {
    // if (name.equals("Payer")) {
    // payer = getText();
    // }
    // }
    // }
    // }
    //
    // /**
    // * Handler for ListVersionsResult XML document.
    // */
    // public static class ListVersionsHandler extends AbstractHandler {
    //
    // private final VersionListing versionListing = new VersionListing();
    //
    // private COSVersionSummary currentVersionSummary;
    // private Owner currentOwner;
    //
    // public VersionListing getListing() {
    // return versionListing;
    // }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // if (in("ListVersionsResult")) {
    // if (name.equals("Version")) {
    // currentVersionSummary = new COSVersionSummary();
    // currentVersionSummary.setBucketName(
    // versionListing.getBucketName());
    //
    // } else if (name.equals("DeleteMarker")) {
    // currentVersionSummary = new COSVersionSummary();
    // currentVersionSummary.setBucketName(
    // versionListing.getBucketName());
    // currentVersionSummary.setIsDeleteMarker(true);
    // }
    // }
    //
    // else if (in("ListVersionsResult", "Version")
    // || in("ListVersionsResult", "DeleteMarker")) {
    // if (name.equals("Owner")) {
    // currentOwner = new Owner();
    // }
    // }
    // }
    //
    // @Override
    // protected void doEndElement(
    // String uri,
    // String name,
    // String qName) {
    //
    // if (in("ListVersionsResult")) {
    // if (name.equals("Name")) {
    // versionListing.setBucketName(getText());
    //
    // } else if (name.equals("Prefix")) {
    // versionListing.setPrefix(checkForEmptyString(getText()));
    //
    // } else if (name.equals("KeyMarker")) {
    // versionListing.setKeyMarker(checkForEmptyString(getText()));
    //
    // } else if (name.equals("VersionIdMarker")) {
    // versionListing.setVersionIdMarker(checkForEmptyString(
    // getText()));
    //
    // } else if (name.equals("MaxKeys")) {
    // versionListing.setMaxKeys(Integer.parseInt(getText()));
    //
    // } else if (name.equals("Delimiter")) {
    // versionListing.setDelimiter(checkForEmptyString(getText()));
    //
    // } else if (name.equals("EncodingType")) {
    // versionListing.setEncodingType(checkForEmptyString(
    // getText()));
    //
    // } else if (name.equals("NextKeyMarker")) {
    // versionListing.setNextKeyMarker(getText());
    //
    // } else if (name.equals("NextVersionIdMarker")) {
    // versionListing.setNextVersionIdMarker(getText());
    //
    // } else if (name.equals("IsTruncated")) {
    // versionListing.setTruncated("true".equals(getText()));
    //
    // } else if (name.equals("Version")
    // || name.equals("DeleteMarker")) {
    //
    // versionListing.getVersionSummaries()
    // .add(currentVersionSummary);
    //
    // currentVersionSummary = null;
    // }
    // }
    //
    // else if (in("ListVersionsResult", "CommonPrefixes")) {
    // if (name.equals("Prefix")) {
    // versionListing.getCommonPrefixes()
    // .add(checkForEmptyString(getText()));
    // }
    // }
    //
    // else if (in("ListVersionsResult", "Version")
    // || in("ListVersionsResult", "DeleteMarker")) {
    //
    // if (name.equals("Key")) {
    // currentVersionSummary.setKey(getText());
    //
    // } else if (name.equals("VersionId")) {
    // currentVersionSummary.setVersionId(getText());
    //
    // } else if (name.equals("IsLatest")) {
    // currentVersionSummary.setIsLatest("true".equals(getText()));
    //
    // } else if (name.equals("LastModified")) {
    // currentVersionSummary.setLastModified(
    // ServiceUtils.parseIso8601Date(getText()));
    //
    // } else if (name.equals("ETag")) {
    // currentVersionSummary.setETag(
    // ServiceUtils.removeQuotes(getText()));
    //
    // } else if (name.equals("Size")) {
    // currentVersionSummary.setSize(Long.parseLong(getText()));
    //
    // } else if (name.equals("Owner")) {
    // currentVersionSummary.setOwner(currentOwner);
    // currentOwner = null;
    //
    // } else if (name.equals("StorageClass")) {
    // currentVersionSummary.setStorageClass(getText());
    // }
    // }
    //
    // else if (in("ListVersionsResult", "Version", "Owner")
    // || in("ListVersionsResult", "DeleteMarker", "Owner")) {
    //
    // if (name.equals("ID")) {
    // currentOwner.setId(getText());
    // } else if (name.equals("DisplayName")) {
    // currentOwner.setDisplayName(getText());
    // }
    // }
    // }
    // }
    //
    // public static class BucketWebsiteConfigurationHandler extends AbstractHandler {
    //
    // private final BucketWebsiteConfiguration configuration =
    // new BucketWebsiteConfiguration(null);
    //
    // private RoutingRuleCondition currentCondition = null;
    // private RedirectRule currentRedirectRule = null;
    // private RoutingRule currentRoutingRule = null;
    //
    // public BucketWebsiteConfiguration getConfiguration() {
    // return configuration;
    // }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // if (in("WebsiteConfiguration")) {
    // if (name.equals("RedirectAllRequestsTo")) {
    // currentRedirectRule = new RedirectRule();
    // }
    // }
    //
    // else if (in("WebsiteConfiguration", "RoutingRules")) {
    // if (name.equals("RoutingRule")) {
    // currentRoutingRule = new RoutingRule();
    // }
    // }
    //
    // else if (in("WebsiteConfiguration", "RoutingRules", "RoutingRule")) {
    // if (name.equals("Condition")) {
    // currentCondition = new RoutingRuleCondition();
    // } else if (name.equals("Redirect")) {
    // currentRedirectRule = new RedirectRule();
    // }
    // }
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (in("WebsiteConfiguration")) {
    // if (name.equals("RedirectAllRequestsTo")) {
    // configuration.setRedirectAllRequestsTo(currentRedirectRule);
    // currentRedirectRule = null;
    // }
    // }
    //
    // else if (in("WebsiteConfiguration", "IndexDocument")) {
    // if (name.equals("Suffix")) {
    // configuration.setIndexDocumentSuffix(getText());
    // }
    // }
    //
    // else if (in("WebsiteConfiguration", "ErrorDocument")) {
    // if (name.equals("Key")) {
    // configuration.setErrorDocument(getText());
    // }
    // }
    //
    // else if (in("WebsiteConfiguration", "RoutingRules")) {
    // if (name.equals("RoutingRule")) {
    // configuration.getRoutingRules().add(currentRoutingRule);
    // currentRoutingRule = null;
    // }
    // }
    //
    // else if (in("WebsiteConfiguration", "RoutingRules", "RoutingRule")) {
    // if (name.equals("Condition")) {
    // currentRoutingRule.setCondition(currentCondition);
    // currentCondition = null;
    // } else if (name.equals("Redirect")) {
    // currentRoutingRule.setRedirect(currentRedirectRule);
    // currentRedirectRule = null;
    // }
    // }
    //
    // else if (in("WebsiteConfiguration", "RoutingRules", "RoutingRule", "Condition")) {
    // if (name.equals("KeyPrefixEquals")) {
    // currentCondition.setKeyPrefixEquals(getText());
    // } else if (name.equals("HttpErrorCodeReturnedEquals")) {
    // currentCondition.setHttpErrorCodeReturnedEquals(getText());
    // }
    // }
    //
    // else if (in("WebsiteConfiguration", "RedirectAllRequestsTo")
    // || in("WebsiteConfiguration", "RoutingRules", "RoutingRule", "Redirect")) {
    //
    // if (name.equals("Protocol")) {
    // currentRedirectRule.setProtocol(getText());
    //
    // } else if (name.equals("HostName")) {
    // currentRedirectRule.setHostName(getText());
    //
    // } else if (name.equals("ReplaceKeyPrefixWith")) {
    // currentRedirectRule.setReplaceKeyPrefixWith(getText());
    //
    // } else if (name.equals("ReplaceKeyWith")) {
    // currentRedirectRule.setReplaceKeyWith(getText());
    //
    // } else if (name.equals("HttpRedirectCode")) {
    // currentRedirectRule.setHttpRedirectCode(getText());
    // }
    // }
    // }
    // }
    //
    // public static class BucketVersioningConfigurationHandler extends AbstractHandler {
    //
    // private final BucketVersioningConfiguration configuration =
    // new BucketVersioningConfiguration();
    //
    // public BucketVersioningConfiguration getConfiguration() { return configuration; }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (in("VersioningConfiguration")) {
    // if (name.equals("Status")) {
    // configuration.setStatus(getText());
    //
    // } else if (name.equals("MfaDelete")) {
    // String mfaDeleteStatus = getText();
    //
    // if (mfaDeleteStatus.equals("Disabled")) {
    // configuration.setMfaDeleteEnabled(false);
    // } else if (mfaDeleteStatus.equals("Enabled")) {
    // configuration.setMfaDeleteEnabled(true);
    // } else {
    // configuration.setMfaDeleteEnabled(null);
    // }
    // }
    // }
    // }
    // }

    /*
     *  
     * http://Example-Bucket.cn-north.myqcloud.com/Example-Object
     * Example-Bucket Example-Object
     * "3858f62230ac3c915f300c664312c11f-9" 
     *
     * Or if an error occurred while completing:
     *
     *   InternalError We
     * encountered an internal error. Please try again.
     * 656c76696e6727732072657175657374
     * Uuag1LuByRx9e6j5Onimru9pO4ZVKnJ2Qz7/C1NPcfTWAtRPfTaOFg== 
     */
    public static class CompleteMultipartUploadHandler extends AbstractSSEHandler
            implements ObjectExpirationResult {
        // Successful completion
        private CompleteMultipartUploadResult result;

        // Error during completion
        private CosServiceException cse;
        private String traceId;
        private String requestId;
        private String errorCode;

        /**
         * @see com.qcloud.cos.model.CompleteMultipartUploadResult#getExpirationTime()
         */
        @Override
        public Date getExpirationTime() {
            return result == null ? null : result.getExpirationTime();
        }

        /**
         * @see com.qcloud.cos.model.CompleteMultipartUploadResult#setExpirationTime(java.util.Date)
         */
        @Override
        public void setExpirationTime(Date expirationTime) {
            if (result != null) {
                result.setExpirationTime(expirationTime);
            }
        }

        /**
         * @see com.qcloud.cos.model.CompleteMultipartUploadResult#getExpirationTimeRuleId()
         */
        @Override
        public String getExpirationTimeRuleId() {
            return result == null ? null : result.getExpirationTimeRuleId();
        }

        /**
         * @see com.qcloud.cos.model.CompleteMultipartUploadResult#setExpirationTimeRuleId(java.lang.String)
         */
        @Override
        public void setExpirationTimeRuleId(String expirationTimeRuleId) {
            if (result != null) {
                result.setExpirationTimeRuleId(expirationTimeRuleId);
            }
        }

        public CompleteMultipartUploadResult getCompleteMultipartUploadResult() {
            return result;
        }

        public CosServiceException getCOSException() {
            return cse;
        }

        @Override
        protected void doStartElement(String uri, String name, String qName, Attributes attrs) {

            if (atTopLevel()) {
                if (name.equals("CompleteMultipartUploadResult")) {
                    result = new CompleteMultipartUploadResult();
                }
            }
        }

        @Override
        protected void doEndElement(String uri, String name, String qName) {
            if (atTopLevel()) {
                if (name.equals("Error")) {
                    if (cse != null) {
                        cse.setErrorCode(errorCode);
                        cse.setRequestId(requestId);
                        cse.setTraceId(traceId);
                    }
                }
            }

            else if (in("CompleteMultipartUploadResult")) {
                if (name.equals("Location")) {
                    result.setLocation(getText());
                } else if (name.equals("Bucket")) {
                    result.setBucketName(getText());
                } else if (name.equals("Key")) {
                    result.setKey(getText());
                } else if (name.equals("ETag")) {
                    result.setETag(StringUtils.removeQuotes(getText()));
                }
            }

            else if (in("Error")) {
                if (name.equals("Code")) {
                    errorCode = getText();
                } else if (name.equals("Message")) {
                    cse = new CosServiceException(getText());
                } else if (name.equals("RequestId")) {
                    requestId = getText();
                } else if (name.equals("HostId")) {
                    traceId = getText();
                }
            }
        }

        @Override
        protected ServerSideEncryptionResult sseResult() {
            return result;
        }
    }

    /*
     *  
     * example-bucket example-object
     * VXBsb2FkIElEIGZvciA2aWWpbmcncyBteS1tb3ZpZS5tMnRzIHVwbG9hZA
     * 
     */
    public static class InitiateMultipartUploadHandler extends AbstractHandler {

        private final InitiateMultipartUploadResult result = new InitiateMultipartUploadResult();

        public InitiateMultipartUploadResult getInitiateMultipartUploadResult() {
            return result;
        }

        @Override
        protected void doStartElement(String uri, String name, String qName, Attributes attrs) {

        }

        @Override
        protected void doEndElement(String uri, String name, String qName) {
            if (in("InitiateMultipartUploadResult")) {
                if (name.equals("Bucket")) {
                    result.setBucketName(getText());

                } else if (name.equals("Key")) {
                    result.setKey(getText());

                } else if (name.equals("UploadId")) {
                    result.setUploadId(getText());
                }
            }
        }
    }

    public static class ListMultipartUploadsHandler extends AbstractHandler {

        private final MultipartUploadListing result = new MultipartUploadListing();

        private MultipartUpload currentMultipartUpload;
        private Owner currentOwner;

        public MultipartUploadListing getListMultipartUploadsResult() {
            return result;
        }

        @Override
        protected void doStartElement(String uri, String name, String qName, Attributes attrs) {

            if (in("ListMultipartUploadsResult")) {
                if (name.equals("Upload")) {
                    currentMultipartUpload = new MultipartUpload();
                }
            } else if (in("ListMultipartUploadsResult", "Upload")) {
                if (name.equals("Owner") || name.equals("Initiator")) {
                    currentOwner = new Owner();
                }
            }
        }

        @Override
        protected void doEndElement(String uri, String name, String qName) {
            if (in("ListMultipartUploadsResult")) {
                if (name.equals("Bucket")) {
                    result.setBucketName(getText());
                } else if (name.equals("KeyMarker")) {
                    result.setKeyMarker(checkForEmptyString(getText()));
                } else if (name.equals("Delimiter")) {
                    result.setDelimiter(checkForEmptyString(getText()));
                } else if (name.equals("Prefix")) {
                    result.setPrefix(checkForEmptyString(getText()));
                } else if (name.equals("UploadIdMarker")) {
                    result.setUploadIdMarker(checkForEmptyString(getText()));
                } else if (name.equals("NextKeyMarker")) {
                    result.setNextKeyMarker(checkForEmptyString(getText()));
                } else if (name.equals("NextUploadIdMarker")) {
                    result.setNextUploadIdMarker(checkForEmptyString(getText()));
                } else if (name.equals("MaxUploads")) {
                    result.setMaxUploads(Integer.parseInt(getText()));
                } else if (name.equals("EncodingType")) {
                    result.setEncodingType(checkForEmptyString(getText()));
                } else if (name.equals("IsTruncated")) {
                    result.setTruncated(Boolean.parseBoolean(getText()));
                } else if (name.equals("Upload")) {
                    result.getMultipartUploads().add(currentMultipartUpload);
                    currentMultipartUpload = null;
                }
            }

            else if (in("ListMultipartUploadsResult", "CommonPrefixes")) {
                if (name.equals("Prefix")) {
                    result.getCommonPrefixes().add(getText());
                }
            }

            else if (in("ListMultipartUploadsResult", "Upload")) {
                if (name.equals("Key")) {
                    currentMultipartUpload.setKey(getText());
                } else if (name.equals("UploadId")) {
                    currentMultipartUpload.setUploadId(getText());
                } else if (name.equals("Owner")) {
                    currentMultipartUpload.setOwner(currentOwner);
                    currentOwner = null;
                } else if (name.equals("Initiator")) {
                    currentMultipartUpload.setInitiator(currentOwner);
                    currentOwner = null;
                } else if (name.equals("Initiated")) {
                    currentMultipartUpload.setInitiated(DateUtils.parseISO8601Date(getText()));
                }
            }

            else if (in("ListMultipartUploadsResult", "Upload", "Owner")
                    || in("ListMultipartUploadsResult", "Upload", "Initiator")) {

                if (name.equals("ID")) {
                    currentOwner.setId(checkForEmptyString(getText()));
                } else if (name.equals("DisplayName")) {
                    currentOwner.setDisplayName(checkForEmptyString(getText()));
                }
            }
        }
    }

    public static class ListPartsHandler extends AbstractHandler {

        private final PartListing result = new PartListing();

        private PartSummary currentPart;
        private Owner currentOwner;

        public PartListing getListPartsResult() {
            return result;
        }

        @Override
        protected void doStartElement(String uri, String name, String qName, Attributes attrs) {

            if (in("ListPartsResult")) {
                if (name.equals("Part")) {
                    currentPart = new PartSummary();
                } else if (name.equals("Owner") || name.equals("Initiator")) {
                    currentOwner = new Owner();
                }
            }
        }

        @Override
        protected void doEndElement(String uri, String name, String qName) {
            if (in("ListPartsResult")) {
                if (name.equals("Bucket")) {
                    result.setBucketName(getText());
                } else if (name.equals("Key")) {
                    result.setKey(getText());
                } else if (name.equals("UploadId")) {
                    result.setUploadId(getText());
                } else if (name.equals("Owner")) {
                    result.setOwner(currentOwner);
                    currentOwner = null;
                } else if (name.equals("Initiator")) {
                    result.setInitiator(currentOwner);
                    currentOwner = null;
                } else if (name.equals("StorageClass")) {
                    result.setStorageClass(getText());
                } else if (name.equals("PartNumberMarker")) {
                    result.setPartNumberMarker(parseInteger(getText()));
                } else if (name.equals("NextPartNumberMarker")) {
                    result.setNextPartNumberMarker(parseInteger(getText()));
                } else if (name.equals("MaxParts")) {
                    result.setMaxParts(parseInteger(getText()));
                } else if (name.equals("EncodingType")) {
                    result.setEncodingType(checkForEmptyString(getText()));
                } else if (name.equals("IsTruncated")) {
                    result.setTruncated(Boolean.parseBoolean(getText()));
                } else if (name.equals("Part")) {
                    result.getParts().add(currentPart);
                    currentPart = null;
                }
            }

            else if (in("ListPartsResult", "Part")) {
                if (name.equals("PartNumber")) {
                    currentPart.setPartNumber(Integer.parseInt(getText()));
                } else if (name.equals("LastModified")) {
                    currentPart.setLastModified(DateUtils.parseISO8601Date(getText()));
                } else if (name.equals("ETag")) {
                    currentPart.setETag(StringUtils.removeQuotes(getText()));
                } else if (name.equals("Size")) {
                    currentPart.setSize(Long.parseLong(getText()));
                }
            }

            else if (in("ListPartsResult", "Owner") || in("ListPartsResult", "Initiator")) {

                if (name.equals("ID")) {
                    currentOwner.setId(checkForEmptyString(getText()));
                } else if (name.equals("DisplayName")) {
                    currentOwner.setDisplayName(checkForEmptyString(getText()));
                }
            }
        }

        private Integer parseInteger(String text) {
            text = checkForEmptyString(getText());
            if (text == null)
                return null;
            return Integer.parseInt(text);
        }
    }

    // public static class BucketReplicationConfigurationHandler extends
    // AbstractHandler {
    //
    // private final BucketReplicationConfiguration bucketReplicationConfiguration = new
    // BucketReplicationConfiguration();
    // private String currentRuleId;
    // private ReplicationRule currentRule;
    // private ReplicationDestinationConfig destinationConfig;
    // private static final String REPLICATION_CONFIG = "ReplicationConfiguration";
    // private static final String ROLE = "Role";
    // private static final String RULE = "Rule";
    // private static final String DESTINATION = "Destination";
    // private static final String ID = "ID";
    // private static final String PREFIX = "Prefix";
    // private static final String STATUS = "Status";
    // private static final String BUCKET = "Bucket";
    // private static final String STORAGECLASS = "StorageClass";
    //
    // public BucketReplicationConfiguration getConfiguration() {
    // return bucketReplicationConfiguration;
    // }
    //
    // @Override
    // protected void doStartElement(String uri, String name, String qName,
    // Attributes attrs) {
    //
    // if (in(REPLICATION_CONFIG)) {
    // if (name.equals(RULE)) {
    // currentRule = new ReplicationRule();
    // }
    // } else if (in(REPLICATION_CONFIG, RULE)) {
    // if (name.equals(DESTINATION)) {
    // destinationConfig = new ReplicationDestinationConfig();
    // }
    // }
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (in(REPLICATION_CONFIG)) {
    // if (name.equals(RULE)) {
    // bucketReplicationConfiguration.addRule(currentRuleId,
    // currentRule);
    // currentRule = null;
    // currentRuleId = null;
    // destinationConfig = null;
    // } else if (name.equals(ROLE)) {
    // bucketReplicationConfiguration.setRoleARN(getText());
    // }
    // } else if (in(REPLICATION_CONFIG, RULE)) {
    // if (name.equals(ID)) {
    // currentRuleId = getText();
    // } else if (name.equals(PREFIX)) {
    // currentRule.setPrefix(getText());
    // } else {
    // if (name.equals(STATUS)) {
    // currentRule.setStatus(getText());
    //
    // } else if (name.equals(DESTINATION)) {
    // currentRule.setDestinationConfig(destinationConfig);
    // }
    // }
    // } else if (in(REPLICATION_CONFIG, RULE, DESTINATION)) {
    // if (name.equals(BUCKET)) {
    // destinationConfig.setBucketARN(getText());
    // } else if (name.equals(STORAGECLASS)) {
    // destinationConfig.setStorageClass(getText());
    // }
    // }
    // }
    // }
    //
    // public static class BucketTaggingConfigurationHandler extends AbstractHandler {
    //
    // private final BucketTaggingConfiguration configuration =
    // new BucketTaggingConfiguration();
    //
    // private Map currentTagSet;
    // private String currentTagKey;
    // private String currentTagValue;
    //
    // public BucketTaggingConfiguration getConfiguration() {
    // return configuration;
    // }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // if (in("Tagging")) {
    // if (name.equals("TagSet")) {
    // currentTagSet = new HashMap();
    // }
    // }
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (in("Tagging")) {
    // if (name.equals("TagSet")) {
    // configuration.getAllTagSets()
    // .add(new TagSet(currentTagSet));
    // currentTagSet = null;
    // }
    // }
    //
    // else if (in("Tagging", "TagSet")) {
    // if (name.equals("Tag")) {
    // if (currentTagKey != null && currentTagValue != null) {
    // currentTagSet.put(currentTagKey, currentTagValue);
    // }
    // currentTagKey = null;
    // currentTagValue = null;
    // }
    // }
    //
    // else if (in("Tagging", "TagSet", "Tag")) {
    // if (name.equals("Key")) {
    // currentTagKey = getText();
    // } else if (name.equals("Value")) {
    // currentTagValue = getText();
    // }
    // }
    // }
    // }

    // public static class DeleteObjectsHandler extends AbstractHandler {
    //
    // private final DeleteObjectsResponse response =
    // new DeleteObjectsResponse();
    //
    // private DeletedObject currentDeletedObject = null;
    // private DeleteError currentError = null;
    //
    // public DeleteObjectsResponse getDeleteObjectResult() {
    // return response;
    // }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // if (in("DeleteResult")) {
    // if (name.equals("Deleted")) {
    // currentDeletedObject = new DeletedObject();
    // } else if (name.equals("Error")) {
    // currentError = new DeleteError();
    // }
    // }
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (in("DeleteResult")) {
    // if (name.equals("Deleted")) {
    // response.getDeletedObjects().add(currentDeletedObject);
    // currentDeletedObject = null;
    // } else if (name.equals("Error")) {
    // response.getErrors().add(currentError);
    // currentError = null;
    // }
    // }
    //
    // else if (in("DeleteResult", "Deleted")) {
    // if (name.equals("Key")) {
    // currentDeletedObject.setKey(getText());
    //
    // } else if (name.equals("VersionId")) {
    // currentDeletedObject.setVersionId(getText());
    //
    // } else if (name.equals("DeleteMarker")) {
    // currentDeletedObject.setDeleteMarker(
    // getText().equals("true"));
    //
    // } else if (name.equals("DeleteMarkerVersionId")) {
    // currentDeletedObject.setDeleteMarkerVersionId(getText());
    // }
    // }
    //
    // else if (in("DeleteResult", "Error")) {
    // if (name.equals("Key")) {
    // currentError.setKey(getText());
    //
    // } else if (name.equals("VersionId")) {
    // currentError.setVersionId(getText());
    //
    // } else if (name.equals("Code")) {
    // currentError.setCode(getText());
    //
    // } else if (name.equals("Message")) {
    // currentError.setMessage(getText());
    // }
    // }
    // }
    // }

    /**
     *   logs-rule logs/
     * Enabled  30
     * STANDARD_IA   90
     * GLACIER 
     *  365 
     *  7
     * STANDARD_IA 
     *  14
     * GLACIER 
     *  365
     *    image-rule image/
     * Enabled  2012-12-31T00:00:00.000Z
     * GLACIER 
     *  2020-12-31T00:00:00.000Z  
     * 
     */
    // public static class BucketLifecycleConfigurationHandler extends AbstractHandler {
    //
    // private final BucketLifecycleConfiguration configuration =
    // new BucketLifecycleConfiguration(new ArrayList());
    //
    // private Rule currentRule;
    // private Transition currentTransition;
    // private NoncurrentVersionTransition currentNcvTransition;
    //
    // public BucketLifecycleConfiguration getConfiguration() {
    // return configuration;
    // }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // if (in("LifecycleConfiguration")) {
    // if (name.equals("Rule")) {
    // currentRule = new Rule();
    // }
    // } else if (in("LifecycleConfiguration", "Rule")) {
    // if (name.equals("Transition")) {
    // currentTransition = new Transition();
    // } else if (name.equals("NoncurrentVersionTransition")) {
    // currentNcvTransition = new NoncurrentVersionTransition();
    // }
    // }
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (in("LifecycleConfiguration")) {
    // if (name.equals("Rule")) {
    // configuration.getRules().add(currentRule);
    // currentRule = null;
    // }
    // }
    //
    // else if (in("LifecycleConfiguration", "Rule")) {
    // if ( name.equals("ID") ) {
    // currentRule.setId(getText());
    //
    // } else if ( name.equals("Prefix") ) {
    // currentRule.setPrefix(getText());
    //
    // } else if ( name.equals("Status") ) {
    // currentRule.setStatus(getText());
    //
    // } else if (name.equals("Transition")) {
    // currentRule.addTransition(currentTransition);
    // currentTransition = null;
    //
    // } else if (name.equals("NoncurrentVersionTransition")) {
    // currentRule.addNoncurrentVersionTransition(
    // currentNcvTransition);
    // currentNcvTransition = null;
    // }
    // }
    //
    // else if (in("LifecycleConfiguration", "Rule", "Expiration")) {
    // if (name.equals("Date")) {
    // currentRule.setExpirationDate(
    // ServiceUtils.parseIso8601Date(getText()));
    // } else if (name.equals("Days")) {
    // currentRule.setExpirationInDays(
    // Integer.parseInt(getText()));
    // }
    // }
    //
    // else if (in("LifecycleConfiguration", "Rule", "Transition")) {
    // if (name.equals("StorageClass")) {
    // currentTransition.setStorageClass(getText());
    // } else if (name.equals("Date")) {
    // currentTransition.setDate(
    // ServiceUtils.parseIso8601Date(getText()));
    //
    // } else if (name.equals("Days")) {
    // currentTransition.setDays(Integer.parseInt(getText()));
    // }
    // }
    //
    // else if (in("LifecycleConfiguration", "Rule", "NoncurrentVersionExpiration")) {
    // if (name.equals("NoncurrentDays")) {
    // currentRule.setNoncurrentVersionExpirationInDays(
    // Integer.parseInt(getText()));
    // }
    // }
    //
    // else if (in("LifecycleConfiguration", "Rule", "NoncurrentVersionTransition")) {
    // if (name.equals("StorageClass")) {
    // currentNcvTransition.setStorageClass(getText());
    // } else if (name.equals("NoncurrentDays")) {
    // currentNcvTransition.setDays(Integer.parseInt(getText()));
    // }
    // }
    // }
    // }

    // public static class BucketCrossOriginConfigurationHandler extends AbstractHandler {
    //
    // private final BucketCrossOriginConfiguration configuration =
    // new BucketCrossOriginConfiguration(new ArrayList());
    //
    // private CORSRule currentRule;
    // private List allowedMethods = null;
    // private List allowedOrigins = null;
    // private List exposedHeaders = null;
    // private List allowedHeaders = null;
    //
    // public BucketCrossOriginConfiguration getConfiguration() {
    // return configuration;
    // }
    //
    // @Override
    // protected void doStartElement(
    // String uri,
    // String name,
    // String qName,
    // Attributes attrs) {
    //
    // if (in("CORSConfiguration")) {
    // if (name.equals("CORSRule")) {
    // currentRule = new CORSRule();
    // }
    // } else if (in("CORSConfiguration", "CORSRule")) {
    // if (name.equals("AllowedOrigin")) {
    // if (allowedOrigins == null) {
    // allowedOrigins = new ArrayList();
    // }
    // } else if (name.equals("AllowedMethod")) {
    // if (allowedMethods == null) {
    // allowedMethods = new ArrayList();
    // }
    // } else if (name.equals("ExposeHeader")) {
    // if (exposedHeaders == null) {
    // exposedHeaders = new ArrayList();
    // }
    // } else if (name.equals("AllowedHeader")) {
    // if (allowedHeaders == null) {
    // allowedHeaders = new LinkedList();
    // }
    // }
    // }
    // }
    //
    // @Override
    // protected void doEndElement(String uri, String name, String qName) {
    // if (in("CORSConfiguration")) {
    // if (name.equals("CORSRule")) {
    // currentRule.setAllowedHeaders(allowedHeaders);
    // currentRule.setAllowedMethods(allowedMethods);
    // currentRule.setAllowedOrigins(allowedOrigins);
    // currentRule.setExposedHeaders(exposedHeaders);
    // allowedHeaders = null;
    // allowedMethods = null;
    // allowedOrigins = null;
    // exposedHeaders = null;
    //
    // configuration.getRules().add(currentRule);
    // currentRule = null;
    // }
    // } else if (in("CORSConfiguration", "CORSRule")) {
    // if (name.equals("ID")) {
    // currentRule.setId(getText());
    //
    // } else if (name.equals("AllowedOrigin")) {
    // allowedOrigins.add(getText());
    //
    // } else if (name.equals("AllowedMethod")) {
    // allowedMethods.add(AllowedMethods.fromValue(getText()));
    //
    // } else if (name.equals("MaxAgeSeconds")) {
    // currentRule.setMaxAgeSeconds(Integer.parseInt(getText()));
    //
    // } else if (name.equals("ExposeHeader")) {
    // exposedHeaders.add(getText());
    //
    // } else if (name.equals("AllowedHeader")) {
    // allowedHeaders.add(getText());
    // }
    // }
    // }
    // }
    //
    // private static String findAttributeValue(
    // String qnameToFind,
    // Attributes attrs) {
    //
    // for (int i = 0; i < attrs.getLength(); i++) {
    // String qname = attrs.getQName(i);
    // if (qname.trim().equalsIgnoreCase(qnameToFind.trim())) {
    // return attrs.getValue(i);
    // }
    // }
    //
    // return null;
    // }
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy