summaryrefslogtreecommitdiff
path: root/src/com/p4square/grow/backend/dynamo
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2016-04-09 14:22:20 -0700
committerJesse Morgan <jesse@jesterpm.net>2016-04-09 15:48:01 -0700
commit3102d8bce3426d9cf41aeaf201c360d342677770 (patch)
tree38c4f1e8828f9af9c4b77a173bee0d312b321698 /src/com/p4square/grow/backend/dynamo
parentbbf907e51dfcf157bdee24dead1d531122aa25db (diff)
Switching from Ivy+Ant to Maven.
Diffstat (limited to 'src/com/p4square/grow/backend/dynamo')
-rw-r--r--src/com/p4square/grow/backend/dynamo/DbTool.java481
-rw-r--r--src/com/p4square/grow/backend/dynamo/DynamoCollectionProviderImpl.java109
-rw-r--r--src/com/p4square/grow/backend/dynamo/DynamoDatabase.java307
-rw-r--r--src/com/p4square/grow/backend/dynamo/DynamoKey.java56
-rw-r--r--src/com/p4square/grow/backend/dynamo/DynamoProviderImpl.java37
5 files changed, 0 insertions, 990 deletions
diff --git a/src/com/p4square/grow/backend/dynamo/DbTool.java b/src/com/p4square/grow/backend/dynamo/DbTool.java
deleted file mode 100644
index 374fa83..0000000
--- a/src/com/p4square/grow/backend/dynamo/DbTool.java
+++ /dev/null
@@ -1,481 +0,0 @@
-/*
- * Copyright 2014 Jesse Morgan
- */
-
-package com.p4square.grow.backend.dynamo;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-
-import com.p4square.grow.backend.dynamo.DynamoDatabase;
-import com.p4square.grow.backend.dynamo.DynamoKey;
-import com.p4square.grow.config.Config;
-import com.p4square.grow.model.UserRecord;
-import com.p4square.grow.provider.Provider;
-
-/**
- *
- * @author Jesse Morgan <jesse@jesterpm.net>
- */
-public class DbTool {
- private static final FilenameFilter JSON_FILTER = new JsonFilter();
-
- private static Config mConfig;
- private static DynamoDatabase mDatabase;
-
- public static void usage() {
- System.out.println("java com.p4square.grow.backend.dynamo.DbTool <command>...\n");
- System.out.println("Commands:");
- System.out.println("\t--domain <domain> Set config domain");
- System.out.println("\t--dev Set config domain to dev");
- System.out.println("\t--config <file> Merge in config file");
- System.out.println("\t--list List all tables");
- System.out.println("\t--create <table> <reads> <writes> Create a table");
- System.out.println("\t--update <table> <reads> <writes> Update table throughput");
- System.out.println("\t--drop <table> Delete a table");
- System.out.println("\t--get <table> <key> <attribute> Get a value");
- System.out.println("\t--put <table> <key> <attribute> <value> Put a value");
- System.out.println("\t--delete <table> <key> <attribute> Delete a value");
- System.out.println("\t--scan <table> List all rows");
- System.out.println("\t--scanf <table> <attribute> List all rows");
- System.out.println();
- System.out.println("Bootstrap Commands:");
- System.out.println("\t--bootstrap <data> Create all tables and import all data");
- System.out.println("\t--loadStrings <data> Load all videos and questions");
- System.out.println("\t--destroy Drop all tables");
- System.out.println("\t--addadmin <user> <pass> Add a backend account");
- System.out.println("\t--import <table> <file> Backfill a table");
- }
-
- public static void main(String... args) {
- if (args.length == 0) {
- usage();
- System.exit(1);
- }
-
- mConfig = new Config();
-
- try {
- mConfig.updateConfig(DbTool.class.getResourceAsStream("/grow.properties"));
-
- int offset = 0;
- while (offset < args.length) {
- if ("--domain".equals(args[offset])) {
- mConfig.setDomain(args[offset + 1]);
- mDatabase = null;
- offset += 2;
-
- } else if ("--dev".equals(args[offset])) {
- mConfig.setDomain("dev");
- mDatabase = null;
- offset += 1;
-
- } else if ("--config".equals(args[offset])) {
- mConfig.updateConfig(args[offset + 1]);
- mDatabase = null;
- offset += 2;
-
- } else if ("--list".equals(args[offset])) {
- //offset = list(args, ++offset);
-
- } else if ("--create".equals(args[offset])) {
- offset = create(args, ++offset);
-
- } else if ("--update".equals(args[offset])) {
- offset = update(args, ++offset);
-
- } else if ("--drop".equals(args[offset])) {
- offset = drop(args, ++offset);
-
- } else if ("--get".equals(args[offset])) {
- offset = get(args, ++offset);
-
- } else if ("--put".equals(args[offset])) {
- offset = put(args, ++offset);
-
- } else if ("--delete".equals(args[offset])) {
- offset = delete(args, ++offset);
-
- } else if ("--scan".equals(args[offset])) {
- offset = scan(args, ++offset);
-
- } else if ("--scanf".equals(args[offset])) {
- offset = scanf(args, ++offset);
-
- /* Bootstrap Commands */
- } else if ("--bootstrap".equals(args[offset])) {
- if ("dev".equals(mConfig.getDomain())) {
- offset = bootstrapDevTables(args, ++offset);
- } else {
- offset = bootstrapTables(args, ++offset);
- }
- offset = loadStrings(args, offset);
-
- } else if ("--loadStrings".equals(args[offset])) {
- offset = loadStrings(args, ++offset);
-
- } else if ("--destroy".equals(args[offset])) {
- offset = destroy(args, ++offset);
-
- } else if ("--addadmin".equals(args[offset])) {
- offset = addAdmin(args, ++offset);
-
- } else if ("--import".equals(args[offset])) {
- offset = importTable(args, ++offset);
-
- } else {
- throw new IllegalArgumentException("Unknown command " + args[offset]);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- System.exit(2);
- }
- }
-
- private static DynamoDatabase getDatabase() {
- if (mDatabase == null) {
- mDatabase = new DynamoDatabase(mConfig);
- }
-
- return mDatabase;
- }
-
- private static int create(String[] args, int offset) {
- String name = args[offset++];
- long reads = Long.parseLong(args[offset++]);
- long writes = Long.parseLong(args[offset++]);
-
- DynamoDatabase db = getDatabase();
-
- db.createTable(name, reads, writes);
-
- return offset;
- }
-
- private static int update(String[] args, int offset) {
- String name = args[offset++];
- long reads = Long.parseLong(args[offset++]);
- long writes = Long.parseLong(args[offset++]);
-
- DynamoDatabase db = getDatabase();
-
- db.updateTable(name, reads, writes);
-
- return offset;
- }
-
- private static int drop(String[] args, int offset) {
- String name = args[offset++];
-
- DynamoDatabase db = getDatabase();
-
- db.deleteTable(name);
-
- return offset;
- }
-
- private static int get(String[] args, int offset) {
- String table = args[offset++];
- String key = args[offset++];
- String attribute = args[offset++];
-
- DynamoDatabase db = getDatabase();
-
- String value = db.getAttribute(DynamoKey.newAttributeKey(table, key, attribute));
-
- if (value == null) {
- value = "<null>";
- }
-
- System.out.printf("%s %s:%s\n%s\n\n", table, key, attribute, value);
-
- return offset;
- }
-
- private static int put(String[] args, int offset) {
- String table = args[offset++];
- String key = args[offset++];
- String attribute = args[offset++];
- String value = args[offset++];
-
- DynamoDatabase db = getDatabase();
-
- db.putAttribute(DynamoKey.newAttributeKey(table, key, attribute), value);
-
- return offset;
- }
-
- private static int delete(String[] args, int offset) {
- String table = args[offset++];
- String key = args[offset++];
- String attribute = args[offset++];
-
- DynamoDatabase db = getDatabase();
-
- db.deleteAttribute(DynamoKey.newAttributeKey(table, key, attribute));
-
- System.out.printf("Deleted %s %s:%s\n\n", table, key, attribute);
-
- return offset;
- }
-
- private static int scan(String[] args, int offset) {
- String table = args[offset++];
-
- DynamoKey key = DynamoKey.newKey(table, null);
-
- doScan(key);
-
- return offset;
- }
-
- private static int scanf(String[] args, int offset) {
- String table = args[offset++];
- String attribute = args[offset++];
-
- DynamoKey key = DynamoKey.newAttributeKey(table, null, attribute);
-
- doScan(key);
-
- return offset;
- }
-
- private static void doScan(DynamoKey key) {
- DynamoDatabase db = getDatabase();
-
- String attributeFilter = key.getAttribute();
-
- while (key != null) {
- Map<DynamoKey, Map<String, String>> result = db.getAll(key);
-
- key = null; // If there are no results, exit
-
- for (Map.Entry<DynamoKey, Map<String, String>> entry : result.entrySet()) {
- key = entry.getKey(); // Save the last key
-
- for (Map.Entry<String, String> attribute : entry.getValue().entrySet()) {
- if (attributeFilter == null || attributeFilter.equals(attribute.getKey())) {
- String keyString = key.getHashKey();
- if (key.getRangeKey() != null) {
- keyString += "(" + key.getRangeKey() + ")";
- }
- System.out.printf("%s %s:%s\n%s\n\n",
- key.getTable(), keyString, attribute.getKey(),
- attribute.getValue());
- }
- }
- }
- }
- }
-
-
- private static int bootstrapTables(String[] args, int offset) {
- DynamoDatabase db = getDatabase();
-
- db.createTable("strings", 5, 1);
- db.createTable("accounts", 5, 1);
- db.createTable("assessments", 5, 5);
- db.createTable("training", 5, 5);
- db.createTable("feedthreads", 5, 1);
- db.createTable("feedmessages", 5, 1);
-
- return offset;
- }
-
- private static int bootstrapDevTables(String[] args, int offset) {
- DynamoDatabase db = getDatabase();
-
- db.createTable("strings", 1, 1);
- db.createTable("accounts", 1, 1);
- db.createTable("assessments", 1, 1);
- db.createTable("training", 1, 1);
- db.createTable("feedthreads", 1, 1);
- db.createTable("feedmessages", 1, 1);
-
- return offset;
- }
-
- private static int loadStrings(String[] args, int offset) throws IOException {
- String data = args[offset++];
- File baseDir = new File(data);
-
- DynamoDatabase db = getDatabase();
-
- insertQuestions(baseDir);
- insertVideos(baseDir);
- insertDefaultPlaylist(baseDir);
-
- return offset;
- }
-
- private static int destroy(String[] args, int offset) {
- DynamoDatabase db = getDatabase();
-
- final String[] tables = { "strings",
- "accounts",
- "assessments",
- "training",
- "feedthreads",
- "feedmessages"
- };
-
- for (String table : tables) {
- try {
- db.deleteTable(table);
- } catch (Exception e) {
- System.err.println("Deleting " + table + ": " + e.getMessage());
- }
- }
-
- return offset;
- }
-
- private static int addAdmin(String[] args, int offset) throws IOException {
- String user = args[offset++];
- String pass = args[offset++];
-
- DynamoDatabase db = getDatabase();
-
- UserRecord record = new UserRecord();
- record.setId(user);
- record.setBackendPassword(pass);
-
- Provider<DynamoKey, UserRecord> provider = new DynamoProviderImpl(db, UserRecord.class);
- provider.put(DynamoKey.newAttributeKey("accounts", user, "value"), record);
-
- return offset;
- }
-
- private static int importTable(String[] args, int offset) throws IOException {
- String table = args[offset++];
- String filename = args[offset++];
-
- DynamoDatabase db = getDatabase();
-
- List<String> lines = Files.readAllLines(new File(filename).toPath(),
- StandardCharsets.UTF_8);
-
- int count = 0;
-
- String key = null;
- Map<String, String> attributes = new HashMap<>();
- for (String line : lines) {
- if (line.length() == 0) {
- if (attributes.size() > 0) {
- db.putKey(DynamoKey.newKey(table, key), attributes);
- count++;
-
- if (count % 50 == 0) {
- System.out.printf("Imported %d records into %s...\n", count, table);
- }
- }
- key = null;
- attributes = new HashMap<>();
- continue;
- }
-
- if (key == null) {
- key = line;
- continue;
- }
-
- int space = line.indexOf(' ');
- String attribute = line.substring(0, space);
- String value = line.substring(space + 1);
-
- attributes.put(attribute, value);
- }
-
- // Finish up the remaining attributes.
- if (key != null && attributes.size() > 0) {
- db.putKey(DynamoKey.newKey(table, key), attributes);
- count++;
- }
-
- System.out.printf("Imported %d records into %s.\n", count, table);
-
- return offset;
- }
-
- private static void insertQuestions(File baseDir) throws IOException {
- DynamoDatabase db = getDatabase();
- File questions = new File(baseDir, "questions");
-
- File[] files = questions.listFiles(JSON_FILTER);
- Arrays.sort(files);
-
- for (File file : files) {
- String filename = file.getName();
- String questionId = filename.substring(0, filename.lastIndexOf('.'));
-
- byte[] encoded = Files.readAllBytes(file.toPath());
- String value = new String(encoded, StandardCharsets.UTF_8);
- db.putAttribute(DynamoKey.newAttributeKey("strings",
- "/questions/" + questionId, "value"), value);
- System.out.println("Inserted /questions/" + questionId);
- }
-
- String filename = files[0].getName();
- String first = filename.substring(0, filename.lastIndexOf('.'));
- int count = files.length;
- String summary = "{\"first\": \"" + first + "\", \"count\": " + count + "}";
- db.putAttribute(DynamoKey.newAttributeKey("strings", "/questions", "value"), summary);
- System.out.println("Inserted /questions");
- }
-
- private static void insertVideos(File baseDir) throws IOException {
- DynamoDatabase db = getDatabase();
- File videos = new File(baseDir, "videos");
-
- for (File topic : videos.listFiles()) {
- if (!topic.isDirectory()) {
- continue;
- }
-
- String topicName = topic.getName();
-
- Map<String, String> attributes = new HashMap<>();
- File[] files = topic.listFiles(JSON_FILTER);
- for (File file : files) {
- String filename = file.getName();
- String videoId = filename.substring(0, filename.lastIndexOf('.'));
-
- byte[] encoded = Files.readAllBytes(file.toPath());
- String value = new String(encoded, StandardCharsets.UTF_8);
-
- attributes.put(videoId, value);
- System.out.println("Found /training/" + topicName + ":" + videoId);
- }
-
- db.putKey(DynamoKey.newKey("strings",
- "/training/" + topicName), attributes);
- System.out.println("Inserted /training/" + topicName);
- }
- }
-
- private static void insertDefaultPlaylist(File baseDir) throws IOException {
- DynamoDatabase db = getDatabase();
- File file = new File(baseDir, "videos/playlist.json");
-
- byte[] encoded = Files.readAllBytes(file.toPath());
- String value = new String(encoded, StandardCharsets.UTF_8);
- db.putAttribute(DynamoKey.newAttributeKey("strings",
- "/training/defaultplaylist", "value"), value);
- System.out.println("Inserted /training/defaultplaylist");
- }
-
- private static class JsonFilter implements FilenameFilter {
- @Override
- public boolean accept(File dir, String name) {
- return name.endsWith(".json");
- }
- }
-}
diff --git a/src/com/p4square/grow/backend/dynamo/DynamoCollectionProviderImpl.java b/src/com/p4square/grow/backend/dynamo/DynamoCollectionProviderImpl.java
deleted file mode 100644
index b53e9f7..0000000
--- a/src/com/p4square/grow/backend/dynamo/DynamoCollectionProviderImpl.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2014 Jesse Morgan
- */
-
-package com.p4square.grow.backend.dynamo;
-
-import java.io.IOException;
-
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import com.p4square.grow.provider.CollectionProvider;
-import com.p4square.grow.provider.JsonEncodedProvider;
-
-/**
- *
- * @author Jesse Morgan <jesse@jesterpm.net>
- */
-public class DynamoCollectionProviderImpl<V> implements CollectionProvider<String, String, V> {
- private final DynamoDatabase mDb;
- private final String mTable;
- private final Class<V> mClazz;
-
- public DynamoCollectionProviderImpl(DynamoDatabase db, String table, Class<V> clazz) {
- mDb = db;
- mTable = table;
- mClazz = clazz;
- }
-
- @Override
- public V get(String collection, String key) throws IOException {
- String blob = mDb.getAttribute(DynamoKey.newAttributeKey(mTable, collection, key));
- return decode(blob);
- }
-
- @Override
- public Map<String, V> query(String collection) throws IOException {
- return query(collection, -1);
- }
-
- @Override
- public Map<String, V> query(String collection, int limit) throws IOException {
- Map<String, V> result = new LinkedHashMap<>();
-
- Map<String, String> row = mDb.getKey(DynamoKey.newKey(mTable, collection));
- if (row.size() > 0) {
- int count = 0;
- for (Map.Entry<String, String> c : row.entrySet()) {
- if (limit >= 0 && ++count > limit) {
- break; // Limit reached.
- }
-
- String key = c.getKey();
- String blob = c.getValue();
- V obj = decode(blob);
-
- result.put(key, obj);
- }
- }
-
- return Collections.unmodifiableMap(result);
- }
-
- @Override
- public void put(String collection, String key, V obj) throws IOException {
- if (obj == null) {
- mDb.deleteAttribute(DynamoKey.newAttributeKey(mTable, collection, key));
- } else {
- String blob = encode(obj);
- mDb.putAttribute(DynamoKey.newAttributeKey(mTable, collection, key), blob);
- }
- }
-
- /**
- * Encode the object as JSON.
- *
- * @param obj The object to encode.
- * @return The JSON encoding of obj.
- * @throws IOException if the object cannot be encoded.
- */
- protected String encode(V obj) throws IOException {
- if (mClazz == String.class) {
- return (String) obj;
- } else {
- return JsonEncodedProvider.MAPPER.writeValueAsString(obj);
- }
- }
-
- /**
- * Decode the JSON string as an object.
- *
- * @param blob The JSON data to decode.
- * @return The decoded object or null if blob is null.
- * @throws IOException If an object cannot be decoded.
- */
- protected V decode(String blob) throws IOException {
- if (blob == null) {
- return null;
- }
-
- if (mClazz == String.class) {
- return (V) blob;
- }
-
- V obj = JsonEncodedProvider.MAPPER.readValue(blob, mClazz);
- return obj;
- }
-}
diff --git a/src/com/p4square/grow/backend/dynamo/DynamoDatabase.java b/src/com/p4square/grow/backend/dynamo/DynamoDatabase.java
deleted file mode 100644
index 68a165d..0000000
--- a/src/com/p4square/grow/backend/dynamo/DynamoDatabase.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright 2014 Jesse Morgan
- */
-
-package com.p4square.grow.backend.dynamo;
-
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import com.amazonaws.auth.AWSCredentials;
-import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
-import com.amazonaws.regions.Region;
-import com.amazonaws.regions.Regions;
-import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
-import com.amazonaws.services.dynamodbv2.model.AttributeAction;
-import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
-import com.amazonaws.services.dynamodbv2.model.AttributeValue;
-import com.amazonaws.services.dynamodbv2.model.AttributeValueUpdate;
-import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
-import com.amazonaws.services.dynamodbv2.model.CreateTableResult;
-import com.amazonaws.services.dynamodbv2.model.DeleteItemRequest;
-import com.amazonaws.services.dynamodbv2.model.DeleteItemResult;
-import com.amazonaws.services.dynamodbv2.model.DeleteTableRequest;
-import com.amazonaws.services.dynamodbv2.model.DeleteTableResult;
-import com.amazonaws.services.dynamodbv2.model.GetItemRequest;
-import com.amazonaws.services.dynamodbv2.model.GetItemResult;
-import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
-import com.amazonaws.services.dynamodbv2.model.KeyType;
-import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
-import com.amazonaws.services.dynamodbv2.model.PutItemRequest;
-import com.amazonaws.services.dynamodbv2.model.PutItemResult;
-import com.amazonaws.services.dynamodbv2.model.ScanRequest;
-import com.amazonaws.services.dynamodbv2.model.ScanResult;
-import com.amazonaws.services.dynamodbv2.model.UpdateItemRequest;
-import com.amazonaws.services.dynamodbv2.model.UpdateItemResult;
-import com.amazonaws.services.dynamodbv2.model.UpdateTableRequest;
-import com.amazonaws.services.dynamodbv2.model.UpdateTableResult;
-
-import com.p4square.grow.config.Config;
-
-/**
- * A wrapper around the Dynamo API.
- */
-public class DynamoDatabase {
- private final AmazonDynamoDBClient mClient;
- private final String mTablePrefix;
-
- public DynamoDatabase(final Config config) {
- AWSCredentials creds;
-
- String awsAccessKey = config.getString("awsAccessKey");
- if (awsAccessKey != null) {
- creds = new AWSCredentials() {
- @Override
- public String getAWSAccessKeyId() {
- return config.getString("awsAccessKey");
- }
- @Override
- public String getAWSSecretKey() {
- return config.getString("awsSecretKey");
- }
- };
- } else {
- creds = new DefaultAWSCredentialsProviderChain().getCredentials();
- }
-
- mClient = new AmazonDynamoDBClient(creds);
-
- String endpoint = config.getString("dynamoEndpoint");
- if (endpoint != null) {
- mClient.setEndpoint(endpoint);
- }
-
- String region = config.getString("awsRegion");
- if (region != null) {
- mClient.setRegion(Region.getRegion(Regions.fromName(region)));
- }
-
- mTablePrefix = config.getString("dynamoTablePrefix", "");
- }
-
- public void createTable(String name, long reads, long writes) {
- ArrayList<AttributeDefinition> attributeDefinitions = new ArrayList<>();
- attributeDefinitions.add(new AttributeDefinition()
- .withAttributeName("id")
- .withAttributeType("S"));
-
- ArrayList<KeySchemaElement> ks = new ArrayList<>();
- ks.add(new KeySchemaElement().withAttributeName("id").withKeyType(KeyType.HASH));
-
- ProvisionedThroughput provisionedThroughput = new ProvisionedThroughput()
- .withReadCapacityUnits(reads)
- .withWriteCapacityUnits(writes);
-
- CreateTableRequest request = new CreateTableRequest()
- .withTableName(mTablePrefix + name)
- .withAttributeDefinitions(attributeDefinitions)
- .withKeySchema(ks)
- .withProvisionedThroughput(provisionedThroughput);
-
- CreateTableResult result = mClient.createTable(request);
- }
-
- public void updateTable(String name, long reads, long writes) {
- ProvisionedThroughput provisionedThroughput = new ProvisionedThroughput()
- .withReadCapacityUnits(reads)
- .withWriteCapacityUnits(writes);
-
- UpdateTableRequest request = new UpdateTableRequest()
- .withTableName(mTablePrefix + name)
- .withProvisionedThroughput(provisionedThroughput);
-
- UpdateTableResult result = mClient.updateTable(request);
- }
-
- public void deleteTable(String name) {
- DeleteTableRequest deleteTableRequest = new DeleteTableRequest()
- .withTableName(mTablePrefix + name);
-
- DeleteTableResult result = mClient.deleteTable(deleteTableRequest);
- }
-
- /**
- * Get all rows from a table.
- *
- * The key parameter must specify a table. If hash/range key is specified,
- * the scan will begin after that key.
- *
- * @param key Previous key to start with.
- * @return An ordered map of all results.
- */
- public Map<DynamoKey, Map<String, String>> getAll(final DynamoKey key) {
- ScanRequest scanRequest = new ScanRequest().withTableName(mTablePrefix + key.getTable());
-
- if (key.getHashKey() != null) {
- scanRequest.setExclusiveStartKey(generateKey(key));
- }
-
- ScanResult scanResult = mClient.scan(scanRequest);
-
- Map<DynamoKey, Map<String, String>> result = new LinkedHashMap<>();
- for (Map<String, AttributeValue> map : scanResult.getItems()) {
- String id = null;
- String range = null;
- Map<String, String> row = new LinkedHashMap<>();
- for (Map.Entry<String, AttributeValue> entry : map.entrySet()) {
- if ("id".equals(entry.getKey())) {
- id = entry.getValue().getS();
- } else if ("range".equals(entry.getKey())) {
- range = entry.getValue().getS();
- } else {
- row.put(entry.getKey(), entry.getValue().getS());
- }
- }
- result.put(DynamoKey.newRangeKey(key.getTable(), id, range), row);
- }
-
- return result;
- }
-
- public Map<String, String> getKey(final DynamoKey key) {
- GetItemRequest getItemRequest = new GetItemRequest()
- .withTableName(mTablePrefix + key.getTable())
- .withKey(generateKey(key));
-
- GetItemResult getItemResult = mClient.getItem(getItemRequest);
- Map<String, AttributeValue> map = getItemResult.getItem();
-
- Map<String, String> result = new LinkedHashMap<>();
- if (map != null) {
- for (Map.Entry<String, AttributeValue> entry : map.entrySet()) {
- if (!"id".equals(entry.getKey())) {
- result.put(entry.getKey(), entry.getValue().getS());
- }
- }
- }
-
- return result;
- }
-
- public String getAttribute(final DynamoKey key) {
- checkAttributeKey(key);
-
- GetItemRequest getItemRequest = new GetItemRequest()
- .withTableName(mTablePrefix + key.getTable())
- .withKey(generateKey(key))
- .withAttributesToGet(key.getAttribute());
-
- GetItemResult result = mClient.getItem(getItemRequest);
- Map<String, AttributeValue> map = result.getItem();
-
- if (map == null) {
- return null;
- }
-
- AttributeValue value = map.get(key.getAttribute());
- if (value != null) {
- return value.getS();
-
- } else {
- return null;
- }
- }
-
- /**
- * Set all attributes for the given key.
- *
- * @param key The key.
- * @param values Map of attributes to values.
- */
- public void putKey(final DynamoKey key, final Map<String, String> values) {
- Map<String, AttributeValue> item = new HashMap<>();
- for (Map.Entry<String, String> entry : values.entrySet()) {
- item.put(entry.getKey(), new AttributeValue().withS(entry.getValue()));
- }
-
- // Set the Key
- item.putAll(generateKey(key));
-
- PutItemRequest putItemRequest = new PutItemRequest()
- .withTableName(mTablePrefix + key.getTable())
- .withItem(item);
-
- PutItemResult result = mClient.putItem(putItemRequest);
- }
-
- /**
- * Set the particular attributes of the given key.
- *
- * @param key The key.
- * @param value The new value.
- */
- public void putAttribute(final DynamoKey key, final String value) {
- checkAttributeKey(key);
-
- Map<String, AttributeValueUpdate> updateItem = new HashMap<>();
- updateItem.put(key.getAttribute(),
- new AttributeValueUpdate()
- .withAction(AttributeAction.PUT)
- .withValue(new AttributeValue().withS(value)));
-
- UpdateItemRequest updateItemRequest = new UpdateItemRequest()
- .withTableName(mTablePrefix + key.getTable())
- .withKey(generateKey(key))
- .withAttributeUpdates(updateItem);
- // TODO: Check conditions.
-
- UpdateItemResult result = mClient.updateItem(updateItemRequest);
- }
-
- /**
- * Delete the given key.
- *
- * @param key The key.
- */
- public void deleteKey(final DynamoKey key) {
- DeleteItemRequest deleteItemRequest = new DeleteItemRequest()
- .withTableName(mTablePrefix + key.getTable())
- .withKey(generateKey(key));
-
- DeleteItemResult result = mClient.deleteItem(deleteItemRequest);
- }
-
- /**
- * Delete an attribute from the given key.
- *
- * @param key The key.
- */
- public void deleteAttribute(final DynamoKey key) {
- checkAttributeKey(key);
-
- Map<String, AttributeValueUpdate> updateItem = new HashMap<>();
- updateItem.put(key.getAttribute(),
- new AttributeValueUpdate().withAction(AttributeAction.DELETE));
-
- UpdateItemRequest updateItemRequest = new UpdateItemRequest()
- .withTableName(mTablePrefix + key.getTable())
- .withKey(generateKey(key))
- .withAttributeUpdates(updateItem);
-
- UpdateItemResult result = mClient.updateItem(updateItemRequest);
- }
-
- /**
- * Generate a DynamoDB Key Map from the DynamoKey.
- */
- private Map<String, AttributeValue> generateKey(final DynamoKey key) {
- HashMap<String, AttributeValue> keyMap = new HashMap<>();
- keyMap.put("id", new AttributeValue().withS(key.getHashKey()));
-
- String range = key.getRangeKey();
- if (range != null) {
- keyMap.put("range", new AttributeValue().withS(range));
- }
-
- return keyMap;
- }
-
- private void checkAttributeKey(DynamoKey key) {
- if (null == key.getAttribute()) {
- throw new IllegalArgumentException("Attribute must be non-null");
- }
- }
-}
diff --git a/src/com/p4square/grow/backend/dynamo/DynamoKey.java b/src/com/p4square/grow/backend/dynamo/DynamoKey.java
deleted file mode 100644
index 5cdbacd..0000000
--- a/src/com/p4square/grow/backend/dynamo/DynamoKey.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2014 Jesse Morgan
- */
-
-package com.p4square.grow.backend.dynamo;
-
-/**
- * DynamoKey represents a table, hash key, and range key tupl.
- */
-public class DynamoKey {
- private final String mTable;
- private final String mHashKey;
- private final String mRangeKey;
- private final String mAttribute;
-
- public static DynamoKey newKey(final String table, final String hashKey) {
- return new DynamoKey(table, hashKey, null, null);
- }
-
- public static DynamoKey newRangeKey(final String table, final String hashKey,
- final String rangeKey) {
-
- return new DynamoKey(table, hashKey, rangeKey, null);
- }
-
- public static DynamoKey newAttributeKey(final String table, final String hashKey,
- final String attribute) {
-
- return new DynamoKey(table, hashKey, null, attribute);
- }
-
- public DynamoKey(final String table, final String hashKey, final String rangeKey,
- final String attribute) {
-
- mTable = table;
- mHashKey = hashKey;
- mRangeKey = rangeKey;
- mAttribute = attribute;
- }
-
- public String getTable() {
- return mTable;
- }
-
- public String getHashKey() {
- return mHashKey;
- }
-
- public String getRangeKey() {
- return mRangeKey;
- }
-
- public String getAttribute() {
- return mAttribute;
- }
-}
diff --git a/src/com/p4square/grow/backend/dynamo/DynamoProviderImpl.java b/src/com/p4square/grow/backend/dynamo/DynamoProviderImpl.java
deleted file mode 100644
index 93a535f..0000000
--- a/src/com/p4square/grow/backend/dynamo/DynamoProviderImpl.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2013 Jesse Morgan
- */
-
-package com.p4square.grow.backend.dynamo;
-
-import java.io.IOException;
-
-import com.p4square.grow.provider.Provider;
-import com.p4square.grow.provider.JsonEncodedProvider;
-
-/**
- * Provider implementation backed by a DynamoDB Table.
- *
- * @author Jesse Morgan <jesse@jesterpm.net>
- */
-public class DynamoProviderImpl<V> extends JsonEncodedProvider<V> implements Provider<DynamoKey, V> {
- private final DynamoDatabase mDb;
-
- public DynamoProviderImpl(DynamoDatabase db, Class<V> clazz) {
- super(clazz);
-
- mDb = db;
- }
-
- @Override
- public V get(DynamoKey key) throws IOException {
- String blob = mDb.getAttribute(key);
- return decode(blob);
- }
-
- @Override
- public void put(DynamoKey key, V obj) throws IOException {
- String blob = encode(obj);
- mDb.putAttribute(key, blob);
- }
-}