Revize bc1cb4b3
Přidáno uživatelem stepanekp před asi 3 roky(ů)
src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/controller/AppController.java | ||
---|---|---|
173 | 173 |
return "result"; |
174 | 174 |
} |
175 | 175 |
|
176 |
/** |
|
177 |
* Method for recalculating the results after a configuration change. |
|
178 |
* |
|
179 |
* @param model object for passing data to the UI |
|
180 |
* @return html file name for thymeleaf template |
|
181 |
*/ |
|
182 |
@GetMapping("/recalculate") |
|
183 |
public String recalculateGet(Model model) { |
|
184 |
return analyzeGet(model); |
|
185 |
} |
|
186 |
|
|
187 |
/** |
|
188 |
* Method for recalculating the results after a configuration change. |
|
189 |
* |
|
190 |
* @param model object for passing data to the UI |
|
191 |
* @return html file name for thymeleaf template |
|
192 |
*/ |
|
193 |
@PostMapping("/recalculate") |
|
194 |
public String resultRecalculate(Model model) { |
|
195 |
|
|
196 |
List<QueryResult> results = antiPatternManager.analyze(antiPatternService.getAnalyzedProjects(), |
|
197 |
antiPatternService.getAnalyzedAntiPatterns(), null); |
|
198 |
|
|
199 |
antiPatternService.saveResults(results); |
|
200 |
antiPatternService.setConfigurationChanged(false); |
|
201 |
|
|
202 |
model.addAttribute("queryResults", results); |
|
203 |
model.addAttribute("recalculationTime", DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalTime.now())); |
|
204 |
return "result"; |
|
205 |
} |
|
206 |
|
|
207 | 176 |
/** |
208 | 177 |
* Method for showing about page. |
209 | 178 |
* |
src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/BusinessAsUsualDetectorImpl.java | ||
---|---|---|
29 | 29 |
private List<String> sqlQueries; |
30 | 30 |
|
31 | 31 |
private float getDivisionOfIterationsWithRetrospective(Map<String, String> thresholds) { |
32 |
if(thresholds != null) |
|
33 |
return new Percentage(Float.parseFloat(thresholds.get("divisionOfIterationsWithRetrospective"))).getValue(); |
|
34 |
|
|
35 |
return ((Percentage) antiPattern.getThresholds().get("divisionOfIterationsWithRetrospective").getValue()).getValue(); |
|
32 |
return new Percentage(Float.parseFloat(thresholds.get("divisionOfIterationsWithRetrospective"))).getValue(); |
|
36 | 33 |
} |
37 | 34 |
|
38 | 35 |
private List<String> getSearchSubstringsWithRetrospective(Map<String, String> thresholds) { |
39 |
if(thresholds != null) |
|
40 |
return Arrays.asList(thresholds.get("searchSubstringsWithRetrospective").split("\\|\\|")); |
|
41 |
|
|
42 |
return Arrays.asList(((String) antiPattern.getThresholds().get("searchSubstringsWithRetrospective").getValue()).split("\\|\\|")); |
|
36 |
return Arrays.asList(thresholds.get("searchSubstringsWithRetrospective").split("\\|\\|")); |
|
43 | 37 |
} |
44 | 38 |
|
45 | 39 |
@Override |
src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/LongOrNonExistentFeedbackLoopsDetectorImpl.java | ||
---|---|---|
36 | 36 |
private List<String> sqlQueries; |
37 | 37 |
|
38 | 38 |
private float getDivisionOfIterationsWithFeedbackLoop(Map<String, String> thresholds) { |
39 |
if(thresholds != null) |
|
40 |
return new Percentage(Float.parseFloat(thresholds.get("divisionOfIterationsWithFeedbackLoop"))).getValue(); |
|
41 |
|
|
42 |
return ((Percentage) antiPattern.getThresholds().get("divisionOfIterationsWithFeedbackLoop").getValue()).getValue(); |
|
39 |
return new Percentage(Float.parseFloat(thresholds.get("divisionOfIterationsWithFeedbackLoop"))).getValue(); |
|
43 | 40 |
} |
44 | 41 |
|
45 | 42 |
private float getMaxGapBetweenFeedbackLoopRate(Map<String, String> thresholds) { |
46 |
if(thresholds != null) |
|
47 |
return new PositiveFloat(Float.parseFloat(thresholds.get("maxGapBetweenFeedbackLoopRate"))).floatValue(); |
|
48 |
|
|
49 |
return ((PositiveFloat) antiPattern.getThresholds().get("maxGapBetweenFeedbackLoopRate").getValue()).floatValue(); |
|
43 |
return new PositiveFloat(Float.parseFloat(thresholds.get("maxGapBetweenFeedbackLoopRate"))).floatValue(); |
|
50 | 44 |
} |
51 | 45 |
|
52 | 46 |
private List<String> getSearchSubstringsWithFeedbackLoop(Map<String, String> thresholds) { |
53 |
if(thresholds != null) |
|
54 |
return Arrays.asList(thresholds.get("searchSubstringsWithFeedbackLoop").split("\\|\\|")); |
|
55 |
|
|
56 |
return Arrays.asList(((String) antiPattern.getThresholds().get("searchSubstringsWithFeedbackLoop").getValue()).split("\\|\\|")); |
|
47 |
return Arrays.asList(thresholds.get("searchSubstringsWithFeedbackLoop").split("\\|\\|")); |
|
57 | 48 |
} |
58 | 49 |
|
59 | 50 |
@Override |
src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/NinetyNinetyRuleDetectorImpl.java | ||
---|---|---|
28 | 28 |
private List<String> sqlQueries; |
29 | 29 |
|
30 | 30 |
private double getMaxDivisionRange(Map<String, String> thresholds) { |
31 |
if(thresholds != null) |
|
32 |
return new PositiveFloat(Float.parseFloat(thresholds.get("maxDivisionRange"))).floatValue(); |
|
33 |
|
|
34 |
return ((PositiveFloat) antiPattern.getThresholds().get("maxDivisionRange").getValue()).doubleValue(); |
|
31 |
return new PositiveFloat(Float.parseFloat(thresholds.get("maxDivisionRange"))).floatValue(); |
|
35 | 32 |
} |
36 | 33 |
|
37 | 34 |
private int getMaxBadDivisionLimit(Map<String, String> thresholds) { |
38 |
if(thresholds != null) |
|
39 |
return new PositiveInteger(Integer.parseInt(thresholds.get("maxBadDivisionLimit"))).intValue(); |
|
40 |
|
|
41 |
return ((PositiveInteger) antiPattern.getThresholds().get("maxBadDivisionLimit").getValue()).intValue(); |
|
35 |
return new PositiveInteger(Integer.parseInt(thresholds.get("maxBadDivisionLimit"))).intValue(); |
|
42 | 36 |
} |
43 | 37 |
|
44 | 38 |
@Override |
src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/RoadToNowhereDetectorImpl.java | ||
---|---|---|
38 | 38 |
private List<String> sqlQueries; |
39 | 39 |
|
40 | 40 |
private int getMinNumberOfWikiPagesWithProjectPlan(Map<String, String> thresholds) { |
41 |
if(thresholds != null) |
|
42 |
return new PositiveInteger(Integer.parseInt(thresholds.get("minNumberOfWikiPagesWithProjectPlan"))).intValue(); |
|
43 |
|
|
44 |
return ((PositiveInteger) antiPattern.getThresholds().get("minNumberOfWikiPagesWithProjectPlan").getValue()).intValue(); |
|
41 |
return new PositiveInteger(Integer.parseInt(thresholds.get("minNumberOfWikiPagesWithProjectPlan"))).intValue(); |
|
45 | 42 |
} |
46 | 43 |
|
47 | 44 |
private int getMinNumberOfActivitiesWithProjectPlan(Map<String, String> thresholds) { |
48 |
if(thresholds != null) |
|
49 |
return new PositiveInteger(Integer.parseInt(thresholds.get("minNumberOfActivitiesWithProjectPlan"))).intValue(); |
|
50 |
|
|
51 |
return ((PositiveInteger) antiPattern.getThresholds().get("minNumberOfActivitiesWithProjectPlan").getValue()).intValue(); |
|
45 |
return new PositiveInteger(Integer.parseInt(thresholds.get("minNumberOfActivitiesWithProjectPlan"))).intValue(); |
|
52 | 46 |
} |
53 | 47 |
|
54 | 48 |
private List<String> getSearchSubstringsWithProjectPlan(Map<String, String> thresholds) { |
55 |
if(thresholds != null) |
|
56 |
return Arrays.asList(thresholds.get("searchSubstringsWithProjectPlan").split("\\|\\|")); |
|
57 |
|
|
58 |
return Arrays.asList(((String) antiPattern.getThresholds().get("searchSubstringsWithProjectPlan").getValue()).split("\\|\\|")); |
|
49 |
return Arrays.asList(thresholds.get("searchSubstringsWithProjectPlan").split("\\|\\|")); |
|
59 | 50 |
} |
60 | 51 |
|
61 | 52 |
@Override |
src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/SpecifyNothingDetectorImpl.java | ||
---|---|---|
35 | 35 |
private List<String> sqlQueries; |
36 | 36 |
|
37 | 37 |
private int getMinNumberOfWikiPagesWithSpecification(Map<String, String> thresholds) { |
38 |
if(thresholds != null) |
|
39 |
return new PositiveInteger(Integer.parseInt(thresholds.get("minNumberOfWikiPagesWithSpecification"))).intValue(); |
|
40 |
|
|
41 |
return ((PositiveInteger) antiPattern.getThresholds().get("minNumberOfWikiPagesWithSpecification").getValue()).intValue(); |
|
38 |
return new PositiveInteger(Integer.parseInt(thresholds.get("minNumberOfWikiPagesWithSpecification"))).intValue(); |
|
42 | 39 |
} |
43 | 40 |
|
44 | 41 |
private int getMinNumberOfActivitiesWithSpecification(Map<String, String> thresholds) { |
45 |
if(thresholds != null) |
|
46 |
return new PositiveInteger(Integer.parseInt(thresholds.get("minNumberOfActivitiesWithSpecification"))).intValue(); |
|
47 |
|
|
48 |
return ((PositiveInteger) antiPattern.getThresholds().get("minNumberOfActivitiesWithSpecification").getValue()).intValue(); |
|
42 |
return new PositiveInteger(Integer.parseInt(thresholds.get("minNumberOfActivitiesWithSpecification"))).intValue(); |
|
49 | 43 |
} |
50 | 44 |
|
51 | 45 |
private int getMinAvgLengthOfActivityDescription(Map<String, String> thresholds) { |
52 |
if(thresholds != null) |
|
53 |
return new PositiveInteger(Integer.parseInt(thresholds.get("minAvgLengthOfActivityDescription"))).intValue(); |
|
54 |
|
|
55 |
return ((PositiveInteger) antiPattern.getThresholds().get("minAvgLengthOfActivityDescription").getValue()).intValue(); |
|
46 |
return new PositiveInteger(Integer.parseInt(thresholds.get("minAvgLengthOfActivityDescription"))).intValue(); |
|
56 | 47 |
} |
57 | 48 |
|
58 | 49 |
private List<String> getSearchSubstringsWithProjectSpecification(Map<String, String> thresholds) { |
59 |
if(thresholds != null) |
|
60 |
return Arrays.asList(thresholds.get("searchSubstringsWithProjectSpecification").split("\\|\\|")); |
|
61 |
|
|
62 |
return Arrays.asList(((String) antiPattern.getThresholds().get("searchSubstringsWithProjectSpecification").getValue()).split("\\|\\|")); |
|
50 |
return Arrays.asList(thresholds.get("searchSubstringsWithProjectSpecification").split("\\|\\|")); |
|
63 | 51 |
} |
64 | 52 |
|
65 | 53 |
@Override |
src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/TooLongSprintDetectorImpl.java | ||
---|---|---|
54 | 54 |
} |
55 | 55 |
|
56 | 56 |
private Integer getMaxIterationLength(Map<String, String> thresholds) { |
57 |
if(thresholds != null) |
|
58 |
return new PositiveInteger(Integer.parseInt(thresholds.get("maxIterationLength"))).intValue(); |
|
59 |
|
|
60 |
return ((PositiveInteger) this.antiPattern.getThresholds().get("maxIterationLength").getValue()).intValue(); |
|
57 |
return new PositiveInteger(Integer.parseInt(thresholds.get("maxIterationLength"))).intValue(); |
|
61 | 58 |
} |
62 | 59 |
|
63 | 60 |
private Integer getMaxNumberOfTooLongIterations(Map<String, String> thresholds) { |
64 |
if(thresholds != null) |
|
65 |
return new PositiveInteger(Integer.parseInt(thresholds.get("maxNumberOfTooLongIterations"))).intValue(); |
|
66 |
|
|
67 |
return ((PositiveInteger) this.antiPattern.getThresholds().get("maxNumberOfTooLongIterations").getValue()).intValue(); |
|
61 |
return new PositiveInteger(Integer.parseInt(thresholds.get("maxNumberOfTooLongIterations"))).intValue(); |
|
68 | 62 |
} |
69 | 63 |
|
70 | 64 |
/** |
src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/VaryingSprintLengthDetectorImpl.java | ||
---|---|---|
33 | 33 |
private List<String> sqlQueries; |
34 | 34 |
|
35 | 35 |
private Integer getMaxDaysDifference(Map<String, String> thresholds) { |
36 |
if(thresholds != null) |
|
37 |
return new PositiveInteger(Integer.parseInt(thresholds.get("maxDaysDifference"))).intValue(); |
|
38 |
|
|
39 |
return ((PositiveInteger) this.antiPattern.getThresholds().get("maxDaysDifference").getValue()).intValue(); |
|
36 |
return new PositiveInteger(Integer.parseInt(thresholds.get("maxDaysDifference"))).intValue(); |
|
40 | 37 |
} |
41 | 38 |
|
42 | 39 |
private Integer getMaxIterationChanged(Map<String, String> thresholds) { |
43 |
if(thresholds != null) |
|
44 |
return new PositiveInteger(Integer.parseInt(thresholds.get("maxIterationChanged"))).intValue(); |
|
45 |
|
|
46 |
return ((PositiveInteger) this.antiPattern.getThresholds().get("maxIterationChanged").getValue()).intValue(); |
|
40 |
return new PositiveInteger(Integer.parseInt(thresholds.get("maxIterationChanged"))).intValue(); |
|
47 | 41 |
} |
48 | 42 |
|
49 | 43 |
@Override |
src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/model/Threshold.java | ||
---|---|---|
2 | 2 |
|
3 | 3 |
/** |
4 | 4 |
* Model class for threshold. |
5 |
* @param <T> threshold can have different data types |
|
6 | 5 |
*/ |
7 |
public class Threshold<T> {
|
|
6 |
public class Threshold { |
|
8 | 7 |
private String name; |
9 | 8 |
private String printName; |
10 | 9 |
private String description; |
11 | 10 |
private String errorMessage; |
11 |
private String type; |
|
12 | 12 |
private boolean isErrorMessageShown; |
13 |
private T value; |
|
14 | 13 |
|
15 |
public Threshold(String name, String printName, String description, T value) {
|
|
14 |
public Threshold(String name, String printName, String description) { |
|
16 | 15 |
this.name = name; |
17 | 16 |
this.printName = printName; |
18 | 17 |
this.description = description; |
19 |
this.value = value; |
|
20 | 18 |
this.isErrorMessageShown = false; |
21 | 19 |
} |
22 | 20 |
|
23 |
public Threshold(String name, String printName, String description, String errorMessage, T value) {
|
|
21 |
public Threshold(String name, String printName, String description, String errorMessage, String type) {
|
|
24 | 22 |
this.name = name; |
25 | 23 |
this.printName = printName; |
26 | 24 |
this.description = description; |
27 | 25 |
this.errorMessage = errorMessage; |
28 |
this.value = value;
|
|
26 |
this.type = type;
|
|
29 | 27 |
this.isErrorMessageShown = false; |
30 | 28 |
} |
31 | 29 |
|
... | ... | |
53 | 51 |
this.description = description; |
54 | 52 |
} |
55 | 53 |
|
56 |
public T getValue() { |
|
57 |
return value; |
|
58 |
} |
|
59 |
|
|
60 |
public void setValue(T value) { |
|
61 |
this.value = value; |
|
62 |
} |
|
63 |
|
|
64 | 54 |
public String getErrorMessage() { |
65 | 55 |
return errorMessage; |
66 | 56 |
} |
... | ... | |
69 | 59 |
this.errorMessage = errorMessage; |
70 | 60 |
} |
71 | 61 |
|
62 |
public String getType() { |
|
63 |
return type; |
|
64 |
} |
|
65 |
|
|
66 |
public void setType(String type) { |
|
67 |
this.type = type; |
|
68 |
} |
|
69 |
|
|
72 | 70 |
public boolean isErrorMessageShown() { |
73 | 71 |
return isErrorMessageShown; |
74 | 72 |
} |
src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/repository/AntiPatternRepository.java | ||
---|---|---|
168 | 168 |
Map<String, Threshold> APMap = new HashMap<>(); |
169 | 169 |
|
170 | 170 |
JsonNode array = node.get("thresholds"); |
171 |
Threshold<?> tmpThreshold = null;
|
|
171 |
Threshold tmpThreshold = null; |
|
172 | 172 |
|
173 | 173 |
for(int i = 0; i < array.size(); i++){ |
174 | 174 |
JsonNode tmpNode = array.get(i); |
... | ... | |
182 | 182 |
String tThresholdPrintName = thresholdNode.get("thresholdPrintName").asText(); |
183 | 183 |
String tThresholdDescription = thresholdNode.get("thresholdDescription").asText(); |
184 | 184 |
String tThresholdErrorMess = thresholdNode.get("thresholdErrorMess").asText(); |
185 |
String tThresholdValue = thresholdNode.get("thresholdValue").asText(); |
|
186 | 185 |
|
187 |
tmpThreshold = getThreshold(thresholdType, tThresholdName, tThresholdPrintName, tThresholdDescription, tThresholdErrorMess, tThresholdValue);
|
|
186 |
tmpThreshold = getThreshold(thresholdType, tThresholdName, tThresholdPrintName, tThresholdDescription, tThresholdErrorMess); |
|
188 | 187 |
|
189 | 188 |
APMap.put(thresholdName, tmpThreshold); |
190 | 189 |
} |
... | ... | |
220 | 219 |
* @param printName |
221 | 220 |
* @param description |
222 | 221 |
* @param errorMessage |
223 |
* @param value |
|
224 | 222 |
* @return |
225 | 223 |
*/ |
226 |
private Threshold<?> getThreshold(String thresholdType, String name, String printName, String description, String errorMessage, String value){
|
|
224 |
private Threshold getThreshold(String thresholdType, String name, String printName, String description, String errorMessage){
|
|
227 | 225 |
|
228 |
if(thresholdType.equals("Percentage")){ |
|
229 |
return new Threshold<>(name, printName, description, errorMessage, new Percentage(Float.parseFloat(value))); |
|
230 |
} |
|
231 |
else if(thresholdType.equals("PositiveFloat")){ |
|
232 |
return new Threshold<>(name, printName, description, errorMessage, new PositiveFloat(Float.parseFloat(value))); |
|
233 |
} |
|
234 |
else if(thresholdType.equals("PositiveInteger")){ |
|
235 |
return new Threshold<>(name, printName, description, errorMessage, new PositiveInteger(Integer.parseInt(value))); |
|
236 |
} |
|
237 |
else if(thresholdType.equals("String")){ |
|
238 |
return new Threshold<>(name, printName, description, errorMessage, value); |
|
226 |
if(thresholdType.equals("Percentage") || thresholdType.equals("PositiveFloat") || thresholdType.equals("PositiveInteger") || thresholdType.equals("String")){ |
|
227 |
return new Threshold(name, printName, description, errorMessage, thresholdType); |
|
239 | 228 |
} |
240 | 229 |
|
241 | 230 |
return null; |
src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/service/ConfigurationServiceImpl.java | ||
---|---|---|
58 | 58 |
|
59 | 59 |
for(int i = 0; i < thresholdNames.length; i++){ |
60 | 60 |
if(antiPattern.getThresholds().containsKey(thresholdNames[i])){ |
61 |
if(antiPattern.getThresholds().get(thresholdNames[i]).getValue().getClass() == Integer.class){
|
|
61 |
if(antiPattern.getThresholds().get(thresholdNames[i]).getType().equals("Integer")){
|
|
62 | 62 |
try { |
63 | 63 |
Integer.parseInt(thresholdValues[i]); |
64 | 64 |
} |
... | ... | |
66 | 66 |
incorrectParameters.add(thresholdNames[i]); |
67 | 67 |
} |
68 | 68 |
} |
69 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getValue().getClass() == Percentage.class){
|
|
69 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getType().equals("Percentage")){
|
|
70 | 70 |
try { |
71 | 71 |
Percentage.parsePercentage(thresholdValues[i]); |
72 | 72 |
} |
... | ... | |
74 | 74 |
incorrectParameters.add(thresholdNames[i]); |
75 | 75 |
} |
76 | 76 |
} |
77 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getValue().getClass() == PositiveInteger.class){
|
|
77 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getType().equals("PositiveInteger")){
|
|
78 | 78 |
try { |
79 | 79 |
PositiveInteger.parsePositiveInteger(thresholdValues[i]); |
80 | 80 |
} |
... | ... | |
82 | 82 |
incorrectParameters.add(thresholdNames[i]); |
83 | 83 |
} |
84 | 84 |
} |
85 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getValue().getClass() == PositiveFloat.class){
|
|
85 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getType().equals("PositiveFloat")){
|
|
86 | 86 |
try { |
87 | 87 |
PositiveFloat.parsePositiveFloat(thresholdValues[i]); |
88 | 88 |
} |
... | ... | |
90 | 90 |
incorrectParameters.add(thresholdNames[i]); |
91 | 91 |
} |
92 | 92 |
} |
93 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getValue().getClass() == Float.class){
|
|
93 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getType().equals("Float")){
|
|
94 | 94 |
try { |
95 | 95 |
Float.parseFloat(thresholdValues[i]); |
96 | 96 |
} |
... | ... | |
98 | 98 |
incorrectParameters.add(thresholdNames[i]); |
99 | 99 |
} |
100 | 100 |
} |
101 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getValue().getClass() == Double.class){
|
|
101 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getType().equals("Double")){
|
|
102 | 102 |
try { |
103 | 103 |
Double.parseDouble(thresholdValues[i]); |
104 | 104 |
} |
... | ... | |
106 | 106 |
incorrectParameters.add(thresholdNames[i]); |
107 | 107 |
} |
108 | 108 |
} |
109 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getValue().getClass() == String.class){
|
|
109 |
else if(antiPattern.getThresholds().get(thresholdNames[i]).getType().equals("String")){
|
|
110 | 110 |
if (Utils.checkStringSubstrings(thresholdValues[i]) == false) { |
111 | 111 |
incorrectParameters.add(thresholdNames[i]); |
112 | 112 |
} |
src/main/webapp/WEB-INF/templates/result.html | ||
---|---|---|
17 | 17 |
|
18 | 18 |
<!-- Result table container --> |
19 | 19 |
<div class="container"> |
20 |
<!-- Container for show success message --> |
|
21 |
<div class="container"> |
|
22 |
<div th:if="${isConfigurationChanged}" class="alert alert-warning" role="alert"> |
|
23 |
Configuration values have changed! Would you like to |
|
24 |
<form action="#" th:action="@{/recalculate}" method="post" style="display: inline-block"> |
|
25 |
<button type="submit" |
|
26 |
style="display: inline-block;background-color: #FEF3CD; color: #167AF6; text-decoration: underline;"> |
|
27 |
recalculate |
|
28 |
</button> |
|
29 |
</form> |
|
30 |
the results? |
|
31 |
</div> |
|
32 |
</div> |
|
33 |
<!-- ./Container for show success message --> |
|
34 | 20 |
<h1>Results</h1> |
35 | 21 |
<table class="table table-bordered table-hover"> |
36 | 22 |
<!-- Result table header --> |
src/main/webapp/antipatterns/BusinessAsUsual.json | ||
---|---|---|
11 | 11 |
"thresholdName": "divisionOfIterationsWithRetrospective", |
12 | 12 |
"thresholdPrintName": "Division of iterations with retrospective", |
13 | 13 |
"thresholdDescription": "Minimum percentage of the total number of iterations with a retrospective (0,100)", |
14 |
"thresholdErrorMess": "Percentage must be float number between 0 and 100", |
|
15 |
"thresholdValue": "66.66f" |
|
14 |
"thresholdErrorMess": "Percentage must be float number between 0 and 100" |
|
16 | 15 |
} |
17 | 16 |
}, |
18 | 17 |
{ |
... | ... | |
22 | 21 |
"thresholdName": "searchSubstringsWithRetrospective", |
23 | 22 |
"thresholdPrintName": "Search substrings with retrospective", |
24 | 23 |
"thresholdDescription": "Substring that will be search in wikipages and activities", |
25 |
"thresholdErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters || ", |
|
26 |
"thresholdValue": "%retr%||%revi%||%week%scrum%" |
|
24 |
"thresholdErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters || " |
|
27 | 25 |
} |
28 | 26 |
} |
29 | 27 |
], |
src/main/webapp/antipatterns/LongOrNonExistentFeedbackLoops.json | ||
---|---|---|
11 | 11 |
"thresholdName": "divisionOfIterationsWithFeedbackLoop", |
12 | 12 |
"thresholdPrintName": "Division of iterations with feedback loop", |
13 | 13 |
"thresholdDescription": "Minimum percentage of the total number of iterations with feedback loop (0,100)", |
14 |
"thresholdErrorMess": "Percentage must be float number between 0 and 100", |
|
15 |
"thresholdValue": "50.00f" |
|
14 |
"thresholdErrorMess": "Percentage must be float number between 0 and 100" |
|
16 | 15 |
} |
17 | 16 |
}, |
18 | 17 |
{ |
... | ... | |
22 | 21 |
"thresholdName": "maxGapBetweenFeedbackLoopRate", |
23 | 22 |
"thresholdPrintName": "Maximum gap between feedback loop rate", |
24 | 23 |
"thresholdDescription": "Value that multiplies average iteration length for given project. Result is maximum threshold value for gap between feedback loops in days.", |
25 |
"thresholdErrorMess": "Maximum gap between feedback loop rate must be positive float number", |
|
26 |
"thresholdValue": "2f" |
|
24 |
"thresholdErrorMess": "Maximum gap between feedback loop rate must be positive float number" |
|
27 | 25 |
} |
28 | 26 |
}, |
29 | 27 |
{ |
... | ... | |
33 | 31 |
"thresholdName": "searchSubstringsWithFeedbackLoop", |
34 | 32 |
"thresholdPrintName": "Search substrings with feedback loop", |
35 | 33 |
"thresholdDescription": "Substring that will be search in wikipages and activities", |
36 |
"thresholdErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters ||", |
|
37 |
"thresholdValue": "%schůz%zákazník%||%předvedení%zákazník%||%zákazn%demo%||%schůz%zadavat%||%inform%schůz%||%zákazn%||%zadavatel%" |
|
34 |
"thresholdErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters ||" |
|
38 | 35 |
} |
39 | 36 |
} |
40 | 37 |
] |
src/main/webapp/antipatterns/NinetyNinetyRule.json | ||
---|---|---|
11 | 11 |
"thresholdName": "maxDivisionRange", |
12 | 12 |
"thresholdPrintName": "Maximum ration value", |
13 | 13 |
"thresholdDescription": "Maximum ratio value of spent and estimated time", |
14 |
"thresholdErrorMess": "Ration values must be positive float number", |
|
15 |
"thresholdValue": "1.25f" |
|
14 |
"thresholdErrorMess": "Ration values must be positive float number" |
|
16 | 15 |
} |
17 | 16 |
}, |
18 | 17 |
{ |
... | ... | |
22 | 21 |
"thresholdName": "maxBadDivisionLimit", |
23 | 22 |
"thresholdPrintName": "Maximum iterations thresholds", |
24 | 23 |
"thresholdDescription": "Maximum number of consecutive iterations where the thresholds were exceeded", |
25 |
"thresholdErrorMess": "Maximum number of consecutive iterations must be positive integer number", |
|
26 |
"thresholdValue": "2" |
|
24 |
"thresholdErrorMess": "Maximum number of consecutive iterations must be positive integer number" |
|
27 | 25 |
} |
28 | 26 |
} |
29 | 27 |
] |
src/main/webapp/antipatterns/RoadToNowhere.json | ||
---|---|---|
11 | 11 |
"thresholdName": "minNumberOfWikiPagesWithProjectPlan", |
12 | 12 |
"thresholdPrintName": "Minimum number of wiki pages with project plan", |
13 | 13 |
"thresholdDescription": "Number of wiki pages", |
14 |
"thresholdErrorMess": "Minimum number of wikipages must be positive integer number", |
|
15 |
"thresholdValue": "1" |
|
14 |
"thresholdErrorMess": "Minimum number of wikipages must be positive integer number" |
|
16 | 15 |
} |
17 | 16 |
}, |
18 | 17 |
{ |
... | ... | |
22 | 21 |
"thresholdName": "minNumberOfActivitiesWithProjectPlan", |
23 | 22 |
"thresholdPrintName": "Minimum number of activities with project plan", |
24 | 23 |
"thresholdDescription": "Number of activities", |
25 |
"thresholdErrorMess": "Minimum number of activities must be positive integer number", |
|
26 |
"thresholdValue": "1" |
|
24 |
"thresholdErrorMess": "Minimum number of activities must be positive integer number" |
|
27 | 25 |
} |
28 | 26 |
}, |
29 | 27 |
{ |
... | ... | |
33 | 31 |
"thresholdName": "searchSubstringsWithProjectPlan", |
34 | 32 |
"thresholdPrintName": "Search substrings with project plan", |
35 | 33 |
"thresholdDescription": "Substring that will be search in wikipages and activities", |
36 |
"thresholdErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters ||", |
|
37 |
"thresholdValue": "%plán projektu%||%project plan%||%plan project%||%projektový plán%" |
|
34 |
"thresholdErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters ||" |
|
38 | 35 |
} |
39 | 36 |
} |
40 | 37 |
], |
src/main/webapp/antipatterns/SpecifyNothing.json | ||
---|---|---|
11 | 11 |
"thresholdName": "minNumberOfWikiPagesWithSpecification", |
12 | 12 |
"thresholdPrintName": "Minimum number of wiki pages with project specification", |
13 | 13 |
"thresholdDescription": "Number of wiki pages", |
14 |
"thresholdErrorMess": "Minimum number of wikipages must be positive integer number", |
|
15 |
"thresholdValue": "1" |
|
14 |
"thresholdErrorMess": "Minimum number of wikipages must be positive integer number" |
|
16 | 15 |
} |
17 | 16 |
}, |
18 | 17 |
{ |
... | ... | |
22 | 21 |
"thresholdName": "minNumberOfActivitiesWithSpecification", |
23 | 22 |
"thresholdPrintName": "Minimum number of activities with project specification", |
24 | 23 |
"thresholdDescription": "Number of activities", |
25 |
"thresholdErrorMess": "Minimum number of activities with project specification must be positive integer number", |
|
26 |
"thresholdValue": "1" |
|
24 |
"thresholdErrorMess": "Minimum number of activities with project specification must be positive integer number" |
|
27 | 25 |
} |
28 | 26 |
}, |
29 | 27 |
{ |
... | ... | |
33 | 31 |
"thresholdName": "minAvgLengthOfActivityDescription", |
34 | 32 |
"thresholdPrintName": "Minimum average length of activity description", |
35 | 33 |
"thresholdDescription": "Minimum average number of character of activity description", |
36 |
"thresholdErrorMess": "Minimum average length of activity description must be positive integer number", |
|
37 |
"thresholdValue": "150" |
|
34 |
"thresholdErrorMess": "Minimum average length of activity description must be positive integer number" |
|
38 | 35 |
} |
39 | 36 |
}, |
40 | 37 |
{ |
... | ... | |
44 | 41 |
"thresholdName": "searchSubstringsWithProjectSpecification", |
45 | 42 |
"thresholdPrintName": "Search substrings with project specification", |
46 | 43 |
"thresholdDescription": "Substring that will be search in wikipages and activities", |
47 |
"thresholdErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters ||", |
|
48 |
"thresholdValue": "%dsp%||%specifikace%||%specification%||%vize%proj%||%vize%produ%" |
|
44 |
"thresholdErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters ||" |
|
49 | 45 |
} |
50 | 46 |
} |
51 | 47 |
], |
src/main/webapp/antipatterns/TooLongSprint.json | ||
---|---|---|
11 | 11 |
"thresholdName": "maxIterationLength", |
12 | 12 |
"thresholdPrintName": "Max Iteration Length", |
13 | 13 |
"thresholdDescription": "Maximum iteration length in days", |
14 |
"thresholdErrorMess": "Max iteration length must be positive integer", |
|
15 |
"thresholdValue": "21" |
|
14 |
"thresholdErrorMess": "Max iteration length must be positive integer" |
|
16 | 15 |
} |
17 | 16 |
}, |
18 | 17 |
{ |
... | ... | |
22 | 21 |
"thresholdName": "maxNumberOfTooLongIterations", |
23 | 22 |
"thresholdPrintName": "Max number of foo long iterations", |
24 | 23 |
"thresholdDescription": "Maximum number of too long iterations in project", |
25 |
"thresholdErrorMess": "Max number of too long iterations must be positive integer", |
|
26 |
"thresholdValue": "0" |
|
24 |
"thresholdErrorMess": "Max number of too long iterations must be positive integer" |
|
27 | 25 |
} |
28 | 26 |
} |
29 | 27 |
] |
src/main/webapp/antipatterns/VaryingSprintLength.json | ||
---|---|---|
11 | 11 |
"thresholdName": "maxDaysDifference", |
12 | 12 |
"thresholdPrintName": "Max days difference", |
13 | 13 |
"thresholdDescription": "Maximum distance of two consecutive iterations in days", |
14 |
"thresholdErrorMess": "Maximum distance must be positive integer number", |
|
15 |
"thresholdValue": "7" |
|
14 |
"thresholdErrorMess": "Maximum distance must be positive integer number" |
|
16 | 15 |
} |
17 | 16 |
}, |
18 | 17 |
{ |
... | ... | |
22 | 21 |
"thresholdName": "maxIterationChanged", |
23 | 22 |
"thresholdPrintName": "Max number of iteration changed", |
24 | 23 |
"thresholdDescription": "Maximum allowed number of significant changes in iteration lengths", |
25 |
"thresholdErrorMess": "Maximum number of iterations changed must be positive integer number", |
|
26 |
"thresholdValue": "1" |
|
24 |
"thresholdErrorMess": "Maximum number of iterations changed must be positive integer number" |
|
27 | 25 |
} |
28 | 26 |
} |
29 | 27 |
] |
Také k dispozici: Unified diff
#14 Unused parts of code removed