public ResourceMetadata getResourceMetadata()

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();
    }