commit e46d554ad2f0f3831983d2f05ae2eb8562533ade
Author: stepanekp <1stepanekpetr@gmail.com>
Date:   Wed Mar 16 20:26:19 2022 +0100

    Configurations of antipatterns moved to separate json files

diff --git a/pom.xml b/pom.xml
index cba794d..195c36b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,6 +56,17 @@
 			<artifactId>jsoup</artifactId>
 			<version>1.14.3</version>
 		</dependency>
+		<!-- Jackson libraries for parsing json files -->
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-core</artifactId>
+			<version>2.13.2</version>
+		</dependency>
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-databind</artifactId>
+			<version>2.13.2</version>
+		</dependency>
 	</dependencies>
 
 	<build>
diff --git a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/BusinessAsUsualDetectorImpl.java b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/BusinessAsUsualDetectorImpl.java
index fdabd90..e806382 100644
--- a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/BusinessAsUsualDetectorImpl.java
+++ b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/BusinessAsUsualDetectorImpl.java
@@ -5,35 +5,23 @@ import cz.zcu.fav.kiv.antipatterndetectionapp.detecting.DatabaseConnection;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.*;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.Percentage;
 import cz.zcu.fav.kiv.antipatterndetectionapp.utils.Utils;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.*;
 
+
 public class BusinessAsUsualDetectorImpl implements AntiPatternDetector {
 
     private final Logger LOGGER = LoggerFactory.getLogger(BusinessAsUsualDetectorImpl.class);
 
-    private final AntiPattern antiPattern = new AntiPattern(3L,
-            "Business As Usual",
-            "BusinessAsUsual",
-            "Absence of a retrospective after individual " +
-                    "iterations or after the completion project.",
-            new HashMap<>() {{
-                put("divisionOfIterationsWithRetrospective", new Configuration<Percentage>("divisionOfIterationsWithRetrospective",
-                        "Division of iterations with retrospective",
-                        "Minimum percentage of the total number of iterations with a retrospective (0,100)",
-                        "Percentage must be float number between 0 and 100",
-                        new Percentage(66.66f)));
-                put("searchSubstringsWithRetrospective", new Configuration<String>("searchSubstringsWithRetrospective",
-                        "Search substrings with retrospective",
-                        "Substring that will be search in wikipages and activities",
-                        "Maximum number of substrings is ten and must not starts and ends with characters || ",
-                        "%retr%" + Constants.SUBSTRING_DELIMITER +
-                                "%revi%" + Constants.SUBSTRING_DELIMITER +
-                                "%week%scrum%"));
-            }},
-            "Business_As_Usual.md");
+    private AntiPatternService antiPatternService = new AntiPatternServiceImpl();
+
+    public final String configJsonFileName = "BusinessAsUsual.json";
+
+    private AntiPattern antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
 
     private final List<String> SQL_FILE_NAMES = Arrays.asList(
             "set_project_id.sql",
@@ -45,15 +33,18 @@ public class BusinessAsUsualDetectorImpl implements AntiPatternDetector {
     private List<String> sqlQueries;
 
     private float getDivisionOfIterationsWithRetrospective() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((Percentage) antiPattern.getConfigurations().get("divisionOfIterationsWithRetrospective").getValue()).getValue();
     }
 
     private List<String> getSearchSubstringsWithRetrospective() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return Arrays.asList(((String) antiPattern.getConfigurations().get("searchSubstringsWithRetrospective").getValue()).split("\\|\\|"));
     }
 
     @Override
     public AntiPattern getAntiPatternModel() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return this.antiPattern;
     }
 
diff --git a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/LongOrNonExistentFeedbackLoopsDetectorImpl.java b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/LongOrNonExistentFeedbackLoopsDetectorImpl.java
index b7e0d9b..2bb59ba 100644
--- a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/LongOrNonExistentFeedbackLoopsDetectorImpl.java
+++ b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/LongOrNonExistentFeedbackLoopsDetectorImpl.java
@@ -5,6 +5,8 @@ import cz.zcu.fav.kiv.antipatterndetectionapp.detecting.DatabaseConnection;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.*;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.Percentage;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.PositiveFloat;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternService;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternServiceImpl;
 import cz.zcu.fav.kiv.antipatterndetectionapp.utils.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -17,39 +19,11 @@ public class LongOrNonExistentFeedbackLoopsDetectorImpl implements AntiPatternDe
 
     private final Logger LOGGER = LoggerFactory.getLogger(LongOrNonExistentFeedbackLoopsDetectorImpl.class);
 
