Skip to content

Instantly share code, notes, and snippets.

@mboudreau
Created June 5, 2012 02:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mboudreau/2872253 to your computer and use it in GitHub Desktop.
Save mboudreau/2872253 to your computer and use it in GitHub Desktop.
Custom DynamoDBMapper for Tiered Deployment
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