diff options
author | Jesse Morgan <jesse@jesterpm.net> | 2014-05-23 13:05:19 -0700 |
---|---|---|
committer | Jesse Morgan <jesse@jesterpm.net> | 2014-05-23 13:05:19 -0700 |
commit | 255b10334bcf190cf56c0d57791e39d5e808497b (patch) | |
tree | 403b64d7eea8f0809854bdacabd39efeabd6e89a /src/com/p4square/grow/backend/resources | |
parent | 7b5467b0356f06fdc8c3c548bf71b5fe72668245 (diff) |
Abstracting out Cassandra.
Diffstat (limited to 'src/com/p4square/grow/backend/resources')
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); } } |