/*
* Copyright (c) 2011 Nat Pryce, Timo Meinen.
*
* 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;
import com.natpryce.piazza.featureBranches.FeatureBranchesMonitorViewState;
import com.natpryce.piazza.pluginConfiguration.PiazzaConfiguration;
import com.natpryce.piazza.projectConfiguration.PiazzaProjectSettings;
import jetbrains.buildServer.serverSide.SBuildType;
import jetbrains.buildServer.serverSide.SProject;
import jetbrains.buildServer.users.SUser;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static com.natpryce.piazza.BuildStatus.SUCCESS;
/**
* @author Nat Pryce, Timo Meinen
*/
public class ProjectMonitorViewState {
private final SProject project;
private final PiazzaConfiguration piazzaConfiguration;
private PiazzaProjectSettings projectSettings;
private final Set<PiazzaUser> committers = new HashSet<>();
private final List<BuildTypeMonitorViewState> builds;
private final FeatureBranchesMonitorViewState featureBranchesView;
public ProjectMonitorViewState(SProject project, UserGroup userGroup, PiazzaConfiguration piazzaConfiguration, PiazzaProjectSettings projectSettings, SUser user) {
this.project = project;
this.piazzaConfiguration = piazzaConfiguration;
this.projectSettings = projectSettings;
builds = new ArrayList<>();
for (SBuildType buildType : project.getBuildTypes()) {
if (hasAtLeastOneBuild(buildType)) {
if (buildType.isAllowExternalStatus()) {
builds.add(new BuildTypeMonitorViewState(buildType, userGroup, piazzaConfiguration.isShowOnFailureOnly()));
}
}
}
for (BuildTypeMonitorViewState build : builds) {
committers.addAll(build.getCommitters());
}
featureBranchesView = new FeatureBranchesMonitorViewState(project, projectSettings, getOrderedBuildTypesOfProjectAndSubprojects(project, user));
}
private List<SBuildType> getOrderedBuildTypesOfProjectAndSubprojects(SProject project, SUser user) {
List<SBuildType> orderedBuildTypes = user.getOrderedBuildTypes(project);
for (SProject childProject : project.getProjects()) {
orderedBuildTypes.addAll(user.getOrderedBuildTypes(childProject));
}
return orderedBuildTypes;
}
private boolean hasAtLeastOneBuild(SBuildType buildType) {
return buildType.getLastChangesStartedBuild() != null;
}
public String getProjectName() {
return project.getName();
}
public String getStatus() {
return status().toString();
}
public BuildStatus status() {
if (builds.isEmpty()) {
return BuildStatus.UNKNOWN;
} else {
BuildStatus status = SUCCESS;
for (BuildTypeMonitorViewState build : builds) {
status = status.mostSevere(build.status());
}
return status;
}
}
public boolean isBuilding() {
return isBuildingDefaultBranches() || (projectSettings.isShowFeatureBranches() && getFeatureBranchesView().isBuilding());
}
private boolean isBuildingDefaultBranches() {
for (BuildTypeMonitorViewState build : builds) {
if (build.isBuilding()) {
return true;
}
}
return false;
}
public String getBuildingStatus() {
return isBuildingDefaultBranches() ? "Building" : "";
}
public List<BuildTypeMonitorViewState> getBuilds() {
return builds;
}
public Set<PiazzaUser> getCommitters() {
return committers;
}
public FeatureBranchesMonitorViewState getFeatureBranchesView() {
return featureBranchesView;
}
public String getPortraitMaxSize() {
return String.valueOf(piazzaConfiguration.getMaxPortraitSize()).concat("px");
}
}