-    private final AntiPattern antiPattern = new AntiPattern(6L,
-            "Long Or Non Existent Feedback Loops",
-            "LongOrNonExistentFeedbackLoops",
-            "Long spacings between customer feedback or no feedback. The customer " +
-                    "enters the project and sees the final result. In the end, the customer " +
-                    "may not get what he really wanted. With long intervals of feedback, " +
-                    "some misunderstood functionality can be created and we have to spend " +
-                    "a lot of effort and time to redo it. ",
-            new HashMap<>() {{
-                put("divisionOfIterationsWithFeedbackLoop", new Configuration<Percentage>("divisionOfIterationsWithFeedbackLoop",
-                        "Division of iterations with feedback loop",
-                        "Minimum percentage of the total number of iterations with feedback loop (0,100)",
-                        "Percentage must be float number between 0 and 100",
-                        new Percentage(50.00f)));
-                put("maxGapBetweenFeedbackLoopRate", new Configuration<PositiveFloat>("maxGapBetweenFeedbackLoopRate",
-                        "Maximum gap between feedback loop rate",
-                        "Value that multiplies average iteration length for given project. Result" +
-                                " is maximum threshold value for gap between feedback loops in days.",
-                        "Maximum gap between feedback loop rate must be positive float number",
-                        new PositiveFloat(2f)));
-                put("searchSubstringsWithFeedbackLoop", new Configuration<String>("searchSubstringsWithFeedbackLoop",
-                        "Search substrings with feedback loop",
-                        "Substring that will be search in wikipages and activities",
-                        "Maximum number of substrings is ten and must not starts and ends with characters ||",
-                        "%schůz%zákazník%" + Constants.SUBSTRING_DELIMITER +
-                                "%předvedení%zákazník%" + Constants.SUBSTRING_DELIMITER +
-                                "%zákazn%demo%" + Constants.SUBSTRING_DELIMITER +
-                                "%schůz%zadavat%" + Constants.SUBSTRING_DELIMITER +
-                                "%inform%schůz%" + Constants.SUBSTRING_DELIMITER +
-                                "%zákazn%" + Constants.SUBSTRING_DELIMITER +
-                                "%zadavatel%"));
-            }}
-    );
+    private AntiPatternService antiPatternService = new AntiPatternServiceImpl();
+
+    public final String configJsonFileName = "LongOrNonExistentFeedbackLoops.json";
+
+    private AntiPattern antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
 
     private final List<String> SQL_FILE_NAMES = Arrays.asList(
             "set_project_id.sql",
@@ -65,19 +39,23 @@ public class LongOrNonExistentFeedbackLoopsDetectorImpl implements AntiPatternDe
     private List<String> sqlQueries;
 
     private float getDivisionOfIterationsWithFeedbackLoop() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((Percentage) antiPattern.getConfigurations().get("divisionOfIterationsWithFeedbackLoop").getValue()).getValue();
     }
 
     private float getMaxGapBetweenFeedbackLoopRate() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveFloat) antiPattern.getConfigurations().get("maxGapBetweenFeedbackLoopRate").getValue()).floatValue();
     }
 
     private List<String> getSearchSubstringsWithFeedbackLoop() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return Arrays.asList(((String) antiPattern.getConfigurations().get("searchSubstringsWithFeedbackLoop").getValue()).split("\\|\\|"));
     }
 
     @Override
     public AntiPattern getAntiPatternModel() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return this.antiPattern;
     }
 
diff --git a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/NinetyNinetyRuleDetectorImpl.java b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/NinetyNinetyRuleDetectorImpl.java
index 5b227d8..4e129a0 100644
--- a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/NinetyNinetyRuleDetectorImpl.java
+++ b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/NinetyNinetyRuleDetectorImpl.java
@@ -4,6 +4,8 @@ import cz.zcu.fav.kiv.antipatterndetectionapp.detecting.DatabaseConnection;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.*;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.PositiveFloat;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.PositiveInteger;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternService;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternServiceImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -13,26 +15,11 @@ public class NinetyNinetyRuleDetectorImpl implements AntiPatternDetector {
 
     private final Logger LOGGER = LoggerFactory.getLogger(BusinessAsUsualDetectorImpl.class);
 
-    private final AntiPattern antiPattern = new AntiPattern(7L,
-            "Ninety Ninety Rule",
-            "NinetyNinetyRule",
-            "The first 90 percent of the code represents the first 90 percent of development time. The " +
-                    "remaining 10 percent of the code represents another 90 percent of development time. " +
-                    "Then decide on a long delay of the project compared to the original estimate. " +
-                    "The functionality is almost done, some number is already closed and is only waiting " +
-                    "for one activity to close, but it has been open for a long time.",
-            new HashMap<>() {{
-                put("maxDivisionRange", new Configuration<PositiveFloat>("maxDivisionRange",
-                        "Maximum ration value",
-                        "Maximum ratio value of spent and estimated time",
-                        "Ration values must be positive float number",
-                        new PositiveFloat(1.25f)));
-                put("maxBadDivisionLimit", new Configuration<PositiveInteger>("maxBadDivisionLimit",
-                        "Maximum iterations thresholds",
-                        "Maximum number of consecutive iterations where the thresholds were exceeded",
-                        "Maximum number of consecutive iterations must be positive integer number",
-                        new PositiveInteger(2)));
-            }});
+    private AntiPatternService antiPatternService = new AntiPatternServiceImpl();
+
+    public final String configJsonFileName = "NinetyNinetyRule.json";
+
+    private AntiPattern antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
 
     private final List<String> SQL_FILE_NAMES = Arrays.asList(
             "set_project_id.sql",
@@ -42,15 +29,18 @@ public class NinetyNinetyRuleDetectorImpl implements AntiPatternDetector {
     private List<String> sqlQueries;
 
     private double getMaxDivisionRange() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveFloat) antiPattern.getConfigurations().get("maxDivisionRange").getValue()).doubleValue();
     }
 
     private int getMaxBadDivisionLimit() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveInteger) antiPattern.getConfigurations().get("maxBadDivisionLimit").getValue()).intValue();
     }
 
     @Override
     public AntiPattern getAntiPatternModel() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return this.antiPattern;
     }
 
