AbstractComparisonStrategy.java 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package de.jplag.strategy;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Optional;
  5. import de.jplag.GreedyStringTiling;
  6. import de.jplag.JPlagComparison;
  7. import de.jplag.Submission;
  8. import de.jplag.SubmissionSet;
  9. import de.jplag.options.JPlagOptions;
  10. public abstract class AbstractComparisonStrategy implements ComparisonStrategy {
  11. private final GreedyStringTiling greedyStringTiling;
  12. protected JPlagOptions options;
  13. public AbstractComparisonStrategy(JPlagOptions options, GreedyStringTiling greedyStringTiling) {
  14. this.greedyStringTiling = greedyStringTiling;
  15. this.options = options;
  16. }
  17. /**
  18. * Compare all submissions to the basecode.
  19. * <p>
  20. * Caller must ensure that the provided set does have a basecode submission before calling.
  21. * </p>
  22. * @param submissionSet Submissions and basecode to compare.
  23. */
  24. protected void compareSubmissionsToBaseCode(SubmissionSet submissionSet) {
  25. Submission baseCodeSubmission = submissionSet.getBaseCode();
  26. for (Submission currentSubmission : submissionSet.getSubmissions()) {
  27. JPlagComparison baseCodeComparison = greedyStringTiling.compareWithBaseCode(currentSubmission, baseCodeSubmission);
  28. currentSubmission.setBaseCodeComparison(baseCodeComparison);
  29. baseCodeSubmission.resetBaseCode();
  30. }
  31. }
  32. /**
  33. * Compares two submissions and optionally returns the results if similarity is high enough.
  34. */
  35. protected Optional<JPlagComparison> compareSubmissions(Submission first, Submission second, boolean withBaseCode) {
  36. JPlagComparison comparison = greedyStringTiling.compare(first, second);
  37. System.out.println("Comparing " + first.getName() + "-" + second.getName() + ": " + comparison.similarity());
  38. if (options.getSimilarityMetric().isAboveThreshold(comparison, options.getSimilarityThreshold())) {
  39. return Optional.of(comparison);
  40. }
  41. return Optional.empty();
  42. }
  43. /**
  44. * @return a list of all submission tuples to be processed.
  45. */
  46. protected static List<SubmissionTuple> buildComparisonTuples(List<Submission> submissions) {
  47. List<SubmissionTuple> tuples = new ArrayList<>();
  48. for (int i = 0; i < (submissions.size() - 1); i++) {
  49. Submission first = submissions.get(i);
  50. if (first.getTokenList() == null) {
  51. continue;
  52. }
  53. for (int j = (i + 1); j < submissions.size(); j++) {
  54. Submission second = submissions.get(j);
  55. if (second.getTokenList() == null) {
  56. continue;
  57. }
  58. if (first.isNew() || second.isNew()) {
  59. tuples.add(new SubmissionTuple(first, second));
  60. }
  61. }
  62. }
  63. return tuples;
  64. }
  65. }