qtoField(int,String)   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
c 0
b 0
f 0
cc 1
loc 2
rs 10
1
package easytests.personal.validators;
2
3
import easytests.common.validators.AbstractDtoValidator;
4
import easytests.core.models.IdentityInterface;
5
import easytests.core.models.IssueStandardQuestionTypeOptionModelInterface;
6
import easytests.core.models.IssueStandardTopicPriorityModelInterface;
7
import easytests.core.models.empty.IssueStandardModelEmpty;
8
import easytests.core.services.IssueStandardQuestionTypeOptionsService;
9
import easytests.core.services.IssueStandardTopicPrioritiesService;
10
import easytests.personal.dto.IssueStandardDto;
11
import easytests.personal.dto.IssueStandardQuestionTypeOptionDto;
12
import easytests.personal.dto.IssueStandardTopicPriorityDto;
13
14
import java.util.ArrayList;
15
import java.util.HashSet;
16
import java.util.List;
17
import java.util.Set;
18
import java.util.stream.Collectors;
19
20
import org.springframework.beans.factory.annotation.Autowired;
21
import org.springframework.stereotype.Component;
22
import org.springframework.validation.Errors;
23
24
/**
25
 * @author SingularityA
26
 */
27
@Component("issueStandardDtoValidator")
28
@SuppressWarnings("checkstyle:MultipleStringLiterals")
29
public class IssueStandardDtoValidator extends AbstractDtoValidator {
30
31
    @Autowired
32
    private IssueStandardTopicPrioritiesService topicPrioritiesService;
33
34
    @Autowired
35
    private IssueStandardQuestionTypeOptionsService questionTypeOptionsService;
36
37
    public boolean supports(Class clazz) {
38
        return IssueStandardDto.class.isAssignableFrom(clazz);
39
    }
40
41
    public void validate(Object object, Errors errors) {
42
        final IssueStandardDto issueStandardDto = (IssueStandardDto) object;
43
        validateTopicPriorities(errors, issueStandardDto);
44
        validateQuestionTypeOptions(errors, issueStandardDto);
45
    }
46
47
    private void validateTopicPriorities(Errors errors, IssueStandardDto issueStandardDto) {
48
        validateTopicPriorityDtoIdBelongsToIssueStandard(errors, issueStandardDto);
49
        validateTopicPriorityIdsAreUnique(errors, issueStandardDto);
50
        validateTopicsAreUnique(errors, issueStandardDto);
51
    }
52
53
    private void validateQuestionTypeOptions(Errors errors, IssueStandardDto issueStandardDto) {
54
        validateQuestionTypeOptionDtoIdBelongsToIssueStandard(errors, issueStandardDto);
55
        validateQuestionTypeOptionIdsAreUnique(errors, issueStandardDto);
56
        validateQuestionTypesAreUnique(errors, issueStandardDto);
57
        validateMaxIsGreaterThanMin(errors, issueStandardDto);
58
    }
59
60
    private void validateTopicPriorityDtoIdBelongsToIssueStandard(Errors errors, IssueStandardDto issueStandardDto) {
61
        final List<IssueStandardTopicPriorityModelInterface> tpModels
62
                = this.topicPrioritiesService
63
                .findByIssueStandard(new IssueStandardModelEmpty(issueStandardDto.getId()));
64
65
        final List<Integer> tpModelIds = new ArrayList<>(tpModels.size());
66
        tpModelIds.addAll(tpModels.stream().map(IdentityInterface::getId).collect(Collectors.toList()));
67
68
        int index = 0;
69
        for (IssueStandardTopicPriorityDto tpDto : issueStandardDto.getTopicPriorities()) {
70
            if (tpDto.getId() != null && !tpModelIds.contains(tpDto.getId())) {
71
                reject(errors, tpField(index, "id"), "Foreign topicPriority id for IssueStandard entity");
72
            }
73
            index++;
74
        }
75
    }
76
77
    private void validateTopicPriorityIdsAreUnique(Errors errors, IssueStandardDto issueStandardDto) {
78
        final List<IssueStandardTopicPriorityDto> tpDtoList = issueStandardDto.getTopicPriorities();
79
        final Set<Integer> tpDtoIdSet = new HashSet<>();
80
81
        for (int index = 0; index < tpDtoList.size(); index++) {
82
            final Integer tpId = tpDtoList.get(index).getId();
83
            if (tpId == null) {
84
                continue;
85
            }
86
            if (tpDtoIdSet.contains(tpId)) {
87
                reject(errors, tpField(index, "id"), "Topic Priority id must be unique");
88
            }
89
            tpDtoIdSet.add(tpId);
90
        }
91
    }
92
93
    private void validateTopicsAreUnique(Errors errors, IssueStandardDto issueStandardDto) {
94
        final List<IssueStandardTopicPriorityDto> tpDtoList = issueStandardDto.getTopicPriorities();
95
        final Set<Integer> tpDtoTopicIdSet = new HashSet<>();
96
97
        for (int index = 0; index < tpDtoList.size(); index++) {
98
            final Integer tpTopicId = tpDtoList.get(index).getTopicId();
99
            if (tpTopicId == null) {
100
                continue;
101
            }
102
            if (tpDtoTopicIdSet.contains(tpTopicId)) {
103
                reject(errors, tpField(index, "topicId"), "Topic must be unique");
104
            }
105
            tpDtoTopicIdSet.add(tpTopicId);
106
        }
107
    }
108
109
    private void validateQuestionTypeOptionDtoIdBelongsToIssueStandard(Errors errors,
110
                                                                       IssueStandardDto issueStandardDto) {
111
        final List<IssueStandardQuestionTypeOptionModelInterface> qtoModels
112
                = this.questionTypeOptionsService
113
                .findByIssueStandard(new IssueStandardModelEmpty(issueStandardDto.getId()));
114
115
        final List<Integer> qtoModelIds = new ArrayList<>(qtoModels.size());
116
        qtoModelIds.addAll(qtoModels.stream().map(IdentityInterface::getId).collect(Collectors.toList()));
117
118
        int index = 0;
119
        for (IssueStandardQuestionTypeOptionDto qtoDto : issueStandardDto.getQuestionTypeOptions()) {
120
            if (qtoDto.getId() != null && !qtoModelIds.contains(qtoDto.getId())) {
121
                reject(errors, qtoField(index, "id"), "Foreign questionTypeOption id for IssueStandard entity");
122
            }
123
            index++;
124
        }
125
    }
126
127
    private void validateQuestionTypeOptionIdsAreUnique(Errors errors, IssueStandardDto issueStandardDto) {
128
        final List<IssueStandardQuestionTypeOptionDto> qtoDtoList = issueStandardDto.getQuestionTypeOptions();
129
        final Set<Integer> qtoDtoIdSet = new HashSet<>();
130
131
        for (int index = 0; index < qtoDtoList.size(); index++) {
132
            final Integer qtoId = qtoDtoList.get(index).getId();
133
            if (qtoId == null) {
134
                continue;
135
            }
136
            if (qtoDtoIdSet.contains(qtoId)) {
137
                reject(errors, qtoField(index, "id"), "Question Type Option id must be unique");
138
            }
139
            qtoDtoIdSet.add(qtoId);
140
        }
141
    }
142
143
    private void validateQuestionTypesAreUnique(Errors errors, IssueStandardDto issueStandardDto) {
144
        final List<IssueStandardQuestionTypeOptionDto> qtoDtoList = issueStandardDto.getQuestionTypeOptions();
145
        final Set<Integer> qtoDtoQuestionTypeIdSet = new HashSet<>();
146
147
        for (int index = 0; index < qtoDtoList.size(); index++) {
148
            final Integer qtoQuestionTypeId = qtoDtoList.get(index).getQuestionTypeId();
149
            if (qtoQuestionTypeId == null) {
150
                continue;
151
            }
152
            if (qtoDtoQuestionTypeIdSet.contains(qtoQuestionTypeId)) {
153
                reject(errors, qtoField(index, "questionTypeId"), "Question Type must be unique");
154
            }
155
            qtoDtoQuestionTypeIdSet.add(qtoQuestionTypeId);
156
        }
157
    }
158
159
    private void validateMaxIsGreaterThanMin(Errors errors, IssueStandardDto issueStandardDto) {
160
        final List<IssueStandardQuestionTypeOptionDto> qtoDtoList = issueStandardDto.getQuestionTypeOptions();
161
162
        for (int index = 0; index < qtoDtoList.size(); index++) {
163
            final Integer minQuestions = qtoDtoList.get(index).getMinQuestions();
164
            final Integer maxQuestions = qtoDtoList.get(index).getMaxQuestions();
165
            if (minQuestions != null && maxQuestions != null && minQuestions > maxQuestions) {
166
                reject(errors, qtoField(index, "maxQuestions"), "Max Questions must be greater than Min Questions");
167
            }
168
        }
169
    }
170
171
    private static String tpField(int index, String propertyName) {
172
        return "topicPriorities[" + Integer.toString(index) + "]." + propertyName;
173
    }
174
175
    private static String qtoField(int index, String propertyName) {
176
        return "questionTypeOptions[" + Integer.toString(index) + "]." + propertyName;
177
    }
178
}
179