de.firemage.autograder.extra.pmd.PMDLinter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of autograder-extra Show documentation
Show all versions of autograder-extra Show documentation
Extra checks for the autograder
The newest version!
package de.firemage.autograder.extra.pmd;
import de.firemage.autograder.api.Translatable;
import de.firemage.autograder.core.CodeLinter;
import de.firemage.autograder.core.LinterStatus;
import de.firemage.autograder.core.Problem;
import de.firemage.autograder.core.file.CompilationUnit;
import de.firemage.autograder.api.AbstractTempLocation;
import de.firemage.autograder.core.file.UploadedFile;
import net.sourceforge.pmd.PMDConfiguration;
import net.sourceforge.pmd.PmdAnalysis;
import net.sourceforge.pmd.lang.rule.Rule;
import net.sourceforge.pmd.lang.rule.RulePriority;
import net.sourceforge.pmd.lang.rule.RuleSet;
import net.sourceforge.pmd.lang.Language;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.document.FileCollector;
import net.sourceforge.pmd.lang.document.FileId;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
public class PMDLinter implements CodeLinter {
private static final Language JAVA_LANGUAGE = LanguageRegistry.PMD.getLanguageById("java");
@Override
public Class supportedCheckType() {
return PMDCheck.class;
}
@Override
public List lint(
UploadedFile submission,
AbstractTempLocation tempLocation,
ClassLoader classLoader,
List checks,
Consumer statusConsumer
) throws IOException {
statusConsumer.accept(LinterStatus.RUNNING_PMD.getMessage());
PMDConfiguration config = new PMDConfiguration();
config.setMinimumPriority(RulePriority.LOW);
config.setIgnoreIncrementalAnalysis(true);
config.setClassLoader(classLoader);
config.setDefaultLanguageVersion(JAVA_LANGUAGE.getVersion(submission.getSource().getVersion().getVersionString()));
Map idMap = new HashMap<>();
List rules = new ArrayList<>();
int idCounter = 0;
for (PMDCheck check : checks) {
for (Rule rule : check.getRules()) {
String id = String.valueOf(idCounter++);
rule.setName(id);
idMap.put(id, check);
rules.add(rule);
}
}
ProblemRenderer renderer = new ProblemRenderer(idMap, submission.getSource());
try (PmdAnalysis pmd = PmdAnalysis.create(config)) {
pmd.addRuleSet(RuleSet.create("Autograder Configuration (Generated)", "", null, List.of(), List.of(), rules));
pmd.addRenderer(renderer);
FileCollector collector = pmd.files();
for (CompilationUnit compilationUnit : submission.getSource().compilationUnits()) {
collector.addSourceFile(
FileId.fromPathLikeString(submission.getSource().path().resolve(compilationUnit.path().toPath()).toString()),
compilationUnit.readString()
);
}
pmd.performAnalysis();
}
return renderer.getProblems();
}
}