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;
}
}
|