/* * Copyright (c) 2012 Nat Pryce, Timo Meinen, Frank Bregulla. * * This file is part of Team Piazza. * * Team Piazza is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Team Piazza is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.natpryce.piazza.featureBranches; import com.natpryce.piazza.BuildStatus; import jetbrains.buildServer.serverSide.Branch; import jetbrains.buildServer.serverSide.SBuild; import jetbrains.buildServer.serverSide.SBuildType; import java.util.*; /** * Contains all information for one feature branch. * Contains all build types where at least one build has been run for that feature branch together with the latest * build for each of those build types. * * @author fbregulla */ public class FeatureBranchMonitorViewState { private SortedMap<SBuildType, BuildTypeWithLatestBuildMonitorViewState> buildTypeWithLatestBuildViewState = new TreeMap<SBuildType, BuildTypeWithLatestBuildMonitorViewState>(); private Branch branch; private List<SBuildType> orderedBuildTypes; private Date latestBuildStartDateInAnyBuildTypeOfThisBranch = new Date(0); public FeatureBranchMonitorViewState(Branch branch, List<SBuildType> orderedBuildTypes) { this.branch = branch; this.orderedBuildTypes = orderedBuildTypes; } public void addBuild(SBuild build) { //noinspection ConstantConditions if ((build.getBranch() == null) || !build.getBranch().getName().equals(branch.getName())) { throw new IllegalArgumentException("Only builds of branch " + branch + " may be added here!"); } updateLatestStartDate(build); if (buildTypeWithLatestBuildViewState.containsKey(build.getBuildType())) { replaceBuildIfNewer(build); } else { buildTypeWithLatestBuildViewState.put(build.getBuildType(), new BuildTypeWithLatestBuildMonitorViewState(build)); } } private void updateLatestStartDate(SBuild build) { if (build.getStartDate().after(latestBuildStartDateInAnyBuildTypeOfThisBranch)) { latestBuildStartDateInAnyBuildTypeOfThisBranch = build.getStartDate(); } } private void replaceBuildIfNewer(SBuild build) { BuildTypeWithLatestBuildMonitorViewState currentlyLatestBuild = buildTypeWithLatestBuildViewState.get(build.getBuildType()); if (currentlyLatestBuild.getStartDate().before(build.getStartDate())) { buildTypeWithLatestBuildViewState.put(build.getBuildType(), new BuildTypeWithLatestBuildMonitorViewState(build)); } } public Collection<BuildTypeWithLatestBuildMonitorViewState> getBuildTypes() { List<BuildTypeWithLatestBuildMonitorViewState> buildTypesWithBuild = new ArrayList<BuildTypeWithLatestBuildMonitorViewState>(); for (SBuildType orderedBuildType : orderedBuildTypes) { if (buildTypeWithLatestBuildViewState.containsKey(orderedBuildType)) { buildTypesWithBuild.add(buildTypeWithLatestBuildViewState.get(orderedBuildType)); } } return buildTypesWithBuild; } public BuildTypeWithLatestBuildMonitorViewState getLatestBuildForBuildType(SBuildType buildType) { return buildTypeWithLatestBuildViewState.get(buildType); } public String getName() { return branch.getDisplayName(); } public String getCombinedBuildStatus() { for (BuildTypeWithLatestBuildMonitorViewState buildTypes : getBuildTypes()) { if (buildTypes.getBuildStatus() == BuildStatus.FAILURE) { return BuildStatus.FAILURE.toString(); } } return BuildStatus.SUCCESS.toString(); } public boolean isBuilding() { for (BuildTypeWithLatestBuildMonitorViewState buildType : getBuildTypes()) { if (buildType.isBuilding()) { return true; } } return false; } public Date getLatestBuildDate() { return latestBuildStartDateInAnyBuildTypeOfThisBranch; } }