1 /*
2  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License").
5  * You may not use this file except in compliance with the License.
6  * A copy of the License is located at
7  *
8  *  http://aws.amazon.com/apache2.0
9  *
10  * or in the "license" file accompanying this file. This file is distributed
11  * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12  * express or implied. See the License for the specific language governing
13  * permissions and limitations under the License.
14  */
15 
16 package software.amazon.awssdk.core.traits;
17 
18 import software.amazon.awssdk.annotations.SdkProtectedApi;
19 import software.amazon.awssdk.utils.DateUtils;
20 
21 /**
22  * Trait that indicates a different format should be used for marshalling/unmarshalling timestamps. If not present
23  * the protocol will determine the default format to use based on the location (i.e. for JSON protocol headers are ISO8601
24  * but timestamps in the payload are epoch seconds with millisecond decimal precision).
25  */
26 @SdkProtectedApi
27 public final class TimestampFormatTrait implements Trait {
28 
29     private final Format format;
30 
TimestampFormatTrait(Format timestampFormat)31     private TimestampFormatTrait(Format timestampFormat) {
32         this.format = timestampFormat;
33     }
34 
35     /**
36      * @return Format to use.
37      */
format()38     public Format format() {
39         return format;
40     }
41 
create(Format timestampFormat)42     public static TimestampFormatTrait create(Format timestampFormat) {
43         return new TimestampFormatTrait(timestampFormat);
44     }
45 
46     /**
47      * Enum of the timestamp formats we currently support.
48      */
49     public enum Format {
50 
51         /**
52          * See {@link DateUtils#parseIso8601Date(String)}
53          */
54         ISO_8601,
55 
56         /**
57          * See {@link DateUtils#parseRfc1123Date(String)}
58          */
59         RFC_822,
60 
61         /**
62          * See {@link DateUtils#parseUnixTimestampInstant(String)}
63          */
64         UNIX_TIMESTAMP,
65 
66         /**
67          * See {@link DateUtils#parseUnixTimestampMillisInstant(String)}. This is only used by the CBOR protocol currently.
68          */
69         UNIX_TIMESTAMP_MILLIS;
70 
71         /**
72          * Creates a timestamp format enum from the string defined in the model.
73          *
74          * @param strFormat String format.
75          * @return Format enum.
76          */
fromString(String strFormat)77         public static Format fromString(String strFormat) {
78             switch (strFormat) {
79                 case "iso8601":
80                     return ISO_8601;
81                 case "rfc822":
82                     return RFC_822;
83                 case "unixTimestamp":
84                     return UNIX_TIMESTAMP;
85                 // UNIX_TIMESTAMP_MILLIS does not have a defined string format so intentionally omitted here.
86                 default:
87                     throw new RuntimeException("Unknown timestamp format - " + strFormat);
88             }
89         }
90     }
91 
92 }
93