All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.oliviercailloux.grade.MavenCodeGrader Maven / Gradle / Ivy

The newest version!
package io.github.oliviercailloux.grade;

import static com.google.common.base.Verify.verify;
import static io.github.oliviercailloux.grade.DeadlineGrader.LOGGER;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import io.github.oliviercailloux.grade.MavenCodeHelper.BasicCompiler;
import io.github.oliviercailloux.grade.MavenCodeHelper.WarningsBehavior;
import io.github.oliviercailloux.jaris.collections.CollectionUtils;
import io.github.oliviercailloux.jaris.exceptions.CheckedStream;
import io.github.oliviercailloux.jaris.io.PathUtils;
import io.github.oliviercailloux.javagrade.JavaGradeUtils;
import io.github.oliviercailloux.javagrade.bytecode.Compiler;
import io.github.oliviercailloux.javagrade.bytecode.Compiler.CompilationResult;
import io.github.oliviercailloux.javagrade.bytecode.Compiler.CompilationResultExt;
import io.github.oliviercailloux.javagrade.bytecode.MyCompiler;
import io.github.oliviercailloux.utils.Utils;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Set;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class MavenCodeGrader implements PathGrader {

  public static  MavenCodeGrader penal(CodeGrader g,
      Function wrapper, WarningsBehavior w) {
    return new MavenCodeGrader<>(g, wrapper, w, new BasicCompiler());
  }

  public static  MavenCodeGrader basic(CodeGrader g,
      Function wrapper) {
    return new MavenCodeGrader<>(g, wrapper, WarningsBehavior.PENALIZE_WARNINGS_AND_SUPPRESS,
        new BasicCompiler());
  }

  public static  MavenCodeGrader complex(CodeGrader g,
      Function wrapper, boolean considerSuppressed, MyCompiler compiler) {
    return new MavenCodeGrader<>(g, wrapper,
        considerSuppressed ? WarningsBehavior.PENALIZE_WARNINGS_AND_SUPPRESS
            : WarningsBehavior.PENALIZE_WARNINGS_AND_NOT_SUPPRESSED,
        compiler);
  }

  private final MavenCodeHelper helper;
  private final Function wrapper;
  private ImmutableMap gradedProjects;
  private final CodeGrader grader;

  private MavenCodeGrader(CodeGrader g, Function wrapper,
      WarningsBehavior w, MyCompiler basicCompiler) {
    gradedProjects = null;
    this.wrapper = wrapper;
    this.grader = g;
    this.helper = new MavenCodeHelper<>(w, basicCompiler);
  }

  @Override
  public MarksTree grade(Path workDir) throws X {
    try {
      final ImmutableSet possibleDirs = MavenCodeHelper.possibleDirs(workDir);
      gradedProjects = CollectionUtils.toMap(possibleDirs, this::gradePomProjectWrapping);
      verify(!gradedProjects.isEmpty());
      final ImmutableMap gradedProjectsByCrit = CollectionUtils
          .transformKeys(gradedProjects, p -> Criterion.given("Using project dir " + p.toString()));
      return MarksTree.composite(gradedProjectsByCrit);
    } catch (IOException e) {
      throw wrapper.apply(e);
    }
  }

  private MarksTree gradePomProjectWrapping(Path pomDirectory) throws X {
    try {
      final CompilationResultExt result = helper.compile(pomDirectory);
      final MarksTree projectGrade = grade(result);
      return projectGrade;
    } catch (IOException e) {
      throw new UncheckedIOException(e);
    }
  }

  private MarksTree grade(CompilationResultExt result) throws X {
    return helper.grade(result, grader);
  }

  @Override
  public GradeAggregator getAggregator() {
    return helper.getAggregator(grader);
  }

  public ImmutableMap getGradedProjects() {
    return gradedProjects;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy