in rest-api/src/jetbrains/buildServer/server/rest/model/project/Project.java [174:306]
public Project(@NotNull final SProject project, final @NotNull Fields fields, @NotNull final BeanContext beanContext) {
myFields = fields;
myProject = project;
myBeanContext = beanContext;
id = ValueWithDefault.decideDefault(fields.isIncluded("id"), project::getExternalId);
final boolean includeInternal = TeamCityProperties.getBoolean(APIController.INCLUDE_INTERNAL_ID_PROPERTY_NAME);
internalId = ValueWithDefault.decideDefault(fields.isIncluded("internalId", includeInternal, includeInternal), project::getProjectId);
name = ValueWithDefault.decideDefault(fields.isIncluded("name"), project::getName);
href = ValueWithDefault.decideDefault(fields.isIncluded("href"), () -> beanContext.getApiUrlBuilder().getHref(project));
webUrl = ValueWithDefault.decideDefaultIgnoringAccessDenied(
fields.isIncluded("webUrl"),
() -> beanContext.getSingletonService(WebLinks.class).getProjectPageUrl(project.getExternalId())
);
links = getLinks(project, fields, beanContext);
description = ValueWithDefault.decideDefault(
fields.isIncluded("description"),
() -> Util.resolveNull(project.getDescription(), d -> StringUtil.isEmpty(d) ? null : d)
);
archived = ValueWithDefault.decideDefault(fields.isIncluded("archived"), project::isArchived);
readOnlyUI = ValueWithDefault.decideDefault(
fields.isIncluded("readOnlyUI"),
() -> StateField.create(
project.isReadOnly(),
((ProjectEx)project).isCustomSettingsFormatUsed() ? false : null,
fields.getNestedField("readOnlyUI")
)
);
final CachingValue<BuildTypeFinder> buildTypeFinder = CachingValue.simple(() -> beanContext.getSingletonService(BuildTypeFinder.class));
buildTypes = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("buildTypes", false), () -> {
final Fields buildTypesFields = fields.getNestedField("buildTypes", Fields.NONE, Fields.LONG);
final String buildTypesLocator = buildTypesFields.getLocator();
final List<BuildTypeOrTemplate> buildTypes = buildTypeFinder.get().getBuildTypesPaged(project, buildTypesLocator, true).getEntries();
return new BuildTypes(buildTypes, null, buildTypesFields, beanContext);
});
CachingValue<Boolean> canViewSettings = CachingValue.simple(() -> {
final PermissionChecker permissionChecker = beanContext.getServiceLocator().findSingletonService(PermissionChecker.class);
assert permissionChecker != null;
return !shouldRestrictSettingsViewing(project, permissionChecker); //use lazy calculation in order not to have performance impact when no related fields are retrieved
});
templates = ValueWithDefault.decideDefault(fields.isIncluded("templates", false), () -> {
if (!canViewSettings.get()) return null;
final Fields templateFields = fields.getNestedField("templates", Fields.NONE, Fields.LONG);
final String templatesLocator = templateFields.getLocator();
final List<BuildTypeOrTemplate> templates = buildTypeFinder.get().getBuildTypesPaged(project, templatesLocator, false).getEntries();
return new BuildTypes(templates, null, templateFields, beanContext);
});
deploymentDashboards = ValueWithDefault.decideDefault(fields.isIncluded("deploymentDashboards", false), () -> {
if (!canViewSettings.get()) return null;
final Fields dashboardFields = fields.getNestedField("deploymentDashboards", Fields.NONE, Fields.LONG);
DeploymentDashboardFinder deploymentDashboardFinder = beanContext.getSingletonService(DeploymentDashboardFinder.class);
String locator = Locator.getStringLocator(
DeploymentDashboardDimensions.PROJECT.getName(),
ProjectFinder.getLocator(myProject)
);
final List<DeploymentDashboard> dashboards = deploymentDashboardFinder.getItems(locator).getEntries();
return new Dashboards(dashboards, null, dashboardFields, beanContext);
});
defaultTemplate = ValueWithDefault.decideDefault(
fields.isIncluded("defaultTemplate", false),
() -> !canViewSettings.get()
? null
: getDefaultTemplate(project, fields.getNestedField("defaultTemplate", Fields.NONE, Fields.SHORT), beanContext)
);
parameters = ValueWithDefault.decideDefault(
fields.isIncluded("parameters", false),
() -> !canViewSettings.get() ? null :
new Properties(createEntity(project), ProjectRequest.getParametersHref(project), null, fields.getNestedField("parameters", Fields.NONE, Fields.LONG), beanContext)
);
vcsRoots = ValueWithDefault.decideDefault(
fields.isIncluded("vcsRoots", false),
() -> !canViewSettings.get() ? null : new VcsRoots(
project.getOwnVcsRoots(), //consistent with VcsRootFinder
new SinglePagePagerData(VcsRootRequest.getHref(project)),
fields.getNestedField("vcsRoots"),
beanContext)
);
projectFeatures = ValueWithDefault.decideDefault(
fields.isIncluded("projectFeatures", false),
() -> {
if (!canViewSettings.get()) return null;
Fields nestedFields = fields.getNestedField("projectFeatures", Fields.NONE, Fields.LONG);
return new PropEntitiesProjectFeature(project, nestedFields.getLocator(), nestedFields, beanContext);
});
projects = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("projects", false), () -> {
final Fields projectsFields = fields.getNestedField("projects", Fields.NONE, Fields.LONG);
final String projectsLocator = projectsFields.getLocator();
final ProjectFinder projectFinder = beanContext.getSingletonService(ProjectFinder.class);
final List<SProject> projects = projectFinder.getItems(project, projectsLocator).getEntries();
return new Projects(projects, null, projectsFields, beanContext);
});
cloudProfiles = ValueWithDefault.decideDefault(fields.isIncluded("cloudProfiles", false, false), () -> {
final Fields nestedFields = fields.getNestedField("cloudProfiles", Fields.NONE, Fields.LONG);
String locator = CloudProfileFinder.getLocator(nestedFields.getLocator(), project);
final CloudProfileFinder finder = beanContext.getSingletonService(CloudProfileFinder.class);
final List<CloudProfile> items = finder.getItems(locator).getEntries();
return new CloudProfiles(items, new SinglePagePagerData(CloudRequest.getProfilesHref(nestedFields.getLocator(), project)), nestedFields, beanContext);
});
// use lazy calculation in order not to have performance impact when no related fields are retrieved
final CachingValueNullable<SProject> actualParentProject = CachingValueNullable.simple(project::getParentProject);
parentProject = ValueWithDefault.decideDefault(
fields.isIncluded("parentProject", false),
() -> Util.resolveNull(actualParentProject.get(), (v) -> new Project(v, fields.getNestedField("parentProject"), beanContext))
);
parentProjectId = ValueWithDefault.decideDefault(
fields.isIncluded("parentProjectId"),
() -> Util.resolveNull(actualParentProject.get(), parent -> parent.getExternalId())
);
final boolean forceParentAttributes = TeamCityProperties.getBoolean("rest.beans.project.addParentProjectAttributes");
parentProjectName = ValueWithDefault.decideDefault(forceParentAttributes || fields.isIncluded("parentProjectName", false, false),
() -> Util.resolveNull(actualParentProject.get(), v -> v.getFullName()));
parentProjectInternalId = ValueWithDefault.decideDefault(forceParentAttributes || fields.isIncluded("parentProjectInternalId", includeInternal, includeInternal),
() -> Util.resolveNull(actualParentProject.get(), v -> v.getProjectId()));
}