diff --git a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/RoadToNowhereDetectorImpl.java b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/RoadToNowhereDetectorImpl.java
index a203e05..6e0b4d3 100644
--- a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/RoadToNowhereDetectorImpl.java
+++ b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/RoadToNowhereDetectorImpl.java
@@ -4,6 +4,8 @@ import cz.zcu.fav.kiv.antipatterndetectionapp.Constants;
 import cz.zcu.fav.kiv.antipatterndetectionapp.detecting.DatabaseConnection;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.*;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.PositiveInteger;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternService;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternServiceImpl;
 import cz.zcu.fav.kiv.antipatterndetectionapp.utils.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -19,33 +21,11 @@ public class RoadToNowhereDetectorImpl implements AntiPatternDetector {
 
     private final Logger LOGGER = LoggerFactory.getLogger(SpecifyNothingDetectorImpl.class);
 
-    private final AntiPattern antiPattern = new AntiPattern(5L,
-            "Road To Nowhere",
-            "RoadToNowhere",
-            "The project is not sufficiently planned and therefore " +
-                    "takes place on an ad hoc basis with an uncertain " +
-                    "outcome and deadline. There is no project plan in the project.",
-            new HashMap<>() {{
-                put("minNumberOfWikiPagesWithProjectPlan", new Configuration<PositiveInteger>("minNumberOfWikiPagesWithProjectPlan",
-                        "Minimum number of wiki pages with project plan",
-                        "Number of wiki pages",
-                        "Minimum number of wikipages must be positive integer number",
-                        new PositiveInteger(1)));
-                put("minNumberOfActivitiesWithProjectPlan", new Configuration<PositiveInteger>("minNumberOfActivitiesWithProjectPlan",
-                        "Minimum number of activities with project plan",
-                        "Number of activities",
-                        "Minimum number of activities must be positive integer number",
-                        new PositiveInteger(1)));
-                put("searchSubstringsWithProjectPlan", new Configuration<String>("searchSubstringsWithProjectPlan",
-                        "Search substrings with project plan",
-                        "Substring that will be search in wikipages and activities",
-                        "Maximum number of substrings is ten and must not starts and ends with characters ||",
-                        "%plán projektu%" + Constants.SUBSTRING_DELIMITER +
-                                "%project plan%" + Constants.SUBSTRING_DELIMITER +
-                                "%plan project%" + Constants.SUBSTRING_DELIMITER +
-                                "%projektový plán%"));
-            }},
-            "Road_To_Nowhere.md");
+    private AntiPatternService antiPatternService = new AntiPatternServiceImpl();
+
+    public final String configJsonFileName = "RoadToNowhere.json";
+
+    private AntiPattern antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
 
     private final List<String> SQL_FILE_NAMES = Arrays.asList(
             "set_project_id.sql",
@@ -59,19 +39,23 @@ public class RoadToNowhereDetectorImpl implements AntiPatternDetector {
     private List<String> sqlQueries;
 
     private int getMinNumberOfWikiPagesWithProjectPlan() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveInteger) antiPattern.getConfigurations().get("minNumberOfWikiPagesWithProjectPlan").getValue()).intValue();
     }
 
     private int getMinNumberOfActivitiesWithProjectPlan() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveInteger) antiPattern.getConfigurations().get("minNumberOfActivitiesWithProjectPlan").getValue()).intValue();
     }
 
     private List<String> getSearchSubstringsWithProjectPlan() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return Arrays.asList(((String) antiPattern.getConfigurations().get("searchSubstringsWithProjectPlan").getValue()).split("\\|\\|"));
     }
 
     @Override
     public AntiPattern getAntiPatternModel() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return this.antiPattern;
     }
 
