@Override
  public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener)
      throws InterruptedException, IOException {

    MavenModuleSetBuild msb = (MavenModuleSetBuild) build;

    Map<MavenModule, MavenBuild> moduleLastBuilds = msb.getModuleLastBuilds();

    for (MavenBuild moduleBuild : moduleLastBuilds.values()) {

      SurefireReport report = moduleBuild.getAction(SurefireReport.class);
      if (report == null) {
        return true;
      }

      List<Data> data = new ArrayList<Data>();
      if (getTestDataPublishers() != null) {
        for (TestDataPublisher tdp : getTestDataPublishers()) {
          Data d = tdp.getTestData(build, launcher, listener, report.getResult());
          if (d != null) {
            data.add(d);
          }
        }
      }

      report.setData(data);
      moduleBuild.save();
    }

    return true;
  }
    @Override
    public Publisher newInstance(StaplerRequest req, JSONObject formData) throws FormException {
      DescribableList<TestDataPublisher, Descriptor<TestDataPublisher>> testDataPublishers =
          new DescribableList<TestDataPublisher, Descriptor<TestDataPublisher>>(Saveable.NOOP);
      try {
        testDataPublishers.rebuild(req, formData, TestDataPublisher.all());
      } catch (IOException e) {
        throw new FormException(e, null);
      }

      return new FixedMavenTestDataPublisher(testDataPublishers);
    }
 @SuppressWarnings("rawtypes")
 @Override
 public boolean isApplicable(Class<? extends AbstractProject> jobType) {
   return MavenModuleSet.class.isAssignableFrom(jobType) && !TestDataPublisher.all().isEmpty();
 }