Explorar el Código

Ensured proper filtering and keep the invalid submissions in a separate list.

Timur Sağlam hace 5 años
padre
commit
e5ca21c343

+ 3 - 3
jplag.frontend-utils/src/main/java/de/jplag/AbstractParser.java

@@ -5,7 +5,7 @@ package de.jplag;
  * @date 22.01.2005
  */
 public abstract class AbstractParser { // TODO TS: We should rename this class, as all concrete parsers shadow its name.
-    protected ErrorReporting program;
+    protected ErrorConsumer program;
     protected int errors = 0;
     private int errorsSum = 0;
 
@@ -21,11 +21,11 @@ public abstract class AbstractParser { // TODO TS: We should rename this class,
         errorsSum += errors;
     }
 
-    public ErrorReporting getProgram() {
+    public ErrorConsumer getProgram() {
         return program;
     }
 
-    public void setProgram(ErrorReporting prog) {
+    public void setProgram(ErrorConsumer prog) {
         this.program = prog;
     }
 }

+ 1 - 1
jplag.frontend-utils/src/main/java/de/jplag/ErrorReporting.java → jplag.frontend-utils/src/main/java/de/jplag/ErrorConsumer.java

@@ -1,6 +1,6 @@
 package de.jplag;
 
-public interface ErrorReporting {
+public interface ErrorConsumer {
 
     /**
      * Print and store an error.

+ 3 - 3
jplag.frontend.chars/src/main/java/de/jplag/chars/Language.java

@@ -2,7 +2,7 @@ package de.jplag.chars;
 
 import java.io.File;
 
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.Token;
 import de.jplag.TokenList;
 
@@ -10,11 +10,11 @@ import de.jplag.TokenList;
  * read in text files as characters
  */
 public class Language implements de.jplag.Language {
-	private ErrorReporting program;
+	private ErrorConsumer program;
 
 	private de.jplag.chars.Parser parser = new Parser();
 
-	public Language(ErrorReporting program) {
+	public Language(ErrorConsumer program) {
 		this.program = program;
 		this.parser.setProgram(this.program);
 	}

+ 2 - 2
jplag.frontend.cpp/src/main/java/de/jplag/cpp/Language.java

@@ -2,7 +2,7 @@ package de.jplag.cpp;
 
 import java.io.File;
 
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.TokenList;
 
 /*
@@ -11,7 +11,7 @@ import de.jplag.TokenList;
 public class Language implements de.jplag.Language {
 	private Scanner scanner;
 
-	public Language(ErrorReporting program) {
+	public Language(ErrorConsumer program) {
 		this.scanner = new Scanner();
 		this.scanner.setProgram(program);
 

+ 2 - 2
jplag.frontend.csharp-1.2/src/main/java/de/jplag/csharp/Language.java

@@ -2,13 +2,13 @@ package de.jplag.csharp;
 
 import java.io.File;
 
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.TokenList;
 
 public class Language implements de.jplag.Language {
 	private Parser parser;
 
-	public Language(ErrorReporting program) {
+	public Language(ErrorConsumer program) {
 		this.parser = new Parser();
 		this.parser.setProgram(program);
 

+ 2 - 2
jplag.frontend.java-1.1exp/src/main/java/de/jplag/javax/Language.java

@@ -2,13 +2,13 @@ package de.jplag.javax;
 
 import java.io.File;
 
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.TokenList;
 
 public class Language implements de.jplag.Language {
 	private Parser parser;
 
-	public Language(ErrorReporting program) {
+	public Language(ErrorConsumer program) {
 		this.parser = new Parser();
 		this.parser.setProgram(program);
 

+ 2 - 2
jplag.frontend.java-1.2/src/main/java/de/jplag/java/Language.java

@@ -2,13 +2,13 @@ package de.jplag.java;
 
 import java.io.File;
 
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.TokenList;
 
 public class Language implements de.jplag.Language {
 	private Parser parser;
 
-	public Language(ErrorReporting program) {
+	public Language(ErrorConsumer program) {
 		this.parser = new Parser();
 		this.parser.setProgram(program);
 	}

+ 2 - 2
jplag.frontend.java-1.5/src/main/java/de/jplag/java15/Language.java

@@ -2,13 +2,13 @@ package de.jplag.java15;
 
 import java.io.File;
 
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.TokenList;
 
 public class Language implements de.jplag.Language {
 	private Parser parser;
 
-	public Language(ErrorReporting program) {
+	public Language(ErrorConsumer program) {
 		this.parser = new Parser(false);
 		this.parser.setProgram(program);
 	}

+ 2 - 2
jplag.frontend.java-1.5/src/main/java/de/jplag/java15/LanguageWithDelimitedMethods.java

@@ -3,7 +3,7 @@ package de.jplag.java15;
 import java.io.File;
 
 import de.jplag.Language;
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.TokenList;
 
 /**
@@ -14,7 +14,7 @@ import de.jplag.TokenList;
 public class LanguageWithDelimitedMethods implements Language {
 	private Parser parser;
 
-	public LanguageWithDelimitedMethods(ErrorReporting program) {
+	public LanguageWithDelimitedMethods(ErrorConsumer program) {
 		this.parser = new Parser(true);
 		this.parser.setProgram(program);
 	}

+ 2 - 2
jplag.frontend.java-1.7/src/main/java/de/jplag/java17/Language.java

@@ -2,13 +2,13 @@ package de.jplag.java17;
 
 import java.io.File;
 
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.TokenList;
 
 public class Language implements de.jplag.Language {
 	private Parser parser;
 
-	public Language(ErrorReporting program) {
+	public Language(ErrorConsumer program) {
 		this.parser = new Parser();
 		this.parser.setProgram(program);
 	}

+ 2 - 2
jplag.frontend.java-1.7/src/test/java/de/jplag/StrippedProgram.java

@@ -1,9 +1,9 @@
 package de.jplag;
 
 /**
- * This is a stripped version of the JPlag main class ErrorReporting to be used during front end development only.
+ * This is a stripped version of the JPlag main class ErrorConsumer to be used during front end development only.
  */
-public class StrippedProgram implements ErrorReporting {
+public class StrippedProgram implements ErrorConsumer {
     @Override
     public void addError(String errorMsg) {
         System.err.println(errorMsg);

+ 2 - 2
jplag.frontend.java-1.9/src/main/java/de/jplag/java19/Language.java

@@ -2,7 +2,7 @@ package de.jplag.java19;
 
 import java.io.File;
 
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.TokenList;
 
 /**
@@ -11,7 +11,7 @@ import de.jplag.TokenList;
 public class Language implements de.jplag.Language {
     private Parser parser;
 
-    public Language(ErrorReporting program) {
+    public Language(ErrorConsumer program) {
         this.parser = new Parser();
         this.parser.setProgram(program);
     }

+ 2 - 2
jplag.frontend.python-3/src/main/java/de/jplag/python3/Language.java

@@ -2,14 +2,14 @@ package de.jplag.python3;
 
 import java.io.File;
 
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.TokenList;
 
 public class Language implements de.jplag.Language {
 
     private Parser parser;
 
-    public Language(ErrorReporting program) {
+    public Language(ErrorConsumer program) {
         this.parser = new Parser();
         this.parser.setProgram(program);
     }

+ 2 - 2
jplag.frontend.scheme/src/main/java/de/jplag/scheme/Language.java

@@ -2,12 +2,12 @@ package de.jplag.scheme;
 
 import java.io.File;
 
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.TokenList;
 
 public class Language implements de.jplag.Language {
 
-	public Language(ErrorReporting program) {
+	public Language(ErrorConsumer program) {
 		this.parser = new Parser();
 		this.parser.setProgram(program);
 

+ 3 - 3
jplag.frontend.text/src/main/java/de/jplag/text/Language.java

@@ -3,7 +3,7 @@ package de.jplag.text;
 
 import java.io.File;
 
-import de.jplag.ErrorReporting;
+import de.jplag.ErrorConsumer;
 import de.jplag.TokenList;
 
 /**
@@ -12,11 +12,11 @@ import de.jplag.TokenList;
  */
 public class Language implements de.jplag.Language {
 
-	private ErrorReporting program;
+	private ErrorConsumer program;
 
 	private Parser parser = new Parser();
 
-	public Language(ErrorReporting program) {
+	public Language(ErrorConsumer program) {
 		this.program = program;
 		this.parser.setProgram(this.program);
 	}

+ 1 - 1
jplag/src/main/java/de/jplag/ErrorCollector.java

@@ -9,7 +9,7 @@ import java.util.List;
 import de.jplag.options.JPlagOptions;
 import de.jplag.options.Verbosity;
 
-public class ErrorCollector implements ErrorReporting {
+public class ErrorCollector implements ErrorConsumer { // TODO TS should be eventually replaced with a true logger/logging manager
 
     private final List<String> errorVector; // List of errors that occurred during the execution of the program.
     private final JPlagOptions options;

+ 1 - 1
jplag/src/main/java/de/jplag/JPlag.java

@@ -191,7 +191,7 @@ public class JPlag {
         LanguageOption languageOption = this.options.getLanguageOption();
 
         try {
-            Constructor<?> constructor = Class.forName(languageOption.getClassPath()).getConstructor(ErrorReporting.class);
+            Constructor<?> constructor = Class.forName(languageOption.getClassPath()).getConstructor(ErrorConsumer.class);
             Object[] constructorParams = {errorCollector};
 
             Language language = (Language) constructor.newInstance(constructorParams);

+ 4 - 0
jplag/src/main/java/de/jplag/Submission.java

@@ -230,6 +230,10 @@ public class Submission implements Comparable<Submission> {
     public void setTokenList(TokenList tokenList) {
         this.tokenList = tokenList;
     }
+    
+    public void markAsErroneous() {
+        hasErrors = true;
+    }
 
     @Override
     public int compareTo(Submission other) {

+ 33 - 25
jplag/src/main/java/de/jplag/SubmissionSet.java

@@ -1,5 +1,7 @@
 package de.jplag;
 
+import static java.util.stream.Collectors.toList;
+
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -9,13 +11,15 @@ import java.util.stream.Collectors;
 import de.jplag.options.JPlagOptions;
 
 /**
- * Collection of submissions and their basecode if it exists.
+ * Collection of all submissions and their basecode if it exists. Parses all allSubmissions upon creation.
  */
 public class SubmissionSet {
     /**
      * Submissions to check for plagiarism.
      */
-    private List<Submission> submissions;
+    private final List<Submission> allSubmissions;
+    private final List<Submission> invalidSubmissions;
+    private final List<Submission> submissions;
 
     /**
      * Base code submission if it exists.
@@ -29,17 +33,18 @@ public class SubmissionSet {
     private String currentSubmissionName;
 
     /**
-     * @param submissions Submissions to check for plagiarism.
+     * @param allSubmissions Submissions to check for plagiarism.
      * @param baseCode Base code submission if it exists.
      */
-    public SubmissionSet(List<Submission> submissions, Optional<Submission> baseCode, ErrorCollector errorCollector, JPlagOptions options)
+    public SubmissionSet(List<Submission> allSubmissions, Optional<Submission> baseCode, ErrorCollector errorCollector, JPlagOptions options)
             throws ExitException {
-        this.submissions = submissions;
+        this.allSubmissions = allSubmissions;
         this.baseCodeSubmission = baseCode;
         this.errorCollector = errorCollector;
         this.options = options;
         parseAllSubmissions();
-        filterValidSubmissions(); // TODO TS: Keep filtered Submissions
+        submissions = filterValidSubmissions();
+        invalidSubmissions = filterInvalidSubmissions();
     }
 
     /**
@@ -63,25 +68,30 @@ public class SubmissionSet {
     }
 
     /**
-     * @return The number of submissions.
+     * @return The number of allSubmissions.
      */
-    public int numberOfSubmissions() { // Ensure this is the right value (filtered vs. all)
-        return submissions.size();
+    public int numberOfSubmissions() { // TODO Ensure this is the right value (filtered vs. all)
+        return allSubmissions.size();
     }
 
     /**
-     * Obtain the submissions.
+     * Obtain the allSubmissions.
      * @note Changes in the list are reflected in this instance.
      */
-    public List<Submission> getSubmissions() { // TODO TS: Ensure this is the right value
+    public List<Submission> getSubmissions() {
         return submissions;
     }
 
-    /**
-     * Remove invalid submissions from the set.
-     */
-    private void filterValidSubmissions() {
-        submissions = submissions.stream().filter(submission -> !submission.hasErrors()).collect(Collectors.toCollection(ArrayList::new));
+    public List<Submission> getInvalidSubmissions() {
+        return invalidSubmissions;
+    }
+
+    private List<Submission> filterValidSubmissions() {
+        return allSubmissions.stream().filter(submission -> !submission.hasErrors()).collect(Collectors.toCollection(ArrayList::new));
+    }
+
+    private List<Submission> filterInvalidSubmissions() {
+        return allSubmissions.stream().filter(submission -> submission.hasErrors()).collect(toList());
     }
 
     /**
@@ -89,11 +99,10 @@ public class SubmissionSet {
      */
     private void parseAllSubmissions() throws ExitException {
         try {
-            parseSubmissions(submissions);
+            parseSubmissions(allSubmissions);
             if (baseCodeSubmission.isPresent()) {
                 parseBaseCodeSubmission(baseCodeSubmission.get()); // cannot use ifPresent because of throws declaration
             }
-
         } catch (OutOfMemoryError e) {
             throw new ExitException("Out of memory during parsing of submission \"" + currentSubmissionName + "\"");
         } catch (Throwable e) {
@@ -127,11 +136,11 @@ public class SubmissionSet {
     }
 
     /**
-     * Parse all given submissions.
+     * Parse all given allSubmissions.
      */
     private void parseSubmissions(List<Submission> submissions) {
         if (submissions.isEmpty()) {
-            System.out.println("No submissions to parse!");
+            System.out.println("No allSubmissions to parse!");
             return;
         }
 
@@ -161,7 +170,7 @@ public class SubmissionSet {
                 subm.setTokenList(null);
                 invalid++;
                 removed = true;
-                iter.remove(); // TODO TS: Keep filtered Submissions
+                subm.markAsErroneous();
             }
 
             if (ok && !removed) {
@@ -171,13 +180,12 @@ public class SubmissionSet {
             }
         }
 
-        errorCollector.print(
-                "\n" + (count - errors - invalid) + " submissions parsed successfully!\n" + errors + " parser error" + (errors != 1 ? "s!\n" : "!\n"),
-                null);
+        errorCollector.print("\n" + (count - errors - invalid) + " allSubmissions parsed successfully!\n" + errors + " parser error"
+                + (errors != 1 ? "s!\n" : "!\n"), null);
 
         if (invalid != 0) {
             errorCollector.print(null,
-                    invalid + ((invalid == 1) ? " submission is not valid because it contains" : " submissions are not valid because they contain")
+                    invalid + ((invalid == 1) ? " submission is not valid because it contains" : " allSubmissions are not valid because they contain")
                             + " fewer tokens than minimum match length allows.\n");
         }