diff --git a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/SpecifyNothingDetectorImpl.java b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/SpecifyNothingDetectorImpl.java
index 11d216b..1369e0a 100644
--- a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/SpecifyNothingDetectorImpl.java
+++ b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/SpecifyNothingDetectorImpl.java
@@ -4,6 +4,8 @@ import cz.zcu.fav.kiv.antipatterndetectionapp.Constants;
 import cz.zcu.fav.kiv.antipatterndetectionapp.detecting.DatabaseConnection;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.*;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.PositiveInteger;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternService;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternServiceImpl;
 import cz.zcu.fav.kiv.antipatterndetectionapp.utils.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -19,38 +21,11 @@ public class SpecifyNothingDetectorImpl implements AntiPatternDetector {
 
     private final Logger LOGGER = LoggerFactory.getLogger(SpecifyNothingDetectorImpl.class);
 
-    private final AntiPattern antiPattern = new AntiPattern(4L,
-            "Specify Nothing",
-            "SpecifyNothing",
-            "The specification is not done intentionally. Programmers are " +
-                    "expected to work better without written specifications.",
-            new HashMap<>() {{
-                put("minNumberOfWikiPagesWithSpecification", new Configuration<PositiveInteger>("minNumberOfWikiPagesWithSpecification",
-                        "Minimum number of wiki pages with project specification",
-                        "Number of wiki pages",
-                        "Minimum number of wikipages must be positive integer number",
-                        new PositiveInteger(1)));
-                put("minNumberOfActivitiesWithSpecification", new Configuration<PositiveInteger>("minNumberOfActivitiesWithSpecification",
-                        "Minimum number of activities with project specification",
-                        "Number of activities",
-                        "Minimum number of activities with project specification must be positive integer number",
-                        new PositiveInteger(1)));
-                put("minAvgLengthOfActivityDescription", new Configuration<PositiveInteger>("minAvgLengthOfActivityDescription",
-                        "Minimum average length of activity description",
-                        "Minimum average number of character of activity description",
-                        "Minimum average length of activity description must be positive integer number",
-                        new PositiveInteger(150)));
-                put("searchSubstringsWithProjectSpecification", new Configuration<String>("searchSubstringsWithProjectSpecification",
-                        "Search substrings with project specification",
-                        "Substring that will be search in wikipages and activities",
-                        "Maximum number of substrings is ten and must not starts and ends with characters ||",
-                        "%dsp%" + Constants.SUBSTRING_DELIMITER +
-                                "%specifikace%" + Constants.SUBSTRING_DELIMITER +
-                                "%specification%" + Constants.SUBSTRING_DELIMITER +
-                                "%vize%proj%" + Constants.SUBSTRING_DELIMITER +
-                                "%vize%produ%"));
-            }},
-            "Specify_Nothing.md");
+    private AntiPatternService antiPatternService = new AntiPatternServiceImpl();
+
+    public final String configJsonFileName = "SpecifyNothing.json";
+
+    private AntiPattern antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
 
     private final List<String> SQL_FILE_NAMES = Arrays.asList(
             "set_project_id.sql",
@@ -63,23 +38,28 @@ public class SpecifyNothingDetectorImpl implements AntiPatternDetector {
     private List<String> sqlQueries;
 
     private int getMinNumberOfWikiPagesWithSpecification() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveInteger) antiPattern.getConfigurations().get("minNumberOfWikiPagesWithSpecification").getValue()).intValue();
     }
 
     private int getMinNumberOfActivitiesWithSpecification() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveInteger) antiPattern.getConfigurations().get("minNumberOfActivitiesWithSpecification").getValue()).intValue();
     }
 
     private int getMinAvgLengthOfActivityDescription() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveInteger) antiPattern.getConfigurations().get("minAvgLengthOfActivityDescription").getValue()).intValue();
     }
 
     private List<String> getSearchSubstringsWithProjectSpecification() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return Arrays.asList(((String) antiPattern.getConfigurations().get("searchSubstringsWithProjectSpecification").getValue()).split("\\|\\|"));
     }
 
     @Override
     public AntiPattern getAntiPatternModel() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return this.antiPattern;
     }
 
diff --git a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/TooLongSprintDetectorImpl.java b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/TooLongSprintDetectorImpl.java
index a8fa4e4..fac58b1 100644
--- a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/TooLongSprintDetectorImpl.java
+++ b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/TooLongSprintDetectorImpl.java
@@ -3,6 +3,8 @@ package cz.zcu.fav.kiv.antipatterndetectionapp.detecting.detectors;
 import cz.zcu.fav.kiv.antipatterndetectionapp.detecting.DatabaseConnection;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.*;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.PositiveInteger;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternService;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternServiceImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -12,27 +14,11 @@ public class TooLongSprintDetectorImpl implements AntiPatternDetector {
 
     private final Logger LOGGER = LoggerFactory.getLogger(TooLongSprintDetectorImpl.class);
 
-    private final AntiPattern antiPattern = new AntiPattern(1L,
-            "Too Long Sprint",
-            "TooLongSprint",
-            "Iterations too long. (ideal iteration length is about 1-2 weeks, " +
-                    "maximum 3 weeks). It could also be detected here if the length " +
-                    "of the iteration does not change often (It can change at the " +
-                    "beginning and at the end of the project, but it should not " +
-                    "change in the already started project).",
-            new HashMap<>() {{
-                put("maxIterationLength", new Configuration<PositiveInteger>("maxIterationLength",
-                        "Max Iteration Length",
-                        "Maximum iteration length in days",
-                        "Max iteration length must be positive integer",
-                        new PositiveInteger(21)));
-                put("maxNumberOfTooLongIterations", new Configuration<PositiveInteger>("maxNumberOfTooLongIterations",
-                        "Max number of foo long iterations",
-                        "Maximum number of too long iterations in project",
-                        "Max number of too long iterations must be positive integer",
-                        new PositiveInteger(0)));
-            }}
-    );
+    private AntiPatternService antiPatternService = new AntiPatternServiceImpl();
+
+    public final String configJsonFileName = "TooLongSprint.json";
+
+    private AntiPattern antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
 
     private final List<String> SQL_FILE_NAMES = Arrays.asList(
             "set_project_id.sql",
@@ -45,6 +31,7 @@ public class TooLongSprintDetectorImpl implements AntiPatternDetector {
 
     @Override
     public AntiPattern getAntiPatternModel() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return this.antiPattern;
     }
 
@@ -60,10 +47,12 @@ public class TooLongSprintDetectorImpl implements AntiPatternDetector {
     }
 
     private Integer getMaxIterationLength() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveInteger) this.antiPattern.getConfigurations().get("maxIterationLength").getValue()).intValue();
     }
 
     private Integer getMaxNumberOfTooLongIterations() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveInteger) this.antiPattern.getConfigurations().get("maxNumberOfTooLongIterations").getValue()).intValue();
     }
 
diff --git a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/VaryingSprintLengthDetectorImpl.java b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/VaryingSprintLengthDetectorImpl.java
index 73fe812..c73ee0f 100644
--- a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/VaryingSprintLengthDetectorImpl.java
+++ b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/detecting/detectors/VaryingSprintLengthDetectorImpl.java
@@ -3,6 +3,8 @@ package cz.zcu.fav.kiv.antipatterndetectionapp.detecting.detectors;
 import cz.zcu.fav.kiv.antipatterndetectionapp.detecting.DatabaseConnection;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.*;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.PositiveInteger;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternService;
+import cz.zcu.fav.kiv.antipatterndetectionapp.service.AntiPatternServiceImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -17,26 +19,11 @@ public class VaryingSprintLengthDetectorImpl implements AntiPatternDetector {
 
     private final Logger LOGGER = LoggerFactory.getLogger(VaryingSprintLengthDetectorImpl.class);
 
-    private final AntiPattern antiPattern = new AntiPattern(2L,
-            "Varying Sprint Length",
-            "VaryingSprintLength",
-            "The length of the sprint changes very often. " +
-                    "It is clear that iterations will be different " +
-                    "lengths at the beginning and end of the project, " +
-                    "but the length of the sprint should not change " +
-                    "during the project.",
-            new HashMap<>() {{
-                put("maxDaysDifference", new Configuration<PositiveInteger>("maxDaysDifference",
-                        "Max days difference",
-                        "Maximum distance of two consecutive iterations in days",
-                        "Maximum distance must be positive integer number",
-                        new PositiveInteger(7)));
-                put("maxIterationChanged", new Configuration<PositiveInteger>("maxIterationChanged",
-                        "Max number of iteration changed",
-                        "Maximum allowed number of significant changes in iteration lengths",
-                        "Maximum number of iterations changed must be positive integer number",
-                        new PositiveInteger(1)));
-            }});
+    private AntiPatternService antiPatternService = new AntiPatternServiceImpl();
+
+    public final String configJsonFileName = "VaryingSprintLength.json";
+
+    private AntiPattern antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
 
     private final List<String> SQL_FILE_NAMES = Arrays.asList(
             "set_project_id.sql",
@@ -48,15 +35,18 @@ public class VaryingSprintLengthDetectorImpl implements AntiPatternDetector {
     private List<String> sqlQueries;
 
     private Integer getMaxDaysDifference() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveInteger) this.antiPattern.getConfigurations().get("maxDaysDifference").getValue()).intValue();
     }
 
     private Integer getMaxIterationChanged() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return ((PositiveInteger) this.antiPattern.getConfigurations().get("maxIterationChanged").getValue()).intValue();
     }
 
     @Override
     public AntiPattern getAntiPatternModel() {
+        this.antiPattern = antiPatternService.getAntiPatternFromJsonFile(configJsonFileName);
         return this.antiPattern;
     }
 
diff --git a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/service/AntiPatternService.java b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/service/AntiPatternService.java
index d126021..9195eb0 100644
--- a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/service/AntiPatternService.java
+++ b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/service/AntiPatternService.java
@@ -37,4 +37,6 @@ public interface AntiPatternService {
     List<AntiPattern> setErrorMessages(List<AntiPattern> antiPatterns, List<String> wrongParameters);
 
     AntiPattern setErrorMessages(AntiPattern antiPattern, List<String> wrongParameters);
+
+    AntiPattern getAntiPatternFromJsonFile(String fileName);
 }
diff --git a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/service/AntiPatternServiceImpl.java b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/service/AntiPatternServiceImpl.java
index f71363d..474b947 100644
--- a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/service/AntiPatternServiceImpl.java
+++ b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/service/AntiPatternServiceImpl.java
@@ -1,5 +1,6 @@
 package cz.zcu.fav.kiv.antipatterndetectionapp.service;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import cz.zcu.fav.kiv.antipatterndetectionapp.detecting.detectors.AntiPatternDetector;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.AntiPattern;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.CacheablesValues;
@@ -9,14 +10,16 @@ import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.Percentage;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.PositiveFloat;
 import cz.zcu.fav.kiv.antipatterndetectionapp.model.types.PositiveInteger;
 import cz.zcu.fav.kiv.antipatterndetectionapp.repository.AntiPatternRepository;
+import cz.zcu.fav.kiv.antipatterndetectionapp.utils.JsonParser;
 import cz.zcu.fav.kiv.antipatterndetectionapp.utils.Utils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.FileSystemResource;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.*;
 
 
 @Service
@@ -199,4 +202,69 @@ public class AntiPatternServiceImpl implements AntiPatternService {
         antiPatterns.add(antiPattern);
         return setErrorMessages(antiPatterns, wrongParameters).get(0);
     }
