diff --git a/jplag.frontend.cpp/src/main/javacc/CPP.jj b/jplag.frontend.cpp/src/main/javacc/CPP.jj index 31df9cf0e..108cfa042 100644 --- a/jplag.frontend.cpp/src/main/javacc/CPP.jj +++ b/jplag.frontend.cpp/src/main/javacc/CPP.jj @@ -19,10 +19,8 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; -import de.jplag.cpp.NewlineStream; - public class CPPScanner implements CPPTokenConstants { - private static Scanner delegatingScanner; + private Scanner delegatingScanner; public static boolean scanFile(File dir, String fileName, Scanner delegatingScanner) { CPPScanner scanner; diff --git a/jplag/src/main/java/de/jplag/JPlagComparison.java b/jplag/src/main/java/de/jplag/JPlagComparison.java index e4d876af1..8136a403e 100644 --- a/jplag/src/main/java/de/jplag/JPlagComparison.java +++ b/jplag/src/main/java/de/jplag/JPlagComparison.java @@ -1,13 +1,13 @@ package de.jplag; import java.util.ArrayList; -import java.util.Comparator; import java.util.List; +import java.util.Objects; /** * This method represents the whole result of a comparison between two submissions. */ -public class JPlagComparison implements Comparator { // FIXME TS: contains a lot of code duplication +public class JPlagComparison { // FIXME TS: contains a lot of code duplication private static final int ROUNDING_FACTOR = 10; @@ -35,18 +35,21 @@ public JPlagComparison(Submission firstSubmission, Submission secondSubmission) matches.add(new Match(startOfFirst, startOfSecond, length)); } - @Override - public int compare(JPlagComparison comparison1, JPlagComparison comparison2) { - return Float.compare(comparison2.similarity(), comparison1.similarity()); // comparison2 first! - } - - // TODO DF: hashCode is not implemented!! @Override public boolean equals(Object other) { - if (!(other instanceof JPlagComparison)) { + if (other == this) { + return true; + } + if (!(other instanceof JPlagComparison otherComparison)) { return false; } - return (compare(this, (JPlagComparison) other) == 0); + return firstSubmission.equals(otherComparison.getFirstSubmission()) && secondSubmission.equals(otherComparison.getSecondSubmission()) + && matches.equals(otherComparison.matches); + } + + @Override + public int hashCode() { + return Objects.hash(firstSubmission, secondSubmission, matches); } /** diff --git a/jplag/src/main/java/de/jplag/Submission.java b/jplag/src/main/java/de/jplag/Submission.java index dc5f48aae..8c0d4a422 100644 --- a/jplag/src/main/java/de/jplag/Submission.java +++ b/jplag/src/main/java/de/jplag/Submission.java @@ -5,6 +5,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Collection; +import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -75,10 +76,25 @@ public Submission(String name, File submissionRootFile, boolean isNew, Collectio @Override public int compareTo(Submission other) { - // TODO DF: "equals(Object obj)" should be overridden along with the "compareTo(T obj)" method return name.compareTo(other.name); } + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof Submission otherSubmission)) { + return false; + } + return otherSubmission.getName().equals(name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + /** * @return base code comparison */ diff --git a/jplag/src/main/java/de/jplag/SubmissionSetBuilder.java b/jplag/src/main/java/de/jplag/SubmissionSetBuilder.java index 6fe6a9bb7..5c28fa462 100644 --- a/jplag/src/main/java/de/jplag/SubmissionSetBuilder.java +++ b/jplag/src/main/java/de/jplag/SubmissionSetBuilder.java @@ -129,27 +129,27 @@ private void checkForNonOverlappingRootDirectories(Set submissionDirectori private Optional loadBaseCode(Set submissionDirectories, Set oldSubmissionDirectories, Map foundSubmissions) throws ExitException { - // Extract the basecode submission if necessary. - Optional baseCodeSubmission = Optional.empty(); - if (options.hasBaseCode()) { - String baseCodeName = options.getBaseCodeSubmissionName().orElseThrow(); - Submission baseCode = loadBaseCodeAsPath(baseCodeName); - if (baseCode == null) { - int numberOfRootDirectories = submissionDirectories.size() + oldSubmissionDirectories.size(); - if (numberOfRootDirectories > 1) { - throw new BasecodeException("The base code submission needs to be specified by path instead of by name!"); - } - - // There is one root directory, and the submissionDirectories variable has been checked to be non-empty. - // That set thus contains the one and only root directory. - File rootDirectory = submissionDirectories.iterator().next(); - - // Single root-directory, try the legacy way of specifying basecode. - baseCode = loadBaseCodeViaName(baseCodeName, rootDirectory, foundSubmissions); + if (!options.hasBaseCode()) { + return Optional.empty(); + } + + String baseCodeName = options.getBaseCodeSubmissionName().orElseThrow(); + Submission baseCode = loadBaseCodeAsPath(baseCodeName); + if (baseCode == null) { + int numberOfRootDirectories = submissionDirectories.size() + oldSubmissionDirectories.size(); + if (numberOfRootDirectories > 1) { + throw new BasecodeException("The base code submission needs to be specified by path instead of by name!"); } - // TODO DF: Here the method assumes that baseCode can be null. later, this is not assumed anymore - baseCodeSubmission = Optional.ofNullable(baseCode); + // There is one root directory, and the submissionDirectories variable has been checked to be non-empty. + // That set thus contains the one and only root directory. + File rootDirectory = submissionDirectories.iterator().next(); + + // Single root-directory, try the legacy way of specifying basecode. + baseCode = loadBaseCodeViaName(baseCodeName, rootDirectory, foundSubmissions); + } + + if (baseCode != null) { logger.info("Basecode directory \"{}\" will be used.", baseCode.getName()); // Basecode may also be registered as a user submission. If so, remove the latter. @@ -158,7 +158,7 @@ private Optional loadBaseCode(Set submissionDirectories, Set OptimizationResult maximize(Function OptimizationResult maximize(Function