public Project()

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()));

  }