Created
June 5, 2012 02:50
-
-
Save mboudreau/2872253 to your computer and use it in GitHub Desktop.
Custom DynamoDBMapper for Tiered Deployment
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.michelboudreau.db; | |
import com.amazonaws.services.dynamodb.AmazonDynamoDB; | |
import com.amazonaws.services.dynamodb.AmazonDynamoDBClient; | |
import com.amazonaws.services.dynamodb.datamodeling.*; | |
import com.amazonaws.services.dynamodb.model.BatchGetItemRequest; | |
import com.amazonaws.services.dynamodb.model.BatchGetItemResult; | |
import com.amazonaws.services.dynamodb.model.KeysAndAttributes; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import java.util.HashMap; | |
import java.util.Map; | |
public class TieredDynamoDBMapper extends DynamoDBMapper { | |
private final AmazonDynamoDB client; | |
public TivityMapper(AmazonDynamoDB dynamoDB) { | |
super(dynamoDB, DynamoDBMapperConfig.DEFAULT); | |
this.client = dynamoDB; | |
} | |
@Override | |
public <T> T load(Class<T> clazz, Object hashKey, Object rangeKey, DynamoDBMapperConfig config) { | |
return super.load(clazz, hashKey, rangeKey, getTieredConfig(clazz, config)); | |
} | |
@Override | |
public <T> void save(T object, DynamoDBMapperConfig config) { | |
super.save(object, getTieredConfig(object.getClass(), config)); | |
} | |
@Override | |
public void delete(Object object, DynamoDBMapperConfig config) { | |
super.delete(object, getTieredConfig(object.getClass(), config)); | |
} | |
@Override | |
public <T> PaginatedScanList<T> scan(Class<T> clazz, DynamoDBScanExpression scanExpression, DynamoDBMapperConfig config) { | |
return super.scan(clazz, scanExpression, getTieredConfig(clazz, config)); | |
} | |
@Override | |
public <T> PaginatedQueryList<T> query(Class<T> clazz, DynamoDBQueryExpression queryExpression, DynamoDBMapperConfig config) { | |
return super.query(clazz, queryExpression, getTieredConfig(clazz, config)); | |
} | |
@Override | |
public int count(Class<?> clazz, DynamoDBScanExpression scanExpression, DynamoDBMapperConfig config) { | |
return super.count(clazz, scanExpression, getTieredConfig(clazz, config)); | |
} | |
@Override | |
public int count(Class<?> clazz, DynamoDBQueryExpression queryExpression, DynamoDBMapperConfig config) { | |
return super.count(clazz, queryExpression, getTieredConfig(clazz, config)); | |
} | |
// Extra functionality | |
public <T> void clobber(T object) { | |
super.save(object, getTieredConfig(object.getClass(),new DynamoDBMapperConfig(DynamoDBMapperConfig.SaveBehavior.CLOBBER))); | |
} | |
public BatchGetItemResult batchGetItem(Map<String,KeysAndAttributes> items){ | |
BatchGetItemResult result = new BatchGetItemResult(); | |
Map<String,KeysAndAttributes> copyItems = new HashMap<String, KeysAndAttributes>(); | |
for(String keyz : items.keySet()){ | |
copyItems.put(properties.getEnvironment() + "-" + keyz,items.get(keyz)); | |
} | |
BatchGetItemRequest request = new BatchGetItemRequest(); | |
request.setRequestItems(copyItems); | |
result = client.batchGetItem(request); | |
return result; | |
} | |
protected <T> DynamoDBMapperConfig getTieredConfig(Class<T> clazz, DynamoDBMapperConfig config) { | |
// Do not use tiered if table name override already exists | |
if (config.getTableNameOverride() == null) { | |
DynamoDBMapperConfig.TableNameOverride override = new DynamoDBMapperConfig.TableNameOverride(getTieredTableName(clazz)); | |
config = new DynamoDBMapperConfig(config.getSaveBehavior(), config.getConsistentReads(), override); | |
} | |
return config; | |
} | |
protected <T> String getTieredTableName(Class<T> clazz) { | |
String tableName = getTableName(clazz); | |
if (System.getProperty('PARAM1') != null) { | |
tableName = System.getProperty('PARAM1') + "-" + tableName; | |
} | |
return tableName; | |
} | |
protected <T> String getTableName(Class<T> clazz) { | |
DynamoDBTable table = clazz.getAnnotation(DynamoDBTable.class); | |
if (table == null) { | |
throw new DynamoDBMappingException("Class " + clazz + " must be annotated with " + DynamoDBTable.class); | |
} | |
return table.tableName(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment