Browse Source

Use withX pattern

Dominik Fuchß 4 years ago
parent
commit
99c56e89ab

+ 10 - 4
jplag.cli/src/main/java/de/jplag/CLI.java

@@ -127,10 +127,16 @@ public final class CLI {
         if (comparisonMode.isEmpty())
             logger.warn("Unknown comparison mode, using default mode!");
 
-        JPlagOptions options = new JPlagOptions(language, DEBUG.getFrom(namespace), Arrays.stream(fileSuffixes).toList(),
-                SIMILARITY_THRESHOLD.getFrom(namespace), SHOWN_COMPARISONS.getFrom(namespace), MIN_TOKEN_MATCH.getFrom(namespace),
-                EXCLUDE_FILE.getFrom(namespace), submissionDirectories, oldSubmissionDirectories, BASE_CODE.getFrom(namespace),
-                SUBDIRECTORY.getFrom(namespace), Verbosity.fromOption(VERBOSITY.getFrom(namespace)));
+        JPlagOptions options = new JPlagOptions(language, submissionDirectories, oldSubmissionDirectories) //
+                .withDebugParser(DEBUG.getFrom(namespace)) //
+                .withFileSuffixes(Arrays.stream(fileSuffixes).toList()) //
+                .withSimilarityThreshold(SIMILARITY_THRESHOLD.getFrom(namespace)) //
+                .withMaximumNumberOfComparisons(SHOWN_COMPARISONS.getFrom(namespace)) //
+                .withMinimumTokenMatch(MIN_TOKEN_MATCH.getFrom(namespace)) //
+                .withExclusionFileName(EXCLUDE_FILE.getFrom(namespace)) //
+                .withBaseCodeSubmissionName(BASE_CODE.getFrom(namespace)) //
+                .withSubdirectoryName(SUBDIRECTORY.getFrom(namespace)) //
+                .withVerbosity(Verbosity.fromOption(VERBOSITY.getFrom(namespace)));
 
         if (comparisonMode.isPresent())
             options = options.withComparisonMode(comparisonMode.get());

+ 53 - 28
jplag/src/main/java/de/jplag/options/JPlagOptions.java

@@ -59,58 +59,69 @@ public record JPlagOptions(LanguageOption languageOption, ComparisonMode compari
 
     private static final Logger logger = LoggerFactory.getLogger(JPlag.class);
 
-    public JPlagOptions(LanguageOption languageOption, boolean debugParser, List<String> fileSuffixes, Float similarityThreshold,
-            int maximumNumberOfComparisons, Integer minimumTokenMatch, String exclusionFileName, List<String> submissionDirectories,
-            List<String> oldSubmissionDirectories, String baseCodeSubmissionName, String subdirectoryName, Verbosity verbosity) {
+    public JPlagOptions(LanguageOption languageOption, List<String> submissionDirectories, List<String> oldSubmissionDirectories) {
         this(languageOption, //
                 DEFAULT_COMPARISON_MODE, //
-                debugParser, //
-                fileSuffixes, //
-                fixSimilarityThreshold(similarityThreshold), //
-                maximumNumberOfComparisons, //
+                false, //
+                null, //
+                DEFAULT_SIMILARITY_THRESHOLD, //
+                DEFAULT_SHOWN_COMPARISONS, //
                 DEFAULT_SIMILARITY_METRIC, //
-                minimumTokenMatch, //
-                exclusionFileName, //
+                null, //
+                null, //
                 submissionDirectories, //
                 oldSubmissionDirectories, //
-                baseCodeSubmissionName, //
-                subdirectoryName, //
-                verbosity, //
+                null, //
+                null, //
+                null, //
                 new ClusteringOptions.Builder().build() //
         );
     }
 
-    public JPlagOptions withClusteringOptions(ClusteringOptions clusteringOptions) {
+    public JPlagOptions withLanguageOption(LanguageOption languageOption) {
         return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
                 similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName,
                 subdirectoryName, verbosity, clusteringOptions);
     }
 
-    public JPlagOptions withMaximumNumberOfComparisons(int maximumNumberOfComparisons) {
+    public JPlagOptions withComparisonMode(ComparisonMode comparisonMode) {
         return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
                 similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName,
                 subdirectoryName, verbosity, clusteringOptions);
     }
 
-    public JPlagOptions withMinimumTokenMatch(int minimumTokenMatch) {
+    public JPlagOptions withDebugParser(boolean debugParser) {
         return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
                 similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName,
                 subdirectoryName, verbosity, clusteringOptions);
     }
 
-    public JPlagOptions withLanguageOption(LanguageOption languageOption) {
+    public JPlagOptions withFileSuffixes(List<String> fileSuffixes) {
         return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
                 similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName,
                 subdirectoryName, verbosity, clusteringOptions);
     }
 
-    public JPlagOptions withComparisonMode(ComparisonMode comparisonMode) {
+    public JPlagOptions withSimilarityThreshold(float similarityThreshold) {
+        return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, fixSimilarityThreshold(similarityThreshold),
+                maximumNumberOfComparisons, similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories,
+                baseCodeSubmissionName, subdirectoryName, verbosity, clusteringOptions);
+    }
+
+    public JPlagOptions withMaximumNumberOfComparisons(Integer maximumNumberOfComparisons) {
+        return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold,
+                maximumNumberOfComparisons == null ? null : Math.max(maximumNumberOfComparisons, -1), similarityMetric, minimumTokenMatch,
+                exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName, subdirectoryName, verbosity,
+                clusteringOptions);
+    }
+
+    public JPlagOptions withSimilarityMetric(SimilarityMetric similarityMetric) {
         return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
                 similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName,
                 subdirectoryName, verbosity, clusteringOptions);
     }
 
-    public JPlagOptions withVerbosity(Verbosity verbosity) {
+    public JPlagOptions withMinimumTokenMatch(Integer minimumTokenMatch) {
         return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
                 similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName,
                 subdirectoryName, verbosity, clusteringOptions);
@@ -122,19 +133,38 @@ public record JPlagOptions(LanguageOption languageOption, ComparisonMode compari
                 subdirectoryName, verbosity, clusteringOptions);
     }
 
+    public JPlagOptions withSubmissionDirectories(List<String> submissionDirectories) {
+        return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
+                similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName,
+                subdirectoryName, verbosity, clusteringOptions);
+    }
+
+    public JPlagOptions withOldSubmissionDirectories(List<String> oldSubmissionDirectories) {
+        return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
+                similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName,
+                subdirectoryName, verbosity, clusteringOptions);
+    }
+
     public JPlagOptions withBaseCodeSubmissionName(String baseCodeSubmissionName) {
+        return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
+                similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories,
+                (baseCodeSubmissionName == null || baseCodeSubmissionName.isBlank()) ? null : baseCodeSubmissionName, subdirectoryName, verbosity,
+                clusteringOptions);
+    }
+
+    public JPlagOptions withSubdirectoryName(String subdirectoryName) {
         return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
                 similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName,
                 subdirectoryName, verbosity, clusteringOptions);
     }
 
-    public JPlagOptions withSubmissionDirectories(List<String> submissionDirectories) {
+    public JPlagOptions withVerbosity(Verbosity verbosity) {
         return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
                 similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName,
                 subdirectoryName, verbosity, clusteringOptions);
     }
 
-    public JPlagOptions withDebugParser(boolean debugParser) {
+    public JPlagOptions withClusteringOptions(ClusteringOptions clusteringOptions) {
         return new JPlagOptions(languageOption, comparisonMode, debugParser, fileSuffixes, similarityThreshold, maximumNumberOfComparisons,
                 similarityMetric, minimumTokenMatch, exclusionFileName, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionName,
                 subdirectoryName, verbosity, clusteringOptions);
@@ -184,12 +214,12 @@ public record JPlagOptions(LanguageOption languageOption, ComparisonMode compari
      * name).</li>
      * <li>A submission with the specified name exists in the root directory.</li>
      * </ul>
-     * It's an error if a string has been provided but it is neither an existing path nor does it fulfill all the conditions
-     * of the compatibility fallback listed above.
+     * It's an error if a string has been provided, but it is neither an existing path nor does it fulfill all the
+     * conditions of the compatibility fallback listed above.
      */
     @Override
     public String baseCodeSubmissionName() {
-        return (baseCodeSubmissionName == null || baseCodeSubmissionName.isBlank()) ? null : baseCodeSubmissionName;
+        return baseCodeSubmissionName;
     }
 
     @Override
@@ -201,11 +231,6 @@ public record JPlagOptions(LanguageOption languageOption, ComparisonMode compari
         return fixedMinimumTokenMatch;
     }
 
-    @Override
-    public Integer maximumNumberOfComparisons() {
-        return Math.max(maximumNumberOfComparisons, -1);
-    }
-
     private Set<String> readExclusionFile(final String exclusionFileName) {
         try (BufferedReader reader = new BufferedReader(new FileReader(exclusionFileName, JPlagOptions.CHARSET))) {
             final var excludedFileNames = reader.lines().collect(Collectors.toSet());

+ 1 - 2
jplag/src/test/java/de/jplag/TestBase.java

@@ -46,8 +46,7 @@ public abstract class TestBase {
 
     protected JPlagResult runJPlag(List<String> newPaths, List<String> oldPaths, Function<JPlagOptions, JPlagOptions> customization)
             throws ExitException {
-        JPlagOptions options = new JPlagOptions(LanguageOption.JAVA, false, null, JPlagOptions.DEFAULT_SIMILARITY_THRESHOLD,
-                JPlagOptions.DEFAULT_SHOWN_COMPARISONS, null, null, newPaths, oldPaths, null, null, null);
+        JPlagOptions options = new JPlagOptions(LanguageOption.JAVA, newPaths, oldPaths);
         options = customization.apply(options);
         options = options.withVerbosity(Verbosity.LONG);
         JPlag jplag = new JPlag(options);