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