+
+    @Override
+    public AntiPattern getAntiPatternFromJsonFile(String jsonFileName){
+        String json = "";   // json configuration file
+        JsonNode node = null;
+        try {
+            json = new String(Files.readAllBytes(Paths.get(new FileSystemResource("").getFile().getAbsolutePath() + "\\src\\main\\webapp\\antipatterns\\" + jsonFileName)));
+            node = JsonParser.parse(json);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        Long APid = Long.parseLong(node.get("id").asText());
+        String APPrintName = node.get("printName").asText();
+        String APName = node.get("name").asText();
+        String APDescription = node.get("description").asText();
+        String APCatalogueFileName = node.get("catalogueFileName") != null ? node.get("catalogueFileName").asText() : null;
+
+        Map<String, Configuration> APMap = new HashMap<>();
+        
+        JsonNode array = node.get("configurations");
+        Configuration<?> tmpConfig = null;
+
+        for(int i = 0; i < array.size(); i++){
+            JsonNode tmpNode = array.get(i);
+
+            String configName = tmpNode.get("configName").asText();
+            String configType = tmpNode.get("configType").asText();
+
+            JsonNode configNode = tmpNode.get("configuration");
+
+            String CConfigName = configNode.get("configName").asText();
+            String CConfigPrintName = configNode.get("configPrintName").asText();
+            String CConfigDescription = configNode.get("configDescription").asText();
+            String CConfigErrorMess = configNode.get("configErrorMess").asText();
+            String CConfigValue = configNode.get("configValue").asText();
+
+            tmpConfig = getConfiguration(configType, CConfigName, CConfigPrintName, CConfigDescription, CConfigErrorMess, CConfigValue);
+
+            APMap.put(configName, tmpConfig);
+        }
+
+        AntiPattern newAP = new AntiPattern(APid, APPrintName, APName, APDescription, APMap, APCatalogueFileName);
+
+        return newAP;
+    }
+
+    private Configuration<?> getConfiguration(String configType, String name, String printName, String description, String errorMessage, String value){
+
+        if(configType.equals("Percentage")){
+            return new Configuration<>(name, printName, description, errorMessage, new Percentage(Float.parseFloat(value)));
+        }
+        else if(configType.equals("PositiveFloat")){
+            return new Configuration<>(name, printName, description, errorMessage, new PositiveFloat(Float.parseFloat(value)));
+        }
+        else if(configType.equals("PositiveInteger")){
+            return new Configuration<>(name, printName, description, errorMessage, new PositiveInteger(Integer.parseInt(value)));
+        }
+        else if(configType.equals("String")){
+            return new Configuration<>(name, printName, description, errorMessage, value);
+        }
+
+        return null;
+    }
+
 }
