summaryrefslogtreecommitdiff
path: root/src/main/java/seu/se/Exercise.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/seu/se/Exercise.java')
-rw-r--r--src/main/java/seu/se/Exercise.java125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/main/java/seu/se/Exercise.java b/src/main/java/seu/se/Exercise.java
new file mode 100644
index 0000000..6df9212
--- /dev/null
+++ b/src/main/java/seu/se/Exercise.java
@@ -0,0 +1,125 @@
+package seu.se;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.annotation.PersistenceCreator;
+import org.springframework.data.neo4j.core.schema.Id;
+import org.springframework.data.neo4j.core.schema.Node;
+
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+@Node
+public class Exercise {
+ @Id
+ private String questionId;
+ private String question;
+ private List<OptionPair> options;
+ private String answer;
+
+ public interface Choice {
+ String A = "A";
+ String B = "B";
+ String C = "C";
+ String D = "D";
+ }
+
+ @Node
+ @JsonSerialize(using = OptionPair.OptionPairSerializer.class)
+ public static class OptionPair {
+ @Id
+ private final String id;
+ private final String key;
+ private final String value;
+
+ public static class OptionPairSerializer extends StdSerializer<OptionPair> {
+ public OptionPairSerializer() {
+ this(null);
+ }
+
+ public OptionPairSerializer(Class<OptionPair> t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(OptionPair value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+ gen.writeStartObject();
+ gen.writeStringField(value.key, value.value);
+ gen.writeEndObject();
+ }
+ }
+
+ public OptionPair(String id, String key, String value) {
+ this.id = id;
+ this.key = key;
+ this.value = value;
+ }
+
+ public String value() {
+ return value;
+ }
+
+ public String key() {
+ return key;
+ }
+
+ public String getId() {
+ return id;
+ }
+ }
+
+ @JsonCreator
+ public Exercise(@JsonProperty("questionId") String questionId, @JsonProperty("question") String question, @JsonProperty("options") Map<String, String> options, @JsonProperty("answer") String answer) {
+ this.questionId = questionId;
+ this.question = question;
+ this.options = new LinkedList<OptionPair>();
+ options.forEach((k, v) -> this.options.add(new OptionPair(String.format("%s.%s", questionId, k), k, v)));
+ this.answer = answer;
+ }
+
+ @Autowired
+ @PersistenceCreator
+ // https://stackoverflow.com/questions/55827640/how-to-fix-failed-to-instantiate-classname-using-constructor-no-constructor
+ public Exercise(String questionId, String question, List<OptionPair> options, String answer) {
+ this.questionId = questionId;
+ this.question = question;
+ this.options = options;
+ this.answer = answer;
+ }
+
+ public String getQuestion() {
+ return question;
+ }
+
+ public void setQuestion(String question) {
+ this.question = question;
+ }
+
+ public String getQuestionId() {
+ return questionId;
+ }
+
+ public List<OptionPair> getOptions() {
+ return options;
+ }
+
+ public void setOptions(List<OptionPair> options) {
+ this.options = options;
+ }
+
+ public String getAnswer() {
+ return answer;
+ }
+
+ public void setAnswer(String answer) {
+ this.answer = answer;
+ }
+}