com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBVersioned Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aws-java-sdk-dynamodb Show documentation
Show all versions of aws-java-sdk-dynamodb Show documentation
The AWS Java SDK for Amazon DynamoDB module holds the client classes that are used for communicating with Amazon DynamoDB Service
/*
* Copyright 2011-2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* 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.dynamodbv2.datamodeling;
import com.amazonaws.services.dynamodbv2.datamodeling.StandardTypeConverters.Scalar;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.BigInteger;
import java.util.Arrays;
/**
* Annotation for marking a property as an optimistic locking version attribute.
*
*
* @DynamoDBVersioned
* public Long getRecordVersionNumber()
*
*
* Alternately, the convinience annotation {@link DynamoDBVersionAttribute}
* may be used if combining with an attribute name on a field/getter.
*
* Only nullable, integral numeric types (e.g. Integer, Long) can be used as
* version properties. On a save() operation, the {@link DynamoDBMapper} will
* attempt to increment the version property and assert that the service's value
* matches the client's.
*
* New objects will be assigned a version of 1 when saved.
*
* Note that for batchWrite, and by extension batchSave and batchDelete,
* no version checks are performed, as required by the
* {@link com.amazonaws.services.dynamodbv2.AmazonDynamoDB#batchWriteItem(BatchWriteItemRequest)}
* API.
*
* May be used as a meta-annotation.
*
* @see com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBVersionAttribute
*/
@DynamoDB
@DynamoDBAutoGenerated(generator=DynamoDBVersioned.Generator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
public @interface DynamoDBVersioned {
/**
* Version auto-generator.
*/
static final class Generator extends DynamoDBAutoGenerator.AbstractGenerator {
private final Sequence sequence;
public Generator(Class targetType, DynamoDBVersioned annotation) {
super(DynamoDBAutoGenerateStrategy.ALWAYS);
this.sequence = Sequences.of(targetType);
}
@Override
public final T generate(final T currentValue) {
return currentValue == null ? sequence.init() : sequence.next(currentValue);
}
static interface Sequence {
public T init();
public T next(final T o);
}
private static enum Sequences {
BIG_INTEGER(Scalar.BIG_INTEGER, new Sequence() {
@Override
public final BigInteger init() {
return BigInteger.ONE;
}
@Override
public final BigInteger next(final BigInteger o) {
return o.add(BigInteger.ONE);
}
}),
BYTE(Scalar.BYTE, new Sequence() {
@Override
public final Byte init() {
return Byte.valueOf((byte)1);
}
@Override
public final Byte next(final Byte o) {
return (byte)((o + 1) % Byte.MAX_VALUE);
}
}),
INTEGER(Scalar.INTEGER, new Sequence() {
@Override
public final Integer init() {
return Integer.valueOf(1);
}
@Override
public final Integer next(final Integer o) {
return o + 1;
}
}),
LONG(Scalar.LONG, new Sequence() {
@Override
public final Long init() {
return Long.valueOf(1L);
}
@Override
public final Long next(final Long o) {
return o + 1L;
}
}),
SHORT(Scalar.SHORT, new Sequence() {
@Override
public final Short init() {
return Short.valueOf((short)1);
}
@Override
public final Short next(final Short o) {
return (short)(o + 1);
}
});
private final Sequence> sequence;
private final Scalar scalar;
private Sequences(final Scalar scalar, final Sequence> sequence) {
this.sequence = sequence;
this.scalar = scalar;
}
private static final Sequence of(final Class targetType) {
for (final Sequences s : Sequences.values()) {
if (s.scalar.is(targetType)) {
return (Sequence)s.sequence;
}
}
throw new DynamoDBMappingException(
"type [" + targetType + "] is not supported; allowed only " + Arrays.toString(Sequences.values())
);
}
}
}
}