private BuildState createBuildState(MultiJobProject project) {

    MultiJobBuild lastBuild = project.getLastBuild();
    MultiJobBuild previousBuild = lastBuild == null ? null : lastBuild.getPreviousBuild();
    MultiJobBuild lastSuccessfulBuild = project.getLastSuccessfulBuild();
    MultiJobBuild lastFailedBuild = project.getLastFailedBuild();
    return new BuildState(
        project.getName(),
        previousBuild == null ? 0 : previousBuild.getNumber(),
        lastBuild == null ? 0 : lastBuild.getNumber(),
        lastSuccessfulBuild == null ? 0 : lastSuccessfulBuild.getNumber(),
        lastFailedBuild == null ? 0 : lastFailedBuild.getNumber());
  }
 @SuppressWarnings("rawtypes")
 private void addMultiProject(
     MultiJobProject parent,
     MultiJobProject project,
     BuildState buildState,
     int nestLevel,
     String phaseName,
     List<TopLevelItem> out) {
   out.add(new ProjectWrapper(parent, project, buildState, nestLevel));
   List<Builder> builders = project.getBuilders();
   for (Builder builder : builders) {
     int phaseNestLevel = nestLevel + 1;
     if (builder instanceof MultiJobBuilder) {
       MultiJobBuilder reactorBuilder = (MultiJobBuilder) builder;
       List<PhaseJobsConfig> subProjects = reactorBuilder.getPhaseJobs();
       String currentPhaseName = reactorBuilder.getPhaseName();
       PhaseWrapper phaseWrapper = new PhaseWrapper(phaseNestLevel, currentPhaseName);
       out.add(phaseWrapper);
       for (PhaseJobsConfig projectConfig : subProjects) {
         TopLevelItem tli = Hudson.getInstance().getItem(projectConfig.getJobName());
         if (tli instanceof MultiJobProject) {
           MultiJobProject subProject = (MultiJobProject) tli;
           BuildState jobBuildState = createBuildState(buildState, project, subProject);
           phaseWrapper.addChildBuildState(jobBuildState);
           addMultiProject(
               project, subProject, jobBuildState, phaseNestLevel + 1, currentPhaseName, out);
         } else {
           Job subProject = (Job) tli;
           if (subProject == null) continue;
           BuildState jobBuildState = createBuildState(buildState, project, subProject);
           phaseWrapper.addChildBuildState(jobBuildState);
           addSimpleProject(project, subProject, jobBuildState, phaseNestLevel + 1, out);
         }
       }
     }
   }
 }
 @SuppressWarnings({"rawtypes"})
 private BuildState createBuildState(
     BuildState parentBuildState, MultiJobProject multiJobProject, Job project) {
   int previousBuildNumber = 0;
   int lastBuildNumber = 0;
   int lastSuccessBuildNumber = 0;
   int lastFailureBuildNumber = 0;
   MultiJobBuild previousParentBuild =
       multiJobProject.getBuildByNumber(parentBuildState.getPreviousBuildNumber());
   MultiJobBuild lastParentBuild =
       multiJobProject.getBuildByNumber(parentBuildState.getLastBuildNumber());
   MultiJobBuild lastParentSuccessBuild =
       multiJobProject.getBuildByNumber(parentBuildState.getLastSuccessBuildNumber());
   MultiJobBuild lastParentFailureBuild =
       multiJobProject.getBuildByNumber(parentBuildState.getLastFailureBuildNumber());
   if (previousParentBuild != null) {
     List<SubBuild> subBuilds = previousParentBuild.getSubBuilds();
     for (SubBuild subBuild : subBuilds) {
       if (subBuild.getJobName().equals(project.getName())) {
         previousBuildNumber = subBuild.getBuildNumber();
       }
     }
   }
   if (lastParentBuild != null) {
     List<SubBuild> subBuilds = lastParentBuild.getSubBuilds();
     for (SubBuild subBuild : subBuilds) {
       if (subBuild.getJobName().equals(project.getName())) {
         lastBuildNumber = subBuild.getBuildNumber();
       }
     }
   }
   if (lastParentSuccessBuild != null) {
     List<SubBuild> subBuilds = lastParentSuccessBuild.getSubBuilds();
     for (SubBuild subBuild : subBuilds) {
       if (subBuild.getJobName().equals(project.getName())) {
         AbstractBuild build = (AbstractBuild) project.getBuildByNumber(subBuild.getBuildNumber());
         if (build != null && Result.SUCCESS.equals(build.getResult())) {
           lastSuccessBuildNumber = subBuild.getBuildNumber();
           break;
         } else {
           lastParentSuccessBuild =
               multiJobProject.getBuildByNumber(parentBuildState.getPreviousBuildNumber());
         }
       }
     }
   }
   if (lastParentFailureBuild != null) {
     List<SubBuild> subBuilds = lastParentFailureBuild.getSubBuilds();
     for (SubBuild subBuild : subBuilds) {
       if (subBuild.getJobName().equals(project.getName())) {
         AbstractBuild build = (AbstractBuild) project.getBuildByNumber(subBuild.getBuildNumber());
         if (build != null && Result.FAILURE.equals(((AbstractBuild) build).getResult())) {
           lastFailureBuildNumber = subBuild.getBuildNumber();
           break;
         } else {
           lastParentFailureBuild =
               multiJobProject.getBuildByNumber(parentBuildState.getPreviousBuildNumber());
         }
       }
     }
   }
   return new BuildState(
       project.getName(),
       previousBuildNumber,
       lastBuildNumber,
       lastSuccessBuildNumber,
       lastFailureBuildNumber);
 }