/* * Copyright 2016-2017 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 static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperFieldModel.DynamoDBAttributeType; import com.amazonaws.services.dynamodbv2.pojos.AutoKeyAndVal; import com.amazonaws.services.dynamodbv2.pojos.Currency; import com.amazonaws.services.dynamodbv2.pojos.DateRange; import com.amazonaws.services.dynamodbv2.pojos.KeyAndVal; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.dynamodbv2.model.KeyType; import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType; import java.math.BigDecimal; import java.math.BigInteger; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import java.util.UUID; import java.util.concurrent.TimeUnit; import org.junit.Test; /** * Unit tests for {@link DynamoDBMapperModelFactory.TableFactory}. */ public class StandardModelFactoriesTest { private static final DynamoDBMapperModelFactory factory = StandardModelFactories.of(S3Link.Factory.of(null)); private static final DynamoDBMapperModelFactory.TableFactory models = factory.getTableFactory(DynamoDBMapperConfig.DEFAULT); @SuppressWarnings("unchecked") private static <T> DynamoDBMapperTableModel<T> getTable(T object) { return models.getTable((Class<T>)object.getClass()); } /** * Test mappings. */ @Test public void testHashAndRangeKey() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBHashKey(attributeName="hk") public String getKey() { return super.getKey(); } @DynamoDBRangeKey(attributeName="rk") public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); assertFieldKeyType(KeyType.HASH, model.field("hk"), model); assertFieldKeyType(KeyType.RANGE, model.field("rk"), model); } /** * Test mappings. */ @Test(expected=DynamoDBMappingException.class) public void testHashAndRangeKeyConflict() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBHashKey @DynamoDBRangeKey public String getKey() { return super.getKey(); } }; getTable(obj); } /** * Test mappings. */ @Test public void testNamed() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBNamed("value") public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); assertEquals(2, model.fields().size()); assertNotNull(model.field("key")); assertNotNull(model.field("value")); } /** * Test mappings. */ @Test public void testAttributeTypeAsNumber() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBTyped(DynamoDBAttributeType.N) public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAttributeType.N, val.attributeType()); } @Test public void testAttributeTypeAsAttributeValueNumber() { final Object obj = new AutoKeyAndVal<AttributeValue>() { @DynamoDBTyped(DynamoDBAttributeType.N) public AttributeValue getVal() { return super.getVal(); } public void setVal(final AttributeValue val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,AttributeValue> val = model.field("val"); assertEquals(DynamoDBAttributeType.N, val.attributeType()); assertEquals("123", val.convert(new AttributeValue().withN("123")).getN()); assertEquals("123", val.unconvert(new AttributeValue().withN("123")).getN()); } @Test public void testAttributeTypeAsAttributeValueMap() { final Object obj = new AutoKeyAndVal<AttributeValue>() { @DynamoDBTyped(DynamoDBAttributeType.M) public AttributeValue getVal() { return super.getVal(); } public void setVal(final AttributeValue val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,AttributeValue> val = model.field("val"); assertEquals(DynamoDBAttributeType.M, val.attributeType()); Map<String,AttributeValue> map = new HashMap<String,AttributeValue>(); map.put("A", new AttributeValue().withN("123")); map = Collections.unmodifiableMap(map); assertEquals("123", val.convert(new AttributeValue().withM(map)).getM().get("A").getN()); assertEquals("123", val.unconvert(new AttributeValue().withM(map)).getM().get("A").getN()); } /** * Test mappings. */ @Test public void testScalarAttributeStringTimeZone() { final Object obj = new AutoKeyAndVal<TimeZone>() { @DynamoDBHashKey public String getKey() { return super.getKey(); } @DynamoDBScalarAttribute(type=ScalarAttributeType.S) public TimeZone getVal() { return super.getVal(); } public void setVal(final TimeZone val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,TimeZone> val = model.field("val"); assertEquals(DynamoDBAttributeType.S, val.attributeType()); assertEquals("America/New_York", val.convert(TimeZone.getTimeZone("America/New_York")).getS()); assertEquals("America/New_York", val.unconvert(new AttributeValue().withS("America/New_York")).getID()); } /** * Test mappings. */ @Test public void testScalarAttributeStringLocale() { final Object obj = new AutoKeyAndVal<Locale>() { @DynamoDBHashKey public String getKey() { return super.getKey(); } @DynamoDBScalarAttribute(type=ScalarAttributeType.S) public Locale getVal() { return super.getVal(); } public void setVal(final Locale val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Locale> val = model.field("val"); assertEquals(DynamoDBAttributeType.S, val.attributeType()); assertEquals("en-CA", val.convert(new Locale("en","CA")).getS()); assertEquals("en-CA", val.unconvert(new AttributeValue().withS("en-CA")).toString().replaceAll("_","-")); } /** * Test mappings. */ @Test public void testScalarAttributeBinaryUuid() { final Object obj = new AutoKeyAndVal<UUID>() { @DynamoDBHashKey public String getKey() { return super.getKey(); } @DynamoDBScalarAttribute(type=ScalarAttributeType.B) public UUID getVal() { return super.getVal(); } public void setVal(final UUID val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); assertEquals(DynamoDBAttributeType.B, model.field("val").attributeType()); final UUID val = UUID.randomUUID(); final AttributeValue converted = model.field("val").convert(val); assertNotNull(converted.getB()); assertEquals(val, model.field("val").unconvert(converted)); } @Test public void testScalarAttributeAttributeName() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBHashKey public String getKey() { return super.getKey(); } @DynamoDBScalarAttribute(attributeName="value", type=ScalarAttributeType.S) public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = models.getTable((Class<Object>)obj.getClass()); final DynamoDBMapperFieldModel<Object,String> val = model.field("value"); assertEquals(DynamoDBAttributeType.S, val.attributeType()); } /** * Test mappings. */ @Test public void testIgnore() { final Object obj = new AutoKeyAndVal<String>() { private String ignore; @DynamoDBAttribute(attributeName="value") public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } @DynamoDBIgnore @DynamoDBAttribute(attributeName="ignore") public String getIgnore() { return this.ignore; } public void setIgnore(final String ignore) { this.ignore = ignore; } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); assertEquals(2, model.fields().size()); assertNotNull(model.field("key")); assertNotNull(model.field("value")); } /** * Test mappings. */ @Test public void testConvertedBool() { final Object obj = new AutoKeyAndVal<Boolean>() { @DynamoDBConvertedBool(DynamoDBConvertedBool.Format.Y_N) public Boolean getVal() { return super.getVal(); } public void setVal(final Boolean val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Boolean> val = model.field("val"); assertEquals(DynamoDBAttributeType.S, val.attributeType()); assertEquals("Y", val.convert(Boolean.TRUE).getS()); assertEquals(Boolean.TRUE, val.unconvert(new AttributeValue().withS("Y"))); assertEquals("N", val.convert(Boolean.FALSE).getS()); assertEquals(Boolean.FALSE, val.unconvert(new AttributeValue().withS("N"))); assertEquals(null, val.convert(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedHashKeyString() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBAttribute public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> key = model.field("key"); assertFieldKeyType(KeyType.HASH, key, model); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, key.getGenerateStrategy()); assertNotNull(key.generate(null)); assertNotNull(key.generate(UUID.randomUUID().toString())); } /** * Test mappings. */ @Test public void testAutoGeneratedRangeKeyUuid() { final Object obj = new AutoKeyAndVal<UUID>() { @DynamoDBRangeKey @DynamoDBAutoGeneratedKey public UUID getVal() { return super.getVal(); } public void setVal(final UUID val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertFieldKeyType(KeyType.RANGE, val, model); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertNotNull(val.generate(null)); assertNotNull(val.generate(UUID.randomUUID())); } /** * Test mappings. */ @Test(expected=DynamoDBMappingException.class) public void testAutoGeneratedConflict() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBHashKey @DynamoDBAutoGeneratedKey @DynamoDBVersionAttribute public String getKey() { return super.getKey(); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); } /** * Test mappings. */ @Test(expected=DynamoDBMappingException.class) public void testAutoGeneratedVersionUuid() { final Object obj = new AutoKeyAndVal<UUID>() { @DynamoDBVersionAttribute public UUID getVal() { return super.getVal(); } public void setVal(final UUID val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); val.generate(null); //<- should fail } /** * Test mappings. */ @Test public void testAutoGeneratedVersionBigInteger() { final Object obj = new AutoKeyAndVal<BigInteger>() { @DynamoDBVersionAttribute public BigInteger getVal() { return super.getVal(); } public void setVal(final BigInteger val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(true, val.versioned()); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, val.getGenerateStrategy()); assertEquals(BigInteger.ONE, val.generate(null)); assertEquals(BigInteger.valueOf((int)2), val.generate(BigInteger.ONE)); } /** * Test mappings. */ @Test public void testAutoGeneratedVersionByte() { final Object obj = new AutoKeyAndVal<Byte>() { @DynamoDBVersionAttribute public Byte getVal() { return super.getVal(); } public void setVal(final Byte val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(true, val.versioned()); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, val.getGenerateStrategy()); assertEquals(Byte.valueOf((byte)1), val.generate(null)); assertEquals(Byte.valueOf((byte)2), val.generate(Byte.valueOf((byte)1))); } /** * Test mappings. */ @Test public void testAutoGeneratedVersionBytePrimitive() { final Object obj = new AutoKeyAndVal<String>() { private byte rvn; @DynamoDBAttribute public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } @DynamoDBVersionAttribute public byte getRvn() { return this.rvn; } public void setRvn(final byte rvn) { this.rvn = rvn; } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> rvn = model.field("rvn"); assertEquals(true, rvn.versioned()); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, rvn.getGenerateStrategy()); assertEquals(Byte.valueOf((byte)1), rvn.generate(null)); assertEquals(Byte.valueOf((byte)2), rvn.generate(Byte.valueOf((byte)1))); } /** * Test mappings. */ @Test public void testAutoGeneratedVersionInteger() { final Object obj = new AutoKeyAndVal<Integer>() { @DynamoDBVersionAttribute public Integer getVal() { return super.getVal(); } public void setVal(final Integer val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(true, val.versioned()); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, val.getGenerateStrategy()); assertEquals(Integer.valueOf((int)1), val.generate(null)); assertEquals(Integer.valueOf((int)2), val.generate(Integer.valueOf((int)1))); } /** * Test mappings. */ @Test public void testAutoGeneratedVersionIntegerPrimitive() { final Object obj = new AutoKeyAndVal<String>() { private int rvn; @DynamoDBAttribute public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } @DynamoDBVersionAttribute public int getRvn() { return this.rvn; } public void setRvn(final int rvn) { this.rvn = rvn; } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> rvn = model.field("rvn"); assertEquals(true, rvn.versioned()); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, rvn.getGenerateStrategy()); assertEquals(Integer.valueOf((int)1), rvn.generate(null)); assertEquals(Integer.valueOf((int)2), rvn.generate(Integer.valueOf((int)1))); } /** * Test mappings. */ @Test public void testAutoGeneratedVersionLong() { final Object obj = new AutoKeyAndVal<Long>() { @DynamoDBVersionAttribute public Long getVal() { return super.getVal(); } public void setVal(final Long val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(true, val.versioned()); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, val.getGenerateStrategy()); assertEquals(Long.valueOf((long)1), val.generate(null)); assertEquals(Long.valueOf((long)2), val.generate(Long.valueOf((long)1))); } /** * Test mappings. */ @Test public void testAutoGeneratedVersionLongPrimitive() { final Object obj = new AutoKeyAndVal<String>() { private long rvn; @DynamoDBAttribute public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } @DynamoDBVersionAttribute public long getRvn() { return this.rvn; } public void setRvn(final long rvn) { this.rvn = rvn; } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> rvn = model.field("rvn"); assertEquals(true, rvn.versioned()); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, rvn.getGenerateStrategy()); assertEquals(Long.valueOf((long)1), rvn.generate(null)); assertEquals(Long.valueOf((long)2), rvn.generate(Long.valueOf((long)1))); } /** * Test mappings. */ @Test public void testAutoGeneratedVersionShort() { final Object obj = new AutoKeyAndVal<Short>() { @DynamoDBVersionAttribute public Short getVal() { return super.getVal(); } public void setVal(final Short val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(true, val.versioned()); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, val.getGenerateStrategy()); assertEquals(Short.valueOf((short)1), val.generate(null)); assertEquals(Short.valueOf((short)2), val.generate(Short.valueOf((short)1))); } /** * Test mappings. */ @Test public void testAutoGeneratedVersionShortPrimitive() { final Object obj = new AutoKeyAndVal<String>() { private short rvn; @DynamoDBAttribute public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } @DynamoDBVersionAttribute public short getRvn() { return this.rvn; } public void setRvn(final short rvn) { this.rvn = rvn; } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> rvn = model.field("rvn"); assertEquals(true, rvn.versioned()); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, rvn.getGenerateStrategy()); assertEquals(Short.valueOf((short)1), rvn.generate(null)); assertEquals(Short.valueOf((short)2), rvn.generate(Short.valueOf((short)1))); } /** * Test mappings. */ @Test(expected=DynamoDBMappingException.class) public void testAutoGeneratedTimestampUuid() { final Object obj = new AutoKeyAndVal<UUID>() { @DynamoDBAutoGeneratedTimestamp public UUID getVal() { return super.getVal(); } public void setVal(final UUID val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); } /** * Test mappings. */ @Test public void testAutoGeneratedTimestampCalendar() { final Object obj = new AutoKeyAndVal<Calendar>() { @DynamoDBAutoGeneratedTimestamp public Calendar getVal() { return super.getVal(); } public void setVal(final Calendar val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, val.getGenerateStrategy()); assertNotNull(val.generate(null)); assertNotNull(val.generate(Calendar.getInstance())); } /** * Test mappings. */ @Test public void testAutoGeneratedTimestampDateKey() { final Object obj = new AutoKeyAndVal<Date>() { @DynamoDBRangeKey @DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.CREATE) public Date getVal() { return super.getVal(); } public void setVal(final Date val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertFieldKeyType(KeyType.RANGE, val, model); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertNotNull(val.generate(null)); assertNotNull(val.generate(new Date())); } /** * Test mappings. */ @Test public void testAutoGeneratedTimestampDateVal() { final Object obj = new AutoKeyAndVal<Date>() { @DynamoDBAutoGeneratedTimestamp public Date getVal() { return super.getVal(); } public void setVal(final Date val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, val.getGenerateStrategy()); assertNotNull(val.generate(null)); assertNotNull(val.generate(new Date())); } /** * Test mappings. */ @Test public void testAutoGeneratedTimestampLong() { final Object obj = new AutoKeyAndVal<Long>() { @DynamoDBAutoGeneratedTimestamp public Long getVal() { return super.getVal(); } public void setVal(final Long val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.ALWAYS, val.getGenerateStrategy()); assertNotNull(val.generate(null)); assertNotNull(val.generate(System.currentTimeMillis())); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultByteBuffer() { final Object obj = new AutoKeyAndVal<ByteBuffer>() { @DynamoDBAutoGeneratedDefault("default-val") public ByteBuffer getVal() { return super.getVal(); } public void setVal(final ByteBuffer val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertNotNull(val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultBigDecimal() { final Object obj = new AutoKeyAndVal<BigDecimal>() { @DynamoDBAutoGeneratedDefault("1234.5") public BigDecimal getVal() { return super.getVal(); } public void setVal(final BigDecimal val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(BigDecimal.valueOf(1234.5D), val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultBigInteger() { final Object obj = new AutoKeyAndVal<BigInteger>() { @DynamoDBAutoGeneratedDefault("1234") public BigInteger getVal() { return super.getVal(); } public void setVal(final BigInteger val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(BigInteger.valueOf(1234), val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultBoolean_true() { final Object obj = new AutoKeyAndVal<Boolean>() { @DynamoDBAutoGeneratedDefault("true") public Boolean getVal() { return super.getVal(); } public void setVal(final Boolean val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Boolean.TRUE, val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultBoolean_0() { final Object obj = new AutoKeyAndVal<Boolean>() { @DynamoDBAutoGeneratedDefault("0") public Boolean getVal() { return super.getVal(); } public void setVal(final Boolean val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Boolean.FALSE, val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultBoolean_1() { final Object obj = new AutoKeyAndVal<Boolean>() { @DynamoDBAutoGeneratedDefault("1") public Boolean getVal() { return super.getVal(); } public void setVal(final Boolean val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Boolean.TRUE, val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultBoolean_y() { final Object obj = new AutoKeyAndVal<Boolean>() { @DynamoDBAutoGeneratedDefault("y") public Boolean getVal() { return super.getVal(); } public void setVal(final Boolean val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Boolean.TRUE, val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultBoolean_Y() { final Object obj = new AutoKeyAndVal<Boolean>() { @DynamoDBAutoGeneratedDefault("Y") public Boolean getVal() { return super.getVal(); } public void setVal(final Boolean val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Boolean.TRUE, val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultByte() { final Object obj = new AutoKeyAndVal<Byte>() { @DynamoDBAutoGeneratedDefault("1") public Byte getVal() { return super.getVal(); } public void setVal(final Byte val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Byte.valueOf((byte)1), val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultCharacter() { final Object obj = new AutoKeyAndVal<Character>() { @DynamoDBAutoGeneratedDefault("A") public Character getVal() { return super.getVal(); } public void setVal(final Character val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Character.valueOf('A'), val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultCurrency() { final Object obj = new AutoKeyAndVal<java.util.Currency>() { @DynamoDBAutoGeneratedDefault("CAD") public java.util.Currency getVal() { return super.getVal(); } public void setVal(final java.util.Currency val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(java.util.Currency.getInstance("CAD"), val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultDouble() { final Object obj = new AutoKeyAndVal<Double>() { @DynamoDBAutoGeneratedDefault("1234.5") public Double getVal() { return super.getVal(); } public void setVal(final Double val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Double.valueOf(1234.5D), val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultEnum() { final Object obj = new AutoKeyAndVal<TimeUnit>() { @DynamoDBTypeConvertedEnum @DynamoDBAutoGeneratedDefault("SECONDS") public TimeUnit getVal() { return super.getVal(); } public void setVal(final TimeUnit val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(TimeUnit.SECONDS, val.generate(null)); assertEquals(TimeUnit.SECONDS, val.generate(TimeUnit.MILLISECONDS)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultFloat() { final Object obj = new AutoKeyAndVal<Float>() { @DynamoDBAutoGeneratedDefault("1234.5") public Float getVal() { return super.getVal(); } public void setVal(final Float val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Float.valueOf(1234.5F), val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultInteger() { final Object obj = new AutoKeyAndVal<Integer>() { @DynamoDBAutoGeneratedDefault("1234") public Integer getVal() { return super.getVal(); } public void setVal(final Integer val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Integer.valueOf((int)1234), val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultLong() { final Object obj = new AutoKeyAndVal<Long>() { @DynamoDBAutoGeneratedDefault("1234") public Long getVal() { return super.getVal(); } public void setVal(final Long val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Long.valueOf((long)1234), val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultShort() { final Object obj = new AutoKeyAndVal<Short>() { @DynamoDBAutoGeneratedDefault("1234") public Short getVal() { return super.getVal(); } public void setVal(final Short val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(Short.valueOf((short)1234), val.generate(null)); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultString() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBAutoGeneratedDefault("default-val") public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals("default-val", val.generate(null)); assertEquals("default-val", val.generate("not-default")); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultTimeZone() { final Object obj = new AutoKeyAndVal<TimeZone>() { @DynamoDBAutoGeneratedDefault("America/New_York") public TimeZone getVal() { return super.getVal(); } public void setVal(final TimeZone val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(TimeZone.getTimeZone("America/New_York"), val.generate(null)); assertEquals(TimeZone.getTimeZone("America/New_York"), val.generate(TimeZone.getTimeZone("America/Los_Angeles"))); } /** * Test mappings. */ @Test public void testAutoGeneratedDefaultUuid() { final Object obj = new AutoKeyAndVal<UUID>() { @DynamoDBAutoGeneratedDefault("12345678-1234-1234-1234-123456789012") public UUID getVal() { return super.getVal(); } public void setVal(final UUID val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> val = model.field("val"); assertEquals(DynamoDBAutoGenerateStrategy.CREATE, val.getGenerateStrategy()); assertEquals(UUID.fromString("12345678-1234-1234-1234-123456789012"), val.generate(null)); } /** * Test mappings. */ @Test public void testIndexHashKeyGlobalSecondaryIndexName() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBIndexHashKey(attributeName="gsi_hk", globalSecondaryIndexName="gsi") public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> gsi_hk = model.field("gsi_hk"); assertFieldGsiNames(Arrays.asList("gsi"), KeyType.HASH, gsi_hk, model); assertFieldGsiNames(null, KeyType.RANGE, gsi_hk, model); assertFieldLsiNames(null, gsi_hk, model); } /** * Test mappings. */ @Test public void testIndexHashKeyGlobalSecondaryIndexNames() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBIndexHashKey(attributeName="gsi_hk", globalSecondaryIndexNames="gsi") public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> gsi_hk = model.field("gsi_hk"); assertFieldGsiNames(Arrays.asList("gsi"), KeyType.HASH, gsi_hk, model); assertFieldGsiNames(null, KeyType.RANGE, gsi_hk, model); assertFieldLsiNames(null, gsi_hk, model); } /** * Test mappings. */ @Test public void testIndexRangeKeyGlobalSecondaryIndexName() { final Object obj = new AutoKeyAndVal<String>() { private String gsi; @DynamoDBIndexHashKey(attributeName="gsi_hk", globalSecondaryIndexName="gsi") public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } @DynamoDBIndexRangeKey(attributeName="gsi_rk", globalSecondaryIndexName="gsi") public String getGsi() { return this.gsi; } public void setGsi(final String gsi) { this.gsi = gsi; } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> gsi_hk = model.field("gsi_hk"); assertFieldGsiNames(Arrays.asList("gsi"), KeyType.HASH, gsi_hk, model); assertFieldGsiNames(null, KeyType.RANGE, gsi_hk, model); assertFieldLsiNames(null, gsi_hk, model); final DynamoDBMapperFieldModel<Object,Object> gsi_rk = model.field("gsi_rk"); assertFieldGsiNames(null, KeyType.HASH, gsi_rk, model); assertFieldGsiNames(Arrays.asList("gsi"), KeyType.RANGE, gsi_rk, model); assertFieldLsiNames(null, gsi_rk, model); } /** * Test mappings. */ @Test public void testIndexRangeKeyGlobalSecondaryIndexNames() { final Object obj = new AutoKeyAndVal<String>() { private String gsi; @DynamoDBIndexHashKey(attributeName="gsi_hk", globalSecondaryIndexName="gsi") public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } @DynamoDBIndexRangeKey(attributeName="gsi_rk", globalSecondaryIndexNames="gsi") public String getGsi() { return this.gsi; } public void setGsi(final String gsi) { this.gsi = gsi; } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> gsi_hk = model.field("gsi_hk"); assertFieldGsiNames(Arrays.asList("gsi"), KeyType.HASH, gsi_hk, model); assertFieldGsiNames(null, KeyType.RANGE, gsi_hk, model); assertFieldLsiNames(null, gsi_hk, model); final DynamoDBMapperFieldModel<Object,Object> gsi_rk = model.field("gsi_rk"); assertFieldGsiNames(null, KeyType.HASH, gsi_rk, model); assertFieldGsiNames(Arrays.asList("gsi"), KeyType.RANGE, gsi_rk, model); assertFieldLsiNames(null, gsi_rk, model); } /** * Test mappings. */ @Test public void testIndexRangeKeyiLocalSecondaryIndexName() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBIndexRangeKey(attributeName="lsi_rk", localSecondaryIndexName="lsi") public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> lsi_rk = model.field("lsi_rk"); assertFieldLsiNames(Arrays.asList("lsi"), lsi_rk, model); } /** * Test mappings. */ @Test public void testIndexRangeKeyLocalSecondaryIndexNames() { final Object obj = new AutoKeyAndVal<String>() { @DynamoDBIndexRangeKey(attributeName="lsi_rk", localSecondaryIndexNames="lsi") public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> lsi_rk = model.field("lsi_rk"); assertFieldLsiNames(Arrays.asList("lsi"), lsi_rk, model); } /** * Test mappings. */ @Test public void testFlattened() { final Object obj = new AutoKeyAndVal<DateRange>() { @DynamoDBFlattened(attributes={ @DynamoDBAttribute(mappedBy="start", attributeName="DateRangeStart"), @DynamoDBAttribute(mappedBy="end", attributeName="DateRangeEnd")}) public DateRange getVal() { return super.getVal(); } public void setVal(final DateRange val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); assertEquals(3, model.fields().size()); assertEquals("DateRangeStart", model.field("DateRangeStart").name()); assertEquals("DateRangeEnd", model.field("DateRangeEnd").name()); } /** * Test mappings. */ @Test public void testFlattenedNotAllSpecified() { final Object obj = new AutoKeyAndVal<DateRange>() { @DynamoDBFlattened(attributes={ @DynamoDBAttribute(mappedBy="start", attributeName="DateRangeStart")}) public DateRange getVal() { return super.getVal(); } public void setVal(final DateRange val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); assertEquals(2, model.fields().size()); assertEquals("DateRangeStart", model.field("DateRangeStart").name()); } /** * Test mappings. */ @Test(expected=DynamoDBMappingException.class) public void testFlattenedInvalidMappedBy() { final Object obj = new AutoKeyAndVal<DateRange>() { @DynamoDBFlattened(attributes={ @DynamoDBAttribute(mappedBy="xstart", attributeName="DateRangeStart"), @DynamoDBAttribute(mappedBy="xend", attributeName="DateRangeEnd")}) public DateRange getVal() { return super.getVal(); } public void setVal(final DateRange val) { super.setVal(val); } }; getTable(obj); } /** * Test mappings. */ @Test public void testFlattenedMultipleSameType() { final Object obj = new AutoKeyAndVal<Currency>() { private Currency other; @DynamoDBFlattened(attributes={ @DynamoDBAttribute(mappedBy="amount", attributeName="firstAmount"), @DynamoDBAttribute(mappedBy="unit", attributeName="firstUnit")}) public Currency getVal() { return super.getVal(); } public void setVal(final Currency val) { super.setVal(val); } @DynamoDBFlattened(attributes={ @DynamoDBAttribute(mappedBy="amount", attributeName="secondAmount"), @DynamoDBAttribute(mappedBy="unit", attributeName="secondUnit")}) public Currency getOther() { return this.other; } public void setOther(final Currency other) { this.other = other; } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); assertEquals(5, model.fields().size()); assertEquals("firstAmount", model.field("firstAmount").name()); assertEquals("firstUnit", model.field("firstUnit").name()); assertEquals("secondAmount", model.field("secondAmount").name()); assertEquals("secondUnit", model.field("secondUnit").name()); } /** * Test mappings. */ @Test public void testTableAndDocument() { models.getTable(TableAndDocument.class); } @DynamoDBDocument @DynamoDBTable(tableName="") public static class TableAndDocument extends AutoKeyAndVal<String> { public String getVal() { return super.getVal(); } public void setVal(final String val) { super.setVal(val); } } /** * Test mappings. */ @Test public void testInheritedWithNoTable() { final Object obj = new KeyAndVal<String,String>() { @DynamoDBHashKey(attributeName="hk") public String getKey() { return super.getKey(); } public void setKey(String key) { super.setKey(key); } @DynamoDBAttribute(attributeName="value") public String getVal() { return super.getVal(); } public void setVal(String val) { super.setVal(val); } }; final DynamoDBMapperTableModel<Object> model = getTable(obj); final DynamoDBMapperFieldModel<Object,Object> key = model.field("hk"); assertNotNull(key); assertEquals(KeyType.HASH, key.keyType()); assertEquals(DynamoDBAttributeType.S, key.attributeType()); final DynamoDBMapperFieldModel<Object,Object> val = model.field("value"); assertNotNull(val); assertEquals(DynamoDBAttributeType.S, val.attributeType()); } /** * Test mappings to make sure the bridge method is ruled out. */ @Test public void testFindRelevantGettersWithBridgeMethod() { final DynamoDBMapperTableModel<SubClass> model = models.getTable(SubClass.class); assertEquals("only two getter should be returned", 2, model.fields().size()); assertEquals("return type should be Integer rather than Object", DynamoDBAttributeType.N, model.field("t").attributeType()); } @DynamoDBTable(tableName = "") private static abstract class SuperGenericClass<T> { private String id; @DynamoDBHashKey public final String getId() { return this.id; } public final void setId(String id) { this.id = id; } public abstract T getT(); public abstract void setT(T t); } @DynamoDBTable(tableName = "GenericString") private static class SubClass extends SuperGenericClass<Integer> { private Integer t; @Override public Integer getT() { return t; } @Override public void setT(Integer t) { this.t = t; } } /** * Test mappings. */ @Test public void testNonMappedInheritedProperties() { final DynamoDBMapperTableModel<NonMappedInheritedProperties> model = models.getTable(NonMappedInheritedProperties.class); assertEquals(2, model.fields().size()); assertNotNull(model.field("doUse")); } public abstract class AbstractNonMappedInheritedProperties { private String doNotUse; public String getDoNotUse() { return this.doNotUse; } public void setDoNotUse(final String doNotUse) { this.doNotUse = doNotUse; } } @DynamoDBTable(tableName="aws-java-sdk-test") public class NonMappedInheritedProperties extends AbstractNonMappedInheritedProperties { private String id; private String doUse; @DynamoDBHashKey public final String getId() { return this.id; } public final void setId(String id) { this.id = id; } public String getDoUse() { return this.doUse; } public void setDoUse(final String doUse) { this.doUse = doUse; } } /** * Test mappings. */ @Test public void testInheritedProperties() { final DynamoDBMapperTableModel<BaseTablePojo> model1 = models.getTable(BaseTablePojo.class); assertEquals(3, model1.fields().size()); assertNotNull(model1.field("hashKeyOnField")); assertNotNull(model1.field("rangeKeyOnGetter")); final DynamoDBMapperTableModel<TablePojoSubclass> model2 = models.getTable(TablePojoSubclass.class); assertEquals(4, model2.fields().size()); assertNotNull(model2.field("hashKeyOnField")); assertNotNull(model2.field("rangeKeyOnGetter")); } @DynamoDBTable(tableName="table") private static class BaseTablePojo { @DynamoDBHashKey private String hashKeyOnField; private String rangeKeyOnGetter; private String attrNoAnnotation; @DynamoDBIgnore private String ignoredAttr; public String getHashKeyOnField() { return hashKeyOnField; } public void setHashKeyOnField(String hashKeyOnField) { this.hashKeyOnField = hashKeyOnField; } @DynamoDBRangeKey public String getRangeKeyOnGetter() { return rangeKeyOnGetter; } public void setRangeKeyOnGetter(String rangeKeyOnGetter) { this.rangeKeyOnGetter = rangeKeyOnGetter; } public String getAttrNoAnnotation() { return attrNoAnnotation; } public void setAttrNoAnnotation(String attrNoAnnotation) { this.attrNoAnnotation = attrNoAnnotation; } public String getIgnoredAttr() { return ignoredAttr; } public void setIgnoredAttr(String ignoredAttr) { this.ignoredAttr = ignoredAttr; } } @DynamoDBTable(tableName="table") private static class TablePojoSubclass extends BaseTablePojo { private String ignoredAttr; @Override public String getIgnoredAttr() { return ignoredAttr; } @Override public void setIgnoredAttr(String ignoredAttr) { this.ignoredAttr = ignoredAttr; } } /** * Test mappings. */ @Test public void testPojoWithGetterAnnotations() { PojoAsserts.assertAll(models.getTable(PojoWithGetterAnnotations.class)); } /** * Test mappings. */ @Test public void testPojoWithFieldAnnotations() { PojoAsserts.assertAll(models.getTable(PojoWithFieldAnnotations.class)); } /** * Test mappings. */ @Test public void testPojoWithMixedAnnotations() { PojoAsserts.assertAll(models.getTable(PojoWithMixedAnnotations.class)); } /** * Pojo field assersions. */ private static enum PojoAsserts { hashKey(KeyType.HASH, null), rangeKey(KeyType.RANGE, DynamoDBAutoGenerateStrategy.CREATE), indexHashKey(null, null), indexRangeKey(null, null), actualAttrName(null, null), versionedAttr(null, DynamoDBAutoGenerateStrategy.ALWAYS), marshallingAttr(null, null); private final DynamoDBAutoGenerateStrategy generateStrategy; private final KeyType keyType; private PojoAsserts(final KeyType keyType, final DynamoDBAutoGenerateStrategy generateStrategy) { this.generateStrategy = generateStrategy; this.keyType = keyType; } public static <T> void assertAll(final DynamoDBMapperTableModel<T> model) { for (final PojoAsserts asserts : PojoAsserts.values()) { final DynamoDBMapperFieldModel<T,Object> field = model.field(asserts.name()); assertNotNull(field); assertFieldKeyType(asserts.keyType, field, model); assertEquals(asserts.generateStrategy, field.getGenerateStrategy()); assertEquals(0, field.localSecondaryIndexNames().size()); } assertEquals(PojoAsserts.values().length, model.fields().size()); } } /** * A POJO model that uses getter annotations. */ @DynamoDBTable(tableName="table") private static class PojoWithGetterAnnotations { private String hashKey; private String rangeKey; private String indexHashKey; private String indexRangeKey; private String annotatedAttr; private Long versionedAttr; private String marshallingAttr; private String ignoredAttr; @DynamoDBHashKey public String getHashKey() { return hashKey; } public void setHashKey(String hashKey) { this.hashKey = hashKey; } @DynamoDBRangeKey @DynamoDBAutoGeneratedKey public String getRangeKey() { return rangeKey; } public void setRangeKey(String rangeKey) { this.rangeKey = rangeKey; } @DynamoDBIndexHashKey(globalSecondaryIndexName="index") public String getIndexHashKey() { return indexHashKey; } public void setIndexHashKey(String indexHashKey) { this.indexHashKey = indexHashKey; } @DynamoDBIndexRangeKey(globalSecondaryIndexName="index") public String getIndexRangeKey() { return indexRangeKey; } public void setIndexRangeKey(String indexRangeKey) { this.indexRangeKey = indexRangeKey; } @DynamoDBAttribute(attributeName="actualAttrName") public String getAnnotatedAttr() { return annotatedAttr; } public void setAnnotatedAttr(String annotatedAttr) { this.annotatedAttr = annotatedAttr; } @DynamoDBVersionAttribute public Long getVersionedAttr() { return versionedAttr; } public void setVersionedAttr(Long versionedAttr) { this.versionedAttr = versionedAttr; } @DynamoDBTypeConverted(converter=RandomUUIDMarshaller.class) public String getMarshallingAttr() { return marshallingAttr; } public void setMarshallingAttr(String marshallingAttr) { this.marshallingAttr = marshallingAttr; } @DynamoDBIgnore public String getIgnoredAttr() { return ignoredAttr; } public void setIgnoredAttr(String ignoredAttr) { this.ignoredAttr = ignoredAttr; } } /** * The same model as defined in PojoWithGetterAnnotations, but uses field * annotations instead. */ @DynamoDBTable(tableName="table") private static class PojoWithFieldAnnotations { @DynamoDBHashKey private String hashKey; @DynamoDBRangeKey @DynamoDBAutoGeneratedKey private String rangeKey; @DynamoDBIndexHashKey(globalSecondaryIndexName="index") private String indexHashKey; @DynamoDBIndexRangeKey(globalSecondaryIndexName="index") private String indexRangeKey; @DynamoDBAttribute(attributeName="actualAttrName") private String annotatedAttr; @DynamoDBVersionAttribute private Long versionedAttr; @DynamoDBTypeConverted(converter=RandomUUIDMarshaller.class) private String marshallingAttr; @DynamoDBIgnore private String ignoredAttr; public String getHashKey() { return hashKey; } public void setHashKey(String hashKey) { this.hashKey = hashKey; } public String getRangeKey() { return rangeKey; } public void setRangeKey(String rangeKey) { this.rangeKey = rangeKey; } public String getIndexHashKey() { return indexHashKey; } public void setIndexHashKey(String indexHashKey) { this.indexHashKey = indexHashKey; } public String getIndexRangeKey() { return indexRangeKey; } public void setIndexRangeKey(String indexRangeKey) { this.indexRangeKey = indexRangeKey; } public String getAnnotatedAttr() { return annotatedAttr; } public void setAnnotatedAttr(String annotatedAttr) { this.annotatedAttr = annotatedAttr; } public Long getVersionedAttr() { return versionedAttr; } public void setVersionedAttr(Long versionedAttr) { this.versionedAttr = versionedAttr; } public String getMarshallingAttr() { return marshallingAttr; } public void setMarshallingAttr(String marshallingAttr) { this.marshallingAttr = marshallingAttr; } public String getIgnoredAttr() { return ignoredAttr; } public void setIgnoredAttr(String ignoredAttr) { this.ignoredAttr = ignoredAttr; } } /** * The same model as defined in PojoWithGetterAnnotations, but uses both getter and field * annotations. */ @DynamoDBTable(tableName="table") private static class PojoWithMixedAnnotations { @DynamoDBHashKey private String hashKey; private String rangeKey; @DynamoDBIndexHashKey(globalSecondaryIndexName="index") private String indexHashKey; private String indexRangeKey; @DynamoDBAttribute(attributeName="actualAttrName") private String annotatedAttr; private Long versionedAttr; @DynamoDBTypeConverted(converter=RandomUUIDMarshaller.class) private String marshallingAttr; private String ignoredAttr; public String getHashKey() { return hashKey; } public void setHashKey(String hashKey) { this.hashKey = hashKey; } @DynamoDBRangeKey @DynamoDBAutoGeneratedKey public String getRangeKey() { return rangeKey; } public void setRangeKey(String rangeKey) { this.rangeKey = rangeKey; } public String getIndexHashKey() { return indexHashKey; } public void setIndexHashKey(String indexHashKey) { this.indexHashKey = indexHashKey; } @DynamoDBIndexRangeKey(globalSecondaryIndexName="index") public String getIndexRangeKey() { return indexRangeKey; } public void setIndexRangeKey(String indexRangeKey) { this.indexRangeKey = indexRangeKey; } public String getAnnotatedAttr() { return annotatedAttr; } public void setAnnotatedAttr(String annotatedAttr) { this.annotatedAttr = annotatedAttr; } @DynamoDBVersionAttribute public Long getVersionedAttr() { return versionedAttr; } public void setVersionedAttr(Long versionedAttr) { this.versionedAttr = versionedAttr; } public String getMarshallingAttr() { return marshallingAttr; } public void setMarshallingAttr(String marshallingAttr) { this.marshallingAttr = marshallingAttr; } @DynamoDBIgnore public String getIgnoredAttr() { return ignoredAttr; } public void setIgnoredAttr(String ignoredAttr) { this.ignoredAttr = ignoredAttr; } } /** * Assert that the field key properties are correct. */ private static <T,V> void assertFieldKeyType(KeyType keyType, DynamoDBMapperFieldModel<T,V> field, DynamoDBMapperTableModel<T> model) { assertEquals(keyType, field.keyType()); if (keyType != null) { if (keyType == KeyType.HASH) { assertEquals(field, model.hashKey()); } else if (keyType == KeyType.RANGE) { assertEquals(field, model.rangeKeyIfExists()); assertEquals(field, model.rangeKey()); } } } /** * Assert that the field contains the LSIs. */ private static <T,V> void assertFieldGsiNames(List<String> names, KeyType keyType, DynamoDBMapperFieldModel<T,V> field, DynamoDBMapperTableModel<T> model) { assertEquals(names == null ? 0 : names.size(), field.globalSecondaryIndexNames(keyType).size()); assertEquals(true, field.indexed()); if (names != null) { for (final String name : names) { assertEquals(true, field.globalSecondaryIndexNames(keyType).contains(name)); assertEquals(true, model.globalSecondaryIndex(name) != null); assertEquals(true, !model.globalSecondaryIndexes().isEmpty()); } } } /** * Assert that the field contains the LSIs. */ private static <T,V> void assertFieldLsiNames(List<String> names, DynamoDBMapperFieldModel<T,V> field, DynamoDBMapperTableModel<T> model) { assertEquals(names == null ? 0 : names.size(), field.localSecondaryIndexNames().size()); assertEquals(true, field.indexed()); if (names != null) { for (final String name : names) { assertEquals(true, field.localSecondaryIndexNames().contains(name)); assertEquals(true, model.localSecondaryIndex(name) != null); assertEquals(true, !model.localSecondaryIndexes().isEmpty()); } } } }