All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBVersionAttribute Maven / Gradle / Ivy

Go to download

The AWS Java SDK for Amazon DynamoDB module holds the client classes that are used for communicating with Amazon DynamoDB Service

There is a newer version: 1.9.11
Show newest version
/*
 * Copyright 2011-2016 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.
 * Applied to the getter method or the class field for the class's version
 * property. If the annotation is applied directly to the class field, the
 * corresponding getter and setter must be declared in the same class.
 * 

* 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. */ @DynamoDB @DynamoDBAutoGenerated(generator=DynamoDBVersionAttribute.Generator.class) @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.METHOD}) public @interface DynamoDBVersionAttribute { /** * Optional parameter when the name of the attribute as stored in DynamoDB * should differ from the name used by the getter / setter. */ String attributeName() default ""; /** * Version auto-generator. */ static final class Generator implements DynamoDBAutoGenerator { private final Sequence sequence; public Generator(final Class targetType, final DynamoDBVersionAttribute annotation) { this.sequence = Sequences.of(targetType); } @Override public final DynamoDBAutoGenerateStrategy getGenerateStrategy() { return DynamoDBAutoGenerateStrategy.ALWAYS; } @Override public final T generate(final T currentValue) { return sequence.next(currentValue); } static interface Sequence { public T next(final T o); } private static enum Sequences { BIG_INTEGER(Scalar.BIG_INTEGER, new Sequence() { public final BigInteger next(final BigInteger o) { return o == null ? BigInteger.ONE : o.add(BigInteger.ONE); } }), BYTE(Scalar.BYTE, new Sequence() { public final Byte next(final Byte o) { return o == null ? Byte.valueOf((byte)1) : (byte)((o + 1) % Byte.MAX_VALUE); } }), INTEGER(Scalar.INTEGER, new Sequence() { public final Integer next(final Integer o) { return o == null ? Integer.valueOf(1) : o + 1; } }), LONG(Scalar.LONG, new Sequence() { public final Long next(final Long o) { return o == null ? Long.valueOf(1L) : o + 1L; } }), SHORT(Scalar.SHORT, new Sequence() { public final Short next(final Short o) { return o == null ? Short.valueOf((short)1) : (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) { final Scalar target = Scalar.of(targetType); for (final Sequences s : Sequences.values()) { if (s.scalar == target) { return (Sequence)s.sequence; } } return new Sequence() { //<- for backwards compatibility public T next(final T o) { throw new DynamoDBMappingException("type [" + targetType + "] is not supported" + "; only " + Arrays.toString(Sequences.values()) + " allowed"); } }; } } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy