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

com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.VersionIncrementor Maven / Gradle / Ivy

Go to download

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

There is a newer version: 2.79.0
Show newest version
/*
 * Copyright 2014-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.mobileconnectors.dynamodbv2.dynamodbmapper;

import java.lang.reflect.Method;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;

/**
 * Helper class for incrementing version attributes.
 */
class VersionIncrementor {

    private final Map cache =
            new HashMap();

    /**
     * Increments a version attribute.
     *
     * @param getter the attribute getter method
     * @param object the current value of the attribute
     * @return the incremented value of the attribute
     */
    public Object increment(Method getter, Object object) {
        Incrementor incrementor = getIncrementor(getter);
        return incrementor.increment(object);
    }

    private Incrementor getIncrementor(Method getter) {
        synchronized (cache) {
            Incrementor result = cache.get(getter);
            if (result != null) {
                return result;
            }

            Class returnType = getter.getReturnType();
            if (matches(returnType, BigInteger.class)) {
                result = BIG_INTEGER;

            } else if (matches(returnType, Long.class, long.class)) {
                result = LONG;

            } else if (matches(returnType, Integer.class, int.class)) {
                result = INTEGER;

            } else if (matches(returnType, Short.class, short.class)) {
                result = SHORT;

            } else if (matches(returnType, Byte.class, byte.class)) {
                result = BYTE;

            } else {
                throw new DynamoDBMappingException(
                        "Unsupported parameter type for "
                                + DynamoDBVersionAttribute.class + ": " + returnType
                                + ". Must be a whole-number type.");
            }

            cache.put(getter, result);
            return result;
        }
    }

    private static boolean matches(Class needle, Class... haystack) {
        for (Class clazz : haystack) {
            if (clazz.isAssignableFrom(needle)) {
                return true;
            }
        }
        return false;
    }

    private static interface Incrementor {
        Object increment(Object o);
    }

    private static final Incrementor BIG_INTEGER = new Incrementor() {
        @Override
        public Object increment(Object o) {
            if (o == null) {
                return BigInteger.ONE;
            }
            return ((BigInteger) o).add(BigInteger.ONE);
        }
    };

    private static final Incrementor LONG = new Incrementor() {
        @Override
        public Object increment(Object o) {
            if (o == null) {
                return Long.valueOf(1);
            }

            long next = ((Long) o) + 1L;
            return next;
        }
    };

    private static final Incrementor INTEGER = new Incrementor() {
        @Override
        public Object increment(Object o) {
            if (o == null) {
                return Integer.valueOf(1);
            }

            int next = ((Integer) o) + 1;
            return next;
        }
    };

    private static final Incrementor SHORT = new Incrementor() {
        @Override
        public Object increment(Object o) {
            if (o == null) {
                return Short.valueOf((short) 1);
            }

            short next = (short) (((Short) o) + 1);
            return next;
        }
    };

    private static final Incrementor BYTE = new Incrementor() {
        @Override
        public Object increment(Object o) {
            if (o == null) {
                return Byte.valueOf((byte) 1);
            }

            // Mod MAX_VALUE since that's what the DynamoDBReflector used to
            // do.
            byte next = (byte) ((((Byte) o) + 1) % Byte.MAX_VALUE);
            return next;
        }
    };
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy