protected ListDistributionsDto fetchDto()

in teamcity-s3-sdk/src/main/java/jetbrains/buildServer/artifacts/s3/ListCloudFrontDistributionsFetcher.java [55:118]


  protected ListDistributionsDto fetchDto(Map<String, String> parameters, @NotNull String projectId) throws ConnectionCredentialsException {
    String bucketName = S3Util.getBucketName(parameters);

    if (bucketName == null) {
      throw new IllegalArgumentException("No S3 bucket specified");
    }

    String bucketRegion = BucketLocationFetcher.getRegionName(myAmazonS3Builder.withCorrectingRegionAndAcceleration(
      parameters,
      projectId,
      correctedClient -> correctedClient.headBucket(b -> b.bucket(bucketName)).bucketRegion(),
      true
    ));

    String domainPattern = String.format(CloudFrontConstants.S3_BUCKET_DOMAIN_PATTERN, bucketName, bucketRegion);
    String domainPatternNoRegion = String.format(CloudFrontConstants.S3_BUCKET_DOMAIN_PATTERN_NO_REGION, bucketName);

    return myAmazonS3Builder.withCloudFrontClient(parameters, projectId, client -> {
      final List<DistributionSummary> distributionSummaries = new LinkedList<>();
      DistributionList distributionsList;
      String marker = null;
      do {
        ListDistributionsRequest.Builder requestBuilder = ListDistributionsRequest.builder().maxItems("1000").marker(marker);
        distributionsList = client.listDistributions(requestBuilder.build()).distributionList();
        distributionSummaries.addAll(distributionsList.items());
        marker = distributionsList.nextMarker();
      } while (marker != null);

      final List<KeyGroupSummary> keyGroups = new LinkedList<>();
      KeyGroupList keyGroupList;
      do {
        ListKeyGroupsRequest.Builder requestBuilder = ListKeyGroupsRequest.builder().maxItems("1000").marker(marker);
        keyGroupList = client.listKeyGroups(requestBuilder.build()).keyGroupList();
        keyGroups.addAll(keyGroupList.items());
        marker = keyGroupList.nextMarker();
      } while (marker != null);

      Map<String, KeyGroup> groupMap = keyGroups
        .stream()
        .map(KeyGroupSummary::keyGroup)
        .collect(Collectors.toMap(KeyGroup::id, Function.identity()));

      List<DistributionDto> distributions = distributionSummaries
        .stream()
        .filter(d -> d.origins()
                      .items()
                      .stream()
                      .anyMatch(o -> o.domainName().equals(domainPattern) || o.domainName().equals(domainPatternNoRegion))
        ).map(d -> {
          String id = d.id();
          String comment = d.comment();
          Boolean enabled = d.enabled();
          Set<String> publicKeys = new HashSet<>();
          TrustedKeyGroups defaultKeyGroups = d.defaultCacheBehavior().trustedKeyGroups();
          publicKeys.addAll(getAllPublicKeys(groupMap, defaultKeyGroups));
          for (CacheBehavior item : d.cacheBehaviors().items()) {
            publicKeys.addAll(getAllPublicKeys(groupMap, item.trustedKeyGroups()));
          }
          return new DistributionDto(id, comment, enabled, publicKeys);
        })
        .collect(Collectors.toList());
      return new ListDistributionsDto(distributions);
    });
  }