package de.jplag; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.jplag.clustering.ClusteringFactory; import de.jplag.exceptions.ExitException; import de.jplag.exceptions.SubmissionException; import de.jplag.options.JPlagOptions; import de.jplag.strategy.ComparisonMode; import de.jplag.strategy.ComparisonStrategy; import de.jplag.strategy.NormalComparisonStrategy; import de.jplag.strategy.ParallelComparisonStrategy; /** * This class coordinates the whole errorConsumer flow. */ public class JPlag { private static final Logger logger = LoggerFactory.getLogger(JPlag.class); private final JPlagOptions options; private final Language language; private final ComparisonStrategy comparisonStrategy; private final GreedyStringTiling coreAlgorithm; // Contains the comparison logic. /** * Creates and initializes a JPlag instance, parameterized by a set of options. * @param options determines the parameterization. */ public JPlag(JPlagOptions options) { this.options = options; coreAlgorithm = new GreedyStringTiling(options); language = this.options.language(); comparisonStrategy = initializeComparisonStrategy(options.comparisonMode()); } /** * Main procedure, executes the comparison of source code submissions. * @return the results of the comparison, specifically the submissions whose similarity exceeds a set threshold. * @throws ExitException if the JPlag exits preemptively. */ public JPlagResult run() throws ExitException { // Parse and validate submissions. SubmissionSetBuilder builder = new SubmissionSetBuilder(language, options); SubmissionSet submissionSet = builder.buildSubmissionSet(); int submissionCount = submissionSet.numberOfSubmissions(); if (submissionCount < 2) { throw new SubmissionException("Not enough valid submissions! (found " + submissionCount + " valid submissions)"); } // Compare valid submissions. JPlagResult result = comparisonStrategy.compareSubmissions(submissionSet); if (logger.isInfoEnabled()) logger.info("Total time for comparing submissions: {}", TimeUtil.formatDuration(result.getDuration())); result.setClusteringResult(ClusteringFactory.getClusterings(result.getAllComparisons(), options.clusteringOptions())); return result; } private ComparisonStrategy initializeComparisonStrategy(final ComparisonMode comparisonMode) { return switch (comparisonMode) { case NORMAL -> new NormalComparisonStrategy(options, coreAlgorithm); case PARALLEL -> new ParallelComparisonStrategy(options, coreAlgorithm); }; } }