summaryrefslogtreecommitdiff
path: root/src/com/p4square/grow/backend/resources/SurveyResultsResource.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/p4square/grow/backend/resources/SurveyResultsResource.java')
-rw-r--r--src/com/p4square/grow/backend/resources/SurveyResultsResource.java139
1 files changed, 31 insertions, 108 deletions
diff --git a/src/com/p4square/grow/backend/resources/SurveyResultsResource.java b/src/com/p4square/grow/backend/resources/SurveyResultsResource.java
index f0bb2aa..91d4d0f 100644
--- a/src/com/p4square/grow/backend/resources/SurveyResultsResource.java
+++ b/src/com/p4square/grow/backend/resources/SurveyResultsResource.java
@@ -14,16 +14,20 @@ import org.codehaus.jackson.map.ObjectMapper;
import org.restlet.data.MediaType;
import org.restlet.data.Status;
-import org.restlet.resource.ServerResource;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
+import org.restlet.resource.ServerResource;
import org.apache.log4j.Logger;
-import com.p4square.grow.model.Answer;
-import com.p4square.grow.model.Question;
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.provider.Provider;
+
/**
* Store the user's answers to the assessment and generate their score.
@@ -31,15 +35,16 @@ import com.p4square.grow.backend.db.CassandraDatabase;
* @author Jesse Morgan <jesse@jesterpm.net>
*/
public class SurveyResultsResource extends ServerResource {
- private final static Logger cLog = Logger.getLogger(SurveyResultsResource.class);
+ private static final Logger LOG = Logger.getLogger(SurveyResultsResource.class);
- private final static ObjectMapper MAPPER = new ObjectMapper();
+ private static final ObjectMapper MAPPER = new ObjectMapper();
static enum RequestType {
ASSESSMENT, ANSWER
}
private CassandraDatabase mDb;
+ private Provider<String, Question> mQuestionProvider;
private RequestType mRequestType;
private String mUserId;
@@ -51,6 +56,7 @@ public class SurveyResultsResource extends ServerResource {
final GrowBackend backend = (GrowBackend) getApplication();
mDb = backend.getDatabase();
+ mQuestionProvider = backend.getQuestionProvider();
mUserId = getAttribute("userId");
mQuestionId = getAttribute("questionId");
@@ -105,7 +111,7 @@ public class SurveyResultsResource extends ServerResource {
success = true;
} catch (Exception e) {
- cLog.warn("Caught exception putting answer: " + e.getMessage(), e);
+ LOG.warn("Caught exception putting answer: " + e.getMessage(), e);
}
break;
@@ -146,18 +152,30 @@ public class SurveyResultsResource extends ServerResource {
continue;
}
- final String questionId = c.getName();
- final String answerId = c.getStringValue();
- if (!scoringDone) {
- scoringDone = !scoreQuestion(score, questionId, answerId);
+ try {
+ Question question = mQuestionProvider.get(c.getName());
+ RecordedAnswer userAnswer = MAPPER.readValue(c.getStringValue(), RecordedAnswer.class);
+
+ if (question == null) {
+ LOG.warn("Answer for unknown question: " + c.getName());
+ continue;
+ }
+
+ LOG.error("Scoring questionId: " + c.getName());
+ scoringDone = !question.scoreAnswer(score, userAnswer);
+
+ } catch (Exception e) {
+ LOG.error("Failed to score question: {userid: \"" + mUserId +
+ "\", questionid:\"" + c.getName() +
+ "\", userAnswer:\"" + c.getStringValue() + "\"}", e);
}
totalAnswers++;
}
- sb.append(", \"score\":" + score.sum / score.count);
- sb.append(", \"sum\":" + score.sum);
- sb.append(", \"count\":" + score.count);
+ sb.append(", \"score\":" + score.getScore());
+ sb.append(", \"sum\":" + score.getSum());
+ sb.append(", \"count\":" + score.getCount());
sb.append(", \"totalAnswers\":" + totalAnswers);
sb.append(", \"result\":\"" + score.toString() + "\"");
}
@@ -170,99 +188,4 @@ public class SurveyResultsResource extends ServerResource {
return summary;
}
-
- private boolean scoreQuestion(final Score score, final String questionId,
- final String answerJson) {
-
- final String data = mDb.getKey("strings", "/questions/" + questionId);
-
- try {
- final Map<?,?> questionMap = MAPPER.readValue(data, Map.class);
- final Map<?,?> answerMap = MAPPER.readValue(answerJson, Map.class);
- final Question question = new Question((Map<String, Object>) questionMap);
- final String answerId = (String) answerMap.get("answerId");
-
- switch (question.getType()) {
- case TEXT:
- case IMAGE:
- final Answer answer = question.getAnswers().get(answerId);
- if (answer == null) {
- cLog.warn("Got unknown answer " + answerId
- + " for question " + questionId);
- } else {
- if (!scoreAnswer(score, answer)) {
- return false; // Quit scoring
- }
- }
- break;
-
- case SLIDER:
- score.sum += Double.valueOf(answerId) * 4 + 1;
- score.count++;
- break;
-
- case CIRCLE:
- case QUAD:
- scoreQuad(score, question, answerId);
- break;
- }
-
- } catch (Exception e) {
- cLog.error("Exception parsing question id " + questionId, e);
- }
-
- return true;
- }
-
- private boolean scoreAnswer(final Score score, final Answer answer) {
- switch (answer.getType()) {
- case TRUMP:
- score.sum = answer.getScoreFactor();
- score.count = 1;
- return false; // Quit scoring.
-
- case AVERAGE:
- score.sum += answer.getScoreFactor();
- score.count++;
- break;
-
- case NONE:
- break;
- }
-
- return true; // Continue scoring
- }
-
- private boolean scoreQuad(final Score score, final Question question,
- final String answerId) {
-
- Point[] answers = new Point[question.getAnswers().size()];
- {
- int i = 0;
- for (String answer : question.getAnswers().keySet()) {
- answers[i++] = Point.valueOf(answer);
- }
- }
-
- Point userAnswer = Point.valueOf(answerId);
-
- double minDistance = Double.MAX_VALUE;
- int answerIndex = 0;
- for (int i = 0; i < answers.length; i++) {
- final double distance = userAnswer.distance(answers[i]);
- if (distance < minDistance) {
- minDistance = distance;
- answerIndex = i;
- }
- }
-
- cLog.debug("Quad " + question.getId() + ": Got answer "
- + answers[answerIndex].toString() + " for user point " + answerId);
-
- final Answer answer = question.getAnswers().get(answers[answerIndex].toString());
- score.sum += answer.getScoreFactor();
- score.count++;
-
- return true; // Continue scoring
- }
}