/** {@inheritDoc} */
  @Override
  public BuildResult perform(final AbstractBuild<?, ?> build, final PluginLogger logger)
      throws InterruptedException, IOException {
    File logFile = build.getLogFile();

    Set<String> validParsers = Sets.newHashSet(getParserNames());
    ParserResult project;
    if (StringUtils.isNotBlank(getPattern())) {
      logger.log("Parsing warnings in files: " + getPattern());
      FilesParser parser =
          new FilesParser(
              logger,
              getPattern(),
              new FileWarningsParser(
                  validParsers, getDefaultEncoding(), getIncludePattern(), getExcludePattern()),
              isMavenBuild(build),
              isAntBuild(build));
      project = build.getWorkspace().act(parser);
    } else {
      project = new ParserResult(build.getWorkspace());
    }

    if (!ignoreConsole || StringUtils.isBlank(getPattern())) {
      logger.log("Parsing warnings in console log...");
      ParserRegistry registry =
          new ParserRegistry(
              ParserRegistry.getParsers(validParsers),
              getDefaultEncoding(),
              getIncludePattern(),
              getExcludePattern());
      Collection<FileAnnotation> warnings = registry.parse(logFile);
      if (!build.getWorkspace().isRemote()) {
        String workspace = build.getWorkspace().getRemote();
        ModuleDetector detector = new ModuleDetector(new File(workspace));
        for (FileAnnotation annotation : warnings) {
          String module = detector.guessModuleName(annotation.getFileName());
          annotation.setModuleName(module);
        }
      }

      project.addAnnotations(warnings);
    }
    project = build.getWorkspace().act(new AnnotationsClassifier(project, getDefaultEncoding()));
    for (FileAnnotation annotation : project.getAnnotations()) {
      annotation.setPathName(build.getWorkspace().getRemote());
    }

    WarningsResult result = new WarningsResult(build, getDefaultEncoding(), project);
    build.getActions().add(new WarningsResultAction(build, this, result));

    return result;
  }
  DependencyCheckResult(
      final Run<?, ?> build,
      final BuildHistory history,
      final ParserResult result,
      final String defaultEncoding,
      final boolean canSerialize) {
    super(build, history, result, defaultEncoding);

    if (canSerialize) {
      serializeAnnotations(result.getAnnotations());
    }
  }
  WarningsResult(
      final AbstractBuild<?, ?> build,
      final BuildHistory history,
      final ParserResult result,
      final String defaultEncoding,
      final String group,
      final boolean canSerialize) {
    super(build, history, result, defaultEncoding);

    this.group = group;
    if (canSerialize) {
      serializeAnnotations(result.getAnnotations());
    }
  }