summaryrefslogtreecommitdiff
path: root/src/com/p4square/grow/backend/resources
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2014-05-23 13:05:19 -0700
committerJesse Morgan <jesse@jesterpm.net>2014-05-23 13:05:19 -0700
commit255b10334bcf190cf56c0d57791e39d5e808497b (patch)
tree403b64d7eea8f0809854bdacabd39efeabd6e89a /src/com/p4square/grow/backend/resources
parent7b5467b0356f06fdc8c3c548bf71b5fe72668245 (diff)
Abstracting out Cassandra.
Diffstat (limited to 'src/com/p4square/grow/backend/resources')
-rw-r--r--src/com/p4square/grow/backend/resources/BannerResource.java16
-rw-r--r--src/com/p4square/grow/backend/resources/SurveyResource.java31
-rw-r--r--src/com/p4square/grow/backend/resources/SurveyResultsResource.java96
-rw-r--r--src/com/p4square/grow/backend/resources/TrainingRecordResource.java14
-rw-r--r--src/com/p4square/grow/backend/resources/TrainingResource.java69
5 files changed, 130 insertions, 96 deletions
diff --git a/src/com/p4square/grow/backend/resources/BannerResource.java b/src/com/p4square/grow/backend/resources/BannerResource.java
index 8519f64..2b9c8e6 100644
--- a/src/com/p4square/grow/backend/resources/BannerResource.java
+++ b/src/com/p4square/grow/backend/resources/BannerResource.java
@@ -17,9 +17,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.log4j.Logger;
import com.p4square.grow.backend.GrowBackend;
-import com.p4square.grow.backend.db.CassandraDatabase;
import com.p4square.grow.model.Banner;
import com.p4square.grow.provider.JsonEncodedProvider;
+import com.p4square.grow.provider.Provider;
/**
* Fetches or sets the banner string.
@@ -31,14 +31,14 @@ public class BannerResource extends ServerResource {
public static final ObjectMapper MAPPER = JsonEncodedProvider.MAPPER;
- private CassandraDatabase mDb;
+ private Provider<String, String> mStringProvider;
@Override
public void doInit() {
super.doInit();
final GrowBackend backend = (GrowBackend) getApplication();
- mDb = backend.getDatabase();
+ mStringProvider = backend.getStringProvider();
}
/**
@@ -46,7 +46,13 @@ public class BannerResource extends ServerResource {
*/
@Override
protected Representation get() {
- String result = mDb.getKey("strings", "banner");
+ String result = null;
+ try {
+ result = mStringProvider.get("banner");
+
+ } catch (IOException e) {
+ LOG.warn("Exception loading banner: " + e);
+ }
if (result == null || result.length() == 0) {
result = "{\"html\":null}";
@@ -67,7 +73,7 @@ public class BannerResource extends ServerResource {
Banner banner = representation.getObject();
- mDb.putKey("strings", "banner", MAPPER.writeValueAsString(banner));
+ mStringProvider.put("banner", MAPPER.writeValueAsString(banner));
setStatus(Status.SUCCESS_NO_CONTENT);
} catch (IOException e) {
diff --git a/src/com/p4square/grow/backend/resources/SurveyResource.java b/src/com/p4square/grow/backend/resources/SurveyResource.java
index 497978f..8723ee2 100644
--- a/src/com/p4square/grow/backend/resources/SurveyResource.java
+++ b/src/com/p4square/grow/backend/resources/SurveyResource.java
@@ -13,14 +13,17 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.restlet.data.MediaType;
import org.restlet.data.Status;
-import org.restlet.resource.ServerResource;
+import org.restlet.ext.jackson.JacksonRepresentation;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
+import org.restlet.resource.ServerResource;
import org.apache.log4j.Logger;
import com.p4square.grow.backend.GrowBackend;
-import com.p4square.grow.backend.db.CassandraDatabase;
+import com.p4square.grow.model.Question;
+import com.p4square.grow.provider.JsonEncodedProvider;
+import com.p4square.grow.provider.Provider;
/**
* This resource manages assessment questions.
@@ -30,9 +33,10 @@ import com.p4square.grow.backend.db.CassandraDatabase;
public class SurveyResource extends ServerResource {
private static final Logger LOG = Logger.getLogger(SurveyResource.class);
- private static final ObjectMapper MAPPER = new ObjectMapper();
+ private static final ObjectMapper MAPPER = JsonEncodedProvider.MAPPER;
- private CassandraDatabase mDb;
+ private Provider<String, Question> mQuestionProvider;
+ private Provider<String, String> mStringProvider;
private String mQuestionId;
@@ -41,7 +45,8 @@ public class SurveyResource extends ServerResource {
super.doInit();
final GrowBackend backend = (GrowBackend) getApplication();
- mDb = backend.getDatabase();
+ mQuestionProvider = backend.getQuestionProvider();
+ mStringProvider = backend.getStringProvider();
mQuestionId = getAttribute("questionId");
}
@@ -71,13 +76,22 @@ public class SurveyResource extends ServerResource {
if (mQuestionId != null) {
// Get a question by id
- result = mDb.getKey("strings", "/questions/" + mQuestionId);
+ Question question = null;
+ try {
+ question = mQuestionProvider.get(mQuestionId);
+ } catch (IOException e) {
+ LOG.error("IOException loading question: " + e);
+ }
- if (result == null) {
+ if (question == null) {
// 404
setStatus(Status.CLIENT_ERROR_NOT_FOUND);
return null;
}
+
+ JacksonRepresentation<Question> rep = new JacksonRepresentation<>(question);
+ rep.setObjectMapper(MAPPER);
+ return rep;
}
return new StringRepresentation(result);
@@ -85,7 +99,8 @@ public class SurveyResource extends ServerResource {
private Map<?, ?> getQuestionsSummary() {
try {
- String json = mDb.getKey("strings", "/questions");
+ // TODO: This could be better. Quick fix for provider support.
+ String json = mStringProvider.get("/questions");
if (json != null) {
return MAPPER.readValue(json, Map.class);
diff --git a/src/com/p4square/grow/backend/resources/SurveyResultsResource.java b/src/com/p4square/grow/backend/resources/SurveyResultsResource.java
index 404ccec..7c15cfd 100644
--- a/src/com/p4square/grow/backend/resources/SurveyResultsResource.java
+++ b/src/com/p4square/grow/backend/resources/SurveyResultsResource.java
@@ -4,12 +4,10 @@
package com.p4square.grow.backend.resources;
+import java.io.IOException;
import java.util.Map;
import java.util.HashMap;
-import com.netflix.astyanax.model.Column;
-import com.netflix.astyanax.model.ColumnList;
-
import com.fasterxml.jackson.databind.ObjectMapper;
import org.restlet.data.MediaType;
@@ -21,12 +19,12 @@ import org.restlet.resource.ServerResource;
import org.apache.log4j.Logger;
import com.p4square.grow.backend.GrowBackend;
-import com.p4square.grow.backend.db.CassandraDatabase;
import com.p4square.grow.model.Answer;
import com.p4square.grow.model.Question;
import com.p4square.grow.model.RecordedAnswer;
import com.p4square.grow.model.Score;
import com.p4square.grow.model.UserRecord;
+import com.p4square.grow.provider.CollectionProvider;
import com.p4square.grow.provider.Provider;
@@ -44,7 +42,7 @@ public class SurveyResultsResource extends ServerResource {
ASSESSMENT, ANSWER
}
- private CassandraDatabase mDb;
+ private CollectionProvider<String, String, String> mAnswerProvider;
private Provider<String, Question> mQuestionProvider;
private Provider<String, UserRecord> mUserRecordProvider;
@@ -57,7 +55,7 @@ public class SurveyResultsResource extends ServerResource {
super.doInit();
final GrowBackend backend = (GrowBackend) getApplication();
- mDb = backend.getDatabase();
+ mAnswerProvider = backend.getAnswerProvider();
mQuestionProvider = backend.getQuestionProvider();
mUserRecordProvider = backend.getUserRecordProvider();
@@ -75,27 +73,33 @@ public class SurveyResultsResource extends ServerResource {
*/
@Override
protected Representation get() {
- String result = null;
-
- switch (mRequestType) {
- case ANSWER:
- result = mDb.getKey("assessments", mUserId, mQuestionId);
- break;
+ try {
+ String result = null;
+
+ switch (mRequestType) {
+ case ANSWER:
+ result = mAnswerProvider.get(mUserId, mQuestionId);
+ break;
+
+ case ASSESSMENT:
+ result = mAnswerProvider.get(mUserId, "summary");
+ if (result == null || result.length() == 0) {
+ result = buildAssessment();
+ }
+ break;
+ }
- case ASSESSMENT:
- result = mDb.getKey("assessments", mUserId, "summary");
- if (result == null) {
- result = buildAssessment();
- }
- break;
- }
+ if (result == null) {
+ setStatus(Status.CLIENT_ERROR_NOT_FOUND);
+ return null;
+ }
- if (result == null) {
- setStatus(Status.CLIENT_ERROR_NOT_FOUND);
+ return new StringRepresentation(result);
+ } catch (IOException e) {
+ LOG.error("IOException getting answer: ", e);
+ setStatus(Status.SERVER_ERROR_INTERNAL);
return null;
}
-
- return new StringRepresentation(result);
}
/**
@@ -108,9 +112,9 @@ public class SurveyResultsResource extends ServerResource {
switch (mRequestType) {
case ANSWER:
try {
- mDb.putKey("assessments", mUserId, mQuestionId, entity.getText());
- mDb.putKey("assessments", mUserId, "lastAnswered", mQuestionId);
- mDb.deleteKey("assessments", mUserId, "summary");
+ mAnswerProvider.put(mUserId, mQuestionId, entity.getText());
+ mAnswerProvider.put(mUserId, "lastAnswered", mQuestionId);
+ mAnswerProvider.put(mUserId, "summary", null);
success = true;
} catch (Exception e) {
@@ -143,8 +147,8 @@ public class SurveyResultsResource extends ServerResource {
switch (mRequestType) {
case ANSWER:
try {
- mDb.deleteKey("assessments", mUserId, mQuestionId);
- mDb.deleteKey("assessments", mUserId, "summary");
+ mAnswerProvider.put(mUserId, mQuestionId, null);
+ mAnswerProvider.put(mUserId, "summary", null);
success = true;
} catch (Exception e) {
@@ -154,7 +158,9 @@ public class SurveyResultsResource extends ServerResource {
case ASSESSMENT:
try {
- mDb.deleteRow("assessments", mUserId);
+ mAnswerProvider.put(mUserId, "summary", null);
+ mAnswerProvider.put(mUserId, "lastAnswered", null);
+ // TODO Delete answers
UserRecord record = mUserRecordProvider.get(mUserId);
if (record != null) {
@@ -188,48 +194,48 @@ public class SurveyResultsResource extends ServerResource {
/**
* This method compiles assessment results.
*/
- private String buildAssessment() {
+ private String buildAssessment() throws IOException {
StringBuilder sb = new StringBuilder("{ ");
// Last question answered
- final String lastAnswered = mDb.getKey("assessments", mUserId, "lastAnswered");
- if (lastAnswered != null) {
- sb.append("\"lastAnswered\": \"" + lastAnswered + "\"");
+ final String lastAnswered = mAnswerProvider.get(mUserId, "lastAnswered");
+ if (lastAnswered != null && lastAnswered.length() > 0) {
+ sb.append("\"lastAnswered\": \"" + lastAnswered + "\", ");
}
// Compute score
- ColumnList<String> row = mDb.getRow("assessments", mUserId);
- if (!row.isEmpty()) {
+ Map<String, String> row = mAnswerProvider.query(mUserId);
+ if (row.size() > 0) {
Score score = new Score();
boolean scoringDone = false;
int totalAnswers = 0;
- for (Column<String> c : row) {
- if (c.getName().equals("lastAnswered") || c.getName().equals("summary")) {
+ for (Map.Entry<String, String> c : row.entrySet()) {
+ if (c.getKey().equals("lastAnswered") || c.getKey().equals("summary")) {
continue;
}
try {
- Question question = mQuestionProvider.get(c.getName());
- RecordedAnswer userAnswer = MAPPER.readValue(c.getStringValue(), RecordedAnswer.class);
+ Question question = mQuestionProvider.get(c.getKey());
+ RecordedAnswer userAnswer = MAPPER.readValue(c.getValue(), RecordedAnswer.class);
if (question == null) {
- LOG.warn("Answer for unknown question: " + c.getName());
+ LOG.warn("Answer for unknown question: " + c.getKey());
continue;
}
- LOG.debug("Scoring questionId: " + c.getName());
+ LOG.debug("Scoring questionId: " + c.getKey());
scoringDone = !question.scoreAnswer(score, userAnswer);
} catch (Exception e) {
LOG.error("Failed to score question: {userid: \"" + mUserId +
- "\", questionid:\"" + c.getName() +
- "\", userAnswer:\"" + c.getStringValue() + "\"}", e);
+ "\", questionid:\"" + c.getKey() +
+ "\", userAnswer:\"" + c.getValue() + "\"}", e);
}
totalAnswers++;
}
- sb.append(", \"score\":" + score.getScore());
+ sb.append("\"score\":" + score.getScore());
sb.append(", \"sum\":" + score.getSum());
sb.append(", \"count\":" + score.getCount());
sb.append(", \"totalAnswers\":" + totalAnswers);
@@ -240,7 +246,7 @@ public class SurveyResultsResource extends ServerResource {
String summary = sb.toString();
// Persist summary
- mDb.putKey("assessments", mUserId, "summary", summary);
+ mAnswerProvider.put(mUserId, "summary", summary);
return summary;
}
diff --git a/src/com/p4square/grow/backend/resources/TrainingRecordResource.java b/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
index 3d9d67f..b316b75 100644
--- a/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
+++ b/src/com/p4square/grow/backend/resources/TrainingRecordResource.java
@@ -11,9 +11,6 @@ import java.util.List;
import java.util.Map;
import java.util.HashMap;
-import com.netflix.astyanax.model.Column;
-import com.netflix.astyanax.model.ColumnList;
-
import com.fasterxml.jackson.databind.ObjectMapper;
import org.restlet.data.MediaType;
@@ -27,16 +24,17 @@ import org.restlet.ext.jackson.JacksonRepresentation;
import org.apache.log4j.Logger;
import com.p4square.grow.backend.GrowBackend;
-import com.p4square.grow.backend.db.CassandraDatabase;
import com.p4square.grow.model.Chapter;
import com.p4square.grow.model.Playlist;
import com.p4square.grow.model.VideoRecord;
import com.p4square.grow.model.TrainingRecord;
+import com.p4square.grow.provider.CollectionProvider;
+import com.p4square.grow.provider.JsonEncodedProvider;
import com.p4square.grow.provider.Provider;
+import com.p4square.grow.provider.ProvidesAssessments;
import com.p4square.grow.provider.ProvidesTrainingRecords;
-import com.p4square.grow.provider.JsonEncodedProvider;
import com.p4square.grow.model.Score;
@@ -52,8 +50,8 @@ public class TrainingRecordResource extends ServerResource {
SUMMARY, VIDEO
}
- private CassandraDatabase mDb;
private Provider<String, TrainingRecord> mTrainingRecordProvider;
+ private CollectionProvider<String, String, String> mAnswerProvider;
private RequestType mRequestType;
private String mUserId;
@@ -64,8 +62,8 @@ public class TrainingRecordResource extends ServerResource {
public void doInit() {
super.doInit();
- mDb = ((GrowBackend) getApplication()).getDatabase();
mTrainingRecordProvider = ((ProvidesTrainingRecords) getApplication()).getTrainingRecordProvider();
+ mAnswerProvider = ((ProvidesAssessments) getApplication()).getAnswerProvider();
mUserId = getAttribute("userId");
mVideoId = getAttribute("videoId");
@@ -184,7 +182,7 @@ public class TrainingRecordResource extends ServerResource {
double assessedScore = 0;
try {
- String summaryString = mDb.getKey("assessments", userId, "summary");
+ String summaryString = mAnswerProvider.get(userId, "summary");
if (summaryString == null) {
LOG.warn("Asked to create training record for unassessed user " + userId);
return;
diff --git a/src/com/p4square/grow/backend/resources/TrainingResource.java b/src/com/p4square/grow/backend/resources/TrainingResource.java
index 85d08c1..6efdfab 100644
--- a/src/com/p4square/grow/backend/resources/TrainingResource.java
+++ b/src/com/p4square/grow/backend/resources/TrainingResource.java
@@ -4,8 +4,8 @@
package com.p4square.grow.backend.resources;
-import com.netflix.astyanax.model.Column;
-import com.netflix.astyanax.model.ColumnList;
+import java.io.IOException;
+import java.util.Map;
import org.restlet.data.Status;
import org.restlet.resource.ServerResource;
@@ -17,16 +17,16 @@ import org.apache.log4j.Logger;
import com.p4square.grow.backend.GrowBackend;
import com.p4square.grow.backend.db.CassandraDatabase;
+import com.p4square.grow.provider.CollectionProvider;
/**
* This resource returns a listing of training items for a particular level.
*
* @author Jesse Morgan <jesse@jesterpm.net>
*/
public class TrainingResource extends ServerResource {
- private final static Logger cLog = Logger.getLogger(TrainingResource.class);
+ private final static Logger LOG = Logger.getLogger(TrainingResource.class);
- private GrowBackend mBackend;
- private CassandraDatabase mDb;
+ private CollectionProvider<String, String, String> mVideoProvider;
private String mLevel;
private String mVideoId;
@@ -35,8 +35,8 @@ public class TrainingResource extends ServerResource {
public void doInit() {
super.doInit();
- mBackend = (GrowBackend) getApplication();
- mDb = mBackend.getDatabase();
+ GrowBackend backend = (GrowBackend) getApplication();
+ mVideoProvider = backend.getVideoProvider();
mLevel = getAttribute("level");
mVideoId = getAttribute("videoId");
@@ -54,35 +54,44 @@ public class TrainingResource extends ServerResource {
return null;
}
- if (mVideoId == null) {
- // Get all videos
- ColumnList<String> row = mDb.getRow("strings", "/training/" + mLevel);
- if (!row.isEmpty()) {
- StringBuilder sb = new StringBuilder("{ \"level\": \"" + mLevel + "\"");
- sb.append(", \"videos\": [");
- boolean first = true;
- for (Column<String> c : row) {
- if (!first) {
- sb.append(", ");
+ try {
+ if (mVideoId == null) {
+ // Get all videos
+ // TODO: This could be improved, but this is the quickest way to get
+ // providers working.
+ Map<String, String> videos = mVideoProvider.query(mLevel);
+ if (videos.size() > 0) {
+ StringBuilder sb = new StringBuilder("{ \"level\": \"" + mLevel + "\"");
+ sb.append(", \"videos\": [");
+ boolean first = true;
+ for (String value : videos.values()) {
+ if (!first) {
+ sb.append(", ");
+ }
+ sb.append(value);
+ first = false;
}
- sb.append(c.getStringValue());
- first = false;
+ sb.append("] }");
+ result = sb.toString();
}
- sb.append("] }");
- result = sb.toString();
+
+ } else {
+ // Get single video
+ result = mVideoProvider.get(mLevel, mVideoId);
}
- } else {
- // Get single video
- result = mDb.getKey("strings", "/training/" + mLevel, mVideoId);
- }
+ if (result == null) {
+ // 404
+ setStatus(Status.CLIENT_ERROR_NOT_FOUND);
+ return null;
+ }
- if (result == null) {
- // 404
- setStatus(Status.CLIENT_ERROR_NOT_FOUND);
+ return new StringRepresentation(result);
+
+ } catch (IOException e) {
+ LOG.error("IOException fetch video: " + e.getMessage(), e);
+ setStatus(Status.SERVER_ERROR_INTERNAL);
return null;
}
-
- return new StringRepresentation(result);
}
}