public ResourceMetadata getResourceMetadata()

in transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSMetadataCollector.java [62:128]


    public ResourceMetadata getResourceMetadata(String resourcePath, boolean recursiveSearch) throws Exception {

        checkInitialized();

        PrivateKey privKey = GCSUtil.getPrivateKey(gcsSecret.getPrivateKey());
        try (Storage storage = StorageOptions.newBuilder().setCredentials(ServiceAccountCredentials.newBuilder()
                .setProjectId(gcsSecret.getProjectId())
                .setPrivateKey(privKey)
                .setClientEmail(gcsSecret.getClientEmail())
                .build()).build().getService()) {

            ResourceMetadata.Builder resourceBuilder = ResourceMetadata.newBuilder();

            if (gcsStorage.getBucketName().isEmpty() && resourcePath.isEmpty()) // Load bucket list
            {
                Page<Bucket> buckets = storage.list();
                DirectoryMetadata.Builder parentDir = DirectoryMetadata.newBuilder();
                parentDir.setResourcePath("");
                parentDir.setFriendlyName("");

                for (Bucket b : buckets.getValues()) {
                    DirectoryMetadata.Builder bucketDir = DirectoryMetadata.newBuilder();
                    bucketDir.setFriendlyName(b.getName());
                    bucketDir.setResourcePath(b.getName());
                    bucketDir.setCreatedTime(b.getCreateTimeOffsetDateTime().getLong(ChronoField.INSTANT_SECONDS));
                    bucketDir.setUpdateTime(b.getUpdateTimeOffsetDateTime().getLong(ChronoField.INSTANT_SECONDS));
                    parentDir.addDirectories(bucketDir);
                }

                resourceBuilder.setDirectory(parentDir);
                return resourceBuilder.build();
            }

            // If directory path or top level bucket path
            final String dirPath = resourcePath.endsWith("/") ? resourcePath : resourcePath + "/";
            if (resourcePath.endsWith("/") || resourcePath.isEmpty()) { // Directory

                Page<Blob> blob = storage.list(gcsStorage.getBucketName(), Storage.BlobListOption.prefix(resourcePath), Storage.BlobListOption.currentDirectory());
                resourceBuilder.setDirectory(processDirectory(resourcePath, blob));

            } else {

                try {
                    Blob blob = storage.get(gcsStorage.getBucketName(), resourcePath, Storage.BlobGetOption.fields(Storage.BlobField.values()));

                    if (blob != null) {
                        FileMetadata.Builder fileBuilder = FileMetadata.newBuilder();
                        fileBuilder.setFriendlyName(blob.getName());
                        fileBuilder.setResourcePath(resourcePath);
                        fileBuilder.setCreatedTime(blob.getCreateTimeOffsetDateTime().getLong(ChronoField.INSTANT_SECONDS));
                        fileBuilder.setUpdateTime(blob.getUpdateTimeOffsetDateTime().getLong(ChronoField.INSTANT_SECONDS));
                        fileBuilder.setResourceSize(blob.getSize());
                        fileBuilder.setMd5Sum(blob.getMd5());
                        resourceBuilder.setFile(fileBuilder);

                    } else {

                        Page<Blob> blobs = storage.list(gcsStorage.getBucketName(), Storage.BlobListOption.prefix(dirPath), Storage.BlobListOption.currentDirectory());
                        resourceBuilder.setDirectory(processDirectory(resourcePath + "/", blobs));
                    }
                } catch (Exception e) {
                    resourceBuilder.setError(MetadataFetchError.NOT_FOUND);
                }
            }
            return resourceBuilder.build();
        }
    }