/**
   * @param distribution Distribution configuration
   * @return Configuration
   * @throws CloudFrontServiceException CloudFront failure details
   * @throws IOException Service error
   */
  private DistributionConfig getDistributionConfig(
      final org.jets3t.service.model.cloudfront.Distribution distribution)
      throws IOException, CloudFrontServiceException {

    CloudFrontService cf = this.getClient();
    if (distribution.isStreamingDistribution()) {
      return cf.getStreamingDistributionConfig(distribution.getId());
    }
    return cf.getDistributionConfig(distribution.getId());
  }
 private Distribution convert(
     final org.jets3t.service.model.cloudfront.Distribution d, Distribution.Method method)
     throws IOException, CloudFrontServiceException {
   // Retrieve distributions configuration to access current logging status settings.
   final DistributionConfig distributionConfig = this.getDistributionConfig(d);
   final String loggingTarget;
   if (null == distributionConfig.getLoggingStatus()) {
     // Default logging target to origin itself
     loggingTarget =
         ServiceUtils.findBucketNameInHostname(
             d.getConfig().getOrigin().getDomainName(), Protocol.S3_SSL.getDefaultHostname());
   } else {
     loggingTarget =
         ServiceUtils.findBucketNameInHostname(
             distributionConfig.getLoggingStatus().getBucket(),
             Protocol.S3_SSL.getDefaultHostname());
   }
   final Distribution distribution =
       new Distribution(
           d.getId(),
           distributionConfig.getEtag(),
           distributionConfig.getCallerReference(),
           d.getConfig().getOrigin().getDomainName(),
           method,
           d.getConfig().isEnabled(),
           d.isDeployed(),
           // CloudFront URL
           String.format("%s://%s%s", method.getScheme(), d.getDomainName(), method.getContext()),
           method.equals(Distribution.DOWNLOAD) || method.equals(Distribution.CUSTOM)
               ? String.format("https://%s%s", d.getDomainName(), method.getContext())
               : null, // No SSL
           null,
           Locale.localizedString(d.getStatus(), "S3"),
           distributionConfig.getCNAMEs(),
           distributionConfig.getLoggingStatus().isEnabled(),
           loggingTarget,
           distributionConfig.getDefaultRootObject());
   if (this.isInvalidationSupported(method)) {
     distribution.setInvalidationStatus(this.readInvalidationStatus(distribution));
   }
   if (this.isLoggingSupported(method)) {
     distribution.setContainers(this.getContainers());
   }
   return distribution;
 }
  /**
   * Amazon CloudFront Extension used to list all configured distributions
   *
   * @param origin Name of the container
   * @param method Distribution method
   * @throws CloudFrontServiceException CloudFront failure details
   * @throws IOException Service error
   */
  private void cache(String origin, Distribution.Method method)
      throws IOException, CloudFrontServiceException {

    if (log.isDebugEnabled()) {
      log.debug(String.format("List distributions for origin %s", origin));
    }

    CloudFrontService cf = this.getClient();

    if (method.equals(Distribution.STREAMING)) {
      for (org.jets3t.service.model.cloudfront.Distribution d :
          cf.listStreamingDistributions(origin)) {
        for (Origin o : d.getConfig().getOrigins()) {
          if (o instanceof S3Origin) {
            // Write to cache
            distributionStatus.get(method).put(origin, this.convert(d, method));
            // We currently only support one distribution per bucket
            break;
          }
        }
      }
    } else if (method.equals(Distribution.DOWNLOAD)) {
      // List distributions restricting to bucket name origin
      for (org.jets3t.service.model.cloudfront.Distribution d : cf.listDistributions(origin)) {
        for (Origin o : d.getConfig().getOrigins()) {
          if (o instanceof S3Origin) {
            // Write to cache
            distributionStatus.get(method).put(origin, this.convert(d, method));
            // We currently only support one distribution per bucket
            break;
          }
        }
      }
    } else if (method.equals(Distribution.CUSTOM) || method.equals(Distribution.WEBSITE_CDN)) {
      for (org.jets3t.service.model.cloudfront.Distribution d : cf.listDistributions()) {
        for (Origin o : d.getConfig().getOrigins()) {
          // Listing all distributions and look for custom origin
          if (o instanceof CustomOrigin) {
            if (o.getDomainName().equals(origin)) {
              distributionStatus.get(method).put(origin, this.convert(d, method));
            }
          }
        }
      }
    }
  }