/* * Copyright 2014 Jesse Morgan */ package com.p4square.grow.backend; import java.io.IOException; import com.amazonaws.auth.AWSCredentials; import com.p4square.grow.backend.dynamo.DynamoDatabase; import com.p4square.grow.backend.dynamo.DynamoKey; import com.p4square.grow.backend.dynamo.DynamoProviderImpl; import com.p4square.grow.backend.dynamo.DynamoCollectionProviderImpl; import com.p4square.grow.config.Config; import com.p4square.grow.model.Message; import com.p4square.grow.model.MessageThread; import com.p4square.grow.model.Playlist; import com.p4square.grow.model.Question; import com.p4square.grow.model.TrainingRecord; import com.p4square.grow.model.UserRecord; import com.p4square.grow.provider.CollectionProvider; import com.p4square.grow.provider.DelegateCollectionProvider; import com.p4square.grow.provider.DelegateProvider; import com.p4square.grow.provider.Provider; import com.p4square.grow.provider.JsonEncodedProvider; /** * * @author Jesse Morgan */ class DynamoGrowData implements GrowData { private static final String DEFAULT_COLUMN = "value"; private static final String DEFAULT_PLAYLIST_KEY = "/training/defaultplaylist"; private final Config mConfig; private final DynamoDatabase mDatabase; private final Provider mUserRecordProvider; private final Provider mQuestionProvider; private final Provider mTrainingRecordProvider; private final CollectionProvider mVideoProvider; private final CollectionProvider mFeedThreadProvider; private final CollectionProvider mFeedMessageProvider; private final Provider mStringProvider; private final CollectionProvider mAnswerProvider; public DynamoGrowData(final Config config) { mConfig = config; AWSCredentials creds = new AWSCredentials() { @Override public String getAWSAccessKeyId() { return config.getString("awsAccessKey"); } @Override public String getAWSSecretKey() { return config.getString("awsSecretKey"); } }; String endpoint = config.getString("dynamoEndpoint"); if (endpoint != null) { mDatabase = new DynamoDatabase(creds, endpoint); } else { mDatabase = new DynamoDatabase(creds); } mUserRecordProvider = new DelegateProvider( new DynamoProviderImpl(mDatabase, UserRecord.class)) { @Override public DynamoKey makeKey(String userid) { return DynamoKey.newAttributeKey("accounts", userid, DEFAULT_COLUMN); } }; mQuestionProvider = new DelegateProvider( new DynamoProviderImpl(mDatabase, Question.class)) { @Override public DynamoKey makeKey(String questionId) { return DynamoKey.newAttributeKey("strings", "/questions/" + questionId, DEFAULT_COLUMN); } }; mFeedThreadProvider = new DynamoCollectionProviderImpl( mDatabase, "feedthreads", MessageThread.class); mFeedMessageProvider = new DynamoCollectionProviderImpl( mDatabase, "feedmessages", Message.class); mTrainingRecordProvider = new DelegateProvider( new DynamoProviderImpl(mDatabase, TrainingRecord.class)) { @Override public DynamoKey makeKey(String userId) { return DynamoKey.newAttributeKey("training", userId, DEFAULT_COLUMN); } }; mVideoProvider = new DelegateCollectionProvider( new DynamoCollectionProviderImpl(mDatabase, "strings", String.class)) { @Override public String makeCollectionKey(String key) { return "/training/" + key; } @Override public String makeKey(String key) { return key; } @Override public String unmakeKey(String key) { return key; } }; mStringProvider = new DelegateProvider( new DynamoProviderImpl(mDatabase, String.class)) { @Override public DynamoKey makeKey(String id) { return DynamoKey.newAttributeKey("strings", id, DEFAULT_COLUMN); } }; mAnswerProvider = new DynamoCollectionProviderImpl( mDatabase, "assessments", String.class); } @Override public void start() throws Exception { } @Override public void stop() throws Exception { } @Override public Provider getUserRecordProvider() { return mUserRecordProvider; } @Override public Provider getQuestionProvider() { return mQuestionProvider; } @Override public Provider getTrainingRecordProvider() { return mTrainingRecordProvider; } @Override public CollectionProvider getVideoProvider() { return mVideoProvider; } @Override public Playlist getDefaultPlaylist() throws IOException { String blob = mStringProvider.get(DEFAULT_PLAYLIST_KEY); if (blob == null) { return null; } return JsonEncodedProvider.MAPPER.readValue(blob, Playlist.class); } @Override public CollectionProvider getThreadProvider() { return mFeedThreadProvider; } @Override public CollectionProvider getMessageProvider() { return mFeedMessageProvider; } @Override public Provider getStringProvider() { return mStringProvider; } @Override public CollectionProvider getAnswerProvider() { return mAnswerProvider; } }