• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.enhanced.dynamodb.internal.extensions;
17 
18 import java.util.Collections;
19 import java.util.HashMap;
20 import java.util.Map;
21 import java.util.function.Consumer;
22 import software.amazon.awssdk.annotations.SdkInternalApi;
23 import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType;
24 import software.amazon.awssdk.enhanced.dynamodb.TableMetadata;
25 import software.amazon.awssdk.enhanced.dynamodb.internal.mapper.AtomicCounter;
26 import software.amazon.awssdk.enhanced.dynamodb.mapper.StaticAttributeTag;
27 import software.amazon.awssdk.enhanced.dynamodb.mapper.StaticTableMetadata;
28 
29 @SdkInternalApi
30 public class AtomicCounterTag implements StaticAttributeTag {
31 
32     public static final String CUSTOM_METADATA_KEY_PREFIX = "AtomicCounter:Counters";
33 
34     private static final long DEFAULT_INCREMENT = 1L;
35     private static final long DEFAULT_START_VALUE = 0L;
36 
37     private static final AtomicCounter DEFAULT_COUNTER = AtomicCounter.builder()
38                                                                       .delta(DEFAULT_INCREMENT)
39                                                                       .startValue(DEFAULT_START_VALUE)
40                                                                       .build();
41 
42     private final AtomicCounter counter;
43 
AtomicCounterTag(AtomicCounter counter)44     private AtomicCounterTag(AtomicCounter counter) {
45         this.counter = counter;
46     }
47 
create()48     public static AtomicCounterTag create() {
49         return new AtomicCounterTag(DEFAULT_COUNTER);
50     }
51 
fromValues(long delta, long startValue)52     public static AtomicCounterTag fromValues(long delta, long startValue) {
53         return new AtomicCounterTag(AtomicCounter.builder()
54                                                  .delta(delta)
55                                                  .startValue(startValue)
56                                                  .build());
57     }
58 
59     @SuppressWarnings("unchecked")
resolve(TableMetadata tableMetadata)60     public static Map<String, AtomicCounter> resolve(TableMetadata tableMetadata) {
61         return tableMetadata.customMetadataObject(CUSTOM_METADATA_KEY_PREFIX, Map.class).orElseGet(HashMap::new);
62     }
63 
64     @Override
modifyMetadata(String attributeName, AttributeValueType attributeValueType)65     public Consumer<StaticTableMetadata.Builder> modifyMetadata(String attributeName, AttributeValueType attributeValueType) {
66         return metadata -> metadata
67             .addCustomMetadataObject(CUSTOM_METADATA_KEY_PREFIX, Collections.singletonMap(attributeName, this.counter))
68             .markAttributeAsKey(attributeName, attributeValueType);
69     }
70 }
71