diff --git a/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/utils/JsonParser.java b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/utils/JsonParser.java
new file mode 100644
index 0000000..3a24069
--- /dev/null
+++ b/src/main/java/cz/zcu/fav/kiv/antipatterndetectionapp/utils/JsonParser.java
@@ -0,0 +1,23 @@
+package cz.zcu.fav.kiv.antipatterndetectionapp.utils;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+
+public class JsonParser {
+
+    private static ObjectMapper objectMapper = getDefaultObjectMapper();
+
+    public static ObjectMapper getDefaultObjectMapper() {
+        ObjectMapper defObjectMapper = new ObjectMapper();
+
+        /* possible modification of ObjectMapper could be placed here */
+
+        return defObjectMapper;
+    }
+
+    public static JsonNode parse(String src) throws IOException {
+        return objectMapper.readTree(src);
+    }
+}
diff --git a/src/main/webapp/antipatterns/BusinessAsUsual.json b/src/main/webapp/antipatterns/BusinessAsUsual.json
new file mode 100644
index 0000000..e4b2bf2
--- /dev/null
+++ b/src/main/webapp/antipatterns/BusinessAsUsual.json
@@ -0,0 +1,31 @@
+{
+    "id": "3",
+    "printName": "Business As Usual",
+    "name": "BusinessAsUsual",
+    "description": "Absence of a retrospective after individual iterations or after the completion project.",
+    "configurations": [
+        {
+            "configName": "divisionOfIterationsWithRetrospective",
+            "configType": "Percentage",
+            "configuration": {
+                "configName": "divisionOfIterationsWithRetrospective",
+                "configPrintName": "Division of iterations with retrospective",
+                "configDescription": "Minimum percentage of the total number of iterations with a retrospective (0,100)",
+                "configErrorMess": "Percentage must be float number between 0 and 100",
+                "configValue": "66.66f"
+            }
+        },
+        {
+            "configName": "searchSubstringsWithRetrospective",
+            "configType": "String",
+            "configuration": {
+                "configName": "searchSubstringsWithRetrospective",
+                "configPrintName": "Search substrings with retrospective",
+                "configDescription": "Substring that will be search in wikipages and activities",
+                "configErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters || ",
+                "configValue": "%retr%||%revi%||%week%scrum%"
+            }
+        }
+    ],
+    "catalogueFileName": "Business_As_Usual.md"
+}
\ No newline at end of file
diff --git a/src/main/webapp/antipatterns/LongOrNonExistentFeedbackLoops.json b/src/main/webapp/antipatterns/LongOrNonExistentFeedbackLoops.json
new file mode 100644
index 0000000..40761d7
--- /dev/null
+++ b/src/main/webapp/antipatterns/LongOrNonExistentFeedbackLoops.json
@@ -0,0 +1,41 @@
+{
+    "id": "6",
+    "printName": "Long Or Non Existent Feedback Loops",
+    "name": "LongOrNonExistentFeedbackLoops",
+    "description": "Long spacings between customer feedback or no feedback. The customer enters the project and sees the final result. In the end, the customer may not get what he really wanted. With long intervals of feedback, some misunderstood functionality can be created and we have to spend a lot of effort and time to redo it. ",
+    "configurations": [
+        {
+            "configName": "divisionOfIterationsWithFeedbackLoop",
+            "configType": "Percentage",
+            "configuration": {
+                "configName": "divisionOfIterationsWithFeedbackLoop",
+                "configPrintName": "Division of iterations with feedback loop",
+                "configDescription": "Minimum percentage of the total number of iterations with feedback loop (0,100)",
+                "configErrorMess": "Percentage must be float number between 0 and 100",
+                "configValue": "50.00f"
+            }
+        },
+        {
+            "configName": "maxGapBetweenFeedbackLoopRate",
+            "configType": "PositiveFloat",
+            "configuration": {
+                "configName": "maxGapBetweenFeedbackLoopRate",
+                "configPrintName": "Maximum gap between feedback loop rate",
+                "configDescription": "Value that multiplies average iteration length for given project. Result is maximum threshold value for gap between feedback loops in days.",
+                "configErrorMess": "Maximum gap between feedback loop rate must be positive float number",
+                "configValue": "2f"
+            }
+        },
+        {
+            "configName": "searchSubstringsWithFeedbackLoop",
+            "configType": "String",
+            "configuration": {
+                "configName": "searchSubstringsWithFeedbackLoop",
+                "configPrintName": "Search substrings with feedback loop",
+                "configDescription": "Substring that will be search in wikipages and activities",
+                "configErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters ||",
+                "configValue": "%schůz%zákazník%||%předvedení%zákazník%||%zákazn%demo%||%schůz%zadavat%||%inform%schůz%||%zákazn%||%zadavatel%"
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/main/webapp/antipatterns/NinetyNinetyRule.json b/src/main/webapp/antipatterns/NinetyNinetyRule.json
new file mode 100644
index 0000000..6819802
--- /dev/null
+++ b/src/main/webapp/antipatterns/NinetyNinetyRule.json
@@ -0,0 +1,30 @@
+{
+    "id": "7",
+    "printName": "Ninety Ninety Rule",
+    "name": "NinetyNinetyRule",
+    "description": "The first 90 percent of the code represents the first 90 percent of development time. The remaining 10 percent of the code represents another 90 percent of development time. Then decide on a long delay of the project compared to the original estimate. The functionality is almost done, some number is already closed and is only waiting for one activity to close, but it has been open for a long time.",
+    "configurations": [
+        {
+            "configName": "maxDivisionRange",
+            "configType": "PositiveFloat",
+            "configuration": {
+                "configName": "maxDivisionRange",
+                "configPrintName": "Maximum ration value",
+                "configDescription": "Maximum ratio value of spent and estimated time",
+                "configErrorMess": "Ration values must be positive float number",
+                "configValue": "1.25f"
+            }
+        },
+        {
+            "configName": "maxBadDivisionLimit",
+            "configType": "PositiveInteger",
+            "configuration": {
+                "configName": "maxBadDivisionLimit",
+                "configPrintName": "Maximum iterations thresholds",
+                "configDescription": "Maximum number of consecutive iterations where the thresholds were exceeded",
+                "configErrorMess": "Maximum number of consecutive iterations must be positive integer number",
+                "configValue": "2"
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/main/webapp/antipatterns/RoadToNowhere.json b/src/main/webapp/antipatterns/RoadToNowhere.json
new file mode 100644
index 0000000..3ff6eec
--- /dev/null
+++ b/src/main/webapp/antipatterns/RoadToNowhere.json
@@ -0,0 +1,42 @@
+{
+    "id": "5",
+    "printName": "Road To Nowhere",
+    "name": "RoadToNowhere",
+    "description": "The project is not sufficiently planned and therefore takes place on an ad hoc basis with an uncertain outcome and deadline. There is no project plan in the project.",
+    "configurations": [
+        {
+            "configName": "minNumberOfWikiPagesWithProjectPlan",
+            "configType": "PositiveInteger",
+            "configuration": {
+                "configName": "minNumberOfWikiPagesWithProjectPlan",
+                "configPrintName": "Minimum number of wiki pages with project plan",
+                "configDescription": "Number of wiki pages",
+                "configErrorMess": "Minimum number of wikipages must be positive integer number",
+                "configValue": "1"
+            }
+        },
+        {
+            "configName": "minNumberOfActivitiesWithProjectPlan",
+            "configType": "PositiveInteger",
+            "configuration": {
+                "configName": "minNumberOfActivitiesWithProjectPlan",
+                "configPrintName": "Minimum number of activities with project plan",
+                "configDescription": "Number of activities",
+                "configErrorMess": "Minimum number of activities must be positive integer number",
+                "configValue": "1"
+            }
+        },
+        {
+            "configName": "searchSubstringsWithProjectPlan",
+            "configType": "String",
+            "configuration": {
+                "configName": "searchSubstringsWithProjectPlan",
+                "configPrintName": "Search substrings with project plan",
+                "configDescription": "Substring that will be search in wikipages and activities",
+                "configErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters ||",
+                "configValue": "%plán projektu%||%project plan%||%plan project%||%projektový plán%"
+            }
+        }
+    ],
+    "catalogueFileName": "Road_To_Nowhere.md"
+}
\ No newline at end of file
diff --git a/src/main/webapp/antipatterns/SpecifyNothing.json b/src/main/webapp/antipatterns/SpecifyNothing.json
new file mode 100644
index 0000000..9eb103b
--- /dev/null
+++ b/src/main/webapp/antipatterns/SpecifyNothing.json
@@ -0,0 +1,53 @@
+{
+    "id": "4",
+    "printName": "Specify Nothing",
+    "name": "SpecifyNothing",
+    "description": "The specification is not done intentionally. Programmers are expected to work better without written specifications.",
+    "configurations": [
+        {
+            "configName": "minNumberOfWikiPagesWithSpecification",
+            "configType": "PositiveInteger",
+            "configuration": {
+                "configName": "minNumberOfWikiPagesWithSpecification",
+                "configPrintName": "Minimum number of wiki pages with project specification",
+                "configDescription": "Number of wiki pages",
+                "configErrorMess": "Minimum number of wikipages must be positive integer number",
+                "configValue": "1"
+            }
+        },
+        {
+            "configName": "minNumberOfActivitiesWithSpecification",
+            "configType": "PositiveInteger",
+            "configuration": {
+                "configName": "minNumberOfActivitiesWithSpecification",
+                "configPrintName": "Minimum number of activities with project specification",
+                "configDescription": "Number of activities",
+                "configErrorMess": "Minimum number of activities with project specification must be positive integer number",
+                "configValue": "1"
+            }
+        },
+        {
+            "configName": "minAvgLengthOfActivityDescription",
+            "configType": "PositiveInteger",
+            "configuration": {
+                "configName": "minAvgLengthOfActivityDescription",
+                "configPrintName": "Minimum average length of activity description",
+                "configDescription": "Minimum average number of character of activity description",
+                "configErrorMess": "Minimum average length of activity description must be positive integer number",
+                "configValue": "150"
+            }
+        },
+        {
+            "configName": "searchSubstringsWithProjectSpecification",
+            "configType": "String",
+            "configuration": {
+                "configName": "searchSubstringsWithProjectSpecification",
+                "configPrintName": "Search substrings with project specification",
+                "configDescription": "Substring that will be search in wikipages and activities",
+                "configErrorMess": "Maximum number of substrings is ten and must not starts and ends with characters ||",
+                "configValue": "%dsp%||%specifikace%||%specification%||%vize%proj%||%vize%produ%"
+            }
+        }
+    ],
+    "catalogueFileName": "Specify_Nothing.md"
+}
\ No newline at end of file
diff --git a/src/main/webapp/antipatterns/TooLongSprint.json b/src/main/webapp/antipatterns/TooLongSprint.json
new file mode 100644
index 0000000..4b81d0e
--- /dev/null
+++ b/src/main/webapp/antipatterns/TooLongSprint.json
@@ -0,0 +1,30 @@
+{
+    "id": "1",
+    "printName": "Too Long Sprint",
+    "name": "TooLongSprint",
+    "description": "Iterations too long. (ideal iteration length is about 1-2 weeks, maximum 3 weeks). It could also be detected here if the length of the iteration does not change often (It can change at the beginning and at the end of the project, but it should not change in the already started project).",
+    "configurations": [
+        {
+            "configName": "maxIterationLength",
+            "configType": "PositiveInteger",
+            "configuration": {
+                "configName": "maxIterationLength",
+                "configPrintName": "Max Iteration Length",
+                "configDescription": "Maximum iteration length in days",
+                "configErrorMess": "Max iteration length must be positive integer",
+                "configValue": "21"
+            }
+        },
+        {
+            "configName": "maxNumberOfTooLongIterations",
+            "configType": "PositiveInteger",
+            "configuration": {
+                "configName": "maxNumberOfTooLongIterations",
+                "configPrintName": "Max number of foo long iterations",
+                "configDescription": "Maximum number of too long iterations in project",
+                "configErrorMess": "Max number of too long iterations must be positive integer",
+                "configValue": "0"
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/main/webapp/antipatterns/VaryingSprintLength.json b/src/main/webapp/antipatterns/VaryingSprintLength.json
new file mode 100644
index 0000000..5bdbf68
--- /dev/null
+++ b/src/main/webapp/antipatterns/VaryingSprintLength.json
@@ -0,0 +1,30 @@
+{
+    "id": "2",
+    "printName": "Varying Sprint Length",
+    "name": "VaryingSprintLength",
+    "description": "The length of the sprint changes very often. It is clear that iterations will be different lengths at the beginning and end of the project, but the length of the sprint should not change during the project.",
+    "configurations": [
+        {
+            "configName": "maxDaysDifference",
+            "configType": "PositiveInteger",
+            "configuration": {
+                "configName": "maxDaysDifference",
+                "configPrintName": "Max days difference",
+                "configDescription": "Maximum distance of two consecutive iterations in days",
+                "configErrorMess": "Maximum distance must be positive integer number",
+                "configValue": "7"
+            }
+        },
+        {
+            "configName": "maxIterationChanged",
+            "configType": "PositiveInteger",
+            "configuration": {
+                "configName": "maxIterationChanged",
+                "configPrintName": "Max number of iteration changed",
+                "configDescription": "Maximum allowed number of significant changes in iteration lengths",
+                "configErrorMess": "Maximum number of iterations changed must be positive integer number",
+                "configValue": "1"
+            }
+        }
+    ]
+}
\ No newline at end of file
