/**
  * Reads and parses the blob with given name.
  *
  * <p>If required the checksum of the blob will be verified.
  *
  * @param blobContainer blob container
  * @param blobName blob name
  * @return parsed blob object
  * @throws IOException
  */
 public T readBlob(BlobContainer blobContainer, String blobName) throws IOException {
   try (InputStream inputStream = blobContainer.readBlob(blobName)) {
     BytesStreamOutput out = new BytesStreamOutput();
     Streams.copy(inputStream, out);
     return read(out.bytes());
   }
 }
 @Override
 public void move(String sourceBlobName, String targetBlobName) throws IOException {
   delegate.move(sourceBlobName, targetBlobName);
 }
 @Override
 public Map<String, BlobMetaData> listBlobsByPrefix(String blobNamePrefix) throws IOException {
   return delegate.listBlobsByPrefix(blobNamePrefix);
 }
 @Override
 public Map<String, BlobMetaData> listBlobs() throws IOException {
   return delegate.listBlobs();
 }
 @Override
 public void deleteBlob(String blobName) throws IOException {
   delegate.deleteBlob(blobName);
 }
 @Override
 public void writeBlob(String blobName, InputStream inputStream, long blobSize)
     throws IOException {
   delegate.writeBlob(blobName, inputStream, blobSize);
 }
 @Override
 public InputStream readBlob(String name) throws IOException {
   return delegate.readBlob(name);
 }
 @Override
 public boolean blobExists(String blobName) {
   return delegate.blobExists(blobName);
 }
 @Override
 public BlobPath path() {
   return delegate.path();
 }