public Agent()

in rest-api/src/jetbrains/buildServer/server/rest/model/agent/Agent.java [144:291]


  public Agent(@NotNull final SBuildAgent agent, final @NotNull Fields fields, @NotNull final BeanContext beanContext) {
    final int agentId = agent.getId();
    final boolean unknownAgent = agentId == UNKNOWN_AGENT_ID;
    name = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("name"), agent.getName());
    typeId = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("typeId"), agent.getAgentTypeId());
    if (!unknownAgent) {
      id = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("id"), agentId);
      href = ValueWithDefault.decideDefault(fields.isIncluded("href"), beanContext.getApiUrlBuilder().getHref(agent));
      connected = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("connected", false), agent.isRegistered());
      enabled = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("enabled", false), agent.isEnabled());
      authorized = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("authorized", false), agent.isAuthorized());


      build = ValueWithDefault.decideDefault(fields.isIncluded("build", false), () -> {
        SRunningBuild runningBuild = agent.getRunningBuild();
        if (runningBuild == null) return null;
        try {
          beanContext.getSingletonService(PermissionChecker.class).checkPermission(Permission.VIEW_PROJECT, runningBuild.getBuildPromotion());
          return new Build(runningBuild, fields.getNestedField("build"), beanContext);
        } catch (AuthorizationFailedException e) {
          return Build.getNoPermissionsBuild(runningBuild, fields.getNestedField("build"),
                                             beanContext); //should probably include "empty" build node instead so that it's clear some build is running
        }
      });
    }

    boolean hasMeaningfulData = !unknownAgent ||
                                !(((BuildAgentEx)agent).getAgentType() instanceof DummyAgentType); //agent type is still in the system
    //check permission to match UI
    if (hasMeaningfulData) {
      if (AuthUtil.canViewAgentDetails(beanContext.getSingletonService(PermissionChecker.class).getCurrent(), agent)) {
        WebLinks webLinks = beanContext.getSingletonService(WebLinks.class);
        webUrl = ValueWithDefault.decideDefault(fields.isIncluded("webUrl", true), () -> webLinks.getAgentUrl(agent, agent.getAgentTypeId()));
        links = ValueWithDefault.decideDefault(fields.isIncluded("links", false, false), () -> {
          Links.LinksBuilder builder = new Links.LinksBuilder();
          String absoluteUrl = webLinks.getAgentUrl(agent, agent.getAgentTypeId());
          String relativeUrl = new RelativeWebLinks().getAgentUrl(agent, agent.getAgentTypeId());
          if (absoluteUrl != null && relativeUrl != null) {
            builder.add(Link.WEB_VIEW_TYPE, absoluteUrl, relativeUrl);
          }
          return builder.build(fields.getNestedField("links"));
        });
        environment = ValueWithDefault.decideDefaultIgnoringAccessDenied(
          fields.isIncluded("environment", false, false),
          () -> new Environment(agent, fields.getNestedField("environment", Fields.NONE, Fields.LONG))
        );

        if (!unknownAgent) {
          uptodate = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("uptodate", false), !agent.isOutdated() && !agent.isPluginsOutdated());
          outdated = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("outdated", false, false), agent::isOutdated);
          pluginsOutdated = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("pluginsOutdated", false, false), agent::isPluginsOutdated);
          javaOutdated = ValueWithDefault
            .decideIncludeByDefault(fields.isIncluded("javaOutdated", false, false), () -> AgentUpgradeUtil.isAgentUsesOldJava(((BuildAgentEx)agent).getAgentType()));
          host = ValueWithDefault.decideDefault(fields.isIncluded("host", false), agent::getHostName);
          cpuRank = ValueWithDefault.decideDefault(fields.isIncluded("cpuRank", false), agent::getCpuBenchmarkIndex);
          port = ValueWithDefault.decideDefault(fields.isIncluded("port", false), agent::getPort);
          ip = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("ip", false), () -> {
            final String hostAddress = agent.getHostAddress();
            return DeadAgent.NA.equals(hostAddress) ? null : hostAddress;
          });
          protocol = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("protocol", false, false), () -> getAgentProtocol(agent));

          version = ValueWithDefault.decideDefault(fields.isIncluded("version", false, false), agent::getVersion);

          currentAgentVersion = ValueWithDefault.decideDefault(fields.isIncluded("currentAgentVersion", false, false), ((BuildAgentEx)agent)::getCurrentAgentVersion);

          lastActivityTime = ValueWithDefault.decideDefault(fields.isIncluded("lastActivityTime", false, false),
                                                            () -> Util.formatTime(agent.getLastCommunicationTimestamp()));

          idleSinceTime = ValueWithDefault.decideDefault(fields.isIncluded("idleSinceTime", false, false),
                                                         () -> {
                                                           long idleTime = agent.getIdleTime();
                                                           return idleTime <= 0 ? null : Util.formatTime(new Date(Dates.now().getTime() - idleTime));
                                                         });

          disconnectionComment = ValueWithDefault.decideDefault(fields.isIncluded("disconnectionComment", false, false),
                                                                agent::getUnregistrationComment);

          registrationTimestamp = ValueWithDefault.decideDefault(fields.isIncluded("registrationTimestamp", false, false),
                                                                 () -> Util.formatTime(agent.getRegistrationTimestamp()));

          enabledInfo = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("enabledInfo", false),
                                                                () -> new AgentEnabledInfo(agent, fields.getNestedField("enabledInfo", Fields.NONE, Fields.LONG), beanContext));

          authorizedInfo = ValueWithDefault.decideIncludeByDefault(fields.isIncluded("authorizedInfo", false),
                                                                   () -> new AgentAuthorizedInfo(agent, fields.getNestedField("authorizedInfo", Fields.NONE, Fields.LONG),
                                                                                                 beanContext));

          //TODO: review, if it should return all parameters on agent, use #getDefinedParameters()
          properties = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("properties", false), () -> new Properties(agent.getAvailableParameters(), null, fields
            .getNestedField("properties", Fields.NONE, Fields.LONG), beanContext));

          cloudInstance = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("cloudInstance", false, false),
                                                                             () -> {
                                                                               try {
                                                                                 return new CloudInstance(
                                                                                   beanContext.getSingletonService(CloudInstanceFinder.class)
                                                                                              .getItem(CloudInstanceFinder.getLocator(agent)),
                                                                                   fields.getNestedField("cloudInstance"), beanContext);
                                                                               } catch (NotFoundException e) {
                                                                                 return null;
                                                                               }
                                                                             });

          cloudImage = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded("cloudImage", false, false), () -> {
            try {
              if (!agent.isCloudAgent()) {
                return null;
              } else {
                return new CloudImage(beanContext.getSingletonService(CloudImageFinder.class).getItem(CloudImageFinder.getLocator(agent)), fields.getNestedField("cloudImage"), beanContext);
              }
            } catch (Exception e) {
              LOGGER.warnAndDebugDetails("Unable to get the cloud image for agent " + LogUtil.describe(agent), e);
              return null;
            }
          });

          compatibilityPolicy = ValueWithDefault.decideDefaultIgnoringAccessDenied(fields.isIncluded(COMPATIBILITY_POLICY, false, false),
                                                                                   () -> CompatibilityPolicy
                                                                                     .getCompatibilityPolicy(agent, fields.getNestedField(COMPATIBILITY_POLICY), beanContext));

          compatibleBuildTypes = ValueWithDefault.decideDefault(
            fields.isIncluded(COMPATIBLE_BUILD_TYPES, false, false),
            () -> resolveCompatibleBuildTypes(agent, fields.getNestedField(COMPATIBLE_BUILD_TYPES), beanContext)
          );
          incompatibleBuildTypes = ValueWithDefault.decideDefault(fields.isIncluded(INCOMPATIBLE_BUILD_TYPES, false, false),
                                                                  () -> new Compatibilities(AgentFinder.getIncompatible(agent, null, beanContext.getServiceLocator()), agent, null,
                                                                                            fields.getNestedField(INCOMPATIBLE_BUILD_TYPES), beanContext));
        }
      }

      builds = ValueWithDefault.decideDefault(fields.isIncluded("builds", false, false),
                                              () -> {
                                                Fields nestedFields = fields.getNestedField("builds", Fields.NONE, Fields.SHORT);
                                                String locator = Locator.merge(nestedFields.getLocator(),
                                                                               LocatorUtil.setDimension(BuildPromotionFinder.getLocator(agent), PagerData.COUNT, "1"));
                                                return Builds.createFromPrefilteredBuildPromotions(
                                                  beanContext.getServiceLocator().getSingletonService(BuildPromotionFinder.class).getItems(locator).getEntries(),
                                                  new SinglePagePagerData(BuildRequest.getHref(locator)), fields, beanContext);
                                              });

      if (!unknownAgent) {
        pool = ValueWithDefault.decideDefault(fields.isIncluded("pool", false),
                                              () -> new AgentPool(beanContext.getSingletonService(AgentPoolFinder.class).getAgentPool(agent), fields.getNestedField("pool"),
                                                                  beanContext));
      }
    }
  }