diff options
author | Jesse Morgan <jesse@jesterpm.net> | 2016-04-09 14:22:20 -0700 |
---|---|---|
committer | Jesse Morgan <jesse@jesterpm.net> | 2016-04-09 15:48:01 -0700 |
commit | 3102d8bce3426d9cf41aeaf201c360d342677770 (patch) | |
tree | 38c4f1e8828f9af9c4b77a173bee0d312b321698 /src/com/p4square/grow/model | |
parent | bbf907e51dfcf157bdee24dead1d531122aa25db (diff) |
Switching from Ivy+Ant to Maven.
Diffstat (limited to 'src/com/p4square/grow/model')
22 files changed, 0 insertions, 1729 deletions
diff --git a/src/com/p4square/grow/model/Answer.java b/src/com/p4square/grow/model/Answer.java deleted file mode 100644 index a818365..0000000 --- a/src/com/p4square/grow/model/Answer.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -import org.apache.log4j.Logger; - -/** - * This is the model of an assessment question's answer. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class Answer { - private static final Logger LOG = Logger.getLogger(Answer.class); - - /** - * ScoreType determines how the answer will be scored. - * - */ - public static enum ScoreType { - /** - * This question has no effect on the score. - */ - NONE, - - /** - * The score of this question is part of the average. - */ - AVERAGE, - - /** - * The score of this question is the total score, no other questions - * matter after this point. - */ - TRUMP; - - @Override - public String toString() { - return name().toLowerCase(); - } - } - - private String mAnswerText; - private ScoreType mType; - private float mScoreFactor; - private String mNextQuestionId; - - public Answer() { - mType = ScoreType.AVERAGE; - } - - /** - * @return The text associated with the answer. - */ - public String getText() { - return mAnswerText; - } - - /** - * Set the text associated with the answer. - * @param text The new text. - */ - public void setText(String text) { - mAnswerText = text; - } - - /** - * @return the ScoreType for the Answer. - */ - public ScoreType getType() { - return mType; - } - - /** - * Set the ScoreType for the answer. - * @param type The new ScoreType. - */ - public void setType(ScoreType type) { - mType = type; - } - - /** - * @return the delta of the score if this answer is selected. - */ - public float getScore() { - if (mType == ScoreType.NONE) { - return 0; - } - - return mScoreFactor; - } - - /** - * Set the score delta for this answer. - * @param score The new delta. - */ - public void setScore(float score) { - mScoreFactor = score; - } - - /** - * @return the id of the next question if this answer is selected, or null - * if selecting this answer has no effect. - */ - public String getNextQuestion() { - return mNextQuestionId; - } - - /** - * Set the id of the next question when this answer is selected. - * @param id The next question id or null to proceed as usual. - */ - public void setNextQuestion(String id) { - mNextQuestionId = id; - } - - /** - * Adjust the running score for the selection of this answer. - * @param score The running score to adjust. - * @return true if scoring should continue, false if this answer trumps all. - */ - public boolean score(final Score score) { - switch (getType()) { - case TRUMP: - score.sum = getScore(); - score.count = 1; - return false; // Quit scoring. - - case AVERAGE: - LOG.debug("ScoreType.AVERAGE: { delta: \"" + getScore() + "\" }"); - score.sum += getScore(); - score.count++; - break; - - case NONE: - break; - } - - return true; // Continue scoring - } -} diff --git a/src/com/p4square/grow/model/Banner.java b/src/com/p4square/grow/model/Banner.java deleted file mode 100644 index b786b36..0000000 --- a/src/com/p4square/grow/model/Banner.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2014 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * Page Banner Data. - */ -public class Banner { - private String mHtml; - - public String getHtml() { - return mHtml; - } - - public void setHtml(final String html) { - mHtml = html; - } -} diff --git a/src/com/p4square/grow/model/Chapter.java b/src/com/p4square/grow/model/Chapter.java deleted file mode 100644 index 3a08e4c..0000000 --- a/src/com/p4square/grow/model/Chapter.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -import java.util.HashMap; -import java.util.Map; - -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnore; - -/** - * Chapter is a list of VideoRecords in a Playlist. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class Chapter implements Cloneable { - private String mName; - private Map<String, VideoRecord> mVideos; - - public Chapter(String name) { - mName = name; - mVideos = new HashMap<String, VideoRecord>(); - } - - /** - * Private constructor for JSON decoding. - */ - private Chapter() { - this(null); - } - - /** - * @return The Chapter name. - */ - public String getName() { - return mName; - } - - /** - * Set the chapter name. - * - * @param name The name of the chapter. - */ - public void setName(final String name) { - mName = name; - } - - /** - * @return The VideoRecord for videoid or null if videoid is not in the chapter. - */ - public VideoRecord getVideoRecord(String videoid) { - return mVideos.get(videoid); - } - - /** - * @return A map of video ids to VideoRecords. - */ - @JsonAnyGetter - public Map<String, VideoRecord> getVideos() { - return mVideos; - } - - /** - * Set the VideoRecord for a video id. - * @param videoId the video id. - * @param video the VideoRecord. - */ - @JsonAnySetter - public void setVideoRecord(String videoId, VideoRecord video) { - mVideos.put(videoId, video); - } - - /** - * Remove the VideoRecord for a video id. - * @param videoId The id to remove. - */ - public void removeVideoRecord(String videoId) { - mVideos.remove(videoId); - } - - /** - * @return true if every required video has been completed. - */ - @JsonIgnore - public boolean isComplete() { - boolean complete = true; - - for (VideoRecord r : mVideos.values()) { - if (r.getRequired() && !r.getComplete()) { - return false; - } - } - - return complete; - } - - /** - * Deeply clone a chapter. - * - * @return a new Chapter object identical but independent of this one. - */ - public Chapter clone() throws CloneNotSupportedException { - Chapter c = new Chapter(mName); - for (Map.Entry<String, VideoRecord> videoEntry : mVideos.entrySet()) { - c.setVideoRecord(videoEntry.getKey(), videoEntry.getValue().clone()); - } - return c; - } -} diff --git a/src/com/p4square/grow/model/CircleQuestion.java b/src/com/p4square/grow/model/CircleQuestion.java deleted file mode 100644 index 71acc14..0000000 --- a/src/com/p4square/grow/model/CircleQuestion.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * Circle Question. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class CircleQuestion extends Question { - private static final ScoringEngine ENGINE = new QuadScoringEngine(); - - private String mTopLeft; - private String mTopRight; - private String mBottomLeft; - private String mBottomRight; - - /** - * @return the Top Left label. - */ - public String getTopLeft() { - return mTopLeft; - } - - /** - * Set the Top Left label. - * @param s The new top left label. - */ - public void setTopLeft(String s) { - mTopLeft = s; - } - - /** - * @return the Top Right label. - */ - public String getTopRight() { - return mTopRight; - } - - /** - * Set the Top Right label. - * @param s The new top left label. - */ - public void setTopRight(String s) { - mTopRight = s; - } - - /** - * @return the Bottom Left label. - */ - public String getBottomLeft() { - return mBottomLeft; - } - - /** - * Set the Bottom Left label. - * @param s The new top left label. - */ - public void setBottomLeft(String s) { - mBottomLeft = s; - } - - /** - * @return the Bottom Right label. - */ - public String getBottomRight() { - return mBottomRight; - } - - /** - * Set the Bottom Right label. - * @param s The new top left label. - */ - public void setBottomRight(String s) { - mBottomRight = s; - } - - @Override - public boolean scoreAnswer(Score score, RecordedAnswer answer) { - return ENGINE.scoreAnswer(score, this, answer); - } - - @Override - public QuestionType getType() { - return QuestionType.CIRCLE; - } -} diff --git a/src/com/p4square/grow/model/ImageQuestion.java b/src/com/p4square/grow/model/ImageQuestion.java deleted file mode 100644 index d94c32c..0000000 --- a/src/com/p4square/grow/model/ImageQuestion.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * Image Question. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class ImageQuestion extends Question { - private static final ScoringEngine ENGINE = new SimpleScoringEngine(); - - @Override - public boolean scoreAnswer(Score score, RecordedAnswer answer) { - return ENGINE.scoreAnswer(score, this, answer); - } - - @Override - public QuestionType getType() { - return QuestionType.IMAGE; - } -} diff --git a/src/com/p4square/grow/model/Message.java b/src/com/p4square/grow/model/Message.java deleted file mode 100644 index 9d33320..0000000 --- a/src/com/p4square/grow/model/Message.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -import java.util.Date; -import java.util.UUID; - -/** - * A feed message. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class Message { - private String mThreadId; - private String mId; - private UserRecord mAuthor; - private Date mCreated; - private String mMessage; - - /** - * @return a new message id. - */ - public static String generateId() { - return String.format("%x-%s", System.currentTimeMillis(), UUID.randomUUID().toString()); - } - - /** - * @return The id of the thread that the message belongs to. - */ - public String getThreadId() { - return mThreadId; - } - - /** - * Set the id of the thread that the message belongs to. - * @param id The new thread id. - */ - public void setThreadId(String id) { - mThreadId = id; - } - - /** - * @return The id the message. - */ - public String getId() { - return mId; - } - - /** - * Set the id of the message. - * @param id The new message id. - */ - public void setId(String id) { - mId = id; - } - - /** - * @return The author of the message. - */ - public UserRecord getAuthor() { - return mAuthor; - } - - /** - * Set the author of the message. - * @param author The new author. - */ - public void setAuthor(UserRecord author) { - mAuthor = author; - } - - /** - * @return The Date the message was created. - */ - public Date getCreated() { - return mCreated; - } - - /** - * Set the Date the message was created. - * @param date The new creation date. - */ - public void setCreated(Date date) { - mCreated = date; - } - - /** - * @return The message text. - */ - public String getMessage() { - return mMessage; - } - - /** - * Set the message text. - * @param text The message text. - */ - public void setMessage(String text) { - mMessage = text; - } -} diff --git a/src/com/p4square/grow/model/MessageThread.java b/src/com/p4square/grow/model/MessageThread.java deleted file mode 100644 index 9542a18..0000000 --- a/src/com/p4square/grow/model/MessageThread.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -import java.util.UUID; - -/** - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class MessageThread { - private String mId; - private Message mMessage; - - /** - * Create a new thread with a probably unique id. - * - * @return the new thread. - */ - public static MessageThread createNew() { - MessageThread t = new MessageThread(); - // IDs are keyed to sort lexicographically from latest to oldest. - t.setId(String.format("%016x-%s", Long.MAX_VALUE - System.currentTimeMillis(), - UUID.randomUUID().toString())); - - return t; - } - - /** - * @return The id the message. - */ - public String getId() { - return mId; - } - - /** - * Set the id of the message. - * @param id The new message id. - */ - public void setId(String id) { - mId = id; - } - - /** - * @return The original message. - */ - public Message getMessage() { - return mMessage; - } - - /** - * Set the original message. - * @param id The new message. - */ - public void setMessage(Message message) { - mMessage = message; - } -} diff --git a/src/com/p4square/grow/model/Playlist.java b/src/com/p4square/grow/model/Playlist.java deleted file mode 100644 index 3e77ada..0000000 --- a/src/com/p4square/grow/model/Playlist.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnore; - -/** - * Representation of a user's playlist. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class Playlist { - /** - * Map of Chapter ID to map of Video ID to VideoRecord. - */ - private Map<String, Chapter> mPlaylist; - - private Date mLastUpdated; - - /** - * Construct an empty playlist. - */ - public Playlist() { - mPlaylist = new HashMap<String, Chapter>(); - mLastUpdated = new Date(0); // Default to a prehistoric date if we don't have one. - } - - /** - * Find the VideoRecord for a video id. - */ - public VideoRecord find(String videoId) { - for (Chapter chapter : mPlaylist.values()) { - VideoRecord r = chapter.getVideoRecord(videoId); - - if (r != null) { - return r; - } - } - - return null; - } - - /** - * @param videoId The video to search for. - * @return the Chapter containing videoId. - */ - private Chapter findChapter(String videoId) { - for (Chapter chapter : mPlaylist.values()) { - VideoRecord r = chapter.getVideoRecord(videoId); - - if (r != null) { - return chapter; - } - } - - return null; - } - - /** - * @return The last modified date of the source playlist. - */ - public Date getLastUpdated() { - return mLastUpdated; - } - - /** - * Set the last updated date. - * @param date the new last updated date. - */ - public void setLastUpdated(Date date) { - mLastUpdated = date; - } - - /** - * Add a video to the playlist. - */ - public VideoRecord add(String chapterId, String videoId) { - Chapter chapter = mPlaylist.get(chapterId); - - if (chapter == null) { - chapter = new Chapter(chapterId); - mPlaylist.put(chapterId, chapter); - } - - VideoRecord r = new VideoRecord(); - chapter.setVideoRecord(videoId, r); - return r; - } - - /** - * Add a Chapter to the Playlist. - * @param chapterId The name of the chapter. - * @param chapter The Chapter object to add. - */ - @JsonAnySetter - public void addChapter(String chapterId, Chapter chapter) { - chapter.setName(chapterId); - mPlaylist.put(chapterId, chapter); - } - - /** - * @return a map of chapter id to chapter. - */ - @JsonAnyGetter - public Map<String, Chapter> getChaptersMap() { - return mPlaylist; - } - - /** - * @return The last chapter to be completed. - */ - @JsonIgnore - public Map<String, Boolean> getChapterStatuses() { - Map<String, Boolean> completed = new HashMap<String, Boolean>(); - - for (Map.Entry<String, Chapter> entry : mPlaylist.entrySet()) { - completed.put(entry.getKey(), entry.getValue().isComplete()); - } - - return completed; - } - - /** - * @return true if all required videos in the chapter have been watched. - */ - public boolean isChapterComplete(String chapterId) { - Chapter chapter = mPlaylist.get(chapterId); - if (chapter != null) { - return chapter.isComplete(); - } - - return false; - } - - /** - * Merge a playlist into this playlist. - * - * Merge is accomplished by adding all missing Chapters and VideoRecords to - * this playlist. - */ - public void merge(Playlist source) { - if (source.getLastUpdated().before(mLastUpdated)) { - // Already up to date. - return; - } - - for (Map.Entry<String, Chapter> entry : source.getChaptersMap().entrySet()) { - String chapterName = entry.getKey(); - Chapter theirChapter = entry.getValue(); - Chapter myChapter = mPlaylist.get(entry.getKey()); - - if (myChapter == null) { - // Add new chapter - myChapter = new Chapter(chapterName); - addChapter(chapterName, myChapter); - } - - // Check chapter for missing videos - for (Map.Entry<String, VideoRecord> videoEntry : theirChapter.getVideos().entrySet()) { - String videoId = videoEntry.getKey(); - VideoRecord myVideo = myChapter.getVideoRecord(videoId); - - if (myVideo == null) { - myVideo = find(videoId); - if (myVideo == null) { - // New Video - try { - myVideo = videoEntry.getValue().clone(); - myChapter.setVideoRecord(videoId, myVideo); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); // Unexpected... - } - } else { - // Video moved - findChapter(videoId).removeVideoRecord(videoId); - myChapter.setVideoRecord(videoId, myVideo); - } - } - } - } - - mLastUpdated = source.getLastUpdated(); - } -} diff --git a/src/com/p4square/grow/model/Point.java b/src/com/p4square/grow/model/Point.java deleted file mode 100644 index e9fc0ca..0000000 --- a/src/com/p4square/grow/model/Point.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * Simple double based point class. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class Point { - /** - * Parse a comma separated x,y pair into a point. - * - * @return The point represented by the string. - * @throws IllegalArgumentException if the input is malformed. - */ - public static Point valueOf(String str) { - final int comma = str.indexOf(','); - if (comma == -1 || comma == 0 || comma == str.length() - 1) { - throw new IllegalArgumentException("Malformed point string"); - } - - final String sX = str.substring(0, comma); - final String sY = str.substring(comma + 1); - - return new Point(Double.valueOf(sX), Double.valueOf(sY)); - } - - private final double mX; - private final double mY; - - /** - * Create a new point with the given coordinates. - * - * @param x The x coordinate. - * @param y The y coordinate. - */ - public Point(double x, double y) { - mX = x; - mY = y; - } - - /** - * Compute the distance between this point and another. - * - * @param other The other point. - * @return The distance between this point and other. - */ - public double distance(Point other) { - final double dx = mX - other.mX; - final double dy = mY - other.mY; - - return Math.sqrt(dx*dx + dy*dy); - } - - /** - * @return The x coordinate. - */ - public double getX() { - return mX; - } - - /** - * @return The y coordinate. - */ - public double getY() { - return mY; - } - - /** - * @return The point represented as a comma separated pair. - */ - @Override - public String toString() { - return String.format("%.2f,%.2f", mX, mY); - } -} diff --git a/src/com/p4square/grow/model/QuadQuestion.java b/src/com/p4square/grow/model/QuadQuestion.java deleted file mode 100644 index a7b4179..0000000 --- a/src/com/p4square/grow/model/QuadQuestion.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * Two-dimensional Question. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class QuadQuestion extends Question { - private static final ScoringEngine ENGINE = new QuadScoringEngine(); - - private String mTop; - private String mRight; - private String mBottom; - private String mLeft; - - /** - * @return the top label. - */ - public String getTop() { - return mTop; - } - - /** - * Set the top label. - * @param s The new top label. - */ - public void setTop(String s) { - mTop = s; - } - - /** - * @return the right label. - */ - public String getRight() { - return mRight; - } - - /** - * Set the right label. - * @param s The new right label. - */ - public void setRight(String s) { - mRight = s; - } - - /** - * @return the bottom label. - */ - public String getBottom() { - return mBottom; - } - - /** - * Set the bottom label. - * @param s The new bottom label. - */ - public void setBottom(String s) { - mBottom = s; - } - - /** - * @return the left label. - */ - public String getLeft() { - return mLeft; - } - - /** - * Set the left label. - * @param s The new left label. - */ - public void setLeft(String s) { - mLeft = s; - } - - @Override - public boolean scoreAnswer(Score score, RecordedAnswer answer) { - return ENGINE.scoreAnswer(score, this, answer); - } - - @Override - public QuestionType getType() { - return QuestionType.QUAD; - } -} diff --git a/src/com/p4square/grow/model/QuadScoringEngine.java b/src/com/p4square/grow/model/QuadScoringEngine.java deleted file mode 100644 index 33403b5..0000000 --- a/src/com/p4square/grow/model/QuadScoringEngine.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -import com.p4square.grow.model.Point; - -/** - * QuadScoringEngine expects the user's answer to be a Point string. We find - * the closest answer Point to the user's answer and treat that as the answer. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class QuadScoringEngine extends ScoringEngine { - - @Override - public boolean scoreAnswer(Score score, Question question, RecordedAnswer userAnswer) { - // Find all of the answer points. - Point[] answers = new Point[question.getAnswers().size()]; - { - int i = 0; - for (String answerStr : question.getAnswers().keySet()) { - answers[i++] = Point.valueOf(answerStr); - } - } - - // Parse the user's answer. - Point userPoint = Point.valueOf(userAnswer.getAnswerId()); - - // Find the closest answer point to the user's answer. - double minDistance = Double.MAX_VALUE; - int answerIndex = 0; - for (int i = 0; i < answers.length; i++) { - final double distance = userPoint.distance(answers[i]); - if (distance < minDistance) { - minDistance = distance; - answerIndex = i; - } - } - - LOG.debug("Quad " + question.getId() + ": Got answer " - + answers[answerIndex].toString() + " for user point " + userAnswer); - - // Get the answer and update the score. - final Answer answer = question.getAnswers().get(answers[answerIndex].toString()); - return answer.score(score); - } -} diff --git a/src/com/p4square/grow/model/Question.java b/src/com/p4square/grow/model/Question.java deleted file mode 100644 index f4b9458..0000000 --- a/src/com/p4square/grow/model/Question.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -import java.util.HashMap; -import java.util.Map; - -import com.fasterxml.jackson.annotation.JsonSubTypes; -import com.fasterxml.jackson.annotation.JsonSubTypes.Type; -import com.fasterxml.jackson.annotation.JsonTypeInfo; - -/** - * Model of an assessment question. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -@JsonTypeInfo( - use = JsonTypeInfo.Id.NAME, - include = JsonTypeInfo.As.PROPERTY, - property = "type") -@JsonSubTypes({ - @Type(value = TextQuestion.class, name = "text"), - @Type(value = ImageQuestion.class, name = "image"), - @Type(value = SliderQuestion.class, name = "slider"), - @Type(value = QuadQuestion.class, name = "quad"), - @Type(value = CircleQuestion.class, name = "circle"), -}) -public abstract class Question { - /** - * QuestionType indicates the type of Question. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ - public enum QuestionType { - TEXT, - IMAGE, - SLIDER, - QUAD, - CIRCLE; - - @Override - public String toString() { - return name().toLowerCase(); - } - } - - private String mQuestionId; - private QuestionType mType; - private String mQuestionText; - private Map<String, Answer> mAnswers; - - private String mPreviousQuestionId; - private String mNextQuestionId; - - public Question() { - mAnswers = new HashMap<String, Answer>(); - } - - /** - * @return the id String for this question. - */ - public String getId() { - return mQuestionId; - } - - /** - * Set the id String for this question. - * @param id New id - */ - public void setId(String id) { - mQuestionId = id; - } - - /** - * @return The Question text. - */ - public String getQuestion() { - return mQuestionText; - } - - /** - * Set the question text. - * @param value The new question text. - */ - public void setQuestion(String value) { - mQuestionText = value; - } - - /** - * @return The id String of the previous question or null if no previous question exists. - */ - public String getPreviousQuestion() { - return mPreviousQuestionId; - } - - /** - * Set the id string of the previous question. - * @param id Previous question id or null if there is no previous question. - */ - public void setPreviousQuestion(String id) { - mPreviousQuestionId = id; - } - - /** - * @return The id String of the next question or null if no next question exists. - */ - public String getNextQuestion() { - return mNextQuestionId; - } - - /** - * Set the id string of the next question. - * @param id next question id or null if there is no next question. - */ - public void setNextQuestion(String id) { - mNextQuestionId = id; - } - - /** - * @return a map of Answer id Strings to Answer objects. - */ - public Map<String, Answer> getAnswers() { - return mAnswers; - } - - /** - * Determine the id of the next question based on the answer to this - * question. - * - * @param answerid - * The id of the selected answer. - * @return a question id or null if this is the last question. - */ - public String getNextQuestion(String answerid) { - String nextQuestion = null; - - Answer a = mAnswers.get(answerid); - if (a != null) { - nextQuestion = a.getNextQuestion(); - } - - if (nextQuestion == null) { - nextQuestion = mNextQuestionId; - } - - return nextQuestion; - } - - /** - * Update the score based on the answer to this question. - * - * @param score The running score to update. - * @param answer The answer give to this question. - * @return true if scoring should continue, false if this answer trumps everything else. - */ - public abstract boolean scoreAnswer(Score score, RecordedAnswer answer); - - /** - * @return the QuestionType of this question. - */ - public abstract QuestionType getType(); - -} diff --git a/src/com/p4square/grow/model/RecordedAnswer.java b/src/com/p4square/grow/model/RecordedAnswer.java deleted file mode 100644 index 7d9905d..0000000 --- a/src/com/p4square/grow/model/RecordedAnswer.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * Simple model for a user's assessment answer. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class RecordedAnswer { - private String mAnswerId; - - /** - * @return The user's answer. - */ - public String getAnswerId() { - return mAnswerId; - } - - /** - * Set the answer id field. - * @param id The new id. - */ - public void setAnswerId(String id) { - mAnswerId = id; - } - - @Override - public String toString() { - return mAnswerId; - } -} diff --git a/src/com/p4square/grow/model/Score.java b/src/com/p4square/grow/model/Score.java deleted file mode 100644 index 031c309..0000000 --- a/src/com/p4square/grow/model/Score.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * Simple structure containing a score's sum and count. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class Score { - /** - * Return the decimal value for the given Score String. - * - * This method satisfies the invariant for Score x: - * numericScore(x.toString()) <= x.getScore() - */ - public static double numericScore(String score) { - score = score.toLowerCase(); - - if ("teacher".equals(score)) { - return 3.5; - } else if ("disciple".equals(score)) { - return 2.5; - } else if ("believer".equals(score)) { - return 1.5; - } else if ("seeker".equals(score)) { - return 0; - } else { - return Integer.MAX_VALUE; - } - } - - double sum; - int count; - - public Score() { - sum = 0; - count = 0; - } - - public Score(double sum, int count) { - this.sum = sum; - this.count = count; - } - - /** - * Copy Constructor. - */ - public Score(Score other) { - sum = other.sum; - count = other.count; - } - - /** - * @return The sum of all the points. - */ - public double getSum() { - return sum; - } - - /** - * @return The number of questions included in the score. - */ - public int getCount() { - return count; - } - - /** - * @return The final score. - */ - public double getScore() { - if (count == 0) { - return 0; - } - - return sum / count; - } - - /** - * @return the lowest score in the same category as this score. - */ - public double floor() { - final double score = getScore(); - - if (score >= 3.5) { - return 3.5; // teacher - - } else if (score >= 2.5) { - return 2.5; // disciple - - } else if (score >= 1.5) { - return 1.5; // believer - - } else { - return 0; // seeker - } - } - - @Override - public String toString() { - final double score = getScore(); - - if (score >= 3.5) { - return "teacher"; - - } else if (score >= 2.5) { - return "disciple"; - - } else if (score >= 1.5) { - return "believer"; - - } else { - return "seeker"; - } - } - -} diff --git a/src/com/p4square/grow/model/ScoringEngine.java b/src/com/p4square/grow/model/ScoringEngine.java deleted file mode 100644 index 8ff18b3..0000000 --- a/src/com/p4square/grow/model/ScoringEngine.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -import org.apache.log4j.Logger; - -/** - * ScoringEngine computes the score for a question and a given answer. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public abstract class ScoringEngine { - protected static final Logger LOG = Logger.getLogger(ScoringEngine.class); - - /** - * Update the score based on the given question and answer. - * - * @param score The running score to update. - * @param question The question to compute the score for. - * @param answer The answer give to this question. - * @return true if scoring should continue, false if this answer trumps everything else. - */ - public abstract boolean scoreAnswer(Score score, Question question, RecordedAnswer answer); -} diff --git a/src/com/p4square/grow/model/SimpleScoringEngine.java b/src/com/p4square/grow/model/SimpleScoringEngine.java deleted file mode 100644 index 6ef2dbb..0000000 --- a/src/com/p4square/grow/model/SimpleScoringEngine.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * SimpleScoringEngine expects the user's answer to a valid answer id and - * scores accordingly. - * - * If the answer id is not valid an Exception is thrown. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class SimpleScoringEngine extends ScoringEngine { - - @Override - public boolean scoreAnswer(Score score, Question question, RecordedAnswer userAnswer) { - final Answer answer = question.getAnswers().get(userAnswer.getAnswerId()); - if (answer == null) { - throw new IllegalArgumentException("Not a valid answer."); - } - - return answer.score(score); - } -} diff --git a/src/com/p4square/grow/model/SliderQuestion.java b/src/com/p4square/grow/model/SliderQuestion.java deleted file mode 100644 index f0861e3..0000000 --- a/src/com/p4square/grow/model/SliderQuestion.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * Slider Question. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class SliderQuestion extends Question { - private static final ScoringEngine ENGINE = new SliderScoringEngine(); - - @Override - public boolean scoreAnswer(Score score, RecordedAnswer answer) { - return ENGINE.scoreAnswer(score, this, answer); - } - - @Override - public QuestionType getType() { - return QuestionType.SLIDER; - } -} diff --git a/src/com/p4square/grow/model/SliderScoringEngine.java b/src/com/p4square/grow/model/SliderScoringEngine.java deleted file mode 100644 index 2961e95..0000000 --- a/src/com/p4square/grow/model/SliderScoringEngine.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * SliderScoringEngine expects the user's answer to be a decimal value in the - * range [0, 1]. The value is scaled to the range [1, 4] and added to the - * score. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class SliderScoringEngine extends ScoringEngine { - - @Override - public boolean scoreAnswer(Score score, Question question, RecordedAnswer userAnswer) { - int numberOfAnswers = question.getAnswers().size(); - if (numberOfAnswers == 0) { - throw new IllegalArgumentException("Question has no answers."); - } - - double answer = Double.valueOf(userAnswer.getAnswerId()); - if (answer < 0 || answer > 1) { - throw new IllegalArgumentException("Answer out of bounds."); - } - - double delta = Math.max(1, Math.ceil(answer * numberOfAnswers) / numberOfAnswers * 4); - - score.sum += delta; - score.count++; - - return true; - } -} diff --git a/src/com/p4square/grow/model/TextQuestion.java b/src/com/p4square/grow/model/TextQuestion.java deleted file mode 100644 index 88c2a34..0000000 --- a/src/com/p4square/grow/model/TextQuestion.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * Text Question. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class TextQuestion extends Question { - private static final ScoringEngine ENGINE = new SimpleScoringEngine(); - - @Override - public boolean scoreAnswer(Score score, RecordedAnswer answer) { - return ENGINE.scoreAnswer(score, this, answer); - } - - @Override - public QuestionType getType() { - return QuestionType.TEXT; - } -} diff --git a/src/com/p4square/grow/model/TrainingRecord.java b/src/com/p4square/grow/model/TrainingRecord.java deleted file mode 100644 index bc3ffa9..0000000 --- a/src/com/p4square/grow/model/TrainingRecord.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -/** - * Representation of a user's training record. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class TrainingRecord { - private String mLastVideo; - private Playlist mPlaylist; - - public TrainingRecord() { - mPlaylist = new Playlist(); - } - - /** - * @return Video id of the last video watched. - */ - public String getLastVideo() { - return mLastVideo; - } - - /** - * Set the video id for the last video watched. - * @param video The new video id. - */ - public void setLastVideo(String video) { - mLastVideo = video; - } - - /** - * @return the user's Playlist. - */ - public Playlist getPlaylist() { - return mPlaylist; - } - - /** - * Set the user's playlist. - * @param playlist The new playlist. - */ - public void setPlaylist(Playlist playlist) { - mPlaylist = playlist; - } -} diff --git a/src/com/p4square/grow/model/UserRecord.java b/src/com/p4square/grow/model/UserRecord.java deleted file mode 100644 index 4399282..0000000 --- a/src/com/p4square/grow/model/UserRecord.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright 2014 Jesse Morgan - */ - -package com.p4square.grow.model; - -import java.io.IOException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.commons.codec.binary.Hex; - -import org.restlet.security.User; - -/** - * A simple user representation without any secrets. - */ -public class UserRecord { - private String mId; - private String mFirstName; - private String mLastName; - private String mEmail; - private String mLanding; - private boolean mNewBeliever; - - // Backend Access - private String mBackendPasswordHash; - - /** - * Create an empty UserRecord. - */ - public UserRecord() { - } - - /** - * Create a new UserRecord with the information from a User. - */ - public UserRecord(final User user) { - mId = user.getIdentifier(); - mFirstName = user.getFirstName(); - mLastName = user.getLastName(); - mEmail = user.getEmail(); - } - - /** - * @return The user's identifier. - */ - public String getId() { - return mId; - } - - /** - * Set the user's identifier. - * @param value The new id. - */ - public void setId(final String value) { - mId = value; - } - - /** - * @return The user's email. - */ - public String getEmail() { - return mEmail; - } - - /** - * Set the user's email. - * @param value The new email. - */ - public void setEmail(final String value) { - mEmail = value; - } - - /** - * @return The user's first name. - */ - public String getFirstName() { - return mFirstName; - } - - /** - * Set the user's first name. - * @param value The new first name. - */ - public void setFirstName(final String value) { - mFirstName = value; - } - - /** - * @return The user's last name. - */ - public String getLastName() { - return mLastName; - } - - /** - * Set the user's last name. - * @param value The new last name. - */ - public void setLastName(final String value) { - mLastName = value; - } - - /** - * @return The user's landing page. - */ - public String getLanding() { - return mLanding; - } - - /** - * Set the user's landing page. - * @param value The new landing page. - */ - public void setLanding(final String value) { - mLanding = value; - } - - /** - * @return true if the user came from the New Believer's landing. - */ - public boolean getNewBeliever() { - return mNewBeliever; - } - - /** - * Set the user's new believer flag. - * @param value The new flag. - */ - public void setNewBeliever(final boolean value) { - mNewBeliever = value; - } - - /** - * @return The user's backend password hash, null if he doesn't have - * access. - */ - public String getBackendPasswordHash() { - return mBackendPasswordHash; - } - - /** - * Set the user's backend password hash. - * @param value The new backend password hash or null to remove - * access. - */ - public void setBackendPasswordHash(final String value) { - mBackendPasswordHash = value; - } - - /** - * Set the user's backend password to the clear-text value given. - * @param value The new backend password. - */ - public void setBackendPassword(final String value) { - try { - mBackendPasswordHash = hashPassword(value); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); - } - } - - /** - * Hash the given secret. - */ - public static String hashPassword(final String secret) throws NoSuchAlgorithmException { - MessageDigest md = MessageDigest.getInstance("SHA-1"); - - // Convert the char[] to byte[] - // FIXME This approach is incorrectly truncating multibyte - // characters. - byte[] b = new byte[secret.length()]; - for (int i = 0; i < secret.length(); i++) { - b[i] = (byte) secret.charAt(i); - } - - md.update(b); - - byte[] hash = md.digest(); - return new String(Hex.encodeHex(hash)); - } -} diff --git a/src/com/p4square/grow/model/VideoRecord.java b/src/com/p4square/grow/model/VideoRecord.java deleted file mode 100644 index ec99d0d..0000000 --- a/src/com/p4square/grow/model/VideoRecord.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2013 Jesse Morgan - */ - -package com.p4square.grow.model; - -import java.util.Date; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -/** - * Simple bean containing video completion data. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class VideoRecord implements Cloneable { - private Boolean mComplete; - private Boolean mRequired; - private Date mCompletionDate; - - public VideoRecord() { - mComplete = null; - mRequired = null; - mCompletionDate = null; - } - - public boolean getComplete() { - if (mComplete == null) { - return false; - } - return mComplete; - } - - public void setComplete(boolean complete) { - mComplete = complete; - } - - @JsonIgnore - public boolean isCompleteSet() { - return mComplete != null; - } - - public boolean getRequired() { - if (mRequired == null) { - return true; - } - return mRequired; - } - - public void setRequired(boolean complete) { - mRequired = complete; - } - - @JsonIgnore - public boolean isRequiredSet() { - return mRequired != null; - } - - public Date getCompletionDate() { - return mCompletionDate; - } - - public void setCompletionDate(Date date) { - mCompletionDate = date; - } - - /** - * Convenience method to mark a video complete. - */ - public void complete() { - mComplete = true; - mCompletionDate = new Date(); - } - - /** - * @return an identical clone of this record. - */ - public VideoRecord clone() throws CloneNotSupportedException { - VideoRecord r = (VideoRecord) super.clone(); - r.mComplete = mComplete; - r.mRequired = mRequired; - r.mCompletionDate = mCompletionDate; - return r; - } -} |