summaryrefslogtreecommitdiff
path: root/src/main/java/seu/se/Exercise.java
blob: 6df9212f141d4960f6ec60655f596448ddf597e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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;
    }
}