JPlag.java 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package de.jplag;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import de.jplag.clustering.ClusteringFactory;
  5. import de.jplag.exceptions.ExitException;
  6. import de.jplag.exceptions.SubmissionException;
  7. import de.jplag.options.JPlagOptions;
  8. import de.jplag.strategy.ComparisonMode;
  9. import de.jplag.strategy.ComparisonStrategy;
  10. import de.jplag.strategy.NormalComparisonStrategy;
  11. import de.jplag.strategy.ParallelComparisonStrategy;
  12. /**
  13. * This class coordinates the whole errorConsumer flow.
  14. */
  15. public class JPlag {
  16. private static final Logger logger = LoggerFactory.getLogger(JPlag.class);
  17. private final JPlagOptions options;
  18. private final Language language;
  19. private final ComparisonStrategy comparisonStrategy;
  20. private final GreedyStringTiling coreAlgorithm; // Contains the comparison logic.
  21. /**
  22. * Creates and initializes a JPlag instance, parameterized by a set of options.
  23. * @param options determines the parameterization.
  24. */
  25. public JPlag(JPlagOptions options) {
  26. this.options = options;
  27. coreAlgorithm = new GreedyStringTiling(options);
  28. language = this.options.language();
  29. comparisonStrategy = initializeComparisonStrategy(options.comparisonMode());
  30. }
  31. /**
  32. * Main procedure, executes the comparison of source code submissions.
  33. * @return the results of the comparison, specifically the submissions whose similarity exceeds a set threshold.
  34. * @throws ExitException if the JPlag exits preemptively.
  35. */
  36. public JPlagResult run() throws ExitException {
  37. // Parse and validate submissions.
  38. SubmissionSetBuilder builder = new SubmissionSetBuilder(language, options);
  39. SubmissionSet submissionSet = builder.buildSubmissionSet();
  40. int submissionCount = submissionSet.numberOfSubmissions();
  41. if (submissionCount < 2) {
  42. throw new SubmissionException("Not enough valid submissions! (found " + submissionCount + " valid submissions)");
  43. }
  44. // Compare valid submissions.
  45. JPlagResult result = comparisonStrategy.compareSubmissions(submissionSet);
  46. if (logger.isInfoEnabled())
  47. logger.info("Total time for comparing submissions: {}", TimeUtil.formatDuration(result.getDuration()));
  48. result.setClusteringResult(ClusteringFactory.getClusterings(result.getAllComparisons(), options.clusteringOptions()));
  49. return result;
  50. }
  51. private ComparisonStrategy initializeComparisonStrategy(final ComparisonMode comparisonMode) {
  52. return switch (comparisonMode) {
  53. case NORMAL -> new NormalComparisonStrategy(options, coreAlgorithm);
  54. case PARALLEL -> new ParallelComparisonStrategy(options, coreAlgorithm);
  55. };
  56. }
  57. }