@Override
  public Map<String, CloudBlobMetadata> getBlobMetadata(List<BlobId> blobIds) throws CloudStorageException {
    /**
     * Just keeping this fn around for tests and legacy reasons but imo this is a horrible function.
     * The fn takes a list as an arg, why not just a single blob ? It is only ever used to fetch metadata of a blob,
     * not a list. And because of this design, the higher levels have to wrap the blob-id in a singleton-list.
     * More importantly, the return type is map. The higher levels have to explicitly look for the result in the map
     * with blob-id. If there is typo in the code in looking up the map, for eg. instead of storeKey.getId(),
     * if we type storeKey() alone, then we make a mistake of thinking the blob is not found. Just stop using maps!
     * Such lookup errors are easy to miss in code-reviews. And most legacy tests are broken beyond repair.
     */
    Map<String, CloudBlobMetadata> cloudBlobMetadataMap = new HashMap<>();
    for (BlobId blobId: blobIds) {
      try {
        CloudBlobMetadata cloudBlobMetadata = getCloudBlobMetadata(blobId);
        if (cloudBlobMetadata != null) {
          cloudBlobMetadataMap.put(blobId.getID(), cloudBlobMetadata);
        }
      } catch (Throwable t) {
        throw t;
      }
    }
    return cloudBlobMetadataMap;
  }
Get azure-blob-properties and wraps it in ambry cloud-blob-metadata object.
@param blobId
@return
@throws CloudStorageException
ambry-cloud/src/main/java/com/github/ambry/cloud/azure/AzureCloudDestinationSync.java