in transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureMetadataCollector.java [54:134]
public ResourceMetadata getResourceMetadata(String resourcePath, boolean recursiveSearch) throws Exception {
checkInitialized();
// Azure does not have a concept called hierarchical containers. So we assume that there are no containers inside
// the given container
ResourceMetadata.Builder metadataBuilder = ResourceMetadata.newBuilder();
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(azureSecret.getConnectionString()).buildClient();
if (resourcePath.isEmpty() && azureStorage.getContainer().isEmpty()) { // List containers
PagedIterable<BlobContainerItem> blobContainerItems = blobServiceClient.listBlobContainers();
DirectoryMetadata.Builder parentDir = DirectoryMetadata.newBuilder();
parentDir.setResourcePath("");
parentDir.setFriendlyName("");
blobContainerItems.forEach(containerItem -> {
DirectoryMetadata.Builder containerDir = DirectoryMetadata.newBuilder();
containerDir.setFriendlyName(containerItem.getName());
containerDir.setResourcePath(containerItem.getName());
containerDir.setCreatedTime(containerItem.getProperties().getLastModified().toEpochSecond());
containerDir.setUpdateTime(containerItem.getProperties().getLastModified().toEpochSecond());
parentDir.addDirectories(containerDir);
});
metadataBuilder.setDirectory(parentDir);
return metadataBuilder.build();
}
BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient(azureStorage.getContainer());
if (resourcePath.isEmpty()) { // List inside the container
PagedIterable<BlobItem> blobItems = blobContainerClient.listBlobs();
DirectoryMetadata.Builder directoryBuilder = DirectoryMetadata.newBuilder();
blobItems.forEach(blobItem -> {
FileMetadata.Builder fileBuilder = FileMetadata.newBuilder();
BlobItemProperties properties = blobItem.getProperties();
fileBuilder.setResourceSize(properties.getContentLength());
fileBuilder.setCreatedTime(properties.getCreationTime().toEpochSecond());
fileBuilder.setUpdateTime(properties.getCreationTime().toEpochSecond());
fileBuilder.setFriendlyName(blobItem.getName());
fileBuilder.setResourcePath(blobItem.getName());
byte[] contentMd5 = properties.getContentMd5();
StringBuilder md5sb = new StringBuilder();
for (byte aByte : contentMd5) {
md5sb.append(Integer.toString((aByte & 0xff) + 0x100, 16).substring(1));
}
fileBuilder.setMd5Sum(md5sb.toString());
directoryBuilder.addFiles(fileBuilder);
});
metadataBuilder.setDirectory(directoryBuilder);
} else { // If resource is a file
if (!isAvailable(resourcePath)) {
metadataBuilder.setError(MetadataFetchError.NOT_FOUND);
return metadataBuilder.build();
}
BlobClient blobClient = blobContainerClient.getBlobClient(resourcePath);
FileMetadata.Builder fileBuilder = FileMetadata.newBuilder();
BlobProperties properties = blobClient.getProperties();
fileBuilder.setResourceSize(properties.getBlobSize());
fileBuilder.setCreatedTime(properties.getCreationTime().toEpochSecond());
fileBuilder.setUpdateTime(properties.getCreationTime().toEpochSecond());
fileBuilder.setFriendlyName(blobClient.getBlobName());
fileBuilder.setResourcePath(resourcePath);
byte[] contentMd5 = properties.getContentMd5();
StringBuilder md5sb = new StringBuilder();
for (byte aByte : contentMd5) {
md5sb.append(Integer.toString((aByte & 0xff) + 0x100, 16).substring(1));
}
fileBuilder.setMd5Sum(md5sb.toString());
metadataBuilder.setFile(fileBuilder);
}
return metadataBuilder.build();
}