| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- 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);
- };
- }
- }
|