-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathGradeService.java
More file actions
85 lines (68 loc) · 3.14 KB
/
GradeService.java
File metadata and controls
85 lines (68 loc) · 3.14 KB
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
package org.cleancode.journal.service;
import com.google.gson.Gson;
import com.vaadin.flow.i18n.I18NProvider;
import com.vaadin.flow.server.VaadinService;
import org.cleancode.journal.domain.grade.Grade;
import org.cleancode.journal.domain.grade.GradeColor;
import org.cleancode.journal.domain.grade.GradeTopic;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.io.InputStreamReader;
import java.util.*;
import java.util.function.Supplier;
import static java.util.stream.Collectors.toList;
import static org.apache.commons.lang3.StringUtils.defaultString;
@Service
public class GradeService implements IGradeService {
private transient HashMap<String, GradeTopic> topics = new LinkedHashMap<>();
private transient HashMap<GradeColor, Grade> grades = new LinkedHashMap<>();
private transient List<GradeColor> allGrades = List.of(GradeColor.values());
@PostConstruct
private void loadGradesFromFile() {
allGrades.forEach(this::loadGrade);
}
private void loadGrade(GradeColor gradeColor) {
Gson gson = new Gson();
String gradeFilePath = "/grades/en/grade_" + gradeColor.getNumber() + ".json";
Grade grade = gson.fromJson(new InputStreamReader(getClass().getResourceAsStream(gradeFilePath)), Grade.class);
grade.listAllGradeTopics().forEach(gradeTopic -> {
gradeTopic.setGrade(grade);
gradeTopic.setDescription(addLineBreaks(gradeTopic.getDescription()));
topics.put(gradeTopic.getId(), gradeTopic);
});
grades.put(grade.getGradeColor(), grade);
}
@Override
public GradeTopic loadGradeTopic(String gradeId, Locale locale) {
return topics.get(gradeId);
}
@Override
public Grade loadGrade(GradeColor gradeColor, Locale locale) {
return grades.get(gradeColor);
}
@Override
public List<Grade> loadAllGrades(Locale locale) {
return allGrades.stream().map(color -> loadGrade(color, locale)).collect(toList());
}
@Override
public Collection<GradeTopic> loadAllTopics(Locale locale) {
return new ArrayList<>(topics.values());
}
@Override
public Collection<GradeTopic> loadTopics(Locale locale, String filter) {
return loadAllTopics(locale).stream().filter(topic -> filter(locale, topic, filter)).collect(toList());
}
private boolean filter(Locale locale, GradeTopic gradeTopic, String filter) {
String search = defaultString(filter).toLowerCase();
I18NProvider i18NProvider = VaadinService.getCurrent().getInstantiator().getI18NProvider();
String gradeColor = i18NProvider.getTranslation(gradeTopic.getGrade().getGradeColor().getMessageKey(), locale);
return contains(gradeTopic::getName, search) || contains(gradeTopic::getDescription, search)
|| contains(gradeTopic::getSectionWhy, search) || contains(() -> gradeColor, search);
}
private String addLineBreaks(String html) {
return html.replace("\\n", System.lineSeparator());
}
private boolean contains(Supplier<String> getter, String search) {
return getter.get().toLowerCase().contains(search);
}
}