/* * Copyright 2014-2017 Amazon Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://aws.amazon.com/apache2.0 * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES * OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and * limitations under the License. */ package com.amazonaws.services.s3.event; import java.util.List; import com.amazonaws.util.SdkHttpUtils; import org.joda.time.DateTime; import com.amazonaws.internal.DateTimeJsonSerializer; import com.amazonaws.util.json.Jackson; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * A helper class that represents a strongly typed S3 EventNotification item sent * to SQS, SNS, or Lambda. */ public class S3EventNotification { private final List<S3EventNotificationRecord> records; @JsonCreator public S3EventNotification( @JsonProperty(value = "Records") List<S3EventNotificationRecord> records) { this.records = records; } /** * <p> * Parse the JSON string into a S3EventNotification object. * </p> * <p> * The function will try its best to parse input JSON string as best as it can. * It will not fail even if the JSON string contains unknown properties. * The function will throw SdkClientException if the input JSON string is * not valid JSON. * </p> * @param json * JSON string to parse. Typically this is the body of your SQS * notification message body. * * @return The resulting S3EventNotification object. */ public static S3EventNotification parseJson(String json) { return Jackson.fromJsonString(json, S3EventNotification.class); } /** * @return the records in this notification */ @JsonProperty(value = "Records") public List<S3EventNotificationRecord> getRecords() { return records; } /** * @return a JSON representation of this object */ public String toJson() { return Jackson.toJsonString(this); } public static class UserIdentityEntity { private final String principalId; @JsonCreator public UserIdentityEntity( @JsonProperty(value = "principalId") String principalId) { this.principalId = principalId; } public String getPrincipalId() { return principalId; } } public static class S3BucketEntity { private final String name; private final UserIdentityEntity ownerIdentity; private final String arn; @JsonCreator public S3BucketEntity( @JsonProperty(value = "name") String name, @JsonProperty(value = "ownerIdentity") UserIdentityEntity ownerIdentity, @JsonProperty(value = "arn") String arn) { this.name = name; this.ownerIdentity = ownerIdentity; this.arn = arn; } public String getName() { return name; } public UserIdentityEntity getOwnerIdentity() { return ownerIdentity; } public String getArn() { return arn; } } public static class S3ObjectEntity { private final String key; private final Long size; private final String eTag; private final String versionId; private final String sequencer; @Deprecated public S3ObjectEntity( String key, Integer size, String eTag, String versionId) { this.key = key; this.size = size == null ? null : size.longValue(); this.eTag = eTag; this.versionId = versionId; this.sequencer = null; } @Deprecated public S3ObjectEntity( String key, Long size, String eTag, String versionId) { this(key, size, eTag, versionId, null); } @JsonCreator public S3ObjectEntity( @JsonProperty(value = "key") String key, @JsonProperty(value = "size") Long size, @JsonProperty(value = "eTag") String eTag, @JsonProperty(value = "versionId") String versionId, @JsonProperty(value = "sequencer") String sequencer) { this.key = key; this.size = size; this.eTag = eTag; this.versionId = versionId; this.sequencer = sequencer; } public String getKey() { return key; } /** * S3 URL encodes the key of the object involved in the event. This is * a convenience method to automatically URL decode the key. * @return The URL decoded object key. */ public String getUrlDecodedKey() { return SdkHttpUtils.urlDecode(getKey()); } /** * @deprecated use {@link #getSizeAsLong()} instead. */ @Deprecated @JsonIgnore public Integer getSize() { return size == null ? null : size.intValue(); } @JsonProperty(value = "size") public Long getSizeAsLong() { return size; } public String geteTag() { return eTag; } public String getVersionId() { return versionId; } public String getSequencer() { return sequencer; } } public static class S3Entity { private final String configurationId; private final S3BucketEntity bucket; private final S3ObjectEntity object; private final String s3SchemaVersion; @JsonCreator public S3Entity( @JsonProperty(value = "configurationId") String configurationId, @JsonProperty(value = "bucket") S3BucketEntity bucket, @JsonProperty(value = "object") S3ObjectEntity object, @JsonProperty(value = "s3SchemaVersion") String s3SchemaVersion) { this.configurationId = configurationId; this.bucket = bucket; this.object = object; this.s3SchemaVersion = s3SchemaVersion; } public String getConfigurationId() { return configurationId; } public S3BucketEntity getBucket() { return bucket; } public S3ObjectEntity getObject() { return object; } public String getS3SchemaVersion() { return s3SchemaVersion; } } public static class RequestParametersEntity { private final String sourceIPAddress; @JsonCreator public RequestParametersEntity( @JsonProperty(value = "sourceIPAddress") String sourceIPAddress) { this.sourceIPAddress = sourceIPAddress; } public String getSourceIPAddress() { return sourceIPAddress; } } public static class ResponseElementsEntity { private final String xAmzId2; private final String xAmzRequestId; @JsonCreator public ResponseElementsEntity( @JsonProperty(value = "x-amz-id-2") String xAmzId2, @JsonProperty(value = "x-amz-request-id") String xAmzRequestId) { this.xAmzId2 = xAmzId2; this.xAmzRequestId = xAmzRequestId; } @JsonProperty("x-amz-id-2") public String getxAmzId2() { return xAmzId2; } @JsonProperty("x-amz-request-id") public String getxAmzRequestId() { return xAmzRequestId; } } public static class S3EventNotificationRecord { private final String awsRegion; private final String eventName; private final String eventSource; private DateTime eventTime; private final String eventVersion; private final RequestParametersEntity requestParameters; private final ResponseElementsEntity responseElements; private final S3Entity s3; private final UserIdentityEntity userIdentity; @JsonCreator public S3EventNotificationRecord( @JsonProperty(value = "awsRegion") String awsRegion, @JsonProperty(value = "eventName") String eventName, @JsonProperty(value = "eventSource") String eventSource, @JsonProperty(value = "eventTime") String eventTime, @JsonProperty(value = "eventVersion") String eventVersion, @JsonProperty(value = "requestParameters") RequestParametersEntity requestParameters, @JsonProperty(value = "responseElements") ResponseElementsEntity responseElements, @JsonProperty(value = "s3") S3Entity s3, @JsonProperty(value = "userIdentity") UserIdentityEntity userIdentity) { this.awsRegion = awsRegion; this.eventName = eventName; this.eventSource = eventSource; if (eventTime != null) { this.eventTime = DateTime.parse(eventTime); } this.eventVersion = eventVersion; this.requestParameters = requestParameters; this.responseElements = responseElements; this.s3 = s3; this.userIdentity = userIdentity; } public String getAwsRegion() { return awsRegion; } public String getEventName() { return eventName; } public String getEventSource() { return eventSource; } @JsonSerialize(using=DateTimeJsonSerializer.class) public DateTime getEventTime() { return eventTime; } public String getEventVersion() { return eventVersion; } public RequestParametersEntity getRequestParameters() { return requestParameters; } public ResponseElementsEntity getResponseElements() { return responseElements; } public S3Entity getS3() { return s3; } public UserIdentityEntity getUserIdentity() { return userIdentity; } } }